openvibers/openvibe.games Commits
New worlds: validate against Contracts 0.320.0, no invented cover (#306)
Changes
@@@ -291,7 +291,7 @@ Events deliveries) and `OV_NETWORK_AUTH_URL` live in `/etc/openvibe/games.env`,between services.<!-- versions:start -->--- openvibe-contracts: v0.312.0++- openvibe-contracts: v0.320.0- openvibe-sdk: v0.94.0- openvibe-shared: v4.129.0- openvibe-publishing: v1.4.0@@@ -6,7 +6,7 @@"runtime": "node 22, TypeScript (tsx), pnpm workspace; Babylon.js (client) + deterministic Rapier physics; PostgreSQL 18 via openvibe-sdk/db (pg, or embedded PGlite in development); Valkey optional","port": 8000,"domain": "openvibe.games, play.openvibe.games",-- "contracts": "openvibe-contracts v0.312.0, openvibe-sdk v0.94.0, openvibe-shared v4.129.0, openvibe-publishing v1.4.0 (apps/server/package.json)",++ "contracts": "openvibe-contracts v0.320.0, openvibe-sdk v0.94.0, openvibe-shared v4.129.0, openvibe-publishing v1.4.0 (apps/server/package.json)","capabilities": ["games.mod.manage","games.mod.read",@@@ -21,7 +21,7 @@"@openvibe/shared": "workspace:*","ajv": "^8.17.1","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0","openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0",@@@ -1,8 +1,11 @@import type { IncomingMessage, ServerResponse } from 'node:http'++import { createRequire } from 'node:module'import { describe, expect, it } from 'vitest'import type { CreatorWorld } from '@openvibe/persistence'import { CARD_TTL_S, cardFrom, createMenuCardHandler, plain } from './menuCard.js'++const contracts = createRequire(import.meta.url)('openvibe-contracts') as { validate: (id: string, value: unknown) => { valid: boolean; errors?: unknown } }++const NOW = Date.parse('2026-11-07T08:00:00Z')const world = (id: string, over: Partial<CreatorWorld> = {}): CreatorWorld => ({@@@ -84,6 +87,10 @@ describe('the menu network card (frame.menu-card@1)', () => {expect(item.meta.length).toBeLessThanOrEqual(120)expect(item.url.startsWith('https://openvibe.games/')).toBe(true)}++ // The menu's contract now allows an item image, but a creator world has no cover of its own: no picture is++ // invented here (a placeholder is never sent), and the file still validates against the new schema.++ expect(card.items.every((item) => !('image' in item))).toBe(true)++ expect(contracts.validate('frame.menu-cards@1', [card]).valid).toBe(true)})it('sends at most six, and never a draft or a hidden world', () => {@@@ -124,8 +124,8 @@ importers:specifier: ^0.4.0version: 0.4.0openvibe-contracts:-- specifier: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0-- version: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0++ specifier: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0++ version: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0openvibe-publishing:specifier: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0version: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0(openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0)@@@ -1415,9 +1415,9 @@ packages:resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==}engines: {node: '>=12.20.0'}-- openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0:-- resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0}-- version: 0.312.0++ openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0:++ resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0}++ version: 0.320.0engines: {node: '>=20'}hasBin: true@@@ -2930,7 +2930,7 @@ snapshots:-- openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0:++ openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0:dependencies:ajv: 8.20.0ajv-formats: 3.0.1([email protected])
@@ -291,7 +291,7 @@ Events deliveries) and `OV_NETWORK_AUTH_URL` live in `/etc/openvibe/games.env`,
@@ -291,7 +291,7 @@ Events deliveries) and `OV_NETWORK_AUTH_URL` live in `/etc/openvibe/games.env`,
between services.
between services.
<!-- versions:start -->
<!-- versions:start -->
-- openvibe-contracts: v0.312.0
+- openvibe-contracts: v0.320.0
- openvibe-sdk: v0.94.0
- openvibe-sdk: v0.94.0
- openvibe-shared: v4.129.0
- openvibe-shared: v4.129.0
- openvibe-publishing: v1.4.0
- openvibe-publishing: v1.4.0
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
"runtime": "node 22, TypeScript (tsx), pnpm workspace; Babylon.js (client) + deterministic Rapier physics; PostgreSQL 18 via openvibe-sdk/db (pg, or embedded PGlite in development); Valkey optional",
"runtime": "node 22, TypeScript (tsx), pnpm workspace; Babylon.js (client) + deterministic Rapier physics; PostgreSQL 18 via openvibe-sdk/db (pg, or embedded PGlite in development); Valkey optional",
"port": 8000,
"port": 8000,
"domain": "openvibe.games, play.openvibe.games",
"domain": "openvibe.games, play.openvibe.games",
- "contracts": "openvibe-contracts v0.312.0, openvibe-sdk v0.94.0, openvibe-shared v4.129.0, openvibe-publishing v1.4.0 (apps/server/package.json)",
+ "contracts": "openvibe-contracts v0.320.0, openvibe-sdk v0.94.0, openvibe-shared v4.129.0, openvibe-publishing v1.4.0 (apps/server/package.json)",
"capabilities": [
"capabilities": [
"games.mod.manage",
"games.mod.manage",
"games.mod.read",
"games.mod.read",
@@ -21,7 +21,7 @@
@@ -21,7 +21,7 @@
"@openvibe/shared": "workspace:*",
"@openvibe/shared": "workspace:*",
"ajv": "^8.17.1",
"ajv": "^8.17.1",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0",
"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0",
"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0",
@@ -1,8 +1,11 @@
@@ -1,8 +1,11 @@
import type { IncomingMessage, ServerResponse } from 'node:http'
import type { IncomingMessage, ServerResponse } from 'node:http'
+import { createRequire } from 'node:module'
import { describe, expect, it } from 'vitest'
import { describe, expect, it } from 'vitest'
import type { CreatorWorld } from '@openvibe/persistence'
import type { CreatorWorld } from '@openvibe/persistence'
import { CARD_TTL_S, cardFrom, createMenuCardHandler, plain } from './menuCard.js'
import { CARD_TTL_S, cardFrom, createMenuCardHandler, plain } from './menuCard.js'
+const contracts = createRequire(import.meta.url)('openvibe-contracts') as { validate: (id: string, value: unknown) => { valid: boolean; errors?: unknown } }
+
const NOW = Date.parse('2026-11-07T08:00:00Z')
const NOW = Date.parse('2026-11-07T08:00:00Z')
const world = (id: string, over: Partial<CreatorWorld> = {}): CreatorWorld => ({
const world = (id: string, over: Partial<CreatorWorld> = {}): CreatorWorld => ({
@@ -84,6 +87,10 @@ describe('the menu network card (frame.menu-card@1)', () => {
@@ -84,6 +87,10 @@ describe('the menu network card (frame.menu-card@1)', () => {
expect(item.meta.length).toBeLessThanOrEqual(120)
expect(item.meta.length).toBeLessThanOrEqual(120)
expect(item.url.startsWith('https://openvibe.games/')).toBe(true)
expect(item.url.startsWith('https://openvibe.games/')).toBe(true)
}
}
+ // The menu's contract now allows an item image, but a creator world has no cover of its own: no picture is
+ // invented here (a placeholder is never sent), and the file still validates against the new schema.
+ expect(card.items.every((item) => !('image' in item))).toBe(true)
+ expect(contracts.validate('frame.menu-cards@1', [card]).valid).toBe(true)
})
})
it('sends at most six, and never a draft or a hidden world', () => {
it('sends at most six, and never a draft or a hidden world', () => {
@@ -124,8 +124,8 @@ importers:
@@ -124,8 +124,8 @@ importers:
specifier: ^0.4.0
specifier: ^0.4.0
version: 0.4.0
version: 0.4.0
openvibe-contracts:
openvibe-contracts:
- specifier: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0
- version: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0
+ specifier: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0
+ version: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0
openvibe-publishing:
openvibe-publishing:
specifier: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0
specifier: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0
version: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0(openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0)
version: https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.4.0(openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.129.0)
@@ -1415,9 +1415,9 @@ packages:
@@ -1415,9 +1415,9 @@ packages:
resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==}
resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==}
engines: {node: '>=12.20.0'}
engines: {node: '>=12.20.0'}
- openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0:
- resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0}
- version: 0.312.0
+ openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0:
+ resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0}
+ version: 0.320.0
engines: {node: '>=20'}
engines: {node: '>=20'}
hasBin: true
hasBin: true
@@ -2930,7 +2930,7 @@ snapshots:
@@ -2930,7 +2930,7 @@ snapshots:
- openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.312.0:
+ openvibe-contracts@https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.0:
dependencies:
dependencies:
ajv: 8.20.0
ajv: 8.20.0
ajv-formats: 3.0.1([email protected])
ajv-formats: 3.0.1([email protected])