openvibers/openvibe.events Commits
openvibe-contracts v0.312.0 (was v0.289.1) (#247)
Changes
@@@ -406,7 +406,7 @@ implemented service.Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).<!-- versions:start -->--- openvibe-contracts: v0.289.1++- openvibe-contracts: v0.312.0- openvibe-sdk: v0.93.0- openvibe-shared: v4.124.0<!-- versions:end -->@@@ -7,7 +7,7 @@"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9","port": 4300,"domain": "openvibe.events",-- "contracts": "openvibe-contracts v0.289.1",++ "contracts": "openvibe-contracts v0.312.0","sdk": "openvibe-sdk v0.93.0","shared": "openvibe-shared v4.124.0","capabilities": [@@@ -12,7 +12,7 @@"dotenv": "^16.4.7","express": "^4.21.2","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0","pg": "^8.23.0"@@@ -1103,9 +1103,9 @@}},"node_modules/openvibe-contracts": {-- "version": "0.289.1",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",-- "integrity": "sha512-LrKTwe8VPCWn+b0MTNmfjAYEJ0rtgLxeM6EHONBDl0ynt/Igndz+ruDEpwuz5SZ9HYCIMkCqSV5ujhedh6zmzQ==",++ "version": "0.312.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",++ "integrity": "sha512-2GsD53zuIedL3eW2LBlYQ68ODTHzoZJHrAmVnZCpiL7ZWnAXGwPW9dpQagLI9Zdkh3LQuuU5ae1YJI0K+acXbA==","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -24,7 +24,7 @@"dotenv": "^16.4.7","express": "^4.21.2","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0","pg": "^8.23.0"@@@ -63,11 +63,13 @@ const DEFAULT_SOURCES = ['live', 'media', 'network', 'community', 'chat', 'openr/*** Namespaces that belong to the network rather than to one service. `provider.*` carries storage* provider health/capacity telemetry, which whichever first-party service observes a provider-- * publishes (Media, Sources, Host, ...), so any service token may publish into it. Sources still++ * publishes (Media, Sources, Host, ...), so any service token may publish into it. `share.*` is++ * the sharing family Network publishes (share.granted, share.revoked, share.transfer.*), named by++ * its family rather than by the network namespace in Contracts' network manifest. Sources still* own their own namespace first; a shared prefix never replaces `<source>.`. Developer apps can* never publish a shared prefix. EVENTS_SHARED_PREFIXES (comma-separated) replaces the default.*/--const DEFAULT_SHARED_PREFIXES = ['provider.'];++const DEFAULT_SHARED_PREFIXES = ['provider.', 'share.'];function sourcePrefixes(env) {let map = Object.fromEntries(DEFAULT_SOURCES.map(s => [s, [`${namespaceOf(s)}.`]]));@@@ -43,7 +43,7 @@ t('config: every source prefix must start with the source', () => {});t('config: network-wide prefixes are shared, source namespaces stay owned', () => {-- assert.deepStrictEqual(load({}).sharedPrefixes, ['provider.']);++ assert.deepStrictEqual(load({}).sharedPrefixes, ['provider.', 'share.']);const c = load({ EVENTS_SHARED_PREFIXES: 'provider.,storage.' });assert.deepStrictEqual(c.sharedPrefixes, ['provider.', 'storage.']);assert.throws(() => load({ EVENTS_SHARED_PREFIXES: 'provider' }), /bad prefix/);@@@ -12,6 +12,6 @@ const manifests = fs.readdirSync(dir).filter((f) => f.endsWith('.json')).map((f)const producers = manifests.filter((m) => (m.eventsProduced || []).length).map((m) => m.id || m.service).filter((id) => id !== 'events');const missing = producers.filter((id) => !DEFAULT_SOURCES.includes(id));assert.deepStrictEqual(missing, [], `producers that may not publish: ${missing.join(', ')}`);--const outside = manifests.flatMap((m) => (m.eventsProduced || []).filter((t) => (m.id || m.service) !== 'events' && t.split('.')[0] !== namespaceOf(m.id || m.service) && !t.startsWith('provider.')).map((t) => `${m.id || m.service}: ${t}`));++const outside = manifests.flatMap((m) => (m.eventsProduced || []).filter((t) => (m.id || m.service) !== 'events' && t.split('.')[0] !== namespaceOf(m.id || m.service) && !t.startsWith('provider.') && !t.startsWith('share.')).map((t) => `${m.id || m.service}: ${t}`));assert.deepStrictEqual(outside, [], 'every produced event type is in its producer\'s own namespace');console.log(`sources cover producers: ${producers.length} producers, all allowed`);
@@ -406,7 +406,7 @@ implemented service.
@@ -406,7 +406,7 @@ implemented service.
Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).
Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).
<!-- versions:start -->
<!-- versions:start -->
-- openvibe-contracts: v0.289.1
+- openvibe-contracts: v0.312.0
- openvibe-sdk: v0.93.0
- openvibe-sdk: v0.93.0
- openvibe-shared: v4.124.0
- openvibe-shared: v4.124.0
<!-- versions:end -->
<!-- versions:end -->
@@ -7,7 +7,7 @@
@@ -7,7 +7,7 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4300,
"port": 4300,
"domain": "openvibe.events",
"domain": "openvibe.events",
- "contracts": "openvibe-contracts v0.289.1",
+ "contracts": "openvibe-contracts v0.312.0",
"sdk": "openvibe-sdk v0.93.0",
"sdk": "openvibe-sdk v0.93.0",
"shared": "openvibe-shared v4.124.0",
"shared": "openvibe-shared v4.124.0",
"capabilities": [
"capabilities": [
@@ -12,7 +12,7 @@
@@ -12,7 +12,7 @@
"dotenv": "^16.4.7",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"express": "^4.21.2",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0",
"pg": "^8.23.0"
"pg": "^8.23.0"
@@ -1103,9 +1103,9 @@
@@ -1103,9 +1103,9 @@
}
}
},
},
"node_modules/openvibe-contracts": {
"node_modules/openvibe-contracts": {
- "version": "0.289.1",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",
- "integrity": "sha512-LrKTwe8VPCWn+b0MTNmfjAYEJ0rtgLxeM6EHONBDl0ynt/Igndz+ruDEpwuz5SZ9HYCIMkCqSV5ujhedh6zmzQ==",
+ "version": "0.312.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",
+ "integrity": "sha512-2GsD53zuIedL3eW2LBlYQ68ODTHzoZJHrAmVnZCpiL7ZWnAXGwPW9dpQagLI9Zdkh3LQuuU5ae1YJI0K+acXbA==",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"dotenv": "^16.4.7",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"express": "^4.21.2",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.289.1",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.93.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.124.0",
"pg": "^8.23.0"
"pg": "^8.23.0"
@@ -63,11 +63,13 @@ const DEFAULT_SOURCES = ['live', 'media', 'network', 'community', 'chat', 'openr
@@ -63,11 +63,13 @@ const DEFAULT_SOURCES = ['live', 'media', 'network', 'community', 'chat', 'openr
/**
/**
* Namespaces that belong to the network rather than to one service. `provider.*` carries storage
* Namespaces that belong to the network rather than to one service. `provider.*` carries storage
* provider health/capacity telemetry, which whichever first-party service observes a provider
* provider health/capacity telemetry, which whichever first-party service observes a provider
- * publishes (Media, Sources, Host, ...), so any service token may publish into it. Sources still
+ * publishes (Media, Sources, Host, ...), so any service token may publish into it. `share.*` is
+ * the sharing family Network publishes (share.granted, share.revoked, share.transfer.*), named by
+ * its family rather than by the network namespace in Contracts' network manifest. Sources still
* own their own namespace first; a shared prefix never replaces `<source>.`. Developer apps can
* own their own namespace first; a shared prefix never replaces `<source>.`. Developer apps can
* never publish a shared prefix. EVENTS_SHARED_PREFIXES (comma-separated) replaces the default.
* never publish a shared prefix. EVENTS_SHARED_PREFIXES (comma-separated) replaces the default.
*/
*/
-const DEFAULT_SHARED_PREFIXES = ['provider.'];
+const DEFAULT_SHARED_PREFIXES = ['provider.', 'share.'];
function sourcePrefixes(env) {
function sourcePrefixes(env) {
let map = Object.fromEntries(DEFAULT_SOURCES.map(s => [s, [`${namespaceOf(s)}.`]]));
let map = Object.fromEntries(DEFAULT_SOURCES.map(s => [s, [`${namespaceOf(s)}.`]]));
@@ -43,7 +43,7 @@ t('config: every source prefix must start with the source', () => {
@@ -43,7 +43,7 @@ t('config: every source prefix must start with the source', () => {
});
});
t('config: network-wide prefixes are shared, source namespaces stay owned', () => {
t('config: network-wide prefixes are shared, source namespaces stay owned', () => {
- assert.deepStrictEqual(load({}).sharedPrefixes, ['provider.']);
+ assert.deepStrictEqual(load({}).sharedPrefixes, ['provider.', 'share.']);
const c = load({ EVENTS_SHARED_PREFIXES: 'provider.,storage.' });
const c = load({ EVENTS_SHARED_PREFIXES: 'provider.,storage.' });
assert.deepStrictEqual(c.sharedPrefixes, ['provider.', 'storage.']);
assert.deepStrictEqual(c.sharedPrefixes, ['provider.', 'storage.']);
assert.throws(() => load({ EVENTS_SHARED_PREFIXES: 'provider' }), /bad prefix/);
assert.throws(() => load({ EVENTS_SHARED_PREFIXES: 'provider' }), /bad prefix/);
@@ -12,6 +12,6 @@ const manifests = fs.readdirSync(dir).filter((f) => f.endsWith('.json')).map((f)
@@ -12,6 +12,6 @@ const manifests = fs.readdirSync(dir).filter((f) => f.endsWith('.json')).map((f)
const producers = manifests.filter((m) => (m.eventsProduced || []).length).map((m) => m.id || m.service).filter((id) => id !== 'events');
const producers = manifests.filter((m) => (m.eventsProduced || []).length).map((m) => m.id || m.service).filter((id) => id !== 'events');
const missing = producers.filter((id) => !DEFAULT_SOURCES.includes(id));
const missing = producers.filter((id) => !DEFAULT_SOURCES.includes(id));
assert.deepStrictEqual(missing, [], `producers that may not publish: ${missing.join(', ')}`);
assert.deepStrictEqual(missing, [], `producers that may not publish: ${missing.join(', ')}`);
-const outside = manifests.flatMap((m) => (m.eventsProduced || []).filter((t) => (m.id || m.service) !== 'events' && t.split('.')[0] !== namespaceOf(m.id || m.service) && !t.startsWith('provider.')).map((t) => `${m.id || m.service}: ${t}`));
+const outside = manifests.flatMap((m) => (m.eventsProduced || []).filter((t) => (m.id || m.service) !== 'events' && t.split('.')[0] !== namespaceOf(m.id || m.service) && !t.startsWith('provider.') && !t.startsWith('share.')).map((t) => `${m.id || m.service}: ${t}`));
assert.deepStrictEqual(outside, [], 'every produced event type is in its producer\'s own namespace');
assert.deepStrictEqual(outside, [], 'every produced event type is in its producer\'s own namespace');
console.log(`sources cover producers: ${producers.length} producers, all allowed`);
console.log(`sources cover producers: ${producers.length} producers, all allowed`);