openvibers/openvibe.today Commits
openvibe-shared v4.33.0 (was v4.31.0) (#1)
Changes
@@@ -205,3 +205,9 @@ and discovery.## LicenseAGPL-3.0-only. See [LICENSE](LICENSE).++++<!-- versions:start -->++- openvibe-contracts: v0.229.0++- openvibe-sdk: v0.70.0++- openvibe-shared: v4.33.0++<!-- versions:end -->@@@ -8,13 +8,13 @@"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9","port": "5100","domain": "openvibe.today",-- "contracts": "openvibe-contracts v0.213.0",-- "sdk": "openvibe-sdk v0.64.0",-- "shared": "openvibe-shared v4.12.0",++ "contracts": "openvibe-contracts v0.229.0",++ "sdk": "openvibe-sdk v0.70.0",++ "shared": "openvibe-shared v4.33.0","packages": [-- "openvibe-contracts v0.213.0",-- "openvibe-sdk v0.64.0",-- "openvibe-shared v4.12.0"++ "openvibe-contracts v0.229.0",++ "openvibe-sdk v0.70.0",++ "openvibe-shared v4.33.0"],"summary": "OpenVibe.Today is the network's time bus and calendar authority. A person schedules a stream (on their Live channel) or a plain event; the public schedule and a channel's ICS feed are readable without an account, a private token feed is one URL per person and rotation invalidates the old one, and reminders arrive through OpenVibe.Network. Events move from scheduled to live and done as OpenVibe.Live says so over OpenVibe.Events, while the daily brief is built from the agenda, today's reminders and OpenVibe.Live's public Rundown.","works": [@@@ -15,9 +15,9 @@"express-rate-limit": "^7.5.0","helmet": "^8.1.0","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0","pg": "^8.23.0"},"devDependencies": {@@@ -875,9 +875,9 @@}},"node_modules/openvibe-contracts": {-- "version": "0.229.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",-- "integrity": "sha512-BYazi/dna8bgdM6+Go8t+D7lTyI9UaWYnJIx0hYEdD0v2ps87iTPONkjnCBadk5RUrBDtvcNoSONS3R+bwFG0w==",++ "version": "0.233.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",++ "integrity": "sha512-pkX0+tsMP6HF7mwbM6jDa97C8U+kbivs+iVdjylEP0sEaqZsPYvTuYHHvnPMZXNQ6QCLriGRSBNdji1F8i3m5A==","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -919,9 +919,9 @@}},"node_modules/openvibe-shared": {-- "version": "4.31.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",-- "integrity": "sha512-Zk1t1RGsiszXJEyW3x/cVCYC6U1qyLXID43l/Ehv2Py5gGglz5CfgYlPcDGI7n3QACsCWoOIGZuMBvlyfxyXEA==",++ "version": "4.33.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0",++ "integrity": "sha512-t9XvhrQ+lQebOrFTjMCzI6/7/i4iQn9dmMr/8HVTNW1XoV1exyJa7IH/HfyyKuLxjA8xaowrDfD28LwKIibBNg==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0"@@@ -22,9 +22,9 @@"express-rate-limit": "^7.5.0","helmet": "^8.1.0","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0","pg": "^8.23.0"},"engines": {@@@ -148,12 +148,18 @@ const iso = (ms) => new Date(ms).toISOString();await check('a failed outbox insert leaves neither the event nor the outbox row', async () => {const u = t.network.addUser('atomic');await t.ctx.s.db.exec('DELETE FROM today_outbox');-- await t.ctx.s.db.exec("ALTER TABLE today_outbox ADD CONSTRAINT outbox_never CHECK (topic <> 'today.event.scheduled')");++ // The outbox insert fails (no DDL: the test role does not own the table on the PostgreSQL store).++ const db = t.ctx.s.db;++ const exec = db.exec;++ db.exec = function (sql, ...rest) {++ if (/INSERT INTO today_outbox/.test(String(sql))) return Promise.reject(new Error('the outbox is down'));++ return exec.call(this, sql, ...rest);++ };try {const r = await t.get('/api/v1/events', { as: u, json: { kind: 'event', title: 'Atomic', starts_at: soon(), tz: 'UTC' } });assert.strictEqual(r.status, 500);} finally {-- await t.ctx.s.db.exec('ALTER TABLE today_outbox DROP CONSTRAINT outbox_never');++ db.exec = exec;}assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_events WHERE title = $1', ['Atomic']), 0);assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_outbox WHERE payload->>$1 = $2', ['title', 'Atomic']), 0);
@@ -205,3 +205,9 @@ and discovery.
@@ -205,3 +205,9 @@ and discovery.
## License
## License
AGPL-3.0-only. See [LICENSE](LICENSE).
AGPL-3.0-only. See [LICENSE](LICENSE).
+
+<!-- versions:start -->
+- openvibe-contracts: v0.229.0
+- openvibe-sdk: v0.70.0
+- openvibe-shared: v4.33.0
+<!-- versions:end -->
@@ -8,13 +8,13 @@
@@ -8,13 +8,13 @@
"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": "5100",
"port": "5100",
"domain": "openvibe.today",
"domain": "openvibe.today",
- "contracts": "openvibe-contracts v0.213.0",
- "sdk": "openvibe-sdk v0.64.0",
- "shared": "openvibe-shared v4.12.0",
+ "contracts": "openvibe-contracts v0.229.0",
+ "sdk": "openvibe-sdk v0.70.0",
+ "shared": "openvibe-shared v4.33.0",
"packages": [
"packages": [
- "openvibe-contracts v0.213.0",
- "openvibe-sdk v0.64.0",
- "openvibe-shared v4.12.0"
+ "openvibe-contracts v0.229.0",
+ "openvibe-sdk v0.70.0",
+ "openvibe-shared v4.33.0"
],
],
"summary": "OpenVibe.Today is the network's time bus and calendar authority. A person schedules a stream (on their Live channel) or a plain event; the public schedule and a channel's ICS feed are readable without an account, a private token feed is one URL per person and rotation invalidates the old one, and reminders arrive through OpenVibe.Network. Events move from scheduled to live and done as OpenVibe.Live says so over OpenVibe.Events, while the daily brief is built from the agenda, today's reminders and OpenVibe.Live's public Rundown.",
"summary": "OpenVibe.Today is the network's time bus and calendar authority. A person schedules a stream (on their Live channel) or a plain event; the public schedule and a channel's ICS feed are readable without an account, a private token feed is one URL per person and rotation invalidates the old one, and reminders arrive through OpenVibe.Network. Events move from scheduled to live and done as OpenVibe.Live says so over OpenVibe.Events, while the daily brief is built from the agenda, today's reminders and OpenVibe.Live's public Rundown.",
"works": [
"works": [
@@ -15,9 +15,9 @@
@@ -15,9 +15,9 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0",
"pg": "^8.23.0"
"pg": "^8.23.0"
},
},
"devDependencies": {
"devDependencies": {
@@ -875,9 +875,9 @@
@@ -875,9 +875,9 @@
}
}
},
},
"node_modules/openvibe-contracts": {
"node_modules/openvibe-contracts": {
- "version": "0.229.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",
- "integrity": "sha512-BYazi/dna8bgdM6+Go8t+D7lTyI9UaWYnJIx0hYEdD0v2ps87iTPONkjnCBadk5RUrBDtvcNoSONS3R+bwFG0w==",
+ "version": "0.233.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",
+ "integrity": "sha512-pkX0+tsMP6HF7mwbM6jDa97C8U+kbivs+iVdjylEP0sEaqZsPYvTuYHHvnPMZXNQ6QCLriGRSBNdji1F8i3m5A==",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -919,9 +919,9 @@
@@ -919,9 +919,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "4.31.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",
- "integrity": "sha512-Zk1t1RGsiszXJEyW3x/cVCYC6U1qyLXID43l/Ehv2Py5gGglz5CfgYlPcDGI7n3QACsCWoOIGZuMBvlyfxyXEA==",
+ "version": "4.33.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0",
+ "integrity": "sha512-t9XvhrQ+lQebOrFTjMCzI6/7/i4iQn9dmMr/8HVTNW1XoV1exyJa7IH/HfyyKuLxjA8xaowrDfD28LwKIibBNg==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0"
"jsonwebtoken": "^9.0.0"
@@ -22,9 +22,9 @@
@@ -22,9 +22,9 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.229.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.70.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.31.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.33.0",
"pg": "^8.23.0"
"pg": "^8.23.0"
},
},
"engines": {
"engines": {
@@ -148,12 +148,18 @@ const iso = (ms) => new Date(ms).toISOString();
@@ -148,12 +148,18 @@ const iso = (ms) => new Date(ms).toISOString();
await check('a failed outbox insert leaves neither the event nor the outbox row', async () => {
await check('a failed outbox insert leaves neither the event nor the outbox row', async () => {
const u = t.network.addUser('atomic');
const u = t.network.addUser('atomic');
await t.ctx.s.db.exec('DELETE FROM today_outbox');
await t.ctx.s.db.exec('DELETE FROM today_outbox');
- await t.ctx.s.db.exec("ALTER TABLE today_outbox ADD CONSTRAINT outbox_never CHECK (topic <> 'today.event.scheduled')");
+ // The outbox insert fails (no DDL: the test role does not own the table on the PostgreSQL store).
+ const db = t.ctx.s.db;
+ const exec = db.exec;
+ db.exec = function (sql, ...rest) {
+ if (/INSERT INTO today_outbox/.test(String(sql))) return Promise.reject(new Error('the outbox is down'));
+ return exec.call(this, sql, ...rest);
+ };
try {
try {
const r = await t.get('/api/v1/events', { as: u, json: { kind: 'event', title: 'Atomic', starts_at: soon(), tz: 'UTC' } });
const r = await t.get('/api/v1/events', { as: u, json: { kind: 'event', title: 'Atomic', starts_at: soon(), tz: 'UTC' } });
assert.strictEqual(r.status, 500);
assert.strictEqual(r.status, 500);
} finally {
} finally {
- await t.ctx.s.db.exec('ALTER TABLE today_outbox DROP CONSTRAINT outbox_never');
+ db.exec = exec;
}
}
assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_events WHERE title = $1', ['Atomic']), 0);
assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_events WHERE title = $1', ['Atomic']), 0);
assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_outbox WHERE payload->>$1 = $2', ['title', 'Atomic']), 0);
assert.strictEqual(await t.ctx.s.db.value('SELECT COUNT(*)::int AS n FROM today_outbox WHERE payload->>$1 = $2', ['title', 'Atomic']), 0);