openvibers/openvibe.host Commits
The OpenVibe Frame from this site's own pinned copy: /shared/* is served by openvibe-shared/serve (1.12.0) and every page references it by content hash (/shared/<file>?v=<hash>), so this site's pin decides what its pages run and its navbar and footer keep working while openvibe.network is down
Changes
@@@ -18,7 +18,7 @@"express-rate-limit": "^7.5.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0"++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"},"bin": {"ovhost": "bin/ovhost"@@@ -1437,9 +1437,9 @@}},"node_modules/openvibe-shared": {-- "version": "1.11.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0",-- "integrity": "sha512-edMW0I25HNFReLcfZ9ak+4q5sy2t7qq7EPG52tOerTBV2fU994C5we/02AD/9i2Vuq0+ayNBBisW0cg60L6DLQ==",++ "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"@@@ -33,7 +33,7 @@"express-rate-limit": "^7.5.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0"++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"},"engines": {"node": ">=22.0.0"@@@ -147,6 +147,8 @@ function createApp(opts = {}) {{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'host', service: 'host', host: 'openvibe.host', name: 'OpenVibe.Host', profile: 'ugc' })); }// ── Static assets (content-hashed ?v= → immutable) ──────++ // 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(express.static(PUBLIC_DIR, {index: false, redirect: false, etag: true,setHeaders(res, filePath) {@@@ -6,6 +6,7 @@* enough on openvibe.host). Every response is private and never cached by a shared cache.*/const express = require('express');++const ovServe = require('openvibe-shared/serve');const frame = require('openvibe-shared/frame');const { renderPage } = require('../render/layout');const pages = require('../render/pages');@@@ -63,7 +64,7 @@ function createDashboard(ctx) {// ── Pages ───────────────────────────────────────────────// What shipped on OpenVibe.Host: the shared update log every OpenVibe site has.-- router.get('/updates', view((req, res) => page(req, res, 200, 'What shipped on OpenVibe.Host', frame.updatesBody({ service: 'host', siteName: 'OpenVibe.Host' }) + frame.shippedScript(), null, { indexable: true })));++ router.get('/updates', view((req, res) => page(req, res, 200, 'What shipped on OpenVibe.Host', frame.updatesBody({ service: 'host', siteName: 'OpenVibe.Host' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>`, null, { indexable: true })));router.get('/', view((req, res) => {// The signed-out front page is the public page of openvibe.host (sitemap.xml): indexable.// Everything behind sign-in stays noindex and private.@@@ -6,6 +6,7 @@* Dashboard pages are private: noindex, private caching.*/const crypto = require('crypto');++const ovServe = require('openvibe-shared/serve');const fs = require('fs');const path = require('path');const appIcon = require('openvibe-shared/app-icon');@@@ -62,9 +63,9 @@ ${o.indexable ? `<link rel="canonical" href="${esc(`${o.config.baseUrl}${o.path<meta name="description" content="OpenVibe.Host: static site hosting for OpenVibe projects (alpha).">${appIcon.headTags({ site: 'host' })}<link rel="stylesheet" href="${asset('css/host.css')}">--<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>--<script src="${NETWORK_URL}/shared/navbar.js" defer></script>--<script src="${NETWORK_URL}/shared/footer.js" defer></script>++<script src="${ovServe.url('theme-loader.js')}" defer></script>++<script src="${ovServe.url('navbar.js')}" defer></script>++<script src="${ovServe.url('footer.js')}" defer></script></head><body><a class="skip" href="#main">Skip to content</a>@@@ -49,7 +49,7 @@ const ORIGIN = 'https://openvibe.host';await check('the signed-out home page is server-rendered with the shared chrome and useful without JavaScript', async () => {const r = await t.api('GET', '/');assert.strictEqual(r.status, 200);-- assert.match(r.text, /<script src="https:\/\/openvibe\.network\/shared\/navbar\.js" defer>/);++ assert.match(r.text, /<script src="\/shared\/navbar\.js\?v=[0-9a-f]{12}" defer>/);assert.match(r.text, /<noscript><nav aria-label="Site"/);assert.match(r.text, /id="ov-footer"/);assert.match(r.text, /Sign in with OpenVibe/);
@@ -18,7 +18,7 @@
@@ -18,7 +18,7 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0"
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
},
},
"bin": {
"bin": {
"ovhost": "bin/ovhost"
"ovhost": "bin/ovhost"
@@ -1437,9 +1437,9 @@
@@ -1437,9 +1437,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "1.11.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0",
- "integrity": "sha512-edMW0I25HNFReLcfZ9ak+4q5sy2t7qq7EPG52tOerTBV2fU994C5we/02AD/9i2Vuq0+ayNBBisW0cg60L6DLQ==",
+ "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"
@@ -33,7 +33,7 @@
@@ -33,7 +33,7 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.5.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.0"
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
},
},
"engines": {
"engines": {
"node": ">=22.0.0"
"node": ">=22.0.0"
@@ -147,6 +147,8 @@ function createApp(opts = {}) {
@@ -147,6 +147,8 @@ function createApp(opts = {}) {
{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'host', service: 'host', host: 'openvibe.host', name: 'OpenVibe.Host', profile: 'ugc' })); }
{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'host', service: 'host', host: 'openvibe.host', name: 'OpenVibe.Host', profile: 'ugc' })); }
// ── Static assets (content-hashed ?v= → immutable) ──────
// ── Static assets (content-hashed ?v= → immutable) ──────
+ // 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(express.static(PUBLIC_DIR, {
app.use(express.static(PUBLIC_DIR, {
index: false, redirect: false, etag: true,
index: false, redirect: false, etag: true,
setHeaders(res, filePath) {
setHeaders(res, filePath) {
@@ -6,6 +6,7 @@
@@ -6,6 +6,7 @@
* enough on openvibe.host). Every response is private and never cached by a shared cache.
* enough on openvibe.host). Every response is private and never cached by a shared cache.
*/
*/
const express = require('express');
const express = require('express');
+const ovServe = require('openvibe-shared/serve');
const frame = require('openvibe-shared/frame');
const frame = require('openvibe-shared/frame');
const { renderPage } = require('../render/layout');
const { renderPage } = require('../render/layout');
const pages = require('../render/pages');
const pages = require('../render/pages');
@@ -63,7 +64,7 @@ function createDashboard(ctx) {
@@ -63,7 +64,7 @@ function createDashboard(ctx) {
// ── Pages ───────────────────────────────────────────────
// ── Pages ───────────────────────────────────────────────
// What shipped on OpenVibe.Host: the shared update log every OpenVibe site has.
// What shipped on OpenVibe.Host: the shared update log every OpenVibe site has.
- router.get('/updates', view((req, res) => page(req, res, 200, 'What shipped on OpenVibe.Host', frame.updatesBody({ service: 'host', siteName: 'OpenVibe.Host' }) + frame.shippedScript(), null, { indexable: true })));
+ router.get('/updates', view((req, res) => page(req, res, 200, 'What shipped on OpenVibe.Host', frame.updatesBody({ service: 'host', siteName: 'OpenVibe.Host' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>`, null, { indexable: true })));
router.get('/', view((req, res) => {
router.get('/', view((req, res) => {
// The signed-out front page is the public page of openvibe.host (sitemap.xml): indexable.
// The signed-out front page is the public page of openvibe.host (sitemap.xml): indexable.
// Everything behind sign-in stays noindex and private.
// Everything behind sign-in stays noindex and private.
@@ -6,6 +6,7 @@
@@ -6,6 +6,7 @@
* Dashboard pages are private: noindex, private caching.
* Dashboard pages are private: noindex, private caching.
*/
*/
const crypto = require('crypto');
const crypto = require('crypto');
+const ovServe = require('openvibe-shared/serve');
const fs = require('fs');
const fs = require('fs');
const path = require('path');
const path = require('path');
const appIcon = require('openvibe-shared/app-icon');
const appIcon = require('openvibe-shared/app-icon');
@@ -62,9 +63,9 @@ ${o.indexable ? `<link rel="canonical" href="${esc(`${o.config.baseUrl}${o.path
@@ -62,9 +63,9 @@ ${o.indexable ? `<link rel="canonical" href="${esc(`${o.config.baseUrl}${o.path
<meta name="description" content="OpenVibe.Host: static site hosting for OpenVibe projects (alpha).">
<meta name="description" content="OpenVibe.Host: static site hosting for OpenVibe projects (alpha).">
${appIcon.headTags({ site: 'host' })}
${appIcon.headTags({ site: 'host' })}
<link rel="stylesheet" href="${asset('css/host.css')}">
<link rel="stylesheet" href="${asset('css/host.css')}">
-<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>
-<script src="${NETWORK_URL}/shared/navbar.js" defer></script>
-<script src="${NETWORK_URL}/shared/footer.js" defer></script>
+<script src="${ovServe.url('theme-loader.js')}" defer></script>
+<script src="${ovServe.url('navbar.js')}" defer></script>
+<script src="${ovServe.url('footer.js')}" defer></script>
</head>
</head>
<body>
<body>
<a class="skip" href="#main">Skip to content</a>
<a class="skip" href="#main">Skip to content</a>
@@ -49,7 +49,7 @@ const ORIGIN = 'https://openvibe.host';
@@ -49,7 +49,7 @@ const ORIGIN = 'https://openvibe.host';
await check('the signed-out home page is server-rendered with the shared chrome and useful without JavaScript', async () => {
await check('the signed-out home page is server-rendered with the shared chrome and useful without JavaScript', async () => {
const r = await t.api('GET', '/');
const r = await t.api('GET', '/');
assert.strictEqual(r.status, 200);
assert.strictEqual(r.status, 200);
- assert.match(r.text, /<script src="https:\/\/openvibe\.network\/shared\/navbar\.js" defer>/);
+ assert.match(r.text, /<script src="\/shared\/navbar\.js\?v=[0-9a-f]{12}" defer>/);
assert.match(r.text, /<noscript><nav aria-label="Site"/);
assert.match(r.text, /<noscript><nav aria-label="Site"/);
assert.match(r.text, /id="ov-footer"/);
assert.match(r.text, /id="ov-footer"/);
assert.match(r.text, /Sign in with OpenVibe/);
assert.match(r.text, /Sign in with OpenVibe/);