openvibers/openvibe.media Commits

Media answers the owner's Setup: /internal/config behind media.config.manage (#441)

OP OpenVibers committed 5 h ago · db009e6af9 · 6 files, +37 −7

* Media answers the owner's Setup: /internal/config behind media.config.manage (the guide said Media did not answer)

* openvibe-contracts v0.423.0: media.config.manage is Media's

* README and STATUS name openvibe-contracts v0.423.0

Changes

ddiff --git a/README.md b/README.md
iindex c71da01..5eb277c 100644
---- a/README.md
++++ b/README.md
@@@ -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
the 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
ddiff --git a/STATUS.json b/STATUS.json
iindex 55c6ade..089231c 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -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": [
ddiff --git a/package-lock.json b/package-lock.json
iindex 6ec35e1..999474b 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex efd6764..f972472 100644
---- a/package.json
++++ b/package.json
@@@ -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",
ddiff --git a/server/index.js b/server/index.js
iindex 9e9bea4..3fe23fc 100644
---- a/server/index.js
++++ b/server/index.js
@@@ -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,
ddiff --git a/test/internal-config-mount.test.js b/test/internal-config-mount.test.js
nnew file mode 100644
iindex 0000000..b06ace0
---- /dev/null
++++ b/test/internal-config-mount.test.js
@@@ -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');