<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Eyeson developers tech blog</title>
        <link>https://docs.eyeson.com/blog</link>
        <description>Get an insight into Eyeson's development, architecture, new projects and more cool stuff</description>
        <lastBuildDate>Tue, 14 Jul 2026 09:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Eyeson GmbH</copyright>
        <item>
            <title><![CDATA[Introducing API Image Sources]]></title>
            <link>https://docs.eyeson.com/blog/api-image-sources</link>
            <guid>https://docs.eyeson.com/blog/api-image-sources</guid>
            <pubDate>Tue, 14 Jul 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[Add images directly to Eyeson meetings using public URLs or binary uploads. Perfect for dashboards, floor plans, branding, and other visual content.]]></description>
            <content:encoded><![CDATA[<p>We're excited to introduce <strong>Image Sources</strong>, a new REST API endpoint for adding images as additional video spots in Eyeson meetings.</p>
<p>Whether it's a company logo, presentation slide, floor plan, status board, or periodically updated camera snapshot, Image Sources make it easy to bring visual content into a meeting alongside participants. If you've already worked with the Playback API, you'll feel right at home - the concept is very similar, but designed for images instead of videos.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example">Example<a href="https://docs.eyeson.com/blog/api-image-sources#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<p>Image Sources can be created from either a public URL or an uploaded image file. URL-based images may also be refreshed automatically at a configurable interval, making them ideal for dynamically generated content.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Public URL</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Binary Upload</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "url":"https://example.com/dashboard.png",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "name":"Live Dashboard",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "object_fit":"contain",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "refresh_interval":30</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  }'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/image_sources"</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-F</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file=@floorplan.png"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-F</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"name=Floor Plan"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-F</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object_fit=contain"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/image_sources"</span><br></div></code></pre></div></div></div></div></div>
<p>Once created, an image source remains part of the meeting until it's removed via the API.</p>
<p>Image Sources can optionally be assigned an <code>image_source_id</code>, allowing them to be updated in place or referenced from <a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-layout">Meeting Layouts</a> to keep images at fixed positions.</p>
<p>For a complete overview of all parameters and examples, see the <a class="" href="https://docs.eyeson.com/docs/rest/references/image-sources">Image Sources documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stay-in-sync">Stay in Sync<a href="https://docs.eyeson.com/blog/api-image-sources#stay-in-sync" class="hash-link" aria-label="Direct link to Stay in Sync" title="Direct link to Stay in Sync" translate="no">​</a></h2>
<p>Applications using the <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer#image_source_update">Meeting Observer API</a> can listen for the new <code>image_source_update</code> event. Whenever image sources are added, updated, or removed, the observer receives the complete list of active image sources, making it easy to keep clients synchronized with the meeting state.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wed-love-your-feedback">We'd Love Your Feedback<a href="https://docs.eyeson.com/blog/api-image-sources#wed-love-your-feedback" class="hash-link" aria-label="Direct link to We'd Love Your Feedback" title="Direct link to We'd Love Your Feedback" translate="no">​</a></h2>
<p>We're excited to see how you'll use Image Sources in your applications. If you have ideas, questions, or feedback, let us know on our GitHub issue board:</p>
<p><a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">https://github.com/eyeson-team/api/issues</a></p>
<p>Thanks for building with Eyeson!</p>]]></content:encoded>
            <category>api</category>
            <category>image</category>
            <category>image sources</category>
        </item>
        <item>
            <title><![CDATA[Deprecating the "insert" Parameter in Layers API]]></title>
            <link>https://docs.eyeson.com/blog/deprecate-insert-layer</link>
            <guid>https://docs.eyeson.com/blog/deprecate-insert-layer</guid>
            <pubDate>Thu, 21 Aug 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Starting September 1st, 2025, the "insert" parameter will be removed from the Eyeson API's layers endpoint. Please switch to using file or url with SVG overlays.]]></description>
            <content:encoded><![CDATA[<p>Starting <strong>September 1st</strong>, the <a class="" href="https://docs.eyeson.com/docs/rest/references/layers">Eyeson API's layers endpoint</a> will no longer support the <code>insert</code> parameter. While <code>file</code> and <code>url</code> parameters will continue to work unchanged, the legacy <code>insert</code> option is being officially removed. Though it's been omitted from the documentation for a while, this formal announcement aims to help any long-term users relying on it to transition smoothly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-change">Why the Change?<a href="https://docs.eyeson.com/blog/deprecate-insert-layer#why-the-change" class="hash-link" aria-label="Direct link to Why the Change?" title="Direct link to Why the Change?" translate="no">​</a></h2>
<p>The <code>insert</code> parameter was originally introduced to make it easy to display simple overlays by automatically generating a grey, translucent background with the provided text inside. It was a convenient shortcut, requiring no design work or external assets.</p>
<p>However, as developer needs evolved, so did our API. The <code>insert</code> parameter is now being retired in favor of a much more powerful and flexible alternative: SVG overlays.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-best-option-going-forward-svg-overlays">Your Best Option Going Forward: SVG Overlays<a href="https://docs.eyeson.com/blog/deprecate-insert-layer#your-best-option-going-forward-svg-overlays" class="hash-link" aria-label="Direct link to Your Best Option Going Forward: SVG Overlays" title="Direct link to Your Best Option Going Forward: SVG Overlays" translate="no">​</a></h2>
<p>With SVG, you can easily replicate the same translucent text box style that <code>insert</code> used - but you're not limited to it:</p>
<ul>
<li class="">Position the overlay anywhere in the video frame</li>
<li class="">Adjust size, and colors to match your brand or UI needs</li>
<li class="">Add icons, shapes, or even dynamic data if needed</li>
<li class="">SVGs are lightweight, scalable, and rendered server-side by Eyeson - just like the old <code>insert</code></li>
</ul>
<p>Whether you're sending an SVG via <code>file</code> or referencing one hosted via <code>url</code>, the setup is straightforward. And because SVG is just XML, it's easy to generate dynamically from backend code or templates.</p>
<p>Check out our dedicated blog post on SVG support and how to implement it here: <a class="" href="https://docs.eyeson.com/blog/api-layer-svg">Using SVG with Eyeson Layers</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-recreating-the-old-insert-style-with-svg">Example: Recreating the Old "insert" Style with SVG<a href="https://docs.eyeson.com/blog/deprecate-insert-layer#example-recreating-the-old-insert-style-with-svg" class="hash-link" aria-label="Direct link to Example: Recreating the Old &quot;insert&quot; Style with SVG" title="Direct link to Example: Recreating the Old &quot;insert&quot; Style with SVG" translate="no">​</a></h3>
<p>With the <a href="https://github.com/eyeson-team/eyeson-node-svg-layer" target="_blank" rel="noopener noreferrer" class="">@eyeson/node-svg-layer</a> Node.js plugin, you can easily generate a styled SVG overlay that mimics the default <code>insert</code> look:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonSvgLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-svg-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonSvgLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> text </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> fontSize </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">16</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> bold </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> fontColor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'black'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">240</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> y </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">450</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> width </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">800</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> maxHeight </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">250</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> padding </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> lineHeight </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">21</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> radius </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> color </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'white 80%'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addMultilineTextBox</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontSize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> bold</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> maxHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> lineHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> radius</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">accessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>This creates:</p>
<ul>
<li class="">A centered text box</li>
<li class="">Black text on a grey translucent background</li>
<li class="">Padding and border radius to match the legacy style</li>
</ul>
<p>For more customization tips and advanced dynamic overlays, check out the <a class="" href="https://docs.eyeson.com/docs/sdks/node-js/node-js-svg-layer">full documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-note">Final Note<a href="https://docs.eyeson.com/blog/deprecate-insert-layer#final-note" class="hash-link" aria-label="Direct link to Final Note" title="Direct link to Final Note" translate="no">​</a></h2>
<p>We're committed to providing a developer-friendly, future-ready platform. SVG gives you the flexibility that <code>insert</code> never could - and we're confident your overlays will look better and work more reliably with this update.</p>
<p>As always, if you need help migrating or want to share feedback, don’t hesitate to reach out via <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>Thanks for building with Eyeson!</p>]]></content:encoded>
            <category>api</category>
            <category>layers</category>
            <category>insert</category>
        </item>
        <item>
            <title><![CDATA[Custom UI - Cast to Device]]></title>
            <link>https://docs.eyeson.com/blog/cast-to-device</link>
            <guid>https://docs.eyeson.com/blog/cast-to-device</guid>
            <pubDate>Mon, 18 Aug 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to implement cast to device options with eyeson Custom UI, allowing to stream the eyeson video meeting to a Chromecast-enabled TV or compatible device.]]></description>
            <content:encoded><![CDATA[<p>We're excited to announce a brand-new feature available in EyesonJS starting with version v2.1.0 - Cast to Device <span></span>.</p>
<p>This utility enables developers to stream an ongoing eyeson meeting directly to any Chromecast-enabled TV or compatible device, such as a smart TV or external monitor. The goal? To provide a distraction-free, video-only experience that's perfect for demos, presentations, or team meetings where visual clarity matters most.</p>
<p>Whether you're showcasing a product, joining a town hall, or presenting to a mix of in-room and remote participants, the Casting Manager simplifies getting your meeting session onto the big screen - with just a few lines of code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-cast">Why Cast?<a href="https://docs.eyeson.com/blog/cast-to-device#why-cast" class="hash-link" aria-label="Direct link to Why Cast?" title="Direct link to Why Cast?" translate="no">​</a></h2>
<p>Sometimes, less is more. By casting only the meeting video to an external screen, your audience stays focused on the speaker and shared visuals - without UI overlays or local controls getting in the way. This is ideal for:</p>
<ul>
<li class="">Presentations with both in-room and remote participants</li>
<li class="">Displaying meetings on a screen in a conference room</li>
<li class="">Passive viewing for team members who just need to watch</li>
<li class="">Streaming remote demos to a TV or external monitor</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-in-prebuilt-ui">Available in Prebuilt UI<a href="https://docs.eyeson.com/blog/cast-to-device#available-in-prebuilt-ui" class="hash-link" aria-label="Direct link to Available in Prebuilt UI" title="Direct link to Available in Prebuilt UI" translate="no">​</a></h2>
<p>If you're using the eyeson Prebuilt UI, you're all set - Cast to Device is built in and ready to use. Simply open the three-dot menu during a meeting, select "Cast to Device", and click the Start button in the popup to begin casting to a compatible screen.</p>
<p><img decoding="async" loading="lazy" alt="Cast to Device in Prebuilt UI" src="https://docs.eyeson.com/assets/images/gui-cast-dialog-8c89cf7abed43372f227bfd80020dea5.png" width="1280" height="845" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="browser-and-device-support">Browser and Device Support<a href="https://docs.eyeson.com/blog/cast-to-device#browser-and-device-support" class="hash-link" aria-label="Direct link to Browser and Device Support" title="Direct link to Browser and Device Support" translate="no">​</a></h2>
<p>The Cast to Device feature is supported in Chromium-based browsers such as Google Chrome, Microsoft Edge, and Opera on desktop platforms.</p>
<p>Casting works with any connected display and supports wireless streaming to Chromecast or Cast-enabled devices, including:</p>
<ul>
<li class="">Google Chromecast</li>
<li class="">Chromecast built-in devices</li>
<li class="">Devices with a Google Cast receiver</li>
</ul>
<p>Android TV and some smart TVs have built-in Cast functionality, but support and performance may vary depending on the device manufacturer and software implementation.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>For the best experience, we recommend using a standard Chromecast device or a certified Cast-enabled display.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://docs.eyeson.com/blog/cast-to-device#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>Here's a quick example of how you can use the new casting feature:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">button</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">button</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">button-cast</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">disabled</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">Start</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">button</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">module</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript imports">eyeson</span><span class="token script language-javascript imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript imports"> </span><span class="token script language-javascript imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript imports"> </span><span class="token script language-javascript imports maybe-class-name">FeatureDetector</span><span class="token script language-javascript imports"> </span><span class="token script language-javascript imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"> castingManager </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> eyeson</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> buttonCast </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript dom variable" style="color:rgb(189, 147, 249);font-style:italic">document</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">getElementById</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'button-cast'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript maybe-class-name">FeatureDetector</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">canCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">===</span><span class="token script language-javascript"> </span><span class="token script language-javascript boolean">true</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  buttonCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">disabled</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">blocked</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">onUpdate</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript parameter">event</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript arrow operator">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"> type </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> event</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">type </span><span class="token script language-javascript operator">===</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'connected'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      buttonCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">textContent</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'Stop'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">type </span><span class="token script language-javascript operator">===</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'terminated'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      buttonCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">textContent</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'Start'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">type </span><span class="token script language-javascript operator">===</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'error'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      </span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">alert</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">event</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">error</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">toString</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">type </span><span class="token script language-javascript operator">===</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'change_blocked'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      buttonCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">disabled</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">blocked</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  buttonCast</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">addEventListener</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'click'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript arrow operator">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript property-access">connected</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">stop</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">      castingManager</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<p>Once <code>start()</code> is called, the browser will display a popup with a list of available casting devices. As soon as a device is selected, the meeting video will begin streaming to it.</p>
<p>Calling <code>stop()</code> will end the casting session.</p>
<p>Read more about all available functions in EyesonJS in the <a class="" href="https://docs.eyeson.com/docs/sdks/js/utilities/cast-to-device">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final Thoughts<a href="https://docs.eyeson.com/blog/cast-to-device#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts" translate="no">​</a></h2>
<p>The new Cast to Device feature adds a whole new dimension to presenting and participating in eyeson meetings. Whether you're embedding EyesonJS into your app or using our prebuilt UI, you can now extend your video stream to any Chromecast-enabled display with ease.</p>
<p>Try it out today and let us know what you think - we'd love to hear from you!
If you have any questions or feedback, don’t hesitate to <a href="https://github.com/eyeson-team/js-docs/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>
<p>Happy casting!</p>]]></content:encoded>
            <category>eyeson-js</category>
            <category>javascript</category>
            <category>cast</category>
            <category>chromecast</category>
        </item>
        <item>
            <title><![CDATA[Working with WHIP and Stream Forwarding]]></title>
            <link>https://docs.eyeson.com/blog/whip-forward</link>
            <guid>https://docs.eyeson.com/blog/whip-forward</guid>
            <pubDate>Wed, 30 Apr 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Getting Started with WHIP and Stream Forwarding]]></description>
            <content:encoded><![CDATA[<p>If you're building intelligent audio/video solutions - think real-time transcription, vision analytics, or smart moderation - you'll want an efficient way to get your audio/video streams for AI processing. Our platform makes this simple using WHIP (WebRTC-HTTP Ingestion Protocol), designed for low-latency media processing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-whip">What Is WHIP?<a href="https://docs.eyeson.com/blog/whip-forward#what-is-whip" class="hash-link" aria-label="Direct link to What Is WHIP?" title="Direct link to What Is WHIP?" translate="no">​</a></h2>
<p>WHIP is a straightforward signaling protocol that uses standard HTTP methods (like POST and DELETE) to establish and manage a WebRTC media session between a client and a media server.</p>
<p>By standardizing the signaling process, WHIP simplifies media ingestion—making it easier to integrate into workflows where audio or video streams are forwarded for processing, such as AI pipelines.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-for-ai-streaming">Benefits for AI Streaming<a href="https://docs.eyeson.com/blog/whip-forward#benefits-for-ai-streaming" class="hash-link" aria-label="Direct link to Benefits for AI Streaming" title="Direct link to Benefits for AI Streaming" translate="no">​</a></h2>
<ul>
<li class=""><strong>Low latency</strong>: WHIP leverages WebRTC for real-time media transport, ensuring minimal delay.</li>
<li class=""><strong>Scalability</strong>: Efficient HTTP-based signaling makes it easy to manage thousands of sessions.</li>
<li class=""><strong>Compatibility</strong>: WebRTC peer connections integrate seamlessly with AI pipelines like GStreamer, FFmpeg, or custom ML models.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="forwarding-streams-with-eyeson">Forwarding Streams with Eyeson<a href="https://docs.eyeson.com/blog/whip-forward#forwarding-streams-with-eyeson" class="hash-link" aria-label="Direct link to Forwarding Streams with Eyeson" title="Direct link to Forwarding Streams with Eyeson" translate="no">​</a></h2>
<p>Eyeson offers a powerful <a class="" href="https://docs.eyeson.com/docs/rest/references/forward">API Forward Stream</a> feature that enables you to forward video and audio streams from a room to a specified destination.</p>
<p>You can forward streams from individual participants, the full MCU One View stream, or playback streams to external endpoints — all through the API.</p>
<p>Streams are delivered in their native format without any transcoding. This preserves the original quality and ensures seamless integration with various processing pipelines, minimizing latency and maintaining high fidelity.</p>
<p>Forwarding is automatically stopped when a source disconnects, simplifying stream management. Developers can also leverage <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer">Eyeson's Observer API</a> to monitor participant and playback updates, enabling quick and efficient responses to connection changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whip--ai-processing-system-overview">WHIP + AI Processing: System Overview<a href="https://docs.eyeson.com/blog/whip-forward#whip--ai-processing-system-overview" class="hash-link" aria-label="Direct link to WHIP + AI Processing: System Overview" title="Direct link to WHIP + AI Processing: System Overview" translate="no">​</a></h2>
<p>Here's the high-level flow for using WHIP to forward audio/video streams to an AI pipeline:</p>
<!-- -->
<ol>
<li class="">
<p><a class="" href="https://docs.eyeson.com/docs/rest/references/forward">Eyeson API forward stream</a> sends a POST request with an SDP offer to the WHIP Server.</p>
</li>
<li class="">
<p>The WHIP Server creates a WebRTC peer connection using this offer and returns an SDP answer.</p>
</li>
<li class="">
<p>Once the WebRTC negotiation completes, the media stream flows directly into a PeerConnection.</p>
</li>
<li class="">
<p>Streams are managed and transformed on the AI Pipeline to ensure full AI compatibility.</p>
</li>
<li class="">
<p>When the session is done, a DELETE request tears down the connection gracefully.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-examples-whip-server-setup">Code Examples: WHIP server setup<a href="https://docs.eyeson.com/blog/whip-forward#code-examples-whip-server-setup" class="hash-link" aria-label="Direct link to Code Examples: WHIP server setup" title="Direct link to Code Examples: WHIP server setup" translate="no">​</a></h2>
<p>Here are some starter snippets for creating a WHIP-compatible server.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">node.js</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Refer to lines 64-85 for an example of how to read audio and video data for further processing.</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token comment" style="color:rgb(98, 114, 164)">#!/usr/bin/env python3</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> asyncio</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> logging</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> traceback</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> uuid</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> aiohttp </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> web</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> aiortc </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> RTCPeerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> RTCSessionDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> RTCConfiguration</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> RTCIceServer</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">logger </span><span class="token operator">=</span><span class="token plain"> logging</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">getLogger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">__name__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">HOST </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'0.0.0.0'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">PORT </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">8889</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Simplified WHIP server</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">SimpleWhipServer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""A simplified WHIP server"""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sessions </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">handle_whip_options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Handle OPTIONS request for CORS preflight."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        headers </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Methods"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OPTIONS, POST, GET, DELETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">status</span><span class="token operator">=</span><span class="token number">204</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> headers</span><span class="token operator">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">handle_whip_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Handle WHIP POST request with SDP offer."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">debug</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Received request: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">request</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">method</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">request</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">url</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">debug</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Headers: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(189, 147, 249)">dict</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation interpolation">request</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">headers</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            session_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">uuid</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">uuid4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            headers </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Methods"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OPTIONS, POST, GET, DELETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Expose-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Location"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/sdp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Location"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">request</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">url</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            content_type </span><span class="token operator">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/sdp"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> content_type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    status</span><span class="token operator">=</span><span class="token number">400</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    text</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type must be application/sdp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    headers</span><span class="token operator">=</span><span class="token plain">headers</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            sdp </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Received SDP: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">sdp</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            config </span><span class="token operator">=</span><span class="token plain"> RTCConfiguration</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">iceServers</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">RTCIceServer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">urls</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"stun:stun.l.google.com:19302"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            pc </span><span class="token operator">=</span><span class="token plain"> RTCPeerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">configuration</span><span class="token operator">=</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> pc</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@pc</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"track"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">on_track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Received </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">track</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">kind</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> track"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">kind </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"video"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">readyState </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"live"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            frame </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">recv</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Video frame: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">frame</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">width</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">x</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">frame</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">height</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> @ </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">frame</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">time</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            </span><span class="token comment" style="color:rgb(98, 114, 164)"># You can add additional processing here</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error receiving video frame: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">break</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">kind </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"audio"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">readyState </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"live"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            frame </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">recv</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Audio frame: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">frame</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">samples</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> samples @ </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">frame</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">sample_rate</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> Hz"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            </span><span class="token comment" style="color:rgb(98, 114, 164)"># You can add audio processing here</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error receiving audio frame: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">break</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@pc</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"connectionstatechange"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">on_connectionstatechange</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Connection state changed: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">pc</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">connectionState</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">connectionState </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"closed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"disconnected"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Peer connection </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> ended with state: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">pc</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">connectionState</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">_cleanup_session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            offer </span><span class="token operator">=</span><span class="token plain"> RTCSessionDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sdp</span><span class="token operator">=</span><span class="token plain">sdp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"offer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">setRemoteDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">offer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            answer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">createAnswer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">setLocalDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">answer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                text</span><span class="token operator">=</span><span class="token plain">pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">localDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sdp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                headers</span><span class="token operator">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                status</span><span class="token operator">=</span><span class="token number">201</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error processing WHIP request: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">traceback</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">format_exc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            headers </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                status</span><span class="token operator">=</span><span class="token number">500</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                text</span><span class="token operator">=</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Server error: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(189, 147, 249)">str</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                headers</span><span class="token operator">=</span><span class="token plain">headers</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">handle_whip_delete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Handle DELETE /whip/{session_id} to stop the peer connection."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        headers </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        session_id </span><span class="token operator">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">match_info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'session_id'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> session_id </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">status</span><span class="token operator">=</span><span class="token number">404</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> text</span><span class="token operator">=</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"No active session with ID </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> headers</span><span class="token operator">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Stopping session </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> via DELETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">_cleanup_session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">status</span><span class="token operator">=</span><span class="token number">200</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> text</span><span class="token operator">=</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Session </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> terminated"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> headers</span><span class="token operator">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error stopping session </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">status</span><span class="token operator">=</span><span class="token number">500</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> text</span><span class="token operator">=</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error stopping session: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(189, 147, 249)">str</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> headers</span><span class="token operator">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">_cleanup_session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Helper function to close peer connection for a session."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pc </span><span class="token operator">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">not</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"No session found with ID </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> for cleanup"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> pc </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">connectionState </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"closed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">close</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"PeerConnection closed for session </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Error closing PeerConnection for session </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">session_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">pop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">session_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">init_app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Initialize the application."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    whip_server </span><span class="token operator">=</span><span class="token plain"> SimpleWhipServer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@web</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">middleware</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">error_middleware</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> handler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> handler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">HTTPException </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> ex</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"HTTP Exception: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">ex</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">status</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> - </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">ex</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">reason</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">raise</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Unhandled exception: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">traceback</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">format_exc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">status</span><span class="token operator">=</span><span class="token number">500</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> text</span><span class="token operator">=</span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app </span><span class="token operator">=</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Application</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">middlewares</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">error_middleware</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">router</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">add_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whip_server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">handle_whip_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">router</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">add_options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whip_server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">handle_whip_options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">router</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">add_delete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip/{session_id}'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whip_server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">handle_whip_delete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">router</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">add_options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip/{session_id}'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whip_server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">handle_whip_options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> app</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(255, 121, 198)">"""Main application entry point."""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    app </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> init_app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    runner </span><span class="token operator">=</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AppRunner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">setup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    site </span><span class="token operator">=</span><span class="token plain"> web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">TCPSite</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> HOST</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> PORT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Starting WHIP server on </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">HOST</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">:</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">PORT</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> site</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"WHIP server listening on :8889\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> asyncio</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">3600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> asyncio</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">CancelledError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Server shutdown initiated"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">cleanup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Server stopped"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> __name__ </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'__main__'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        asyncio</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">except</span><span class="token plain"> KeyboardInterrupt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Server stopped by user"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span></span><br></div></code></pre></div></div><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Note on Codec Support:</div><div class="admonitionContent_BuS1"><p>As of now, the <a href="https://github.com/aiortc/aiortc" target="_blank" rel="noopener noreferrer" class="">aiortc</a> library does not support the VP9 video codec. If you're planning to work with video streams, make sure to use the H.264 or VP8 codec for compatibility.</p><p>This makes <code>aiortc</code> an excellent match with <a href="https://github.com/eyeson-team/ghost" target="_blank" rel="noopener noreferrer" class="">Ghost by Eyeson</a>, which streams video over RTMP or RTSP using the H.264 codec. With this setup, you'll have a smooth and fully supported video streaming pipeline.</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Refer to lines 107-136 for an example of how to read audio and video data for further processing.</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> main</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"crypto/rand"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"encoding/hex"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"fmt"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"io"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"log"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"net/http"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"strings"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"sync"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"errors"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/pion/webrtc/v4"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    sessionStore </span><span class="token operator">=</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// map[string]*webrtc.PeerConnection</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Generates a random session ID</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">generateSessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    b </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">make</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token builtin" style="color:rgb(189, 147, 249)">byte</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">16</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> rand</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Read</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">panic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> hex</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">EncodeToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Ends a WHIP session: closes PeerConnection and removes from session store</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Also stops the video recording if active by closing the stdin pipe</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">endSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ok </span><span class="token operator">:=</span><span class="token plain"> sessionStore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Load</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token operator">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pc </span><span class="token operator">:=</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">*</span><span class="token plain">webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PeerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Close PeerConnection</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Close</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Error closing PeerConnection for session %s: %v"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    sessionStore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Delete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Session %s ended"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Handles POST /whip</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">whipPostHandler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResponseWriter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> r </span><span class="token operator">*</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// CORS</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Methods"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST, DELETE, OPTIONS, GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Expose-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Location"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Method </span><span class="token operator">==</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MethodOptions </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">WriteHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusOK</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Method </span><span class="token operator">!=</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MethodPost </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Method not allowed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusMethodNotAllowed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/sdp"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unsupported Media Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusUnsupportedMediaType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ReadAll</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed to read SDP body"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusBadRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"SDP Offer: %s"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Create PeerConnection with STUN server</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    config </span><span class="token operator">:=</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Configuration</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ICEServers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ICEServer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                URLs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string" style="color:rgb(255, 121, 198)">"stun:stun.l.google.com:19302"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewPeerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed to create PeerConnection"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusInternalServerError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    sessionID </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">generateSessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Connection state cleanup handler</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">OnConnectionStateChange</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">state webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PeerConnectionState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Session %s connection state: %s"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> state </span><span class="token operator">==</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PeerConnectionStateDisconnected </span><span class="token operator">||</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            state </span><span class="token operator">==</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PeerConnectionStateFailed </span><span class="token operator">||</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            state </span><span class="token operator">==</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PeerConnectionStateClosed </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">endSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Track handling</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">OnTrack</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track </span><span class="token operator">*</span><span class="token plain">webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">TrackRemote</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> receiver </span><span class="token operator">*</span><span class="token plain">webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">RTPReceiver</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Incoming track: %s"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Codec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MimeType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">go</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ReadRTP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> errors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Is</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">EOF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Contains</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"closed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Track %s ended: %v"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Error reading RTP packet from track %s: %v"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">HasPrefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Codec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MimeType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"video/"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Video packet received: SSRC=%d, Timestamp=%d, PayloadType=%d, PayloadSize=%d"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SSRC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Timestamp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PayloadType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">len</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token comment" style="color:rgb(98, 114, 164)">// You can add additional video processing here</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">HasPrefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Codec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MimeType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"audio/"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Audio packet received: SSRC=%d, Timestamp=%d, PayloadType=%d, PayloadSize=%d"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SSRC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Timestamp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PayloadType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">len</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pkt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Payload</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token comment" style="color:rgb(98, 114, 164)">// You can add additional audio processing here</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Set remote offer</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    offer </span><span class="token operator">:=</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SessionDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SDPTypeOffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        SDP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">SetRemoteDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">offer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SetRemoteDescription failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusInternalServerError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Create and set local answer</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    answer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">CreateAnswer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CreateAnswer failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusInternalServerError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">SetLocalDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">answer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SetLocalDescription failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusInternalServerError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Wait for ICE gathering</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token operator">&lt;-</span><span class="token plain">webrtc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">GatheringCompletePromise</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Store session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    sessionStore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Store</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    scheme </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">TLS </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">		scheme </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Respond with SDP answer and session location</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    location </span><span class="token operator">:=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Sprintf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"%s://%s%s/%s"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> scheme</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Host</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">RequestURI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Location"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> location</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/sdp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">WriteHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusCreated</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token function" style="color:rgb(80, 250, 123)">byte</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">peerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">LocalDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SDP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Handles DELETE /whip/{session-id}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">whipDeleteHandler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResponseWriter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> r </span><span class="token operator">*</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// CORS</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Origin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Headers"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Access-Control-Allow-Methods"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST, DELETE, OPTIONS, GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Method </span><span class="token operator">==</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MethodOptions </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">WriteHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusOK</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Method </span><span class="token operator">!=</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MethodDelete </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Method not allowed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusMethodNotAllowed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pathParts </span><span class="token operator">:=</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Split</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">len</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pathParts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> pathParts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"whip"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Invalid session path"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusBadRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    sessionID </span><span class="token operator">:=</span><span class="token plain"> pathParts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token boolean">_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ok </span><span class="token operator">:=</span><span class="token plain"> sessionStore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Load</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token operator">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NotFound</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">endSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    w</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">WriteHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StatusOK</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">HandleFunc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"/whip"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whipPostHandler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// POST /whip</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">HandleFunc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"/whip/"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> whipDeleteHandler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// DELETE /whip/&lt;id&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    fmt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"WHIP server listening on :8889"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ListenAndServe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">":8889"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fatal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Refer to lines 39-55 for an example of how to read audio and video data for further processing.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">express</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'express'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">wrtc</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@roamhq/wrtc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> app </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">express</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> port </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">8889</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Store active peer connections keyed by session ID</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> sessions </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">use</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">express</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'*/*'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Enable CORS for all routes</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">use</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">_req</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> res</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Access-Control-Allow-Origin'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'*'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Or restrict to specific origin</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Access-Control-Allow-Methods'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'GET, POST, DELETE, OPTIONS'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Access-Control-Allow-Headers'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Content-Type'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Access-Control-Expose-Headers'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Location'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">next</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Handle preflight OPTIONS requests</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/{*splat}'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">_req</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendStatus</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">204</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// No Content</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">req</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">is</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'application/sdp'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">status</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">415</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Unsupported Media Type: expected application/sdp'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> sessionId </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">generateSessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> offerSDP </span><span class="token operator">=</span><span class="token plain"> req</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pc </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">wrtc</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">RTCPeerConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token literal-property property">iceServers</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">urls</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'stun:stun.l.google.com:19302'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(80, 250, 123)">ontrack</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> track </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Received track:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">kind</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'audio'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> audioSink </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">wrtc</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">nonstandard</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">RTCAudioSink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            audioSink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(80, 250, 123)">ondata</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> bitsPerSample</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> sampleRate</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> samples </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token comment" style="color:rgb(98, 114, 164)">// process audio data</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">bitsPerSample</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sampleRate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> samples</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">kind</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'video'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> videoSink </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">wrtc</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">nonstandard</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">RTCVideoSink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">track</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            videoSink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(80, 250, 123)">onframe</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> </span><span class="token parameter literal-property property">frame</span><span class="token parameter operator">:</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> width</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> height</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> data </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token comment" style="color:rgb(98, 114, 164)">// process video frames</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">width</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">x</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">height</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">, </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">data</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">length</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> bytes</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(80, 250, 123)">onconnectionstatechange</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Connection state changed to:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">connectionState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">connectionState</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'disconnected'</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">connectionState</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'failed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">terminateSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setRemoteDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'offer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">sdp</span><span class="token operator">:</span><span class="token plain"> offerSDP </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> answer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">createAnswer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setLocalDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">answer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">waitForIceGathering</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> answerSDP </span><span class="token operator">=</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">localDescription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">sdp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Save the session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">req</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">protocol</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">://</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">req</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation method function property-access" style="color:rgb(80, 250, 123)">get</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string interpolation string" style="color:rgb(255, 121, 198)">'host'</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">req</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">originalUrl</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Location'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation dom variable" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">sessionId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setHeader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Content-Type'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'application/sdp'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">status</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">201</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">answerSDP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">status</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">500</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// DELETE route to end session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">delete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/whip/:id'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> sessionId </span><span class="token operator">=</span><span class="token plain"> req</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">terminateSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">status</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">200</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Session terminated'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">status</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">404</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">terminateSession</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'DELETE'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Session not found'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pc </span><span class="token operator">=</span><span class="token plain"> sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Close peer connection and clean up</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">close</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token known-class-name class-name">Reflect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">deleteProperty</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sessions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Session </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">sessionId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> terminated.</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Helper: wait for ICE gathering to finish</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">waitForIceGathering</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">pc</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> maxTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Promise</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">resolve</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> timer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">setTimeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">resolve</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> maxTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(80, 250, 123)">onicecandidate</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> candidate </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">candidate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">clearTimeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">timer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">resolve</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">generateSessionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">random</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">36</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">substring</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">listen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">port</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">WHIP server is listening on http://localhost:</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">port</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">/whip</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#F8F8F2"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></span><br></div></code></pre></div></div><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Note on Codec Support:</div><div class="admonitionContent_BuS1"><p>The <code>@roamhq/wrtc</code> Node.js package lacks native H.264 support. This can be problematic when using tools like <a href="https://github.com/eyeson-team/ghost" target="_blank" rel="noopener noreferrer" class="">Ghost by Eyeson</a>, where RTMP/RTSP streams typically require H.264. Consider alternative WebRTC implementations or transcoding solutions if H.264 is needed.</p></div></div></div></div></div>
<p>The WHIP URL of all examples is:</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">https</span><span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">ip-of-whip-server</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text">:8889/whip</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whip-compatible-tools-as-alternatives-and-for-prototyping">WHIP-Compatible Tools as Alternatives and for Prototyping<a href="https://docs.eyeson.com/blog/whip-forward#whip-compatible-tools-as-alternatives-and-for-prototyping" class="hash-link" aria-label="Direct link to WHIP-Compatible Tools as Alternatives and for Prototyping" title="Direct link to WHIP-Compatible Tools as Alternatives and for Prototyping" translate="no">​</a></h2>
<p>If you're exploring alternatives to building your own WHIP server or want to prototype quickly without diving into low-level implementation, there are several open-source tools that support WHIP and can feed WebRTC streams directly into your pipeline. Here are two solid options:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gstreamer-whipserversrc-element">GStreamer: <code>whipserversrc</code> Element<a href="https://docs.eyeson.com/blog/whip-forward#gstreamer-whipserversrc-element" class="hash-link" aria-label="Direct link to gstreamer-whipserversrc-element" title="Direct link to gstreamer-whipserversrc-element" translate="no">​</a></h3>
<p>GStreamer is a powerful multimedia framework used across applications ranging from media playback to real-time AI inference. It now features a <code>whipserversrc</code> element that acts as a WHIP endpoint, making it easy to receive and process WebRTC media.</p>
<p><a href="https://gstreamer.freedesktop.org/documentation/rswebrtc/whipserversrc.html" target="_blank" rel="noopener noreferrer" class="">https://gstreamer.freedesktop.org/documentation/rswebrtc/whipserversrc.html</a></p>
<p>Here's an example of a simple GStreamer pipeline to receive and play a WHIP stream:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">video</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">audio</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">gst-launch-1.0 whipserversrc </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  signaller::host-addr</span><span class="token operator">=</span><span class="token plain">http://0.0.0.0:8889 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  stun-server</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"stun://stun.l.google.com:19302"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token operator">!</span><span class="token plain"> decodebin </span><span class="token operator">!</span><span class="token plain"> videoconvert </span><span class="token operator">!</span><span class="token plain"> autovideosink</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">gst-launch-1.0 whipserversrc </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  signaller::host-addr</span><span class="token operator">=</span><span class="token plain">http://0.0.0.0:8889 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  stun-server</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"stun://stun.l.google.com:19302"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token operator">!</span><span class="token plain"> decodebin </span><span class="token operator">!</span><span class="token plain"> audioconvert </span><span class="token operator">!</span><span class="token plain"> autoaudiosink</span><br></div></code></pre></div></div></div></div></div>
<p>The WHIP URL will look like this:</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">https</span><span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">ip-of-gstreamer-server</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text">:8889/whip/endpoint</span><br></div></code></pre></div></div>
<p>You can also connect it directly to AI pipelines:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">gst-launch-1.0 whipserversrc </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">name</span><span class="token operator">=</span><span class="token plain">whip </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    whip. </span><span class="token operator">!</span><span class="token plain"> decodebin </span><span class="token operator">!</span><span class="token plain"> videoconvert </span><span class="token operator">!</span><span class="token plain"> videoscale </span><span class="token operator">!</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    your_ai_inference_element_here</span><br></div></code></pre></div></div>
<ul>
<li class="">Pros: A solid WHIP-compatible alternative for building prototypes.</li>
<li class="">Easy integration with AI tools like TensorFlow or OpenCV.</li>
<li class="">Ideal for developers already using GStreamer.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mediamtx-whip-ingest-server-with-rtsprtmpudp-output">MediaMTX: WHIP-Ingest Server with RTSP/RTMP/UDP Output<a href="https://docs.eyeson.com/blog/whip-forward#mediamtx-whip-ingest-server-with-rtsprtmpudp-output" class="hash-link" aria-label="Direct link to MediaMTX: WHIP-Ingest Server with RTSP/RTMP/UDP Output" title="Direct link to MediaMTX: WHIP-Ingest Server with RTSP/RTMP/UDP Output" translate="no">​</a></h3>
<p>MediaMTX (formerly rtsp-simple-server) is a robust media server that supports WHIP as a native ingestion method. It can convert incoming WebRTC streams into RTSP, RTMP, HLS, SRT, and more — making it extremely flexible for AI and media applications.</p>
<p><a href="https://github.com/bluenviron/mediamtx" target="_blank" rel="noopener noreferrer" class="">https://github.com/bluenviron/mediamtx</a></p>
<p>For a basic setup, clone and run MediaMTX:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> clone https://github.com/bluenviron/mediamtx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> mediamtx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./mediamtx</span><br></div></code></pre></div></div>
<p>It has the following default WHIP URL:</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">https</span><span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">ip-of-mediamtx-server</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text">:8889/mystream/whip</span><br></div></code></pre></div></div>
<ul>
<li class="">Converts WebRTC to RTSP, HLS, SRT, MPEG-TS, etc.</li>
<li class="">WHIP server built in — great for rapid prototyping or format bridging.</li>
<li class="">Perfect for AI systems that prefer non-WebRTC formats.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/whip-forward#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'd love to hear from you!</p>
<p>If you're building real-time AI video pipelines and need help setting up WHIP or peer connection forwarding, feel free to reach out. We'd love to collaborate or support your development.</p>]]></content:encoded>
            <category>WHIP</category>
            <category>forward</category>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[Changing Names of our Node Packages]]></title>
            <link>https://docs.eyeson.com/blog/npm-scope-change</link>
            <guid>https://docs.eyeson.com/blog/npm-scope-change</guid>
            <pubDate>Mon, 14 Apr 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[We're Now Publishing Our Node Packages Under an Organization Scope]]></description>
            <content:encoded><![CDATA[<p>We're excited to announce that we've updated how we publish our Node.js packages: going forward, all our packages will be published under the <code>@eyeson</code> organization scope on npm.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-changing">What's Changing?<a href="https://docs.eyeson.com/blog/npm-scope-change#whats-changing" class="hash-link" aria-label="Direct link to What's Changing?" title="Direct link to What's Changing?" translate="no">​</a></h2>
<p>Previously, our packages were named like this:</p>
<ul>
<li class=""><code>eyeson</code></li>
<li class=""><code>eyeson-node</code></li>
</ul>
<p>Now, they'll be published like this:</p>
<ul>
<li class=""><code>@eyeson/js</code></li>
<li class=""><code>@eyeson/node</code></li>
</ul>
<p>This change only affects the package names — all functionality remains the same, and you can continue using our libraries as usual with a small update to your <code>package.json</code>.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Deprecation Notice</div><div class="admonitionContent_BuS1"><p>The old packages (e.g. <code>eyeson-node</code>) will remain available <nobr><strong>until July 1st, 2025</strong></nobr>.
After that date, they will no longer receive updates and may be removed from npm entirely.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-were-making-this-change">Why We're Making This Change<a href="https://docs.eyeson.com/blog/npm-scope-change#why-were-making-this-change" class="hash-link" aria-label="Direct link to Why We're Making This Change" title="Direct link to Why We're Making This Change" translate="no">​</a></h2>
<p>We made this update for a few important reasons — all of which benefit you as much as they do us:</p>
<ul>
<li class="">
<p><strong>Better Clarity and Trust</strong><br>
<!-- -->Scoped packages make it immediately clear that a package comes from our team. It adds confidence, especially when working with multiple dependencies.</p>
</li>
<li class="">
<p><strong>Easier Maintenance and Discovery</strong><br>
<!-- -->All our packages are now grouped under the <code>@eyeson</code> scope, making it easier to discover and manage them as a set — whether you're browsing npm or searching within your project.</p>
</li>
<li class="">
<p><strong>Reduced Risk of Name Conflicts</strong><br>
<!-- -->Scoped naming helps avoid accidental conflicts with similarly named public packages, providing a safer and more predictable developer experience.</p>
</li>
<li class="">
<p><strong>Streamlined Permissions and Security</strong><br>
<!-- -->Using npm organizations allows us to better manage access, publishing rights, and versioning — which translates to more reliable and secure packages for you.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deprecation-notice-old-package-names">Deprecation Notice: Old Package Names<a href="https://docs.eyeson.com/blog/npm-scope-change#deprecation-notice-old-package-names" class="hash-link" aria-label="Direct link to Deprecation Notice: Old Package Names" title="Direct link to Deprecation Notice: Old Package Names" translate="no">​</a></h2>
<p>To make this transition smooth for everyone:</p>
<ul>
<li class="">The old packages (e.g. <code>eyeson-node</code>) will remain available <nobr><strong>until July 1st, 2025</strong></nobr>.</li>
<li class="">After that date, they will no longer receive updates and may be removed from npm entirely.</li>
</ul>
<p>We strongly encourage you to migrate to the new scoped packages before that deadline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-need-to-do">What You Need to Do<a href="https://docs.eyeson.com/blog/npm-scope-change#what-you-need-to-do" class="hash-link" aria-label="Direct link to What You Need to Do" title="Direct link to What You Need to Do" translate="no">​</a></h2>
<p>If you’re using one of our packages, simply update the package name in your <code>package.json</code>.</p>
<p>For example:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Before:</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"dependencies"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"eyeson-node"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"^1.4.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">After:</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"dependencies"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"@eyeson/node"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"^1.4.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>eyeson</code> =&gt; <code>@eyeson/js</code></li>
<li class=""><code>eyeson-node</code> =&gt; <code>@eyeson/node</code></li>
<li class=""><code>eyeson-node-layer</code> =&gt; <code>@eyeson/node-layer</code></li>
<li class=""><code>eyeson-node-svg-layer</code> =&gt; <code>@eyeson/node-svg-layer</code></li>
</ul>
<p>Then run your usual install command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># or</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># or</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanks-for-your-support">Thanks for Your Support<a href="https://docs.eyeson.com/blog/npm-scope-change#thanks-for-your-support" class="hash-link" aria-label="Direct link to Thanks for Your Support" title="Direct link to Thanks for Your Support" translate="no">​</a></h2>
<p>We're committed to improving your experience as a developer and believe this change will lead to a cleaner, safer, and more scalable ecosystem for everyone using our tools.</p>
<p>If you have any questions or run into issues during the transition, <a href="https://github.com/eyeson-team/js-docs/issues" target="_blank" rel="noopener noreferrer" class="">don't hesitate to reach out to us</a>!</p>]]></content:encoded>
            <category>NPM</category>
        </item>
        <item>
            <title><![CDATA[Introducing API Stream Forward]]></title>
            <link>https://docs.eyeson.com/blog/api-forward-stream</link>
            <guid>https://docs.eyeson.com/blog/api-forward-stream</guid>
            <pubDate>Fri, 04 Apr 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Introducing API tream forward endpoints that allow real-time AI processing of video conference streams]]></description>
            <content:encoded><![CDATA[<p>The Eyeson API provides a powerful way to forward the stream of any meeting client in real-time and at its original quality to your desired destination for further processing.</p>
<p>This feature forms the backbone of the <a class="" href="https://docs.eyeson.com/docs/rest/eyeson-ai-adapter">Eyeson AI Adatpter</a>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>tl;dr</div><div class="admonitionContent_BuS1"><ul>
<li class="">Your API key is required</li>
<li class="">You can forward a single stream from any client (source), the entire meeting stream (MCU), or a public video file (playback)</li>
<li class="">A WHIP-compatible destination endpoint is expected</li>
<li class="">You can forward audio only, video only, or both</li>
<li class="">The same stream can be forwarded multiple times to different destinations</li>
</ul></div></div>
<p>For full API documentation, visit <a class="" href="https://docs.eyeson.com/docs/rest/references/forward">https://docs.eyeson.com/docs/rest/references/forward</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structure">Structure<a href="https://docs.eyeson.com/blog/api-forward-stream#structure" class="hash-link" aria-label="Direct link to Structure" title="Direct link to Structure" translate="no">​</a></h2>
<p>Eyeson Video Meetings are built on MCU (Multipoint Control Unit) technology. In this system, a media server aggregates, processes, and combines multiple audio and video streams into one or a few unified streams. To learn more about MCU, read <a class="" href="https://docs.eyeson.com/docs/rest/SFU_vs_MCU#what-is-an-mcu">Understanding SFU, MCU &amp; Eyeson’s MCU+</a>.</p>
<p>The Eyeson API allows you to forward the incoming media stream directly, before it even reaches the media server.</p>
<p>You can also forward the generated MCU+ One View media stream.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://docs.eyeson.com/blog/api-forward-stream#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h2>
<p>To make sure only authorized people can forward a stream, authentication with an <a class="" href="https://docs.eyeson.com/docs/rest/eyeson-api#how-to-obtain-an-eyeson-api-key">API key</a> is required.</p>
<p>You will need a compatible WHIP (WebRTC-HTTP Ingestion Protocol) server as the destination endpoint.</p>
<p>While the same source can be forwarded to multiple destinations, each forward request must have its unique <code>forward-id</code>.</p>
<p>When the source is disconnected, the forward will automatically stop. To detect disconnections, you can use the Eyeson Meeting Observer's <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer#participant_update">participant_update</a> and <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer#playback_update">playback_update</a>. These provide insights when a source drops out or reconnects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="application">Application<a href="https://docs.eyeson.com/blog/api-forward-stream#application" class="hash-link" aria-label="Direct link to Application" title="Direct link to Application" translate="no">​</a></h2>
<p>This feature is the foundation of the <a class="" href="https://docs.eyeson.com/docs/rest/eyeson-ai-adapter">Eyeson AI Adatpter</a> which allows a customer-implemented AI module to process streams and return instructions, such as layout changes or enhanced audio/video content. Since the AI module runs on the customer’s side, this setup is flexible and supports many use cases.</p>
<p>In its simplest form, you might want to capture important streams for processing or recording in their original quality, even if they are not visible on the MCU media stream.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-usage">API Usage<a href="https://docs.eyeson.com/blog/api-forward-stream#api-usage" class="hash-link" aria-label="Direct link to API Usage" title="Direct link to API Usage" translate="no">​</a></h2>
<p>The full API documentation is available at <a class="" href="https://docs.eyeson.com/docs/rest/references/forward">/docs/rest/references/forward</a>.</p>
<p>To make integration easier, we've provided SDKs for quick implementation in <a href="https://github.com/eyeson-team/eyeson-node" target="_blank" rel="noopener noreferrer" class="">Node.js</a>, <a href="https://github.com/eyeson-team/eyeson-go" target="_blank" rel="noopener noreferrer" class="">Go</a>, and <a href="https://github.com/eyeson-team/eyeson-php" target="_blank" rel="noopener noreferrer" class="">PHP</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="start-a-source-forward">Start a Source Forward<a href="https://docs.eyeson.com/blog/api-forward-stream#start-a-source-forward" class="hash-link" aria-label="Direct link to Start a Source Forward" title="Direct link to Start a Source Forward" translate="no">​</a></h3>
<p>The following example demonstrates how to forward a video source. For more examples, refer to the <a class="" href="https://docs.eyeson.com/docs/rest/references/forward">API documentation</a>.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">curl</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">node sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">php sdk</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$API_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"forward_id=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FORWARD_ID</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user_id=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$USER_ID</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type=video"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"url=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${https</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">:</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">/</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">example.com</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">whip}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ROOM_ID</span><span class="token string" style="color:rgb(255, 121, 198)">/forward/source"</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;API_KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> room_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;ROOM_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> forward </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">createRoomForward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> forward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;FORWARD_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USER_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'video'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'https://example.com/whip...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">room_id </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;ROOM_ID&gt;"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;API_KEY&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Rooms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ForwardSource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;FORWARD_ID&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;USER_ID&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MediaType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Video</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com/whip..."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;API_KEY&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$room_id</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;ROOM_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$forward</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">forward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$forward</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;FORWARD_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;USER_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'video'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'https://example.com/whip...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stop-any-active-forward">Stop Any Active Forward<a href="https://docs.eyeson.com/blog/api-forward-stream#stop-any-active-forward" class="hash-link" aria-label="Direct link to Stop Any Active Forward" title="Direct link to Stop Any Active Forward" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">curl</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">node sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">php sdk</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> GET </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$API_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ROOM_ID</span><span class="token string" style="color:rgb(255, 121, 198)">/forward/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FORWARD_ID</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;API_KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> room_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;ROOM_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> forward </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">createRoomForward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> forward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">stop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;FORWARD_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">room_id </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;ROOM_ID&gt;"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;API_KEY&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Rooms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">DeleteForward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;FORWARD_ID&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;API_KEY&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$room_id</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;ROOM_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$forward</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">forward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$forward</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">stop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;FORWARD_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="combination-with-meeting-observer">Combination with Meeting Observer<a href="https://docs.eyeson.com/blog/api-forward-stream#combination-with-meeting-observer" class="hash-link" aria-label="Direct link to Combination with Meeting Observer" title="Direct link to Combination with Meeting Observer" translate="no">​</a></h3>
<p>We recommend combining the forward stream feature with the <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer">Eyeson Meeting Observer</a> to track each client’s connection and disconnection states, as the forward stream does not automatically handle these events.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;API_KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> room_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;ROOM_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USER_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> forward </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">createRoomForward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> connection </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">observer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">connect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">room_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">connection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'event'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token parameter">event</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'room_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> participants </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">participants</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">some</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> id </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> id </span><span class="token operator">===</span><span class="token plain"> user_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">startForwardUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'participant_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> online </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">participant</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id </span><span class="token operator">===</span><span class="token plain"> user_id </span><span class="token operator">&amp;&amp;</span><span class="token plain"> online</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">startForwardUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">startForwardUser</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> forward</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;FORWARD_ID&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> user_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'video'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'https://example.com/whip...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/api-forward-stream#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We’d love to hear from you!</p>
<p>If you have any questions or would like to share feedback, feel free to
<a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>API</category>
            <category>forward</category>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[API layers SVG support]]></title>
            <link>https://docs.eyeson.com/blog/api-layer-svg</link>
            <guid>https://docs.eyeson.com/blog/api-layer-svg</guid>
            <pubDate>Fri, 28 Mar 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Announcement about added support of SVG image format for layers]]></description>
            <content:encoded><![CDATA[<p>The <a class="" href="https://docs.eyeson.com/docs/rest/references/layers">API layers endpoint</a> now supports SVG images. This comes with great advantages for developers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-power-of-svg">The power of SVG<a href="https://docs.eyeson.com/blog/api-layer-svg#the-power-of-svg" class="hash-link" aria-label="Direct link to The power of SVG" title="Direct link to The power of SVG" translate="no">​</a></h2>
<p>SVG is an XML-based vector image format, where XML is human-readable text.</p>
<p>Define drawing objects and use it with the Eyeson API. The actual image is created on our server, so the whole process of creating, sending and drawing the overlay is way faster than before.</p>
<p>In other words:</p>
<ul>
<li class="">Significantly smaller file sizes</li>
<li class="">Text-based format that can be edited with code editors</li>
<li class="">Original quality in contrast to compression of PNG, WebP, etc.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rules">Rules<a href="https://docs.eyeson.com/blog/api-layer-svg#rules" class="hash-link" aria-label="Direct link to Rules" title="Direct link to Rules" translate="no">​</a></h2>
<p>SVG files are rendered on server side and applied immediately as overlay or background.</p>
<ul>
<li class="">Width and height must be set on the SVG element</li>
<li class="">Maximum size is 1280x960 pixels (or 1280x720px in widescreen mode)</li>
<li class="">Only "<strong>DejaVu Sans</strong>" font in normal and bold is supported and the default</li>
<li class=""><code>&lt;?xml version="1.0" ...</code> is optional</li>
<li class="">No external URLs - use <a href="https://en.wikipedia.org/wiki/Data_URI_scheme" target="_blank" rel="noopener noreferrer" class="">data URIs</a> if needed</li>
<li class="">No animations, only static SVG subset is supported</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-svg">Example SVG<a href="https://docs.eyeson.com/blog/api-layer-svg#example-svg" class="hash-link" aria-label="Direct link to Example SVG" title="Direct link to Example SVG" translate="no">​</a></h2>
<p>Here's a simple example with some object and text elements.</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">svg</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">xmlns</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">http://www.w3.org/2000/svg</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">width</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">400</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">225</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">rect</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">x</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">0</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">y</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">0</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">width</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">400</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">225</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">#3C1C88</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">circle</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">cx</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">200</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">cy</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">112</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">r</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">100</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">none</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">stroke</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">#6C3FFF</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">stroke-width</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">20</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">x</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">200</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">y</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">112</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">font-size</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">50</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">font-weight</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">bold</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">#ffffff</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">text-anchor</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">middle</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">LOREM IPSUM</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">x</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">200</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">y</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">112</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">dy</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">40</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">font-size</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">30</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">letter-spacing</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">8</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">#AA99FF</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">text-anchor</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">middle</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">dolor sit amet</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">svg</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="225" font-family="sans-serif"><rect x="0" y="0" width="400" height="225" fill="#3C1C88"></rect><circle cx="200" cy="112" r="100" fill="none" stroke="#6C3FFF" stroke-width="20"></circle><text x="200" y="112" font-size="50" font-weight="bold" fill="#ffffff" text-anchor="middle">LOREM IPSUM</text><text x="200" y="112" dy="40" font-size="30" letter-spacing="8" fill="#AA99FF" text-anchor="middle">dolor sit amet</text></svg>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-svg-files-with-eyeson-api">Using SVG files with Eyeson API<a href="https://docs.eyeson.com/blog/api-layer-svg#using-svg-files-with-eyeson-api" class="hash-link" aria-label="Direct link to Using SVG files with Eyeson API" title="Direct link to Using SVG files with Eyeson API" translate="no">​</a></h2>
<p>The <a class="" href="https://docs.eyeson.com/docs/rest/references/layers">API layers endpoint</a> parameters <code>url</code> and <code>file</code> are now ready to be used with SVG files in addition to PNG and other image file formats.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-a-public-url">Provide a public URL<a href="https://docs.eyeson.com/blog/api-layer-svg#provide-a-public-url" class="hash-link" aria-label="Direct link to Provide a public URL" title="Direct link to Provide a public URL" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">curl</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">node sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">php sdk</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"url=https://docs.eyeson.com/img/examples/overlay_example.svg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/layers"</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'ACCESS_KEY'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">url</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'https://docs.eyeson.com/img/examples/overlay_example.svg'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  eyeson </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/eyeson-team/eyeson-go"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">accessKey </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">userService</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewUserServiceFromAccessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">accessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">userService</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">SetLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"https://docs.eyeson.com/img/examples/overlay_example.svg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Foreground</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">EyesonTeam</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Eyeson</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$layer</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ACCESS_KEY'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$layer</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">setImageUrl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'https://docs.eyeson.com/img/examples/overlay_example.svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="send-svg-file-as-binary">Send SVG file as binary<a href="https://docs.eyeson.com/blog/api-layer-svg#send-svg-file-as-binary" class="hash-link" aria-label="Direct link to Send SVG file as binary" title="Direct link to Send SVG file as binary" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">curl</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">node sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">php sdk</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-F</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file=@path/to/local/file.svg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/layers"</span><br></div></code></pre></div></div><p>Using pipe:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;svg xmlns="http://www.w3.org/2000/svg" ...'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-F</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file=@-;filename=upload.svg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/layers"</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">fs</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'node:fs'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'ACCESS_KEY'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> svg </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">promises</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">readFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'./demo.svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">encoding</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'utf8'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">svg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"os"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  eyeson </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/eyeson-team/eyeson-go"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">userService</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewUserServiceFromAccessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"ACCESS_KEY"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ReadFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"./demo.svg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">userService</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">SetLayerImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">buffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SVG</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Foreground</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">EyesonTeam</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Eyeson</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$layer</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eyeson</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ACCESS_KEY'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$layer</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">sendImageFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'./demo.svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You can find more examples in the <a class="" href="https://docs.eyeson.com/docs/rest/how-to/layers-svg#methods-for-using-svg-in-eyeson">How to use SVG files in Eyeson</a> article.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodejs-svg-plugin">Node.js SVG Plugin<a href="https://docs.eyeson.com/blog/api-layer-svg#nodejs-svg-plugin" class="hash-link" aria-label="Direct link to Node.js SVG Plugin" title="Direct link to Node.js SVG Plugin" translate="no">​</a></h2>
<p>For convenience and more powerful applications we've created a node.js plugin. It provides text size calculation functions, multiline text boxes, and much more.</p>
<p><a href="https://github.com/eyeson-team/eyeson-node-svg-layer" target="_blank" rel="noopener noreferrer" class="">https://github.com/eyeson-team/eyeson-node-svg-layer</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-plugins-with-npm">Install plugins with NPM<a href="https://docs.eyeson.com/blog/api-layer-svg#install-plugins-with-npm" class="hash-link" aria-label="Direct link to Install plugins with NPM" title="Direct link to Install plugins with NPM" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> i </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--save</span><span class="token plain"> @eyeson/node @eyeson/node-svg-layer</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-example-with-dynamic-meeting-info">Advanced example with dynamic meeting info<a href="https://docs.eyeson.com/blog/api-layer-svg#advanced-example-with-dynamic-meeting-info" class="hash-link" aria-label="Direct link to Advanced example with dynamic meeting info" title="Direct link to Advanced example with dynamic meeting info" translate="no">​</a></h3>
<p>The following example demonstrates dynamic overlay creation with realtime data. It uses the <a href="http://localhost:3000/docs/rest/advanced/meeting_observer" target="_blank" rel="noopener noreferrer" class="">Meeting Observer</a> to show the actual number of participants as an overlay.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonSvgLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-svg-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'...'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> overlay </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonSvgLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> infoBox </span><span class="token operator">=</span><span class="token plain"> overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addTextBox</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#000'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'top left'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'grey 80%'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> meeting </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> connection </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">observer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">connect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">roomId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> participantCount </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">connection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'event'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token parameter">event</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'room_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        participantCount </span><span class="token operator">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">participants</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">ready</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">updateOverlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'participant_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">participant</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">online</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            participantCount</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            participantCount</span><span class="token operator">--</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">updateOverlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">updateOverlay</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    infoBox</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">text</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">meeting</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">data</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">room</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> - Participants: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">participantCount</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Resulting SVG:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">svg</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">xmlns</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">http://www.w3.org/2000/svg</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">width</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">1280</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">720</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">font-family</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">DejaVu Sans,sans-serif</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">rect</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">x</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">20</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">y</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">20</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">width</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">302</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">40</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">rx</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">3</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">grey</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill-opacity</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">80%</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">x</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">30</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">y</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">31</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">font-size</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">20</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">fill</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">#000</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">dominant-baseline</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">hanging</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">SVG Demo - Participants: 4</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">text</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">svg</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Result of the example showing Prebuilt-UI with 4 particpants and the meeting info as overlay" src="https://docs.eyeson.com/assets/images/node-example-35dbec1e8a79cc60694f2ea6be171c29.png" width="640" height="423" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/api-layer-svg#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>API</category>
            <category>SVG</category>
            <category>layers</category>
            <category>image</category>
        </item>
        <item>
            <title><![CDATA[Upgrading to VP9 as default video codec]]></title>
            <link>https://docs.eyeson.com/blog/migration-to-vp9-video-codec</link>
            <guid>https://docs.eyeson.com/blog/migration-to-vp9-video-codec</guid>
            <pubDate>Tue, 10 Dec 2024 09:00:00 GMT</pubDate>
            <description><![CDATA[Announcement about upgrading the default video codec from VP8 to VP9 and details about the migration and its benefits for video quality and bandwidth]]></description>
            <content:encoded><![CDATA[<div style="width:8em;float:right;margin-left:1em"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 317 144"><defs><linearGradient id="a" x1="657" x2="721" y1="-94.2" y2="3.81" gradientTransform="translate(-203 593)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#8ae234"></stop><stop offset="1" style="stop-color:#4e9a06"></stop></linearGradient></defs><path d="m61 83 3.26 21.6h.906l3.62-21.7 24.3-74.3h26.1l-47.1 128h-17.8l-47.5-128h28.8zm67-73c5.07-.966 10.6-1.69 16.7-2.17 6.16-.604 12.3-.906 18.3-.906 6.28 0 12.6.544 18.8 1.63 6.4.967 12.1 3.02 17.2 6.16 5.07 3.02 9.18 7.31 12.3 12.9 3.26 5.44 4.89 12.6 4.89 21.4 0 7.97-1.39 14.7-4.17 20.3-2.78 5.44-6.46 9.91-11.1 13.4-4.59 3.5-9.85 6.04-15.8 7.61-5.8 1.57-11.8 2.36-18.1 2.36h-7.07l-4.35-.362c-1.33-.121-2.3-.242-2.9-.362v43.7h-24.8zm30.11 18.662c-2.17.121-3.93.302-5.25.544v41.1c.483.121 1.21.242 2.17.362.966.121 1.99.242 3.08.362h5.44q4.89 0 9.6-.906 4.89-.905 8.7-3.26c2.54-1.69 4.53-3.99 5.98-6.89 1.57-2.9 2.36-6.7 2.36-11.4q-.001-5.985-2.17-9.78c-1.45-2.66-3.38-4.77-5.8-6.34-2.3-1.57-4.95-2.66-7.97-3.26A47 47 0 0 0 165 28.3c-2.42 0-4.71.121-6.89.362z" style="color:#000;fill:#333;stroke-width:2.24;stroke:#292929;text-decoration-line:none;text-indent:0;text-transform:none"></path><path d="M455.72 520c1.93-5.19 4.65-9.6 8.15-13.2 3.62-3.74 7.97-6.64 13-8.7 5.19-2.17 11.1-3.26 17.8-3.26 13.7 0 24.3 4.11 32.1 12.3 7.85 8.09 11.8 19.9 11.8 35.5 0 14-1.81 26.2-5.44 36.4-3.5 10.1-8.27 18.7-14.3 25.5-5.92 6.76-12.8 12-20.7 15.6-7.85 3.62-16.1 5.8-24.8 6.52l-5.07-18.5c6.64-.846 12.6-2.48 17.8-4.89 5.19-2.42 9.66-5.38 13.4-8.88 3.74-3.62 6.76-7.67 9.06-12.1 2.42-4.59 4.11-9.48 5.07-14.7-2.9 3.14-6.04 5.32-9.42 6.52-3.26 1.21-7.67 1.81-13.2 1.81-4.59 0-9.18-.785-13.8-2.36a36.6 36.6 0 0 1-12.1-7.07c-3.5-3.26-6.51-7.3-8.81-12.09-2.17-4.95-3.26-10.8-3.26-17.4 0-6.16.906-11.8 2.72-17zm25.99 31.32c3.87 3.5 8.7 5.25 14.5 5.25 4.95 0 9-.785 12.1-2.36 3.14-1.57 5.56-3.5 7.25-5.8.362-2.54.544-4.95.544-7.25 0-3.38-.423-6.7-1.27-9.97-.846-3.26-2.17-6.16-3.99-8.7-1.69-2.54-3.93-4.53-6.7-5.98-2.66-1.57-5.86-2.36-9.6-2.36-5.92 0-10.5 1.93-13.8 5.8-3.26 3.74-4.89 9-4.89 15.8 0 6.89 1.986 12.07 5.856 15.57z" style="color:#000;fill:url(#a);stroke-linejoin:round;stroke-width:2.01;stroke:#366a04;text-decoration-line:none;text-indent:0;text-transform:none" transform="translate(-227 -489)"></path></svg></div>
<p>Eyeson is excited to announce a significant improvement to our video conferencing platform with the migration from VP8 to VP9 as our default video codec. This upgrade will automatically enhance your video conferencing experience without requiring any action on your part.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-vp9-for-eyeson-users">Benefits of VP9 for Eyeson Users<a href="https://docs.eyeson.com/blog/migration-to-vp9-video-codec#benefits-of-vp9-for-eyeson-users" class="hash-link" aria-label="Direct link to Benefits of VP9 for Eyeson Users" title="Direct link to Benefits of VP9 for Eyeson Users" translate="no">​</a></h2>
<ol>
<li class="">
<p>Superior HD Quality: Eyeson's video streams will now benefit from VP9's ability to maintain high video quality. You'll notice clearer, more detailed video in your conferences.</p>
</li>
<li class="">
<p>Reduced Bandwidth Usage: VP9 achieves 30-50% better compression rates than VP8 while maintaining the same level of video quality. This means you can enjoy high-quality video calls with less data consumption.</p>
</li>
<li class="">
<p>Improved Performance in Unstable Networks: VP9's efficiency allows for better video quality at lower bitrates, making it more resilient in challenging network environments. This results in smoother video experiences with less buffering and fewer interruptions, even when your internet connection is unstable.</p>
</li>
<li class="">
<p>Hardware Acceleration Support: Many modern devices, including smartphones and streaming devices, now support hardware-accelerated VP9 decoding. This ensures smooth playback and improved power efficiency, especially beneficial for mobile users.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compatibility-assured">Compatibility Assured<a href="https://docs.eyeson.com/blog/migration-to-vp9-video-codec#compatibility-assured" class="hash-link" aria-label="Direct link to Compatibility Assured" title="Direct link to Compatibility Assured" translate="no">​</a></h2>
<p>While we're moving forward with VP9, we understand that not all devices are created equal. For this reason, Eyeson continues to offer VP8 as a fallback option for older devices, ensuring that all users can still participate in video conferences regardless of their hardware.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-means-for-you">What This Means for You<a href="https://docs.eyeson.com/blog/migration-to-vp9-video-codec#what-this-means-for-you" class="hash-link" aria-label="Direct link to What This Means for You" title="Direct link to What This Means for You" translate="no">​</a></h2>
<p>As an Eyeson user, you don't need to take any action to benefit from this upgrade. The transition to VP9 will happen automatically, ensuring that you always have the best possible video conferencing experience. Whether you're joining calls from your smartphone, tablet, or computer, you'll enjoy:</p>
<ul>
<li class="">Clearer video quality</li>
<li class="">More stable connections, even on slower networks</li>
<li class="">Reduced data usage for the same high-quality experience</li>
<li class="">Improved battery life on mobile devices due to hardware acceleration</li>
</ul>
<p>By adopting VP9, Eyeson continues to demonstrate its commitment to providing cutting-edge video conferencing technology. This upgrade ensures that our users enjoy the best possible video quality while optimizing their bandwidth usage, all without any extra effort on their part.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/migration-to-vp9-video-codec#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>VP9</category>
            <category>video</category>
            <category>codec</category>
            <category>migration</category>
            <category>update</category>
        </item>
        <item>
            <title><![CDATA[Audio passthrough for Custom UI]]></title>
            <link>https://docs.eyeson.com/blog/audio-passthrough</link>
            <guid>https://docs.eyeson.com/blog/audio-passthrough</guid>
            <pubDate>Fri, 06 Dec 2024 09:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to implement audio passthrough options with eyeson Custom UI, allowing clearer sound from microphones and instruments without echo cancellation]]></description>
            <content:encoded><![CDATA[<p>The audio passthrough option allows for greater preservation of audio received from your microphone without using Eyeson's echo cancellation and audio filters.</p>
<p>This is ideal if your microphone or sound equipment has these features built-in or if you want to preserve the full range of sound from a musical instrument.</p>
<p><img decoding="async" loading="lazy" alt="Picture of a microphone connected to an audio mixer device" src="https://docs.eyeson.com/assets/images/cover-26438f9212163f0c885307a4e0c056d4.jpg" width="640" height="360" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prebuilt-ui">Prebuilt UI<a href="https://docs.eyeson.com/blog/audio-passthrough#prebuilt-ui" class="hash-link" aria-label="Direct link to Prebuilt UI" title="Direct link to Prebuilt UI" translate="no">​</a></h2>
<p>In our Prebuilt UI this feature is available in the desktop client in "Device Settings" under the "Advanced" options.</p>
<p><img decoding="async" loading="lazy" alt="Picture of prebuilt UI device settings with audio passthrough option" src="https://docs.eyeson.com/assets/images/gui-device-settings-128dd98226d452d7e28df390d749f9a5.png" width="1948" height="1334" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-ui">Custom UI<a href="https://docs.eyeson.com/blog/audio-passthrough#custom-ui" class="hash-link" aria-label="Direct link to Custom UI" title="Direct link to Custom UI" translate="no">​</a></h2>
<p>To offer audio passthrough in your Custom UI, EyesonJS v1.9.6 has added some functions and options.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-or-settings">Preview or Settings<a href="https://docs.eyeson.com/blog/audio-passthrough#preview-or-settings" class="hash-link" aria-label="Direct link to Preview or Settings" title="Direct link to Preview or Settings" translate="no">​</a></h3>
<p>In preview or device settings, audio passthrough can be turned on or off.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> deviceManager </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">DeviceManager</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">audioPassthroughToggle</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addEventListener</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'change'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> target </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> enabled </span><span class="token operator">=</span><span class="token plain"> target</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">checked</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    deviceManager</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setAudioPassthrough</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>If you just want to set the option in combination with a new audio input device, the option <code>preventUpdate</code> comes in handy.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">audioInputSelect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addEventListener</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'change'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> target </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    deviceManager</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setAudioPassthrough</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">preventUpdate</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    deviceManager</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setAudioInput</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">target</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-meeting">Join the meeting<a href="https://docs.eyeson.com/blog/audio-passthrough#join-the-meeting" class="hash-link" aria-label="Direct link to Join the meeting" title="Direct link to Join the meeting" translate="no">​</a></h3>
<p>To join the meeting with audio passthrough already enabled, you can set the option in the <code>start()</code> function. When <code>audioPassthrough</code> is omitted, it is set to <code>false</code> by default.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;access-token&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">audio</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">video</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">audioPassthrough</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="during-the-meeting">During the meeting<a href="https://docs.eyeson.com/blog/audio-passthrough#during-the-meeting" class="hash-link" aria-label="Direct link to During the meeting" title="Direct link to During the meeting" translate="no">​</a></h3>
<p><strong>This is the most important part!</strong> Whenever you call the <code>start_stream</code> event, you have to add the <code>audioPassthrough</code> option, otherwise it is <code>false</code> by default.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'start_stream'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">audio</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">video</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">audioPassthrough</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/audio-passthrough#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/js-docs/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>eyeson-js</category>
            <category>javascript</category>
            <category>audio</category>
            <category>passthrough</category>
            <category>sound</category>
        </item>
        <item>
            <title><![CDATA[API playback layout changes]]></title>
            <link>https://docs.eyeson.com/blog/api-playback-layout-changes</link>
            <guid>https://docs.eyeson.com/blog/api-playback-layout-changes</guid>
            <pubDate>Mon, 11 Nov 2024 09:00:00 GMT</pubDate>
            <description><![CDATA[How API playback layouts handle object-fit settings and display video content]]></description>
            <content:encoded><![CDATA[<p>We've made changes to the API playbacks layout that you need to be aware of!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>tl;dr</div><div class="admonitionContent_BuS1"><ul>
<li class="">Playback videos will use object-fit setting of its layout box</li>
<li class="">In "auto" layout, the object-fit is "auto" which most of the times means "cover" - in contrast to former "contain"!</li>
<li class="">To get the old behaviour, you have to set a layout with object-fit "contain"</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="layout-object-fit">Layout object-fit<a href="https://docs.eyeson.com/blog/api-playback-layout-changes#layout-object-fit" class="hash-link" aria-label="Direct link to Layout object-fit" title="Direct link to Layout object-fit" translate="no">​</a></h2>
<p>There are currently 3 types available for object-fit.</p>
<p><strong>"cover"</strong> fully fills the box with the video content. This means that the video is zoomed and oversized parts will be cropped.</p>
<p><strong>"contain"</strong> displays the whole video content inside the box. Black bars might appear.</p>
<p><strong>"auto"</strong> is a special type. It translates to default "cover", but "contain" for narrow portrait video content.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-has-changed">What has changed<a href="https://docs.eyeson.com/blog/api-playback-layout-changes#what-has-changed" class="hash-link" aria-label="Direct link to What has changed" title="Direct link to What has changed" translate="no">​</a></h2>
<p>So far, playbacks have always been shown using object-fit "contain" and there was no way of changing it.</p>
<p>From now on, <strong>playback makes use of the object-fit setting of its layout box</strong>. The default object-fit is "auto", which in most cases will zoom the video and crop oversized parts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-can-i-do">What can I do?<a href="https://docs.eyeson.com/blog/api-playback-layout-changes#what-can-i-do" class="hash-link" aria-label="Direct link to What can I do?" title="Direct link to What can I do?" translate="no">​</a></h2>
<p>If you want show the whole video content inside the box (black bars might appear), you need to set a layout with object-fit "contain" for the box where the playback is shown.</p>
<p>Here's an example:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"playback[audio]=true"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"playback[play_id]=demo-video"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"playback[url]=https://..."</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">https://api.eyeson.team/rooms/</span><span class="token operator">&lt;</span><span class="token plain">ACCESS_KEY</span><span class="token operator">&gt;</span><span class="token plain">/playbacks</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"layout=auto"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"name=playback-layout"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"users[]=demo-video"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"users[]="</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"map="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">320,0</span><span class="token plain">,640,360,</span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain">"contain</span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">,</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">320,360</span><span class="token plain">,640,360,</span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain">"auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">https://api.eyeson.team/rooms/</span><span class="token operator">&lt;</span><span class="token plain">ACCESS_KEY</span><span class="token operator">&gt;</span><span class="token plain">/layout</span><br></div></code></pre></div></div>
<p>Please note the playback's play_id is the same as the layout's user id.</p>
<p>Read more about the <a class="" href="https://docs.eyeson.com/blog/custom-layout-map-api">layout map API</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/api-playback-layout-changes#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>API</category>
            <category>eyeson-js</category>
            <category>playbacks</category>
            <category>layout</category>
            <category>changes</category>
        </item>
        <item>
            <title><![CDATA[How to Build a Virtual Situation Room with Eyeson (Part 1)]]></title>
            <link>https://docs.eyeson.com/blog/virtual-situation-room-1</link>
            <guid>https://docs.eyeson.com/blog/virtual-situation-room-1</guid>
            <pubDate>Tue, 22 Oct 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Part 1: Creating a virtual situation room]]></description>
            <content:encoded><![CDATA[<p>Virtual situation rooms are a quick way to build a command and control structure, and since they are virtual,
they do not require physical space and can be created in large numbers to give teams room to collaborate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="welcome-to-a-series-of-posts">Welcome to a series of posts<a href="https://docs.eyeson.com/blog/virtual-situation-room-1#welcome-to-a-series-of-posts" class="hash-link" aria-label="Direct link to Welcome to a series of posts" title="Direct link to Welcome to a series of posts" translate="no">​</a></h2>
<p>I will guide you through creating a virtual situation room in this series. It will have the following episodes.</p>
<ol>
<li class=""><a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-1"><strong>Creating a virtual situation room</strong></a>
Creating rooms, different kinds of users</li>
<li class=""><a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-2"><strong>Connecting the virtual situation room</strong></a>
Inviting participants, adding sources</li>
<li class=""><a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-3"><strong>Optimize the layout</strong></a>
Custom Layout</li>
<li class=""><a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-4"><strong>Permalink rooms</strong></a>
Different usage, standard ops only?</li>
</ol>
<p>If you have specific questions, <a href="https://help.eyeson.com/support-hours" target="_blank" rel="noopener noreferrer" class="">let me know</a>. Also, note that I might switch use cases to give you a blend of
pieces showing what you must do or how to solve certain requirements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-1-creating-a-virtual-situation-room">Part 1: Creating a virtual situation room<a href="https://docs.eyeson.com/blog/virtual-situation-room-1#part-1-creating-a-virtual-situation-room" class="hash-link" aria-label="Direct link to Part 1: Creating a virtual situation room" title="Direct link to Part 1: Creating a virtual situation room" translate="no">​</a></h2>
<p>To create a virtual situation room using the Eyeson API, you need to start an Eyeson room, which is the simplest solution for this scenario.</p>
<p>Here's a brief overview of what you need to do:</p>
<ol>
<li class="">If you haven't already, obtain an <strong>API key</strong> from Eyeson. Go to the
<a href="https://developers.eyeson.team/accounts/sign_up" target="_blank" rel="noopener noreferrer" class="">Developer Portal</a>, sign up, create a project, and get your API key now.</li>
<li class="">To create an Eyeson room, make a single <strong>POST request to the Eyeson API</strong>. This request will provide a
link to a reference web UI that can be used immediately.</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Basic curl script to create a room</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization: YOUR_API_KEY"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"id=VSR"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user[name]=Host"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms"</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">You'll receive <strong>a guest token and a direct URL</strong> to the Eyeson GUI in the API response.
This URL can be used without any further API communication, allowing your users to join the virtual situation room directly.</li>
</ol>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Example response from API</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"access_key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ACCESS_KEY"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"ready"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"locked"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"room"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tryout"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"VSR"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"ready"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"started_at"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2024-10-04T11:18:43.568Z"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"shutdown"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"guest_token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"e0dkCcDalWsQwxWT3Ena020b"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"team"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"VSR"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"user"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"66ffcf13fae130863805c90b"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"room_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tryout"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Host"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"avatar"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"guest"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"blocked"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"ready"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"links"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"self"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/4r3lJExyaa4RWXKEt948Az5e"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"gui"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/?4r3lJExyaa4RWXKEt948Az5e"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"guest_join"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/?guest=e0dkCcDalWsQwxWT3Ena020b"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"websocket"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rt?access_key=4r3lJExyaa4RWXKEt948Az5e"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  …</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ol start="4">
<li class="">You need to join that meeting room asap. The meeting will be spun down and cease to exist if you do not enter the meeting room.</li>
</ol>
<p>Let's break down the methods for authenticating even further:</p>
<ul>
<li class=""><strong>API Key</strong>: This is the most powerful authentication method for <em>server-side operations</em>. It's obtained from the Eyeson Developer dashboard and allows full access to the API. It should never be exposed in client-side code.</li>
<li class=""><strong>Access Key</strong>: This is used for <em>client-side authentication</em>, typically when a registered user joins a meeting. It's generated via the API and scoped to a specific user's permissions. It's used in the front end with the Eyeson iframe API.</li>
<li class=""><strong>Guest Token</strong>: This temporary, <em>single-use</em> token allows guests to join meetings without full user registration. It's typically generated when starting a meeting and provides limited, often read-only access to meeting features.</li>
</ul>
<p>The choice between these methods depends on your use case. For backend operations and management, you'll use the API Key. For registered users joining meetings, you'll use Access Keys. And for quick, temporary access for guests, you'll use Guest Tokens. Each method balances security, convenience, and feature access differently.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-links-for-creating-virtual-situation-rooms-and-handling-users">Further Links for creating Virtual Situation Rooms and Handling Users<a href="https://docs.eyeson.com/blog/virtual-situation-room-1#further-links-for-creating-virtual-situation-rooms-and-handling-users" class="hash-link" aria-label="Direct link to Further Links for creating Virtual Situation Rooms and Handling Users" title="Direct link to Further Links for creating Virtual Situation Rooms and Handling Users" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/eyeson-api#how-to-start-your-first-meeting">Start a Meeting</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-room">Room API endpoint</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/references/user">User API endpoint</a></li>
</ul>]]></content:encoded>
            <category>virtual situation room</category>
            <category>API</category>
        </item>
        <item>
            <title><![CDATA[How to Build a Virtual Situation Room with Eyeson (Part 2)]]></title>
            <link>https://docs.eyeson.com/blog/virtual-situation-room-2</link>
            <guid>https://docs.eyeson.com/blog/virtual-situation-room-2</guid>
            <pubDate>Tue, 22 Oct 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Part 2: Connecting People to the Virtual Situation Room]]></description>
            <content:encoded><![CDATA[<p>In the <a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-1">first part</a>, we looked at creating the virtual situation room. Further, we looked at the
authentication and users. We will now consider bringing the participants into the room and adding sources.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connecting-people-to-the-virtual-situation-room">Connecting People to the Virtual Situation Room<a href="https://docs.eyeson.com/blog/virtual-situation-room-2#connecting-people-to-the-virtual-situation-room" class="hash-link" aria-label="Direct link to Connecting People to the Virtual Situation Room" title="Direct link to Connecting People to the Virtual Situation Room" translate="no">​</a></h2>
<p>As we learned in <a class="" href="https://docs.eyeson.com/blog/virtual-situation-room-1">Part 1</a>, there are multiple ways to admit people to the room. Let’s examine how they connect to the room.</p>
<ol>
<li class="">
<p><strong>API Key user</strong>
People or code pieces can use the API key to start a meeting. This is usually the host. Once the meeting has started, the user can use the link or access key from the API response to join.</p>
</li>
<li class="">
<p><strong>Access Key user</strong>
This is a known user. You can create her/him by using the join method from the SDKs. The user name could be the email address or something similar. This way, you can pull names and other user data from your system and show them in the call.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR_API_KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createUserWithAccessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">username</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">username</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">accessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Guest user</strong>
The guest user link does not require authentication but is only valid for the current session. Once the room is closed, the link will be invalid. Guests can be invited from the call interface with a shareable link or a QR Code. This allows any responder on the call to share the Virtual Situation Rooms for collaboration.</p>
</li>
</ol>
<p>With <a class="" href="https://docs.eyeson.com/docs/sdks/js/eyeson-js-sdk">Javascript SDK</a> you can handle a lot of the options regarding users easily and fast.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">onEvent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">event</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'add_user'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">initial</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">  type: 'add_user',</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">  user: {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    id,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    name,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    avatar, // url to users avatar</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    guest: true | false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">  }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">  initial: true | false // initial connect or reconnect</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">*/</span><br></div></code></pre></div></div>
<p><em>What if I don’t want the room to be <strong>that</strong> open?</em></p>
<p>You have two options:</p>
<ul>
<li class="">
<p><em>Number 1</em> is to <a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-room#lock-meeting">lock the room</a> after everybody you want in has joined. This is the hard way to do,
and it might not be feasible during an operation.</p>
</li>
<li class="">
<p><em>Number 2</em> is to remove the guest_join when creating the call. Ensure
you have the <a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-room">option turned off in the payload</a> of the POST request.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">guest_token_available</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token plain">false</span><br></div></code></pre></div></div>
</li>
</ul>
<p>Let’s assume that everyone is now on the call or at least has the link to join and move on to connecting the sources.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-image-content-to-the-virtual-situation-room">Adding image content to the Virtual Situation Room<a href="https://docs.eyeson.com/blog/virtual-situation-room-2#adding-image-content-to-the-virtual-situation-room" class="hash-link" aria-label="Direct link to Adding image content to the Virtual Situation Room" title="Direct link to Adding image content to the Virtual Situation Room" translate="no">​</a></h2>
<p>The Eyeson Layer API provides a flexible system for adding dynamic visual elements to video meetings. All data that can be visualized can be added to the room. So if it can be an image, it can be added to the room. Be aware that a transparent foreground image shows the camera feeds.</p>
<p>It offers three main methods:</p>
<ul>
<li class="">File: Direct image upload (also check out <a href="https://github.com/eyeson-team/eyeson-node-layer" target="_blank" rel="noopener noreferrer" class="">eyeson-node-layer</a> on that)</li>
<li class="">URL: Link to an online image</li>
<li class="">Insert[content]: Server-generated text overlays</li>
</ul>
<p><em><a class="" href="https://docs.eyeson.com/docs/rest/how-to-guides">See some examples</a>.</em></p>
<p>Key features:</p>
<ul>
<li class="">Dynamic content (e.g., real-time clock overlays, maps with moving markers,...)</li>
<li class="">Support for text, images, and shapes</li>
<li class="">Customizable positioning and styling</li>
</ul>
<p>Typical uses include images, maps, API data displays, and custom meeting overlays.</p>
<p>Implementation is straightforward using the sendLayer() function. While Node.js libraries are available, the core functionality is language-agnostic, allowing integration with various programming environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connecting-sources-to-the-virtual-situation-room">Connecting sources to the Virtual Situation Room<a href="https://docs.eyeson.com/blog/virtual-situation-room-2#connecting-sources-to-the-virtual-situation-room" class="hash-link" aria-label="Direct link to Connecting sources to the Virtual Situation Room" title="Direct link to Connecting sources to the Virtual Situation Room" translate="no">​</a></h2>
<p>Some sources are different than others: They already have video streams. If you want to add bodycams, drones, and CCTV cameras, you must first bring their streams to the current meeting. We will use <a class="" href="https://docs.eyeson.com/blog/ghost-rmtp">Eyeson Ghost as a proxy</a> to do just that.</p>
<p>First, you need to <a href="https://github.com/eyeson-team/ghost" target="_blank" rel="noopener noreferrer" class="">install the release for your platform from GitHub</a>. Afterward, you can run the Ghost to connect to the Video Meeting as a guest by entering the following line into a terminal</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Run ghost RTMP server on Windows</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">./rtmp-server_windows_amd64.exe https://app.eyeson.team/?guest</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$GUEST_TOKEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div>
<p>Now, we have to connect the drone to the server by giving it the destination to stream to. Usually, that is port 1935 of the IP address on which the Ghost machine runs. It could be rtmp://192.168.0.1:1935/drones/alpha. Of course there is a parameter to change the port.</p>
<p>If you and the drone are in different networks, you could use <a href="https://ngrok.com/" target="_blank" rel="noopener noreferrer" class="">ngrok</a> to connect the drone to a public ngrok endpoint and then to the call.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-links-for-adding-sources-and-content-to-the-eyeson-video-conference">Further Links for adding sources and content to the Eyeson Video Conference<a href="https://docs.eyeson.com/blog/virtual-situation-room-2#further-links-for-adding-sources-and-content-to-the-eyeson-video-conference" class="hash-link" aria-label="Direct link to Further Links for adding sources and content to the Eyeson Video Conference" title="Direct link to Further Links for adding sources and content to the Eyeson Video Conference" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.eyeson.com/docs/sdks/js/features/users">Joining and Leaving users with the Javascript SDK</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/how-to/layers-overlay-image">Overlay Image</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/how-to/layers-background-image">Background Image</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/how-to/layers-local-images">Local images</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/blog/ghost-rmtp">Using Ghost to Create a RTMP-to-webrtc Proxy</a></li>
<li class=""><a href="https://github.com/eyeson-team/ghost" target="_blank" rel="noopener noreferrer" class="">Github Repository of Eyeson Ghost</a></li>
</ul>]]></content:encoded>
            <category>virtual situation room</category>
            <category>overlay</category>
            <category>eyeson-node</category>
            <category>eyeson-js</category>
            <category>ghost</category>
        </item>
        <item>
            <title><![CDATA[How to Build a Virtual Situation Room with Eyeson (Part 3)]]></title>
            <link>https://docs.eyeson.com/blog/virtual-situation-room-3</link>
            <guid>https://docs.eyeson.com/blog/virtual-situation-room-3</guid>
            <pubDate>Tue, 22 Oct 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Part 3: Layout functionalities of the Eyeson One View API]]></description>
            <content:encoded><![CDATA[<p>In Part 3 of our Series, we will look at the layout functionalities of the Eyeson One View API. Since Eyeson is built on top of a next-generation MCU, you can be sure that everyone sees the same things at the same time. So, the Layout is applied by the MCU and can not be changed individually.</p>
<p>Some <a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-layout#list-of-predefined-layouts">predefined layouts</a> come with Eyeson One View, optimized for conversational topics. If not instructed otherwise, each call starts with an auto layout.</p>
<p>Custom layouts enable you to define your own video arrangement by specifying a custom name, a map of coordinates, and object-fit values for each participant's or source’s video feed.</p>
<p>Now, let's dive into the details:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="defining-a-custom-layout">Defining a Custom Layout<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#defining-a-custom-layout" class="hash-link" aria-label="Direct link to Defining a Custom Layout" title="Direct link to Defining a Custom Layout" translate="no">​</a></h2>
<p>To create a custom layout, you'll use the Layout API endpoint with specific parameters:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"layout=auto"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"name=custom-map"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"map=[[20,80,400,400,</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">auto</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">],[440,160,400,400,</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">contain</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">],[860,240,400,400,</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">cover</span><span class="token string entity" style="color:rgb(255, 121, 198)">\"</span><span class="token string" style="color:rgb(255, 121, 198)">]]"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"users[]="</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"users[]=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$USER_ID1</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"users[]="</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.eyeson.team/rooms/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ACCESS_KEY</span><span class="token string" style="color:rgb(255, 121, 198)">/layout"</span><br></div></code></pre></div></div>
<p>This request sets up a custom layout with three video spots, each with different positioning and object-fit values.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-map-parameter">Understanding the Map Parameter<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#understanding-the-map-parameter" class="hash-link" aria-label="Direct link to Understanding the Map Parameter" title="Direct link to Understanding the Map Parameter" translate="no">​</a></h3>
<p>The <code>map</code> parameter is crucial for custom layouts. It's an array of arrays, where each inner array represents a video spot:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object-fit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>x</code> and <code>y</code> are the coordinates for the top-left corner of the spot</li>
<li class=""><code>width</code> and <code>height</code> define the size of the spot</li>
<li class=""><code>"object-fit"</code> determines how the video fills the spot</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="object-fit-options">Object-Fit Options<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#object-fit-options" class="hash-link" aria-label="Direct link to Object-Fit Options" title="Direct link to Object-Fit Options" translate="no">​</a></h3>
<p>You have three choices for object-fit:</p>
<ul>
<li class=""><code>"cover"</code>: Scales the video to cover the whole spot, maintaining aspect ratio (default)</li>
<li class=""><code>"contain"</code>: Fits the video within the spot, potentially leaving letterbox space</li>
<li class=""><code>"auto"</code>: Chooses between cover and contain based on the video source's aspect ratio</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="user-positioning">User Positioning<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#user-positioning" class="hash-link" aria-label="Direct link to User Positioning" title="Direct link to User Positioning" translate="no">​</a></h3>
<p>The <code>users[]</code> parameter allows you to assign specific users to spots.
Empty strings (<code>""</code>) can be used to leave spots vacant. A placeholder string
can be used to block the spot from being used.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="layout-considerations">Layout Considerations<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#layout-considerations" class="hash-link" aria-label="Direct link to Layout Considerations" title="Direct link to Layout Considerations" translate="no">​</a></h3>
<ul>
<li class="">Ensure all spots fit within the video stream (1280x720 for widescreen or 1280x960 for standard)</li>
<li class="">The number of map indices should match the number of user parameters</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visualization-tool">Visualization Tool<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#visualization-tool" class="hash-link" aria-label="Direct link to Visualization Tool" title="Direct link to Visualization Tool" translate="no">​</a></h3>
<p>Eyeson provides a visualization tool to help you plan your custom layouts. This can be especially useful when determining coordinates for the <code>map</code> parameter.</p>
<form><p>Map<br><textarea rows="10" cols="60" placeholder="[
  [320, 0, 640, 360, &quot;auto&quot;],
  [320, 360, 640, 360, &quot;auto&quot;]
]">[
  [20, 80, 400, 400, "auto"],
  [440, 160, 400, 400, "contain"],
  [860, 240, 400, 400, "cover"]
]</textarea></p><p><label>Widescreen <input type="checkbox" checked=""></label></p><p><button type="submit" class="button button--primary">Check</button><button type="button" class="button button--link">Clear</button></p></form><p>Preview<br><canvas id="layoutMapPreview"></canvas></p>
<p>By leveraging custom layouts, you can create unique video experiences tailored to your specific needs. This feature sets Eyeson apart as a highly configurable video API solution. Out of the box 10 spots are supported. These also can overlap in the order they are added.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-links-for-creating-layouts-and-design-in-an-eyeson-video-conference">Further Links for creating layouts and design in an Eyeson Video Conference<a href="https://docs.eyeson.com/blog/virtual-situation-room-3#further-links-for-creating-layouts-and-design-in-an-eyeson-video-conference" class="hash-link" aria-label="Direct link to Further Links for creating layouts and design in an Eyeson Video Conference" title="Direct link to Further Links for creating layouts and design in an Eyeson Video Conference" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-layout">Layout API endpoint</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/references/meeting-layout#custom-layout-map">Custom Layout examples</a></li>
</ul>]]></content:encoded>
            <category>virtual situation room</category>
            <category>layout</category>
        </item>
        <item>
            <title><![CDATA[How to Build a Virtual Situation Room with Eyeson (Part 4)]]></title>
            <link>https://docs.eyeson.com/blog/virtual-situation-room-4</link>
            <guid>https://docs.eyeson.com/blog/virtual-situation-room-4</guid>
            <pubDate>Tue, 22 Oct 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Part 4: Create pre-defined meeting rooms with shareable and permanent guest links]]></description>
            <content:encoded><![CDATA[<p>Permalinks in Eyeson allow developers to create pre-defined meeting rooms with shareable and permanent guest links, enabling meeting setup and invitation distribution before the actual meeting starts.</p>
<p>Now, let's explore permalinks in more depth:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-permalinks">Introduction to Permalinks<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#introduction-to-permalinks" class="hash-link" aria-label="Direct link to Introduction to Permalinks" title="Direct link to Introduction to Permalinks" translate="no">​</a></h2>
<p>Permalinks address a common need among developers: the ability to share meeting links before the meeting is actually created. Previously, Eyeson API only allowed immediate meeting creation, but with the Permalink API, you can now pre-define meeting rooms and share guest links in advance.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-permalink">Creating a Permalink<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#creating-a-permalink" class="hash-link" aria-label="Direct link to Creating a Permalink" title="Direct link to Creating a Permalink" translate="no">​</a></h3>
<p>To create a permalink, use the following API endpoint:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /permalink</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">host-user-name</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># options[exit_url] and many more options</span><br></div></code></pre></div></div>
<p>This request will return a response containing the necessary links:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string-property property">"links"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string-property property">"gui"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/permalink?9clgjJXl1NzbcmF5vfXWhAVJ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string-property property">"guest_join"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/permalink?guest=R2SdUxiqKhpBoUu0oi0pZZkZ"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>It's crucial to keep the host user GUI links secret and only share guest links.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prebuilt-ui-vs-custom-ui">Prebuilt UI vs. Custom UI<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#prebuilt-ui-vs-custom-ui" class="hash-link" aria-label="Direct link to Prebuilt UI vs. Custom UI" title="Direct link to Prebuilt UI vs. Custom UI" translate="no">​</a></h3>
<p>Eyeson provides links for both prebuilt UI and custom UI implementations. The prebuilt UI works out-of-the-box, while the custom UI offers more control through additional API endpoints.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="process-for-custom-ui">Process for Custom UI<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#process-for-custom-ui" class="hash-link" aria-label="Direct link to Process for Custom UI" title="Direct link to Process for Custom UI" translate="no">​</a></h3>
<p>When using custom UI, follow these steps:</p>
<ol>
<li class="">Create a permalink and store its user-token and guest-token.</li>
<li class="">Allow meeting hosts to start the meeting at any time using the user-token.</li>
<li class="">Let guests wait until the meeting is running, then join using the guest-token</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-and-deleting-permalinks">Updating and Deleting Permalinks<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#updating-and-deleting-permalinks" class="hash-link" aria-label="Direct link to Updating and Deleting Permalinks" title="Direct link to Updating and Deleting Permalinks" translate="no">​</a></h3>
<p>You can update permalink settings or register additional host users after creation:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">PUT /permalink/</span><span class="token operator">&lt;</span><span class="token plain">permalink-id</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">recording_available</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token plain">false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># options[exit_url] and many more options</span><br></div></code></pre></div></div>
<p>To add new host users:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /permalink/</span><span class="token operator">&lt;</span><span class="token plain">permalink-id</span><span class="token operator">&gt;</span><span class="token plain">/users</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">new-host-user-name</span><span class="token operator">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="permalink-information">Permalink Information<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#permalink-information" class="hash-link" aria-label="Direct link to Permalink Information" title="Direct link to Permalink Information" translate="no">​</a></h3>
<p>The API provides details about the permalink, including its current running state, layout settings, and custom fields. This information is crucial for integrating permalinks with your custom UI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-with-eyeson-iframe-api">Integration with Eyeson IFrame API<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#integration-with-eyeson-iframe-api" class="hash-link" aria-label="Direct link to Integration with Eyeson IFrame API" title="Direct link to Integration with Eyeson IFrame API" translate="no">​</a></h2>
<p>For easy integration of Eyeson video conferencing into your website or app, you can use the <a class="" href="https://docs.eyeson.com/docs/sdks/iframe/eyeson-iframe-sdk">IFrame API</a>. This involves including the API script, providing an HTML container, and initializing the EyesonIframe function:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">https://app.eyeson.team/iframe-api.js</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">meeting</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token script language-javascript"> </span><span class="token script language-javascript class-name">EyesonIframe</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'#meeting'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property">accessKey</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'...'</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<p>The IFrame API also offers advanced features for interacting with the Eyeson UI and observing meeting events.</p>
<p>By leveraging permalinks and the IFrame API, you can create a seamless video conferencing experience within your application, allowing for pre-scheduled meetings and easy participant invitations.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">https://app.eyeson.team/iframe-api.js</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">meeting</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> permalinkGuestToken </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'HoYq1gudkP9D7NXF6ERTnd05'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token script language-javascript"> </span><span class="token script language-javascript class-name">EyesonIframe</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'#meeting'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript literal-property property">isPermalink</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript boolean">true</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript literal-property property">guest</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property">token</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> permalinkGuestToken </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-links-for-creating-and-managing-permalinks">Further Links for Creating and Managing Permalinks<a href="https://docs.eyeson.com/blog/virtual-situation-room-4#further-links-for-creating-and-managing-permalinks" class="hash-link" aria-label="Direct link to Further Links for Creating and Managing Permalinks" title="Direct link to Further Links for Creating and Managing Permalinks" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.eyeson.com/docs/rest/references/permalink">Permalink documentation</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/blog/permalink-api">Permalink Introductory Blog</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/sdks/iframe/eyeson-iframe-sdk#iframe-with-permalink">IFrame API with Permalink</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/sdks/android/usage/permalink">Permalink with Android</a></li>
<li class=""><a class="" href="https://docs.eyeson.com/docs/sdks/js/features/permalink">Permalink with Javascript</a></li>
</ul>]]></content:encoded>
            <category>virtual situation room</category>
            <category>permalink</category>
            <category>iframe</category>
        </item>
        <item>
            <title><![CDATA[Introducing the Permalink API!]]></title>
            <link>https://docs.eyeson.com/blog/permalink-api</link>
            <guid>https://docs.eyeson.com/blog/permalink-api</guid>
            <pubDate>Mon, 17 Jun 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Introducing the Permalink API. Pre-define meeting rooms, get sharable guest-links, and start whenever needed with the same permanent links.]]></description>
            <content:encoded><![CDATA[<p>Finally, developers are able to create pre-defined meeting rooms, get sharable
guest-links, and start the meeting whenever needed with the same permanent links!</p>
<p>Share a meeting link, before the meeting has even being started!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /permalink</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">host-user-name</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># options[exit_url] and many more options</span><br></div></code></pre></div></div>
<p>This will give you all the links you need.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string-property property">"links"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string-property property">"gui"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/permalink?9clgjJXl1NzbcmF5vfXWhAVJ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string-property property">"guest_join"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://app.eyeson.team/permalink?guest=R2SdUxiqKhpBoUu0oi0pZZkZ"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>Host user GUI links need to be kept secret! <strong>Make sure to only share guest links!</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation">Motivation<a href="https://docs.eyeson.com/blog/permalink-api#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation" translate="no">​</a></h2>
<p>Until now, Eyeson API was designed to only request a meeting when it is being used immediately.</p>
<p>A request to <code>POST /rooms</code> will create a meeting room that becomes instantly ready.
So the link received from that request is only valid for the running meeting.
If no one enters the meeting room, it will shut down soon automatically and the link becomes invalid.</p>
<p>Many developers have asked for a link they can share even before the meeting is started.</p>
<p>Enter Permalink API!</p>
<p>Pre-define your meeting room with the desired settings, share the guest link via WhatsApp, Email, Calender, etc.
and start the meeting with your personal GUI link at the proposed time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prebuilt-ui-vs-custom-ui">Prebuilt UI vs. Custom UI<a href="https://docs.eyeson.com/blog/permalink-api#prebuilt-ui-vs-custom-ui" class="hash-link" aria-label="Direct link to Prebuilt UI vs. Custom UI" title="Direct link to Prebuilt UI vs. Custom UI" translate="no">​</a></h2>
<p>The links provided are using Eyeson's prebuilt UI so you don't have to care about further steps, it will just work out-of-the-box!</p>
<p>Of course we've thought about you and added more functions to give you more control of the power of Permalink API.</p>
<p>There are API endpoints to gather permalink meeting information like the current
running state, start the meeting from a permalink user token, register a guest
user to a permalink meeting, and of course many more. This makes it easy to use
Permalink API with your Custom UI.</p>
<p>Process for Custom UI:</p>
<ul>
<li class="">Create permalink and store its user-token and guest-token</li>
<li class="">Meeting hosts are allowed to start the meeting at any time using the user-token</li>
<li class="">Guests have to wait until the meeting is running and then join using the guest-token</li>
</ul>
<p>That's it!</p>
<p>We have <a class="" href="https://docs.eyeson.com/docs/sdks/js/features/permalink">added functions in EyesonJS</a>, that make it even more easy to integrate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-and-delete">Update and Delete<a href="https://docs.eyeson.com/blog/permalink-api#update-and-delete" class="hash-link" aria-label="Direct link to Update and Delete" title="Direct link to Update and Delete" translate="no">​</a></h2>
<p>After creating a permalink, you can update its settings, if needed.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">PUT /permalink/</span><span class="token operator">&lt;</span><span class="token plain">permalink_id</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">recording_available</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token plain">false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># options[exit_url] and many more options</span><br></div></code></pre></div></div>
<p>Besides updating, you can also register more host users to a permalink which allows them to also start the meeting at the agreed time.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /permalink/</span><span class="token operator">&lt;</span><span class="token plain">permalink_id</span><span class="token operator">&gt;</span><span class="token plain">/users</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">=</span><span class="token operator">&lt;</span><span class="token plain">new-host-user-name</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># user[id]=&lt;user id&gt; and other options</span><br></div></code></pre></div></div>
<p>And of course, a permalink can be deleted. Note that all links and tokens become invalid afterwards.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">DELETE /permalink/&lt;permalink_id&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">HEADERS Authorization</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-information">Further information<a href="https://docs.eyeson.com/blog/permalink-api#further-information" class="hash-link" aria-label="Direct link to Further information" title="Direct link to Further information" translate="no">​</a></h2>
<p>If this catched your attention and you want to dive deeper, read the <a class="" href="https://docs.eyeson.com/docs/rest/references/permalink">full documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/permalink-api#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>API</category>
            <category>permalink</category>
            <category>pre-define</category>
        </item>
        <item>
            <title><![CDATA[Custom UI - System compute pressure]]></title>
            <link>https://docs.eyeson.com/blog/system-pressure</link>
            <guid>https://docs.eyeson.com/blog/system-pressure</guid>
            <pubDate>Tue, 11 Jun 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Get informed about your system compute pressure.]]></description>
            <content:encoded><![CDATA[<p>Inform your users about their current system compute pressure. This way they know when it's time to reduce some background activity to keep the meeting running smoothly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-and-feature-detection">Initializing and Feature detection<a href="https://docs.eyeson.com/blog/system-pressure#initializing-and-feature-detection" class="hash-link" aria-label="Direct link to Initializing and Feature detection" title="Direct link to Initializing and Feature detection" translate="no">​</a></h2>
<p>Currently this feature is only available in Chromium based browsers like Chrome, Edge, and Opera since version 125. For more information about availabilty, see <a href="https://caniuse.com/mdn-api_pressureobserver" target="_blank" rel="noopener noreferrer" class="">caniuse.com</a>.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">FeatureDetector</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">SystemPressureMonitor</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">FeatureDetector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">canMonitorSystemPressure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">startSystemPressureMonitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">startSystemPressureMonitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> monitor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">SystemPressureMonitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">sampleInterval</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">3000</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    monitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">onUpdate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">state</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">cpu pressure: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">state</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> monitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The sample interval is the requested sampling interval expressed in milliseconds. It defaults to 1000ms.
We recommend setting it to some more seconds to avoid many quick switches.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="end-monitor">End monitor<a href="https://docs.eyeson.com/blog/system-pressure#end-monitor" class="hash-link" aria-label="Direct link to End monitor" title="Direct link to End monitor" translate="no">​</a></h2>
<p>At the end of the meeting, when the observer is not needed anymore, it can be detroyed.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">monitor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">destroy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pressure-states">Pressure states<a href="https://docs.eyeson.com/blog/system-pressure#pressure-states" class="hash-link" aria-label="Direct link to Pressure states" title="Direct link to Pressure states" translate="no">​</a></h2>
<p>The pressure state is defined as following.</p>
<p><code>nominal</code></p>
<blockquote>
<p>The conditions of the target device are at an acceptable level with no noticeable adverse effects on the user.</p>
</blockquote>
<p><code>fair</code></p>
<blockquote>
<p>Target device pressure, temperature and/or energy usage are slightly elevated, potentially resulting in reduced battery-life, as well as fans (or systems with fans) becoming active and audible. Apart from that the target device is running flawlessly and can take on additional work.</p>
</blockquote>
<p><code>serious</code></p>
<blockquote>
<p>Target device pressure, temperature and/or energy usage is consistently highly elevated. The system may be throttling as a countermeasure to reduce thermals.</p>
</blockquote>
<p><code>critical</code></p>
<blockquote>
<p>The temperature of the target device or system is significantly elevated and it requires cooling down to avoid any potential issues.</p>
</blockquote>
<p><em>Source: <a href="https://w3c.github.io/compute-pressure/#pressure-states" target="_blank" rel="noopener noreferrer" class="">https://w3c.github.io/compute-pressure/#pressure-states</a></em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More information<a href="https://docs.eyeson.com/blog/system-pressure#more-information" class="hash-link" aria-label="Direct link to More information" title="Direct link to More information" translate="no">​</a></h2>
<p>Read more about all available functions in eyesonJS in the <a class="" href="https://docs.eyeson.com/docs/sdks/js/utilities/system-pressure-monitor">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/system-pressure#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate to <a href="https://github.com/eyeson-team/js-docs/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>eyeson-js</category>
            <category>javascript</category>
            <category>cpu pressure</category>
            <category>compute pressure</category>
        </item>
        <item>
            <title><![CDATA[Share location]]></title>
            <link>https://docs.eyeson.com/blog/share-location</link>
            <guid>https://docs.eyeson.com/blog/share-location</guid>
            <pubDate>Thu, 16 May 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[How to easily share location in an Eyeson meeting]]></description>
            <content:encoded><![CDATA[<p>Nowadays "share location" is one of the basic features in mobile chat applications.</p>
<p>When share location is triggered, the device collects its geolocation information and after adjusting and confirming the location is sent and becomes visible as a map for other chat users. This is extremely useful, especially in situations where you need quick help and can't describe the location in words.</p>
<p>We've added some new functions dedicated to share and display location information in Eyeson meetings.</p>
<p><img decoding="async" loading="lazy" alt="Share location map with a marker" src="https://docs.eyeson.com/assets/images/share-location-3afa328e152eb46b04434155b84f17c7.png" width="452" height="302" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-and-share-current-position">Get and share current position<a href="https://docs.eyeson.com/blog/share-location#get-and-share-current-position" class="hash-link" aria-label="Direct link to Get and share current position" title="Direct link to Get and share current position" translate="no">​</a></h2>
<p>The easiest way to share your location with Eyeson is to get your current position and generate a link with a common online maps services like Google Maps.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">eyeson</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Geolocation</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token maybe-class-name">Geolocation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getCurrentPosition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> googleMaps </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">Geolocation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">generateLinkFromCoordinates</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'send_chat'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token operator">:</span><span class="token plain"> googleMaps </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>This is just a simple example. For more complex and safer code, please read the <a class="" href="https://docs.eyeson.com/docs/sdks/js/utilities/geolocation">Geolocation documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="parse-position-from-shared-links">Parse position from shared links<a href="https://docs.eyeson.com/blog/share-location#parse-position-from-shared-links" class="hash-link" aria-label="Direct link to Parse position from shared links" title="Direct link to Parse position from shared links" translate="no">​</a></h2>
<p>The other way around, if you need to handle position data from a shared link, you can use the <code>parseCoordinatesFromLink()</code> function.</p>
<p>It supports links from Google Maps, OpenStreetMap, Bing Maps, and HERE WeGo.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">eyeson</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Geolocation</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">onEvent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">event</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'chat'</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token maybe-class-name">Geolocation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">linkContainsCoordinates</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">Geolocation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">parseCoordinatesFromLink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">displayMap</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>A parsable link looks for example like this:
<a href="https://www.google.com/maps/place/51%C2%B030'18.0%22+0%C2%B005'24.0%22W/@51.505,-0.09,17z" target="_blank" rel="noopener noreferrer" class="">https://www.google.com/maps/place/51°30'18.0"+0°05'24.0"W/@51.505,-0.09,17z</a>
where <code>51.505</code> is latitude and <code>-0.09</code> is the longitude.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="display-location-map">Display location map<a href="https://docs.eyeson.com/blog/share-location#display-location-map" class="hash-link" aria-label="Direct link to Display location map" title="Direct link to Display location map" translate="no">​</a></h2>
<p>We recommend <a href="https://leafletjs.com/" target="_blank" rel="noopener noreferrer" class="">Leaflet</a>, a JavaScript library for interactive maps in your custom UI. It plays very nicely together with <a class="" href="https://docs.eyeson.com/docs/sdks/js/utilities/geolocation">Eyeson Geolocation functions</a>.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Geolocation</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/js'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Leaflet</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'https://cdn.jsdelivr.net/npm/leaflet/+esm'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> zoom </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">17</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token maybe-class-name">Geolocation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getCurrentPosition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> map </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">Leaflet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'map'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">setView</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> zoom</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token maybe-class-name">Leaflet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">tileLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'https://tile.openstreetmap.org/{z}/{x}/{y}.png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">attribution</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&amp;copy; &lt;a href="http://www.openstreetmap.org/copyright"&gt;OpenStreetMap&lt;/a&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addTo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token maybe-class-name">Leaflet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">marker</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">latitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> longitude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addTo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/share-location#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate to <a href="https://github.com/eyeson-team/js-docs/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>eyeson-js</category>
            <category>javascript</category>
            <category>geolocation</category>
        </item>
        <item>
            <title><![CDATA[Dynamic layer creation with eyeson-node-layer]]></title>
            <link>https://docs.eyeson.com/blog/eyeson-node-layer</link>
            <guid>https://docs.eyeson.com/blog/eyeson-node-layer</guid>
            <pubDate>Tue, 09 Apr 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Define your layers and let the library create the image for you.]]></description>
            <content:encoded><![CDATA[<p>Define your overlay and background layer with dynamic content and let the library create the image for you on-the-fly.</p>
<p><a href="https://github.com/eyeson-team/eyeson-node-layer" target="_blank" rel="noopener noreferrer" class="">https://github.com/eyeson-team/eyeson-node-layer</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://docs.eyeson.com/blog/eyeson-node-layer#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>The <a class="" href="https://docs.eyeson.com/docs/rest/references/layers">Eyeson Layer API</a> offers 2 different ways of usage:</p>
<ol>
<li class=""><code>file</code> ... binary data of an image</li>
<li class=""><code>url</code> ... public URL to an image file</li>
</ol>
<p><a href="https://github.com/eyeson-team/eyeson-node-layer" target="_blank" rel="noopener noreferrer" class="">Eyeson-node-layer</a> is based on "<a href="https://github.com/Brooooooklyn/canvas" target="_blank" rel="noopener noreferrer" class="">canvas for node</a>" and so it provides many functions to draw on a canvas in the background and get its image binary data for using Layer API via its <code>file</code> option.</p>
<p>In this post I want to introduce <a href="https://github.com/eyeson-team/eyeson-node-layer" target="_blank" rel="noopener noreferrer" class="">eyeson-node-layer</a> and it's numerous ways to dynamically show data in any Eyeson meeting.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>In order to start a meeting, you have to use an API key. If you don't have it already, <a class="" href="https://docs.eyeson.com/docs/rest/eyeson-api#how-to-obtain-an-eyeson-api-key">here's how to get your API key</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://docs.eyeson.com/blog/eyeson-node-layer#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h2>
<p>Add <a href="https://github.com/eyeson-team/eyeson-node-layer" target="_blank" rel="noopener noreferrer" class="">eyeson-node-layer</a> to your Node project via npm or yarn.
It makes sense to combine it with <a href="https://github.com/eyeson-team/eyeson-node" target="_blank" rel="noopener noreferrer" class="">eyeson-node</a> to apply created layers directly in the meeting.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">npm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Yarn</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> i </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--save</span><span class="token plain"> @eyeson/node @eyeson/node-layer</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> @eyeson/node @eyeson/node-layer</span><br></div></code></pre></div></div></div></div></div>
<p>To make it comfortable, <a href="https://github.com/eyeson-team/eyeson-node" target="_blank" rel="noopener noreferrer" class="">eyeson-node</a> v1.2.0 has added a function <code>sendLayer()</code> to send image buffer or even EyesonLayer directly.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR API-KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// layer.addText, addImage, addRect, etc.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USERNAME&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The complete list of functions is documented in the <a href="https://github.com/eyeson-team/eyeson-node-layer/blob/main/README.md" target="_blank" rel="noopener noreferrer" class="">README</a> file.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-watermark-with-your-logo">Example watermark with your logo<a href="https://docs.eyeson.com/blog/eyeson-node-layer#example-watermark-with-your-logo" class="hash-link" aria-label="Direct link to Example watermark with your logo" title="Direct link to Example watermark with your logo" translate="no">​</a></h2>
<p>With <code>loadImage()</code> and <code>addImage()</code> it is very easy to include a logo image and place it on your desired position.</p>
<p>In this example, the image is scaled to 15% of the video width and placed on the bottom right corner.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR API-KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">createWatermark</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token parameter">logoSource</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">widescreen</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> logo </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">loadImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">logoSource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> margin </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// 15% of layer width</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> logoWidth </span><span class="token operator">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">round</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> logoHeight </span><span class="token operator">=</span><span class="token plain"> logoWidth </span><span class="token operator">/</span><span class="token plain"> logo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> logo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">height</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// put image in bottom right corner</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> logoX </span><span class="token operator">=</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain"> margin </span><span class="token operator">-</span><span class="token plain"> logoWidth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> logoY </span><span class="token operator">=</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">height</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain"> margin </span><span class="token operator">-</span><span class="token plain"> logoHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">logo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> logoX</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> logoY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> logoWidth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> logoHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">run</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USERNAME&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> watermark </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createWatermark</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'./images/virtual_healthcare.png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">watermark</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Watermark overlay" src="https://docs.eyeson.com/assets/images/watermark-overlay-227fd6a3afa57f00f846669e7fe674d5.png" width="1280" height="827" class="img_ev3q"></p>
<p>Read more about the importance of branding: <a href="https://blog.eyeson.com/building-a-strong-brand-identity-through-video-calls-5-tips" target="_blank" rel="noopener noreferrer" class="">https://blog.eyeson.com/building-a-strong-brand-identity-through-video-calls-5-tips</a></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Pro Tipp</div><div class="admonitionContent_BuS1"><p>Use <code>layer.writeFile('./preview.png')</code> to save the image in order to see a preview and check the result.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-live-weather-data">Example live weather data<a href="https://docs.eyeson.com/blog/eyeson-node-layer#example-live-weather-data" class="hash-link" aria-label="Direct link to Example live weather data" title="Direct link to Example live weather data" translate="no">​</a></h2>
<p>Fetch live data and create an overlay image on-the-fly. The following example is based on the <a href="https://openweathermap.org/" target="_blank" rel="noopener noreferrer" class="">OpenWeather API</a>.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR API-KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">fetchWeatherData</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token parameter dom variable" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// https://openweathermap.org/api/geocoding-api</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// https://openweathermap.org/current</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> key </span><span class="token operator">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OPENWEATHERMAP_KEY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">https://api.openweathermap.org/geo/1.0/direct?q=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation dom variable" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">&amp;limit=1&amp;appid=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">key</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> data </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">json</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">ok</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">https://api.openweathermap.org/data/2.5/weather?lat=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">data</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token template-string interpolation number">0</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">lat</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">&amp;lon=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">data</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token template-string interpolation number">0</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">lon</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">&amp;units=metric&amp;appid=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">key</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    data </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">json</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">ok</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">createWeatherOverlay</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token parameter">weatherData</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> weather</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> wind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> visibility </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> weatherData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">widescreen</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> image </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">loadImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">https://openweathermap.org/img/w/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">weather</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token template-string interpolation number">0</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">icon</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">.png</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> font </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'20px Tahoma'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> fontColor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#000'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> textWidth </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> textStack </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// helper function to measure text size before drawing the background box</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">addText</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">text</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> font</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> color</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> x</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> y</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> leftMargin </span><span class="token parameter operator">=</span><span class="token parameter"> </span><span class="token parameter number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> measuredWidth </span><span class="token operator">=</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">measureText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> leftMargin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        textStack</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token plain"> x </span><span class="token operator">+</span><span class="token plain"> leftMargin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">measuredWidth </span><span class="token operator">&gt;</span><span class="token plain"> textWidth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            textWidth </span><span class="token operator">=</span><span class="token plain"> measuredWidth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">70</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    font </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bold 20px Tahoma'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">main</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">temp</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">°C</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">weather</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">135</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    font </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'12px Tahoma'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Feels like: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">main</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">feels_like</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">°C</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">170</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Wind: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">wind</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">speed</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> m/s</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">189</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Humidity: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">main</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">humidity</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">%</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">208</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Visibility: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation known-class-name class-name">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation method function property-access" style="color:rgb(80, 250, 123)">round</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string interpolation">visibility</span><span class="token template-string interpolation operator">/</span><span class="token template-string interpolation number">1000</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> km</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">227</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addRect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">40</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">60</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> textWidth </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">190</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#d9d9d980'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">70</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    textStack</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">forEach</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> text</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> font</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> color</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> x</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> y </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">run</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USERNAME&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> weatherData </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetchWeatherData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Graz, AT'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> overlay </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createWeatherOverlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">weatherData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Weather overlay" src="https://docs.eyeson.com/assets/images/weather-overlay-42cdcf8e1ea5fbfcc950115b26554be7.png" width="1280" height="827" class="img_ev3q"></p>
<p>Read more about enhancing the meeting experience: <a href="https://blog.eyeson.com/how-to-add-weather-widgets-to-an-eyeson-video-call" target="_blank" rel="noopener noreferrer" class="">https://blog.eyeson.com/how-to-add-weather-widgets-to-an-eyeson-video-call</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-dynamic-clock">Example dynamic clock<a href="https://docs.eyeson.com/blog/eyeson-node-layer#example-dynamic-clock" class="hash-link" aria-label="Direct link to Example dynamic clock" title="Direct link to Example dynamic clock" translate="no">​</a></h2>
<p>The next example demonstrates a great feature of the EyesonLayer library: re-using objects and just update one of its parameters.</p>
<p>In this case, the <code>addTextBox()</code> function is used which creates a background box behind a text with padding and smart positioning using the origin parameter <code>"bottom center"</code> for the given X and Y coordinates.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR API-KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">run</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> overlay </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">widescreen</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> font </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bold 17px Arial'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> fontColor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#000'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> backgroundColor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#d9d9d980'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> borderRadius </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> padding </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// top-bottom, left-right</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> x </span><span class="token operator">=</span><span class="token plain"> overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> y </span><span class="token operator">=</span><span class="token plain"> overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">height</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> origin </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bottom center'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> timeString </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toLocaleTimeString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'en'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">timeStyle</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'short'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> timeBox </span><span class="token operator">=</span><span class="token plain"> overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addTextBox</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">timeString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> origin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> borderRadius</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> backgroundColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USERNAME&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">setInterval</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> timeString </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toLocaleTimeString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'en'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">timeStyle</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'short'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        timeBox</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">text</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> timeString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">60</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// update every minute</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Clock overlay" src="https://docs.eyeson.com/assets/images/clock-overlay-669b22e2cbf90b6e3ccc638e0409bbd0.png" width="1280" height="827" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-qr-code-with-meeting-guest-link">Example QR-Code with meeting guest-link<a href="https://docs.eyeson.com/blog/eyeson-node-layer#example-qr-code-with-meeting-guest-link" class="hash-link" aria-label="Direct link to Example QR-Code with meeting guest-link" title="Direct link to Example QR-Code with meeting guest-link" translate="no">​</a></h2>
<p>The library even plays nicely together with other tools, in this case <a href="https://github.com/alexeyten/qr-image" target="_blank" rel="noopener noreferrer" class="">qr-image</a>, a node QR Code generator.</p>
<p>Please note that the QR Code is rendered with the actual guest-link of the currently generated meeting!</p>
<p>The QR Code image buffer is fed into the <code>loadImage()</code> function to comfortably perform calculations for positioning.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">qr</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'qr-image'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;YOUR API-KEY&gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">createQROverlay</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token parameter">link</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">widescreen</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> qrBuffer </span><span class="token operator">=</span><span class="token plain"> qr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">imageSync</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">link</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">margin</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">size</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> qrImage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">loadImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">qrBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> margin </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> padding </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> font </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'17px Arial'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> fontColor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#000'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> text </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Join meeting'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> textSize </span><span class="token operator">=</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">measureText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> textHeight </span><span class="token operator">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">abs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">textSize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">actualBoundingBoxAscent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">abs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">textSize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">actualBoundingBoxDescent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> rectWidth </span><span class="token operator">=</span><span class="token plain"> qrImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">2</span><span class="token operator">*</span><span class="token plain">padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> rectHeight </span><span class="token operator">=</span><span class="token plain"> qrImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">height</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> textHeight </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">3</span><span class="token operator">*</span><span class="token plain">padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// put qr code in top right corner</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> x </span><span class="token operator">=</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain"> rectWidth </span><span class="token operator">-</span><span class="token plain"> margin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> y </span><span class="token operator">=</span><span class="token plain"> margin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">startShadow</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#444'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addRect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> rectWidth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> rectHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#fff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">endShadow</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> fontColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> x </span><span class="token operator">+</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y </span><span class="token operator">+</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">qrImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> x </span><span class="token operator">+</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> y </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">2</span><span class="token operator">*</span><span class="token plain">padding </span><span class="token operator">+</span><span class="token plain"> textHeight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">run</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> user </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;USERNAME&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// use current guest link from meeting data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// see https://docs.eyeson.com/docs/rest/references/room</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> overlay </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createQROverlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">links</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">guest_join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">sendLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">overlay</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="QR-Code overlay" src="https://docs.eyeson.com/assets/images/qr-overlay-e0d204a61cd672d1875ca1cf7799a71c.png" width="1280" height="827" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-fonts">Custom fonts<a href="https://docs.eyeson.com/blog/eyeson-node-layer#custom-fonts" class="hash-link" aria-label="Direct link to Custom fonts" title="Direct link to Custom fonts" translate="no">​</a></h2>
<p>The "<a href="https://github.com/Brooooooklyn/canvas" target="_blank" rel="noopener noreferrer" class="">canvas for node</a>" library includes a function to register custom fonts for later usage.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">EyesonLayer</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node-layer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token maybe-class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">registerFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'./fonts/NotoColorEmoji-Regular.ttf'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Noto Emoji'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> layer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonLayer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">layer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addText</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'😃🎉'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'50px "Noto Emoji"'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'#000'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">150</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><em>(NotoColorEmoji font: <a href="https://fonts.google.com/noto/specimen/Noto+Color+Emoji" target="_blank" rel="noopener noreferrer" class="">https://fonts.google.com/noto/specimen/Noto+Color+Emoji</a>)</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/eyeson-node-layer#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/eyeson-node-layer/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>node</category>
            <category>layers</category>
            <category>overlay</category>
            <category>background</category>
        </item>
        <item>
            <title><![CDATA[Embed Eyeson video meeting in your website with IFrame API]]></title>
            <link>https://docs.eyeson.com/blog/iframe-api</link>
            <guid>https://docs.eyeson.com/blog/iframe-api</guid>
            <pubDate>Thu, 01 Feb 2024 12:00:00 GMT</pubDate>
            <description><![CDATA[The new IFrame API is the easiest way to embed Eyeson meeting in your website.]]></description>
            <content:encoded><![CDATA[<p>Using the new <strong>IFrame API</strong> is the easiest way to embed Eyeson video conferencing into your site or app using a few lines of HTML and Javascript.</p>
<ol>
<li class="">Integrate the Eyeson IFrame API script
<code>&lt;script src="https://app.eyeson.team/iframe-api.js"&gt;&lt;/script&gt;</code></li>
<li class="">Provide an HTML element as meeting container
<code>&lt;div id="meeting"&gt;&lt;/div&gt;</code></li>
<li class="">Call the <code>EyesonIframe</code> function and let the magic happen
<code>new EyesonIframe('#meeting', { accessKey: '...' });</code></li>
</ol>
<p>IFrame API creates an iframe HTML element with all correct settings and loads Eyeson's default UI.</p>
<p>In <a class="" href="https://docs.eyeson.com/blog/iframe-api#advanced-mode-"><strong>advanced mode</strong></a>, methods to interact with Eyeson UI inside the iframe are
available, like present, chat, snapshot, and also meeting events for the user
like join and leave can be observed.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>To get an <strong>accessKey</strong>, you have to start a meeting and join new users.
For <strong>guest token</strong> usage, you have to start a meeting and let any user register via Eyeson's default UI.</p><p><a class="" href="https://docs.eyeson.com/docs/rest/eyeson-api">Read more about Eyeson API usage.</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://docs.eyeson.com/blog/iframe-api#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h2>
<p>The following simplified code demonstrates the basic implementation, either with accessKey or guest token.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">User</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Guest</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- The &lt;iframe&gt; will be inside this &lt;div&gt; tag --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">meeting</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- This &lt;script&gt; loads the Eyeson IFrame API code --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">https://app.eyeson.team/iframe-api.js</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">start</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Load the user's access key for your application</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> accessKey </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">fetch</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'https://myapp.example/get-user-access-key'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// This function creates the &lt;iframe&gt; with the Eyeson default UI</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> meeting </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token script language-javascript"> </span><span class="token script language-javascript class-name">EyesonIframe</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'#meeting'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"> accessKey </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    meeting</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'error'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript parameter">error</span><span class="token script language-javascript"> </span><span class="token script language-javascript arrow operator">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Example error notification</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript console class-name">console</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">error</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">error</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Remove the &lt;iframe&gt; and clear the meeting instance</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        meeting</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">close</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">start</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- The &lt;iframe&gt; will be inside this &lt;div&gt; tag --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">meeting</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- This &lt;script&gt; loads the Eyeson IFrame API code --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">https://app.eyeson.team/iframe-api.js</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">start</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Load the meeting's guest token for your application</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> guestToken </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">fetch</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'https://myapp.example/get-meeting-guest-token'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// This function creates the &lt;iframe&gt; with the Eyeson default UI</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token script language-javascript"> meeting </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token script language-javascript"> </span><span class="token script language-javascript class-name">EyesonIframe</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'#meeting'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript literal-property property">guest</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property">token</span><span class="token script language-javascript operator">:</span><span class="token script language-javascript"> guestToken</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    meeting</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript string" style="color:rgb(255, 121, 198)">'error'</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript parameter">error</span><span class="token script language-javascript"> </span><span class="token script language-javascript arrow operator">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Example error notification</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript console class-name">console</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">error</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript">error</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        </span><span class="token script language-javascript comment" style="color:rgb(98, 114, 164)">// Remove the &lt;iframe&gt; and clear the meeting instance</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">        meeting</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(80, 250, 123)">close</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token script language-javascript function" style="color:rgb(80, 250, 123)">start</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token script language-javascript punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">script</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div></div></div></div>
<p><em>Simplified code to embed Eyeson UI in your website</em></p>
<p>Discover <a class="" href="https://docs.eyeson.com/docs/sdks/iframe/eyeson-iframe-sdk">all methods and events</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="options">Options<a href="https://docs.eyeson.com/blog/iframe-api#options" class="hash-link" aria-label="Direct link to Options" title="Direct link to Options" translate="no">​</a></h2>
<p>There are many options to customize the iframe to your needs. Width and height or even your desired CSS styles can be applied.</p>
<p>For guest token usage, options for locale and name suggestion are available.</p>
<p>A <a class="" href="https://docs.eyeson.com/docs/sdks/iframe/references/constructor#options">list of all options</a> is well documented.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-mode-">Advanced mode 🔐<a href="https://docs.eyeson.com/blog/iframe-api#advanced-mode-" class="hash-link" aria-label="Direct link to Advanced mode 🔐" title="Direct link to Advanced mode 🔐" translate="no">​</a></h2>
<p>Register your website's origin with the API at the start of the meeting to unlock more features that lets you interact with the Eyeson UI inside the iframe.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> meeting </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">startMeeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Load the user's access key for your application</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> accessKey </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'https://myapp.example/get-user-access-key'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// This function creates the &lt;iframe&gt; with the Eyeson default UI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    meeting </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">EyesonIframe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'#meeting'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        accessKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token literal-property property">events</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            onReady</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            onError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            onMeetingJoin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            onMeetingLeave</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            onMeetingError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">presentPdf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Load pdf file as blob</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pdf </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'https://myapp.example/get-pdf'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Start presentation in Eyeson UI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">present</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pdf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">showError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Present PDF failed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sendChat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Send a chat message in Eyeson UI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">chat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">showError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Send chat failed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createSnapshot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Create a snapshot</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">snapshot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">showError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Create snapshot failed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">onReady</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Eyeson UI is loaded and ready</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">onError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Eyeson UI could not be loaded</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">close</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">onMeetingJoin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// User has joined the meeting (after preview screen)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">onMeetingLeave</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">reason</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// User has left the meeting (by intention or error)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">onMeetingError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">reason</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// User is not able to join the meeting at all</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">startMeeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><em>Simplified code to demonstrate the advanced mode</em></p>
<p>Read the <a class="" href="https://docs.eyeson.com/docs/sdks/iframe/eyeson-iframe-sdk#advanced-mode">documentation about advanced mode</a> for further information.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/iframe-api#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>iframe</category>
            <category>embed</category>
            <category>website</category>
        </item>
        <item>
            <title><![CDATA[Introducing the API meeting observer!]]></title>
            <link>https://docs.eyeson.com/blog/api-meeting-observer</link>
            <guid>https://docs.eyeson.com/blog/api-meeting-observer</guid>
            <pubDate>Tue, 12 Dec 2023 05:00:00 GMT</pubDate>
            <description><![CDATA[Introducing the API meeting observer, a one-way WebSocket connection that allows to boost your application's meeting controls.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Picture of a man looking through binoculars" src="https://docs.eyeson.com/assets/images/observer-eyeson-a96b1d7f6300ebf9681c54bccf7f1c7b.jpg" width="1200" height="675" class="img_ev3q"></p>
<p>We're adding a new way for developers to receive information about a meeting in real-time!</p>
<p>Introducing the <strong>"Meeting Observer"</strong>, a one-way WebSocket connection that allows to boost your application's meeting controls.</p>
<p>It is easier to use than the <a class="" href="https://docs.eyeson.com/docs/rest/advanced/register_webhooks">existing WebHooks</a> and even more powerful, since a lot more information can be observed.</p>
<p>If you want to skip the introduction and get your hands on, head over to the <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer">observer documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://docs.eyeson.com/blog/api-meeting-observer#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h2>
<p>The WebSocket connection is based on the <a href="https://docs.anycable.io/misc/action_cable_protocol" target="_blank" rel="noopener noreferrer" class="">rails actioncable protocol</a>.</p>
<p>To connect to the observer, you need to authenticate with your API key. If you don't have it already, <a class="" href="https://docs.eyeson.com/docs/rest/eyeson-api#how-to-obtain-an-eyeson-api-key">here's how to get your API key</a>.
Depending on your preferred programming language, you might already find a useful library for "Actioncable" or its successor "AnyCable".</p>
<p>The URL is the API's origin <code>https://api.eyeson.team</code>, followed by <code>/rt</code> (for "realtime") and <code>room_id</code> as query parameter.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Example Observer URL</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">https://api.eyeson.team/rt?room_id</span><span class="token operator">=</span><span class="token plain">651b0c4c3ae7400ea35db31fs</span><br></div></code></pre></div></div>
<p><code>room_id</code> is required, since each observer connects to a single meeting room and receives all events related to the given <code>room_id</code>.</p>
<p>There are 3 ways to include the API key.</p>
<ul>
<li class="">"Authorization" header</li>
<li class="">API key as WebSocket protocol</li>
<li class="">Query parameter "api_key=YOUR_API_KEY"</li>
</ul>
<p>And last but not least, you have to subscribe to the <code>RoomChannel</code> to make it work.</p>
<p>As soon as the meeting shuts down, the connection is closed automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="events">Events<a href="https://docs.eyeson.com/blog/api-meeting-observer#events" class="hash-link" aria-label="Direct link to Events" title="Direct link to Events" translate="no">​</a></h2>
<p>In contrast to WebHooks, the observer provides a lot more event types.
Besides <code>room_update</code> and <code>recording_update</code> you will get notified for</p>
<ul>
<li class="">snapshots,</li>
<li class="">broadcasts,</li>
<li class="">participants,</li>
<li class="">chat messages,</li>
<li class="">playbacks,</li>
<li class="">and layout changes.</li>
</ul>
<p><a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer#events">All events, including examples, are listed in the documentation.</a></p>
<p>Here are some examples to give you an idea.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="room-update">Room update<a href="https://docs.eyeson.com/blog/api-meeting-observer#room-update" class="hash-link" aria-label="Direct link to Room update" title="Direct link to Room update" translate="no">​</a></h3>
<p>All meeting room options and its ready and shutdown states are included in the <code>room_update</code> event.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"room_update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"content"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6576daef1f138900153d0762"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Observer demo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"ready"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"started_at"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2023-12-11T09:48:32.031Z"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"shutdown"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"guest_token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"jCWzhzCWONkbIubUYF7PD3hP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"options"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"show_names"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"show_label"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"exit_url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"recording_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"broadcast_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"layout_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"layout"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"reaction_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"suggest_guest_names"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"lock_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"kick_available"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"sfu_mode"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ptp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"layout_users"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"layout_name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"layout_map"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"voice_activation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"custom_fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"widescreen"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"background_color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#121212"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"participants"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"playbacks"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"image_sources"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"presentation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"broadcasts"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"recording"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><em>Example <code>room_update</code> event where ready state is true</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="participant-update">Participant update<a href="https://docs.eyeson.com/blog/api-meeting-observer#participant-update" class="hash-link" aria-label="Direct link to Participant update" title="Direct link to Participant update" translate="no">​</a></h3>
<p>You can find out when a participant joins or leaves the meeting in real-time. With the given participant ids, you can easily adjust the meeting layout, for example.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"participant_update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"participant"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test@observer.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"room_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6576daef1f138900153d0762"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Observer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"avatar"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"guest"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"online"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><em>Example <code>participant_update</code> event with online state true</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="chat-message">Chat message<a href="https://docs.eyeson.com/blog/api-meeting-observer#chat-message" class="hash-link" aria-label="Direct link to Chat message" title="Direct link to Chat message" translate="no">​</a></h3>
<p>Messages via <a class="" href="https://docs.eyeson.com/docs/rest/references/messages">messages API</a> are forwarded to the observer. With this in place, your app can log the chat, or even react to it.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"chat"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"content"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Hello world!"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"cid"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6576daf01f138900153d0764"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test@observer.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"created_at"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2023-12-11T09:59:33.892Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><em>Example <code>chat</code> event</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="podium-update">Podium update<a href="https://docs.eyeson.com/blog/api-meeting-observer#podium-update" class="hash-link" aria-label="Direct link to Podium update" title="Direct link to Podium update" translate="no">​</a></h3>
<p>There's even one more incredibly useful event, called <code>podium_update</code>, that provides all information about the current video podium.
The exact position and size of each of the layout boxes and its current content. So you know which user or playback is visible and on which position.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"podium_update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"podium"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"presentation-video"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1280</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userA@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">214</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userB@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">213</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">214</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userC@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">213</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">427</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userD@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">213</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">640</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userE@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">213</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">853</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"user_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"userF@myawesomeapp.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"play_id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">214</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"height"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"left"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1066</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"top"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">600</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"z-index"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><em>Example <code>podium_update</code> event with layout "present-upper-6" including a playback</em></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The complete list of events is in the <a class="" href="https://docs.eyeson.com/docs/rest/advanced/meeting_observer#events">documentation</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-code">Example code<a href="https://docs.eyeson.com/blog/api-meeting-observer#example-code" class="hash-link" aria-label="Direct link to Example code" title="Direct link to Example code" translate="no">​</a></h2>
<p>Here are simplified examples that demonstrate the usage of the meeting observer.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">node sdk</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">go sdk</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>The observer is already integrated in the <a href="https://github.com/eyeson-team/eyeson-node" target="_blank" rel="noopener noreferrer" class="">eyeson-node</a> library.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Eyeson</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eyeson/node'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> eyeson </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt; api-key &gt;'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// configure to use your api key</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> meeting </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">username</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> connection </span><span class="token operator">=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">observer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">connect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">meeting</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">roomId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">connection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'disconnected'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token parameter">reason</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Channel closed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> reason</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">connection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'event'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token parameter">event</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'room_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'chat'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'participant_update'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">participant</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// and many more</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>The observer is already integrated in the <a href="https://github.com/eyeson-team/eyeson-go" target="_blank" rel="noopener noreferrer" class="">eyeson-go</a> library.</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">eyesonApiKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">room</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Rooms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"standup meeting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mike"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">msgCh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">:=</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Observer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Connect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Background</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> room</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Room</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ok </span><span class="token operator">:=</span><span class="token plain"> </span><span class="token operator">&lt;-</span><span class="token plain">msgCh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token operator">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      fmt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Channel closed. Probably disconnected"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    fmt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Received event type: "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">GetType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> m </span><span class="token operator">:=</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">eyeson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Chat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      fmt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Chat: %s - %s\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ClientID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://docs.eyeson.com/blog/api-meeting-observer#contact" class="hash-link" aria-label="Direct link to Contact" title="Direct link to Contact" translate="no">​</a></h2>
<p>We'll be happy to hear from you!</p>
<p>If you have a question or want to share any feedback, do not hesitate
to <a href="https://github.com/eyeson-team/api/issues" target="_blank" rel="noopener noreferrer" class="">create a ticket on GitHub</a>.</p>]]></content:encoded>
            <category>API</category>
            <category>observer</category>
            <category>websocket</category>
            <category>events</category>
        </item>
    </channel>
</rss>