openvibers/openvibe.tools Commits
The Tools gateway serves its own pinned OpenVibe Frame files at /shared/* (openvibe-shared/serve 1.12.0) and its server-rendered pages reference them by content hash
Changes
@@@ -18,7 +18,7 @@"helmet": "^8.1.0","jsonwebtoken": "^9.0.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"}},"node_modules/accepts": {@@@ -1051,9 +1051,9 @@}},"node_modules/openvibe-shared": {-- "version": "1.11.1",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1",-- "integrity": "sha512-hBaZlZRVZjkGfsPQE16rQIou2lUuusADea3Evx1tVjB84FTHGHS7ZALfcXaNOk7dR53HOVTJrQ0njmScdreUiw==",++ "version": "1.12.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0",++ "integrity": "sha512-Qpy4YVoPMs1q/0/08/5ZODI0+7ev+Krk75nsRPsTjNCm7Eu91tt1LPnUNLt4kYfRj6duS+N9icm02gksnlMiyA==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0"@@@ -19,6 +19,6 @@"helmet": "^8.1.0","jsonwebtoken": "^9.0.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"}}@@@ -384,6 +384,8 @@ function sendTool(req, res, file) {// The apex is server-rendered from the registry: index, families, tool pages, search,// sitemap.xml, robots.txt, llms.txt and /api/catalog.json (server/pages/site.js).++// This site's own pinned copy of the OpenVibe Frame's browser files (openvibe-shared/serve).++app.use('/shared', require('openvibe-shared/serve').handler());app.use(require('./pages/site').createSiteRouter());// Net tool subdomains → net.html SPA@@@ -12,6 +12,7 @@// ═══════════════════════════════════════════════════════════════const crypto = require('crypto');const frame = require('openvibe-shared/frame');++const ovServe = require('openvibe-shared/serve');const express = require('express');const seo = require('openvibe-shared/seo');const icons = require('openvibe-shared/icons');@@@ -119,14 +120,14 @@ ${head}${appIcon.headTags({ site: 'tools', iconBase: '/assets' })}<link rel="alternate" type="application/json" href="${SITE}/api/catalog.json" title="Tool catalog"><link rel="preconnect" href="https://openvibe.network">--<script src="https://openvibe.network/shared/theme-loader.js" defer></script>++<script src="${ovServe.url('theme-loader.js')}" defer></script><style>${CSS}</style></head><body>${spriteSvg}<noscript><header class="topbar"><a href="${SITE}/">${NAME}</a><nav>${families.filter(f => f.path).map(f => `<a href="${esc(f.path)}">${esc(f.name)}</a>`).join('')}<a href="/all-tools">All tools</a></nav></header></noscript><main class="wrap">${body}<section aria-labelledby="net-h"><div class="sec-h"><h2 id="net-h">The rest of OpenVibe</h2></div><p class="sec-p">One account works on every site. Open source and community-run.</p><div class="net">${NETWORK.map(([ic, n, d, u]) => `<a class="tool" href="${u}">${icon(ic, 36)}<span class="tool-t"><b>${n}</b><small>${d}</small></span></a>`).join('')}</div></section></main>${frame.footer({ service: 'tools', variant: 'full', updates: '/updates' })}--<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script><script src="/js/site.js" defer></script>++<script src="${ovServe.url('navbar.js')}" defer></script><script src="${ovServe.url('footer.js')}" defer></script><script src="/js/site.js" defer></script></body></html>`;}@@@ -236,7 +237,7 @@ function cached(key, render) {/** /developers: how to call any tool from code (run API, jobs, SDK, auth tiers, limits). */function pageUpdates() {const { families } = registry.get();-- const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${frame.shippedScript()}`;++ const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${`<script src="${ovServe.url('shipped.js')}" defer></script>`}`;return shell({ families, body, head: head({ title: 'What shipped on OpenVibe.Tools', description: 'Every change deployed to OpenVibe.Tools, newest first, with the Patch notes that gather them.', canonical: SITE + '/updates' }) });}
@@ -18,7 +18,7 @@
@@ -18,7 +18,7 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
}
}
},
},
"node_modules/accepts": {
"node_modules/accepts": {
@@ -1051,9 +1051,9 @@
@@ -1051,9 +1051,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "1.11.1",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1",
- "integrity": "sha512-hBaZlZRVZjkGfsPQE16rQIou2lUuusADea3Evx1tVjB84FTHGHS7ZALfcXaNOk7dR53HOVTJrQ0njmScdreUiw==",
+ "version": "1.12.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0",
+ "integrity": "sha512-Qpy4YVoPMs1q/0/08/5ZODI0+7ev+Krk75nsRPsTjNCm7Eu91tt1LPnUNLt4kYfRj6duS+N9icm02gksnlMiyA==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0"
"jsonwebtoken": "^9.0.0"
@@ -19,6 +19,6 @@
@@ -19,6 +19,6 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
}
}
}
}
@@ -384,6 +384,8 @@ function sendTool(req, res, file) {
@@ -384,6 +384,8 @@ function sendTool(req, res, file) {
// The apex is server-rendered from the registry: index, families, tool pages, search,
// The apex is server-rendered from the registry: index, families, tool pages, search,
// sitemap.xml, robots.txt, llms.txt and /api/catalog.json (server/pages/site.js).
// sitemap.xml, robots.txt, llms.txt and /api/catalog.json (server/pages/site.js).
+// This site's own pinned copy of the OpenVibe Frame's browser files (openvibe-shared/serve).
+app.use('/shared', require('openvibe-shared/serve').handler());
app.use(require('./pages/site').createSiteRouter());
app.use(require('./pages/site').createSiteRouter());
// Net tool subdomains → net.html SPA
// Net tool subdomains → net.html SPA
@@ -12,6 +12,7 @@
@@ -12,6 +12,7 @@
// ═══════════════════════════════════════════════════════════════
// ═══════════════════════════════════════════════════════════════
const crypto = require('crypto');
const crypto = require('crypto');
const frame = require('openvibe-shared/frame');
const frame = require('openvibe-shared/frame');
+const ovServe = require('openvibe-shared/serve');
const express = require('express');
const express = require('express');
const seo = require('openvibe-shared/seo');
const seo = require('openvibe-shared/seo');
const icons = require('openvibe-shared/icons');
const icons = require('openvibe-shared/icons');
@@ -119,14 +120,14 @@ ${head}
@@ -119,14 +120,14 @@ ${head}
${appIcon.headTags({ site: 'tools', iconBase: '/assets' })}
${appIcon.headTags({ site: 'tools', iconBase: '/assets' })}
<link rel="alternate" type="application/json" href="${SITE}/api/catalog.json" title="Tool catalog">
<link rel="alternate" type="application/json" href="${SITE}/api/catalog.json" title="Tool catalog">
<link rel="preconnect" href="https://openvibe.network">
<link rel="preconnect" href="https://openvibe.network">
-<script src="https://openvibe.network/shared/theme-loader.js" defer></script>
+<script src="${ovServe.url('theme-loader.js')}" defer></script>
<style>${CSS}</style></head><body>${spriteSvg}
<style>${CSS}</style></head><body>${spriteSvg}
<noscript><header class="topbar"><a href="${SITE}/">${NAME}</a><nav>${families.filter(f => f.path).map(f => `<a href="${esc(f.path)}">${esc(f.name)}</a>`).join('')}<a href="/all-tools">All tools</a></nav></header></noscript>
<noscript><header class="topbar"><a href="${SITE}/">${NAME}</a><nav>${families.filter(f => f.path).map(f => `<a href="${esc(f.path)}">${esc(f.name)}</a>`).join('')}<a href="/all-tools">All tools</a></nav></header></noscript>
<main class="wrap">${body}
<main class="wrap">${body}
<section aria-labelledby="net-h"><div class="sec-h"><h2 id="net-h">The rest of OpenVibe</h2></div><p class="sec-p">One account works on every site. Open source and community-run.</p>
<section aria-labelledby="net-h"><div class="sec-h"><h2 id="net-h">The rest of OpenVibe</h2></div><p class="sec-p">One account works on every site. Open source and community-run.</p>
<div class="net">${NETWORK.map(([ic, n, d, u]) => `<a class="tool" href="${u}">${icon(ic, 36)}<span class="tool-t"><b>${n}</b><small>${d}</small></span></a>`).join('')}</div></section>
<div class="net">${NETWORK.map(([ic, n, d, u]) => `<a class="tool" href="${u}">${icon(ic, 36)}<span class="tool-t"><b>${n}</b><small>${d}</small></span></a>`).join('')}</div></section>
</main>${frame.footer({ service: 'tools', variant: 'full', updates: '/updates' })}
</main>${frame.footer({ service: 'tools', variant: 'full', updates: '/updates' })}
-<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script><script src="/js/site.js" defer></script>
+<script src="${ovServe.url('navbar.js')}" defer></script><script src="${ovServe.url('footer.js')}" defer></script><script src="/js/site.js" defer></script>
</body></html>`;
</body></html>`;
}
}
@@ -236,7 +237,7 @@ function cached(key, render) {
@@ -236,7 +237,7 @@ function cached(key, render) {
/** /developers: how to call any tool from code (run API, jobs, SDK, auth tiers, limits). */
/** /developers: how to call any tool from code (run API, jobs, SDK, auth tiers, limits). */
function pageUpdates() {
function pageUpdates() {
const { families } = registry.get();
const { families } = registry.get();
- const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${frame.shippedScript()}`;
+ const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${`<script src="${ovServe.url('shipped.js')}" defer></script>`}`;
return shell({ families, body, head: head({ title: 'What shipped on OpenVibe.Tools', description: 'Every change deployed to OpenVibe.Tools, newest first, with the Patch notes that gather them.', canonical: SITE + '/updates' }) });
return shell({ families, body, head: head({ title: 'What shipped on OpenVibe.Tools', description: 'Every change deployed to OpenVibe.Tools, newest first, with the Patch notes that gather them.', canonical: SITE + '/updates' }) });
}
}