openvibers/openvibe.network Commits

openvibe-contracts v0.271.0: the Dock's timer (#482)

OP OpenVibers committed 12 days ago · b11a75bbea · 5 files, +15 −7

The Dock's state may carry a timer (network.dock-state@1, contracts 0.271.0, plan L48 R2): kept whole, cleared with
null, a kind the contract does not know refused.

Changes

ddiff --git a/README.md b/README.md
iindex c80bb728..a5f635c7 100644
---- a/README.md
++++ b/README.md
@@@ -820,7 +820,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md). The rules the code keeps:
MIT (`license` in [package.json](package.json)).
<!-- versions:start -->
--- openvibe-contracts: v0.270.0
++- openvibe-contracts: v0.271.0
- openvibe-sdk: v0.74.0
- openvibe-shared: v4.73.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex 291937af..c509e951 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -6,7 +6,7 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4000,
"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
-- "contracts": "openvibe-contracts v0.270.0",
++ "contracts": "openvibe-contracts v0.271.0",
"sdk": "openvibe-sdk v0.74.0",
"shared": "openvibe-shared v4.73.0",
"capabilities": [
ddiff --git a/package-lock.json b/package-lock.json
iindex ab263a0a..b474b12f 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -20,7 +20,7 @@
"iovalkey": "^0.4.0",
"jsonwebtoken": "^9.0.0",
"multer": "^1.4.5-lts.1",
-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.270.0",
++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.271.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.73.0",
"pg": "^8.23.0",
@@@ -1595,9 +1595,9 @@
}
},
"node_modules/openvibe-contracts": {
-- "version": "0.270.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.270.0",
-- "integrity": "sha512-smeardiqY5pkwFNpVAEbR6LszJkjRMIRIvpv2mNN1Tlo0rWXHeQ5QSFQPhsPvpFCyFmewjayHtQp/K7bE3Bojw==",
++ "version": "0.271.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.271.0",
++ "integrity": "sha512-pkkF191c+cxm6v90eNXej8qywVcRMK/avsfDKxlGuH/GrYICjceGxuPsCBQZeQ79by0/DqgXaG8tTWYnEs+oFw==",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex c4e88f88..a9e0fdbf 100644
---- a/package.json
++++ b/package.json
@@@ -24,7 +24,7 @@
"iovalkey": "^0.4.0",
"jsonwebtoken": "^9.0.0",
"multer": "^1.4.5-lts.1",
-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.270.0",
++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.271.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.73.0",
"pg": "^8.23.0",
ddiff --git a/test/dock.test.js b/test/dock.test.js
iindex a9bb4bab..a07d50d8 100644
---- a/test/dock.test.js
++++ b/test/dock.test.js
@@@ -108,6 +108,14 @@ try {
assert.strictEqual(r.body.state.tab, 'vibe');
r = await call('PUT', { tab: 'chats' });
assert.strictEqual((await call('PUT', { tab: 'nope' })).status, 422, 'a tab the contract does not know is refused');
++ // A timer (contracts 0.271.0, plan L48 R2): kept whole, cleared with null.
++ const timer = { kind: 'focus', label: 'Write', started_at: '2026-11-01T09:00:00.000Z', ends_at: '2026-11-01T09:25:00.000Z', round: 1, rounds: 4, focus_min: 25, break_min: 5 };
++ r = await call('PUT', { timer });
++ assert.strictEqual(r.status, 200, JSON.stringify(r.body));
++ assert.deepStrictEqual(r.body.state.timer, timer);
++ assert.strictEqual((await call('PUT', { timer: { kind: 'nap', started_at: timer.started_at, ends_at: timer.ends_at } })).status, 422, 'a kind the contract does not know');
++ r = await call('PUT', { timer: null });
++ assert.strictEqual(r.body.state.timer, null, 'stopped');
// place merges per device class, and inside a class per field.
r = await call('PUT', { place: { desktop: { width: 500 } } });