openvibers/openvibe.media Commits
Media answers the owner's Setup: /internal/config behind media.config.manage (#441)
Changes
@@@ -48,7 +48,7 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pgexport and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay andthe account and revocation subscriptions)- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host--- `openvibe-contracts` v0.419.0, `openvibe-sdk` v0.161.0 (tokens, events outbox, usage readings, per-actor limits),++- `openvibe-contracts` v0.423.0, `openvibe-sdk` v0.161.0 (tokens, events outbox, usage readings, per-actor limits),`openvibe-shared` v4.235.0, pinned by release tarball## Capabilities@@@ -6,7 +6,7 @@"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg","port": 4100,"domain": "openvibe.media",-- "contracts": "openvibe-contracts v0.419.0",++ "contracts": "openvibe-contracts v0.423.0","sdk": "openvibe-sdk v0.161.0","shared": "openvibe-shared v4.235.0","capabilities": [@@@ -16,7 +16,7 @@"express": "^4.19.2","iovalkey": "^0.4.0","multer": "^1.4.5-lts.1",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0","pg": "^8.23.0",@@@ -2197,9 +2197,9 @@}},"node_modules/openvibe-contracts": {-- "version": "0.419.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",-- "integrity": "sha512-VxrTdeHchT8gvl2wWC9ASaId92en7ZKfJ8F/0hKzCAD0f2Y00rPrqgBWF9BNPoLGARoyQvsMbhBEhSkhxGNnjA==",++ "version": "0.423.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0",++ "integrity": "sha512-bF58G3suZW3cJAb3QuUF3zm0nwafNBr/0PACXEAPPNoJFF3wJ3x6hClkm9L4Y3l09xL5iqwu6ysIscmxLqXNOg==","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -20,7 +20,7 @@"express": "^4.19.2","iovalkey": "^0.4.0","multer": "^1.4.5-lts.1",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0","pg": "^8.23.0",@@@ -178,6 +178,22 @@ const ready = (async () => {const retire = require('./objects/legacy-paste-retire');app.post(retire.PATH, require('./service-guard').guard(retire.CAPABILITY), ...retire.handlers());}++ // ── The owner's Setup reads every service's settings here (Network's /admin/setup and its guide), with a Network++ // service token for media.config.manage (2026-11-13: Media had no such route, so the guide said "OpenVibe.Media did++ // not answer"). Media's settings are its two storage policies (media.storage_tier, media.object_tier); it asks the++ // owner for nothing, so Setup lists no input of Media's. Built on first use, like the admin copy of the same routes.++ {++ let routes = null;++ app.use('/internal/config', require('./service-guard').guard('media.config.manage'), express.json({ limit: '64kb' }), (req, res, next) => {++ if (!routes) {++ const vodStorage = require('./vod/vod-storage');++ routes = require('openvibe-shared/config').adminRoutes([vodStorage.tierConfig.get(vodStorage.DEFAULTS), require('./objects/tier-policy').get()], {++ basePath: '/', requireAdmin: (_rq, _rs, nx) => nx(), actor: (rq) => ({ type: 'service', id: (rq.principal && rq.principal.sub) || 'network' }),++ });++ }++ routes.handle(req, res, next);++ });++ }const userAuth = require('./user-auth');const userAuthConfig = {baseUrl: config.publicUrl, networkUrl: config.network.url, networkInternalUrl: config.network.internalUrl,nnew file mode 100644@@@ -0,0 +1,14 @@++'use strict';++// The owner's Setup reads Media's settings (2026-11-13): Network's /admin/setup and its guide read every service at++// /internal/config with a Network service token for <service>.config.manage. Media had no such route, so the guide said++// "OpenVibe.Media did not answer". It is mounted behind the service guard (loopback, a token holding++// media.config.manage) with openvibe-shared/config's routes over Media's two storage policies.++const assert = require('assert');++const fs = require('fs');++const path = require('path');++++const src = fs.readFileSync(path.join(__dirname, '..', 'server', 'index.js'), 'utf8');++assert.ok(/app\.use\('\/internal\/config', require\('\.\/service-guard'\)\.guard\('media\.config\.manage'\)/.test(src), 'mounted behind the service guard for media.config.manage');++assert.ok(/require\('openvibe-shared\/config'\)\.adminRoutes\(\[vodStorage\.tierConfig\.get\(vodStorage\.DEFAULTS\), require\('\.\/objects\/tier-policy'\)\.get\(\)\], \{\s*basePath: '\/'/.test(src), 'the two storage policies, at the mount\'s root');++assert.ok(typeof require('openvibe-shared/config').adminRoutes === 'function', 'openvibe-shared/config has the routes');++console.log('internal-config-mount: /internal/config answers Network\'s Setup with Media\'s two policies, behind media.config.manage');
@@ -48,7 +48,7 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pg
@@ -48,7 +48,7 @@ without `DATABASE_URL`, development uses an embedded PGlite database in `data/pg
export and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay and
export and deletion), OpenVibe.Live (`live.lineage.resolve`), OpenVibe.Events (the outbox relay and
the account and revocation subscriptions)
the account and revocation subscriptions)
- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host
- Backblaze B2 and Cloudflare R2 (S3 API) when configured; `ffmpeg`/`ffprobe` on the host
-- `openvibe-contracts` v0.419.0, `openvibe-sdk` v0.161.0 (tokens, events outbox, usage readings, per-actor limits),
+- `openvibe-contracts` v0.423.0, `openvibe-sdk` v0.161.0 (tokens, events outbox, usage readings, per-actor limits),
`openvibe-shared` v4.235.0, pinned by release tarball
`openvibe-shared` v4.235.0, pinned by release tarball
## Capabilities
## Capabilities
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg",
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, ffmpeg",
"port": 4100,
"port": 4100,
"domain": "openvibe.media",
"domain": "openvibe.media",
- "contracts": "openvibe-contracts v0.419.0",
+ "contracts": "openvibe-contracts v0.423.0",
"sdk": "openvibe-sdk v0.161.0",
"sdk": "openvibe-sdk v0.161.0",
"shared": "openvibe-shared v4.235.0",
"shared": "openvibe-shared v4.235.0",
"capabilities": [
"capabilities": [
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"express": "^4.19.2",
"express": "^4.19.2",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -2197,9 +2197,9 @@
@@ -2197,9 +2197,9 @@
}
}
},
},
"node_modules/openvibe-contracts": {
"node_modules/openvibe-contracts": {
- "version": "0.419.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",
- "integrity": "sha512-VxrTdeHchT8gvl2wWC9ASaId92en7ZKfJ8F/0hKzCAD0f2Y00rPrqgBWF9BNPoLGARoyQvsMbhBEhSkhxGNnjA==",
+ "version": "0.423.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0",
+ "integrity": "sha512-bF58G3suZW3cJAb3QuUF3zm0nwafNBr/0PACXEAPPNoJFF3wJ3x6hClkm9L4Y3l09xL5iqwu6ysIscmxLqXNOg==",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -20,7 +20,7 @@
@@ -20,7 +20,7 @@
"express": "^4.19.2",
"express": "^4.19.2",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.419.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.423.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.161.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.235.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -178,6 +178,22 @@ const ready = (async () => {
@@ -178,6 +178,22 @@ const ready = (async () => {
const retire = require('./objects/legacy-paste-retire');
const retire = require('./objects/legacy-paste-retire');
app.post(retire.PATH, require('./service-guard').guard(retire.CAPABILITY), ...retire.handlers());
app.post(retire.PATH, require('./service-guard').guard(retire.CAPABILITY), ...retire.handlers());
}
}
+ // ── The owner's Setup reads every service's settings here (Network's /admin/setup and its guide), with a Network
+ // service token for media.config.manage (2026-11-13: Media had no such route, so the guide said "OpenVibe.Media did
+ // not answer"). Media's settings are its two storage policies (media.storage_tier, media.object_tier); it asks the
+ // owner for nothing, so Setup lists no input of Media's. Built on first use, like the admin copy of the same routes.
+ {
+ let routes = null;
+ app.use('/internal/config', require('./service-guard').guard('media.config.manage'), express.json({ limit: '64kb' }), (req, res, next) => {
+ if (!routes) {
+ const vodStorage = require('./vod/vod-storage');
+ routes = require('openvibe-shared/config').adminRoutes([vodStorage.tierConfig.get(vodStorage.DEFAULTS), require('./objects/tier-policy').get()], {
+ basePath: '/', requireAdmin: (_rq, _rs, nx) => nx(), actor: (rq) => ({ type: 'service', id: (rq.principal && rq.principal.sub) || 'network' }),
+ });
+ }
+ routes.handle(req, res, next);
+ });
+ }
const userAuth = require('./user-auth');
const userAuth = require('./user-auth');
const userAuthConfig = {
const userAuthConfig = {
baseUrl: config.publicUrl, networkUrl: config.network.url, networkInternalUrl: config.network.internalUrl,
baseUrl: config.publicUrl, networkUrl: config.network.url, networkInternalUrl: config.network.internalUrl,
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+'use strict';
+// The owner's Setup reads Media's settings (2026-11-13): Network's /admin/setup and its guide read every service at
+// /internal/config with a Network service token for <service>.config.manage. Media had no such route, so the guide said
+// "OpenVibe.Media did not answer". It is mounted behind the service guard (loopback, a token holding
+// media.config.manage) with openvibe-shared/config's routes over Media's two storage policies.
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+
+const src = fs.readFileSync(path.join(__dirname, '..', 'server', 'index.js'), 'utf8');
+assert.ok(/app\.use\('\/internal\/config', require\('\.\/service-guard'\)\.guard\('media\.config\.manage'\)/.test(src), 'mounted behind the service guard for media.config.manage');
+assert.ok(/require\('openvibe-shared\/config'\)\.adminRoutes\(\[vodStorage\.tierConfig\.get\(vodStorage\.DEFAULTS\), require\('\.\/objects\/tier-policy'\)\.get\(\)\], \{\s*basePath: '\/'/.test(src), 'the two storage policies, at the mount\'s root');
+assert.ok(typeof require('openvibe-shared/config').adminRoutes === 'function', 'openvibe-shared/config has the routes');
+console.log('internal-config-mount: /internal/config answers Network\'s Setup with Media\'s two policies, behind media.config.manage');