openvibers/openvibe.codes Commits

Docs: /docs/events links each event's payload contract (117 published) and marks the rest planned, instead of saying payload schemas do not exist; openvibe-contracts v0.34.2; the per-address rate limit is CODES_RATE_LIMIT_PER_MIN (default 300), raised in tests that fetch every contract page

OP OpenVibers committed 24 Sept 2026 · a1294156cd · 6 files, +17 −13


Changes

ddiff --git a/package-lock.json b/package-lock.json
iindex 58306df..09fa1c4 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -16,7 +16,7 @@
"express": "^4.21.2",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.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.34.2",
"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.5.1"
},
@@@ -1023,9 +1023,9 @@
}
},
"node_modules/openvibe-contracts": {
-- "version": "0.33.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.0",
-- "integrity": "sha512-7q8NUhcPxgb8lxrVdC3pFbiPdjzliJM1mMP/1G5a2PmOr2tJVAXwYa8+a8YgCJvYeMSeMHWijLkIEiZ9IhllOg==",
++ "version": "0.34.2",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.34.2",
++ "integrity": "sha512-LV+8rnyfok0c7JsWymmrmo49BGL+nFvvcB75l1Ogx5iVoTw6PmX+jFUbQtnvYchKPmnzu2irfT2VOI49GSro7w==",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex b99f7e8..0ba1df3 100644
---- a/package.json
++++ b/package.json
@@@ -27,7 +27,7 @@
"express": "^4.21.2",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.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.34.2",
"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.5.1"
},
ddiff --git a/server/app.js b/server/app.js
iindex 5e5728f..e0af2de 100644
---- a/server/app.js
++++ b/server/app.js
@@@ -123,7 +123,7 @@ function createApp(opts = {}) {
app.use('/api', (req, res) => contracts.http.sendProblem(res, 404, 'route.not_found', { detail: 'No such API route', ctx: req.ov }));
// ── Pages ───────────────────────────────────────────────
-- app.use(rateLimit({ windowMs: 60_000, limit: 300, standardHeaders: true, legacyHeaders: false }));
++ app.use(rateLimit({ windowMs: 60_000, limit: Number(process.env.CODES_RATE_LIMIT_PER_MIN) || 300, standardHeaders: true, legacyHeaders: false })); // per address; tests raise it
app.use('/docs', createDocsRoutes(ctx));
app.use('/projects', rateLimit({ windowMs: 60_000, limit: 60, standardHeaders: true, legacyHeaders: false, skip: (req) => req.method === 'GET' }), createPortalRoutes(ctx));
app.use('/releases', createReleaseActionRoutes(ctx));
ddiff --git a/server/http/docs.js b/server/http/docs.js
iindex 32f80f6..9cb782c 100644
---- a/server/http/docs.js
++++ b/server/http/docs.js
@@@ -148,13 +148,15 @@ ${c.outputSchema ? html`<dt>Output</dt><dd>${c.outputSchema}</dd>` : ''}
});
// ── Events ──────────────────────────────────────────────
++ // Event types that have a payload contract (events/payloads/<type>.v<major>.json in openvibe-contracts).
++ const payloadIds = new Set(require('openvibe-contracts').catalog.filter((c) => String(c.schema || '').startsWith('events/payloads/')).map((c) => c.id));
r.get('/events', (req, res) => {
page(req, res, {
title: 'Event types',
crumbs: [{ label: 'Docs', href: '/docs' }, { label: 'Events' }],
body: html`<h1>Event types</h1>${versions()}
--<p>Every event type a service manifest declares it produces, and who declares they consume it. Events travel as <a href="/docs/contracts/events.event-envelope">events.event-envelope@1</a>; deliveries are signed (<a href="/tools/webhooks">webhook tester</a>). Contracts do not define per-event payload schemas yet.</p>
--${table(['Event type', 'Produced by', 'Consumed by'], docs.events.map((e) => [code(e.type), e.producers.join(', '), e.consumers.join(', ') || '—']))}`,
++<p>Every event type a service manifest declares it produces, and who declares they consume it. Events travel as <a href="/docs/contracts/events.event-envelope">events.event-envelope@1</a>; deliveries are signed (<a href="/tools/webhooks">webhook tester</a>). Each event's payload has its own contract where one is published (named after the event type, version = the envelope's <code>version</code>).</p>
++${table(['Event type', 'Payload', 'Produced by', 'Consumed by'], docs.events.map((e) => [code(e.type), payloadIds.has(e.type) ? html`<a href="/docs/contracts/${e.type}">schema</a>` : html`<span class="muted">planned</span>`, e.producers.join(', '), e.consumers.join(', ') || '—']))}`,
});
});
ddiff --git a/test/docs.test.js b/test/docs.test.js
iindex 9b301d7..61ff97e 100644
---- a/test/docs.test.js
++++ b/test/docs.test.js
@@@ -19,11 +19,11 @@ const sdkPkg = require('openvibe-sdk/package.json');
await check('package.json pins the contracts, SDK and shared tags that are installed', async () => {
const tag = (dep) => (pkg.dependencies[dep].match(/refs\/tags\/(v[0-9.]+)$/) || [])[1];
-- assert.strictEqual(tag('openvibe-contracts'), 'v0.33.0');
++ assert.strictEqual(tag('openvibe-contracts'), 'v0.34.2');
assert.strictEqual(tag('openvibe-sdk'), `v${sdkPkg.version}`);
assert.strictEqual(tag('openvibe-shared'), `v${require('openvibe-shared/package.json').version}`);
assert.strictEqual(sdkPkg.version, '0.5.0');
-- // The contracts tag v0.33.0 carries the released codes manifest and codes.app-manifest@1.
++ // The contracts tag v0.34.2 carries the released codes manifest and codes.app-manifest@1.
assert.ok(contracts.services.get('codes') && contracts.services.get('codes').status === 'alpha');
assert.ok(contracts.resolve('codes.app-manifest@1'));
});
@@@ -33,13 +33,13 @@ const sdkPkg = require('openvibe-sdk/package.json');
const r = await t.get(p);
assert.strictEqual(r.status, 200, p);
assert.ok(r.text.includes(`openvibe-contracts v${contractsVersion}`), `${p} names the installed contracts version`);
-- assert.ok(r.text.includes('OpenVibe.Contracts/tree/v0.33.0'), `${p} links the pinned tag`);
-- if (contractsVersion !== '0.33.0') assert.ok(r.text.includes('(tag v0.33.0)'), `${p} says the tag differs from the package version`);
++ assert.ok(r.text.includes('OpenVibe.Contracts/tree/v0.34.2'), `${p} links the pinned tag`);
++ if (contractsVersion !== '0.34.2') assert.ok(r.text.includes('(tag v0.34.2)'), `${p} says the tag differs from the package version`);
assert.ok(r.text.includes(`openvibe-sdk v${sdkPkg.version}`), `${p} names the SDK version`);
}
const v = (await t.get('/api/v1/docs/versions')).json();
assert.strictEqual(v.contracts, contractsVersion);
-- assert.strictEqual(v.contracts_tag, 'v0.33.0');
++ assert.strictEqual(v.contracts_tag, 'v0.34.2');
assert.strictEqual(v.sdk, sdkPkg.version);
});
ddiff --git a/test/helpers/boot.js b/test/helpers/boot.js
iindex 19cbb3f..589c306 100644
---- a/test/helpers/boot.js
++++ b/test/helpers/boot.js
@@@ -1,4 +1,6 @@
'use strict';
++// The docs tests fetch one page per contract (hundreds); the per-address limit would answer 429 part-way.
++process.env.CODES_RATE_LIMIT_PER_MIN = process.env.CODES_RATE_LIMIT_PER_MIN || '100000';
/**
* Boots Codes on a temp database with mocks of Network, Events and Media, captures every log line
* (the app's logger AND console), and returns a small HTTP client. Every test file gets its own.