openvibers/openvibe.tips 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 @@"jsonwebtoken": "^9.0.2","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"@@@ -1008,9 +1008,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"@@@ -23,7 +23,7 @@"jsonwebtoken": "^9.0.2","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"@@@ -94,6 +94,8 @@ function createApp(opts = {}) {app.use('/auth', createSessionRoutes(config, userAuth, { fetchImpl }));{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'tips', service: 'tips', host: 'openvibe.tips', name: 'OpenVibe.Tips', profile: 'ugc' })); }++ // 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,setHeaders(res, filePath) {@@@ -7,6 +7,7 @@* site's stylesheet and its small progressive script. Everything is useful without JavaScript.*/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');@@@ -80,11 +81,11 @@ ${o.ogImage ? `<meta property="og:image" content="${esc(o.ogImage)}">` : ''}<meta name="twitter:card" content="summary">${appIcon.headTags({ site: 'tips' })}${release ? release.metaTag() : ''}--<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>++<script src="${ovServe.url('theme-loader.js')}" defer></script><link rel="stylesheet" href="${asset('css/tips.css')}">${jsonLd}--<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><script src="${asset('js/tips.js')}" defer></script></head><body>@@@ -22,6 +22,7 @@* GET /robots.txt, /sitemap.xml*/const crypto = require('crypto');++const ovServe = require('openvibe-shared/serve');const frame = require('openvibe-shared/frame');const express = require('express');const { TipsError, json: parseJson } = require('../util');@@@ -68,7 +69,7 @@ function createWebRoutes({ domain, config, layout, userAuth }) {html(res, pageFor(req, { active: 'home', canonicalPath: '/', body: pages.home({ creators }) }));});// What shipped on OpenVibe.Tips: the shared update log every OpenVibe site has.-- r.get('/updates', withViewer, (req, res) => html(res, pageFor(req, { canonicalPath: '/updates', title: 'What shipped on OpenVibe.Tips', body: frame.updatesBody({ service: 'tips', siteName: 'OpenVibe.Tips' }) + frame.shippedScript() })));++ r.get('/updates', withViewer, (req, res) => html(res, pageFor(req, { canonicalPath: '/updates', title: 'What shipped on OpenVibe.Tips', body: frame.updatesBody({ service: 'tips', siteName: 'OpenVibe.Tips' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>` })));r.get('/robots.txt', (req, res) => res.type('text/plain').set('Cache-Control', 'public, max-age=3600').send(`User-agent: *\nAllow: /\nDisallow: /dashboard\nDisallow: /receipts\nDisallow: /overlay/\nDisallow: /moderate/\nDisallow: /auth/\nDisallow: /api/\nDisallow: /internal/\nSitemap: ${config.baseUrl}/sitemap.xml\n`));r.get('/sitemap.xml', (req, res) => {@@@ -26,7 +26,7 @@ const { boot, check, done } = require('./helpers/app');const r = await get('/');assert.strictEqual(r.status, 200);assert.match(r.text, /<noscript><nav/);-- assert.match(r.text, /https:\/\/openvibe\.network\/shared\/navbar\.js/);++ assert.match(r.text, /\/shared\/navbar\.js\?v=[0-9a-f]{12}/);assert.match(r.text, /<meta name="ov-release"/);assert.match(r.text, /id="ov-footer"|class="ovf/);assert.match(r.text, /href="\/alex"/);
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"jsonwebtoken": "^9.0.2",
"jsonwebtoken": "^9.0.2",
"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"
@@ -1008,9 +1008,9 @@
@@ -1008,9 +1008,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"
@@ -23,7 +23,7 @@
@@ -23,7 +23,7 @@
"jsonwebtoken": "^9.0.2",
"jsonwebtoken": "^9.0.2",
"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"
@@ -94,6 +94,8 @@ function createApp(opts = {}) {
@@ -94,6 +94,8 @@ function createApp(opts = {}) {
app.use('/auth', createSessionRoutes(config, userAuth, { fetchImpl }));
app.use('/auth', createSessionRoutes(config, userAuth, { fetchImpl }));
{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'tips', service: 'tips', host: 'openvibe.tips', name: 'OpenVibe.Tips', profile: 'ugc' })); }
{ const legal = require('openvibe-shared/legal'); app.get(legal.PATHS, legal.handler({ id: 'tips', service: 'tips', host: 'openvibe.tips', name: 'OpenVibe.Tips', profile: 'ugc' })); }
+ // 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,
index: false, redirect: false,
setHeaders(res, filePath) {
setHeaders(res, filePath) {
@@ -7,6 +7,7 @@
@@ -7,6 +7,7 @@
* site's stylesheet and its small progressive script. Everything is useful without JavaScript.
* site's stylesheet and its small progressive script. Everything is useful without JavaScript.
*/
*/
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');
@@ -80,11 +81,11 @@ ${o.ogImage ? `<meta property="og:image" content="${esc(o.ogImage)}">` : ''}
@@ -80,11 +81,11 @@ ${o.ogImage ? `<meta property="og:image" content="${esc(o.ogImage)}">` : ''}
<meta name="twitter:card" content="summary">
<meta name="twitter:card" content="summary">
${appIcon.headTags({ site: 'tips' })}
${appIcon.headTags({ site: 'tips' })}
${release ? release.metaTag() : ''}
${release ? release.metaTag() : ''}
-<script src="${NETWORK_URL}/shared/theme-loader.js" defer></script>
+<script src="${ovServe.url('theme-loader.js')}" defer></script>
<link rel="stylesheet" href="${asset('css/tips.css')}">
<link rel="stylesheet" href="${asset('css/tips.css')}">
${jsonLd}
${jsonLd}
-<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>
<script src="${asset('js/tips.js')}" defer></script>
<script src="${asset('js/tips.js')}" defer></script>
</head>
</head>
<body>
<body>
@@ -22,6 +22,7 @@
@@ -22,6 +22,7 @@
* GET /robots.txt, /sitemap.xml
* GET /robots.txt, /sitemap.xml
*/
*/
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 { TipsError, json: parseJson } = require('../util');
const { TipsError, json: parseJson } = require('../util');
@@ -68,7 +69,7 @@ function createWebRoutes({ domain, config, layout, userAuth }) {
@@ -68,7 +69,7 @@ function createWebRoutes({ domain, config, layout, userAuth }) {
html(res, pageFor(req, { active: 'home', canonicalPath: '/', body: pages.home({ creators }) }));
html(res, pageFor(req, { active: 'home', canonicalPath: '/', body: pages.home({ creators }) }));
});
});
// What shipped on OpenVibe.Tips: the shared update log every OpenVibe site has.
// What shipped on OpenVibe.Tips: the shared update log every OpenVibe site has.
- r.get('/updates', withViewer, (req, res) => html(res, pageFor(req, { canonicalPath: '/updates', title: 'What shipped on OpenVibe.Tips', body: frame.updatesBody({ service: 'tips', siteName: 'OpenVibe.Tips' }) + frame.shippedScript() })));
+ r.get('/updates', withViewer, (req, res) => html(res, pageFor(req, { canonicalPath: '/updates', title: 'What shipped on OpenVibe.Tips', body: frame.updatesBody({ service: 'tips', siteName: 'OpenVibe.Tips' }) + `<script src="${ovServe.url('shipped.js')}" defer></script>` })));
r.get('/robots.txt', (req, res) => res.type('text/plain').set('Cache-Control', 'public, max-age=3600').send(
r.get('/robots.txt', (req, res) => res.type('text/plain').set('Cache-Control', 'public, max-age=3600').send(
`User-agent: *\nAllow: /\nDisallow: /dashboard\nDisallow: /receipts\nDisallow: /overlay/\nDisallow: /moderate/\nDisallow: /auth/\nDisallow: /api/\nDisallow: /internal/\nSitemap: ${config.baseUrl}/sitemap.xml\n`));
`User-agent: *\nAllow: /\nDisallow: /dashboard\nDisallow: /receipts\nDisallow: /overlay/\nDisallow: /moderate/\nDisallow: /auth/\nDisallow: /api/\nDisallow: /internal/\nSitemap: ${config.baseUrl}/sitemap.xml\n`));
r.get('/sitemap.xml', (req, res) => {
r.get('/sitemap.xml', (req, res) => {
@@ -26,7 +26,7 @@ const { boot, check, done } = require('./helpers/app');
@@ -26,7 +26,7 @@ const { boot, check, done } = require('./helpers/app');
const r = await get('/');
const r = await get('/');
assert.strictEqual(r.status, 200);
assert.strictEqual(r.status, 200);
assert.match(r.text, /<noscript><nav/);
assert.match(r.text, /<noscript><nav/);
- assert.match(r.text, /https:\/\/openvibe\.network\/shared\/navbar\.js/);
+ assert.match(r.text, /\/shared\/navbar\.js\?v=[0-9a-f]{12}/);
assert.match(r.text, /<meta name="ov-release"/);
assert.match(r.text, /<meta name="ov-release"/);
assert.match(r.text, /id="ov-footer"|class="ovf/);
assert.match(r.text, /id="ov-footer"|class="ovf/);
assert.match(r.text, /href="\/alex"/);
assert.match(r.text, /href="\/alex"/);