openvibers/openrestream 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
@@@ -16,7 +16,7 @@"node-media-server": "2.7.4","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.12.0"@@@ -1140,9 +1140,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"@@@ -25,7 +25,7 @@"node-media-server": "2.7.4","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.12.0"@@@ -30,6 +30,8 @@ function createApp({ rt, auth, keys, log = console, fetchImpl }) {next();});app.use(cookieParser());++ // This site's own pinned copy of the OpenVibe Frame's browser files (openvibe-shared/serve).++ app.use('/shared', require('openvibe-shared/serve').handler());// Restore drill (OPENRE_DRILL, ovhost drill): serve reads from the restored copy and nothing// else. No writes (they would only change the copy, but a drill must not look like it works),@@@ -1,4 +1,5 @@'use strict';++const ovServe = require('openvibe-shared/serve');/*** Page shell for openre.stream: server-rendered HTML that works without JavaScript, with the shared* OpenVibe Frame (theme loader, navbar and footer from openvibe.network, footer SSR from the@@@ -62,10 +63,10 @@ function renderPage({ title, body, user, canonicalPath = '/', robots = 'noindex,<meta name="robots" content="${esc(robots)}"><link rel="canonical" href="${esc(config.baseUrl + canonicalPath)}">${icon}--<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>++<script src="${ovServe.url('theme-loader.js')}" defer></script><style>${CSS}</style>--<script src="${NETWORK_URL}/shared/navbar.js" defer></script>--<script src="${NETWORK_URL}/shared/footer.js" defer></script>++<script src="${ovServe.url('navbar.js')}" defer></script>++<script src="${ovServe.url('footer.js')}" defer></script></head><body><div id="navbar-mount"></div>@@@ -14,6 +14,7 @@* read the cookie, so it cannot produce the token); SameSite=Lax cookies are the second layer.*/const crypto = require('crypto');++const ovServe = require('openvibe-shared/serve');const frame = require('openvibe-shared/frame');const express = require('express');const { renderPage, esc } = require('./layout');@@@ -81,7 +82,7 @@ function createUiRouter({ rt, auth }) {// ── Pages ─────────────────────────────────────────────────// What shipped on OpenRe.Stream: the shared update log every OpenVibe site has.-- router.get('/updates', (req, res) => page(req, res, { canonicalPath: '/updates', robots: 'index,follow', title: 'What shipped on OpenRe.Stream', body: frame.updatesBody({ service: 'openre', siteName: 'OpenRe.Stream' }) + frame.shippedScript() }));++ router.get('/updates', (req, res) => page(req, res, { canonicalPath: '/updates', robots: 'index,follow', title: 'What shipped on OpenRe.Stream', body: frame.updatesBody({ service: 'openre', siteName: 'OpenRe.Stream' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>` }));router.get('/', (req, res) => {const signedIn = req.caller.kind === 'user' && req.caller.subject;const mine = signedIn ? store.definitions.list({ owner_subject: req.caller.subject }) : [];
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"node-media-server": "2.7.4",
"node-media-server": "2.7.4",
"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.12.0"
"node": ">=22.12.0"
@@ -1140,9 +1140,9 @@
@@ -1140,9 +1140,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"
@@ -25,7 +25,7 @@
@@ -25,7 +25,7 @@
"node-media-server": "2.7.4",
"node-media-server": "2.7.4",
"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.12.0"
"node": ">=22.12.0"
@@ -30,6 +30,8 @@ function createApp({ rt, auth, keys, log = console, fetchImpl }) {
@@ -30,6 +30,8 @@ function createApp({ rt, auth, keys, log = console, fetchImpl }) {
next();
next();
});
});
app.use(cookieParser());
app.use(cookieParser());
+ // This site's own pinned copy of the OpenVibe Frame's browser files (openvibe-shared/serve).
+ app.use('/shared', require('openvibe-shared/serve').handler());
// Restore drill (OPENRE_DRILL, ovhost drill): serve reads from the restored copy and nothing
// Restore drill (OPENRE_DRILL, ovhost drill): serve reads from the restored copy and nothing
// else. No writes (they would only change the copy, but a drill must not look like it works),
// else. No writes (they would only change the copy, but a drill must not look like it works),
@@ -1,4 +1,5 @@
@@ -1,4 +1,5 @@
'use strict';
'use strict';
+const ovServe = require('openvibe-shared/serve');
/**
/**
* Page shell for openre.stream: server-rendered HTML that works without JavaScript, with the shared
* Page shell for openre.stream: server-rendered HTML that works without JavaScript, with the shared
* OpenVibe Frame (theme loader, navbar and footer from openvibe.network, footer SSR from the
* OpenVibe Frame (theme loader, navbar and footer from openvibe.network, footer SSR from the
@@ -62,10 +63,10 @@ function renderPage({ title, body, user, canonicalPath = '/', robots = 'noindex,
@@ -62,10 +63,10 @@ function renderPage({ title, body, user, canonicalPath = '/', robots = 'noindex,
<meta name="robots" content="${esc(robots)}">
<meta name="robots" content="${esc(robots)}">
<link rel="canonical" href="${esc(config.baseUrl + canonicalPath)}">
<link rel="canonical" href="${esc(config.baseUrl + canonicalPath)}">
${icon}
${icon}
-<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>
+<script src="${ovServe.url('theme-loader.js')}" defer></script>
<style>${CSS}</style>
<style>${CSS}</style>
-<script src="${NETWORK_URL}/shared/navbar.js" defer></script>
-<script src="${NETWORK_URL}/shared/footer.js" defer></script>
+<script src="${ovServe.url('navbar.js')}" defer></script>
+<script src="${ovServe.url('footer.js')}" defer></script>
</head>
</head>
<body>
<body>
<div id="navbar-mount"></div>
<div id="navbar-mount"></div>
@@ -14,6 +14,7 @@
@@ -14,6 +14,7 @@
* read the cookie, so it cannot produce the token); SameSite=Lax cookies are the second layer.
* read the cookie, so it cannot produce the token); SameSite=Lax cookies are the second layer.
*/
*/
const crypto = require('crypto');
const crypto = require('crypto');
+const ovServe = require('openvibe-shared/serve');
const frame = require('openvibe-shared/frame');
const frame = require('openvibe-shared/frame');
const express = require('express');
const express = require('express');
const { renderPage, esc } = require('./layout');
const { renderPage, esc } = require('./layout');
@@ -81,7 +82,7 @@ function createUiRouter({ rt, auth }) {
@@ -81,7 +82,7 @@ function createUiRouter({ rt, auth }) {
// ── Pages ─────────────────────────────────────────────────
// ── Pages ─────────────────────────────────────────────────
// What shipped on OpenRe.Stream: the shared update log every OpenVibe site has.
// What shipped on OpenRe.Stream: the shared update log every OpenVibe site has.
- router.get('/updates', (req, res) => page(req, res, { canonicalPath: '/updates', robots: 'index,follow', title: 'What shipped on OpenRe.Stream', body: frame.updatesBody({ service: 'openre', siteName: 'OpenRe.Stream' }) + frame.shippedScript() }));
+ router.get('/updates', (req, res) => page(req, res, { canonicalPath: '/updates', robots: 'index,follow', title: 'What shipped on OpenRe.Stream', body: frame.updatesBody({ service: 'openre', siteName: 'OpenRe.Stream' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>` }));
router.get('/', (req, res) => {
router.get('/', (req, res) => {
const signedIn = req.caller.kind === 'user' && req.caller.subject;
const signedIn = req.caller.kind === 'user' && req.caller.subject;
const mine = signedIn ? store.definitions.list({ owner_subject: req.caller.subject }) : [];
const mine = signedIn ? store.definitions.list({ owner_subject: req.caller.subject }) : [];