openvibers/openvibe.games Commits
menu card: build and serve it with openvibe-sdk/menu (#310)
Changes
@@@ -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.320.0, openvibe-sdk v0.94.0, openvibe-shared v4.133.0, openvibe-publishing v1.4.0 (apps/server/package.json)",++ "contracts": "openvibe-contracts v0.320.0, openvibe-sdk v0.97.1, openvibe-shared v4.133.0, openvibe-publishing v1.4.0 (apps/server/package.json)","capabilities": ["games.mod.manage","games.mod.read",@@@ -23,7 +23,7 @@"iovalkey": "^0.4.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-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0","pg": "^8.23.0","quickjs-emscripten": "0.32.0",@@@ -84,7 +84,7 @@ describe('the menu network card (frame.menu-card@1)', () => {expect(card.title.length).toBeLessThanOrEqual(60)for (const item of card.items) {expect(item.title.length).toBeLessThanOrEqual(80)-- expect(item.meta.length).toBeLessThanOrEqual(120)++ expect(item.meta?.length ?? 0).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@@@ -131,7 +131,7 @@ describe('the menu network card (frame.menu-card@1)', () => {expect(store.calls(), 'the second request is served from the cache').toBe(1)})-- it('answers 503 when the store fails and no good card is cached, and keeps the last good one after', async () => {++ it('answers [] when the store fails and no good card is cached, and keeps the last good one after', async () => {let fail = falselet calls = 0const store = {@@@ -146,7 +146,9 @@ describe('the menu network card (frame.menu-card@1)', () => {fail = truehandler(req('/.well-known/openvibe-menu.json'), bad.res)await bad.ended-- expect(bad.status()).toBe(503)++ expect(bad.status()).toBe(200)++ expect(JSON.parse(bad.body())).toEqual([])++ expect(bad.headers['cache-control']).toBe('no-store')fail = falseconst good = fakeRes()@@@ -1,5 +1,7 @@import type { IncomingMessage, ServerResponse } from 'node:http'import type { CreatorWorld, CreatorWorldStore } from '@openvibe/persistence'++import { MENU_PATH, menuCard, menuRoute } from 'openvibe-sdk/menu'++import type { MenuCard } from 'openvibe-sdk/menu'/*** The menu's network card for OpenVibe.Games (frame.menu-card@1): GET /.well-known/openvibe-menu.json.@@@ -28,7 +30,7 @@ export function plain(value: unknown, max: number): string {}/** The card itself, newest published world first (the store's order). */--export function cardFrom(worlds: CreatorWorld[], at = Date.now()) {++export function cardFrom(worlds: CreatorWorld[], at = Date.now()): MenuCard {const items = (Array.isArray(worlds) ? worlds : []).filter((w) => w && w.id && w.status === 'published').slice(0, 6)@@@ -37,16 +39,17 @@ export function cardFrom(worlds: CreatorWorld[], at = Date.now()) {meta: `by ${plain(w.ownerName, 110)}`,url: `${BASE}/worlds/${encodeURIComponent(w.id)}`,}))-- return {++ return menuCard({id: CARD_ID,site: SITE,title: 'New worlds',kind: 'rows',++ origin: BASE,items,more: { label: 'All worlds', url: `${BASE}/worlds` },-- updated_at: new Date(at).toISOString(),-- ttl_s: CARD_TTL_S,-- }++ ttlSeconds: CARD_TTL_S,++ updatedAt: at,++ })}export interface MenuCardOptions {@@@ -56,15 +59,15 @@ export interface MenuCardOptions {/*** The route. Returns true when it answered the request (the platform handle stops there), false for any other-- * path. A database failure keeps the last good card; before one exists it answers 503 and Network keeps the-- * site's previous card for its 30-minute window.++ * path. A database failure keeps the last good card; before one exists openvibe-sdk/menu answers [] (never a++ * 500), and Network keeps the site's previous card for its 30-minute window.*/export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions) {-- let cached: ReturnType<typeof cardFrom> | null = null++ let cached: MenuCard | null = nulllet cachedAt = 0-- let pending: Promise<ReturnType<typeof cardFrom>> | null = null++ let pending: Promise<MenuCard> | null = null-- async function card(): Promise<ReturnType<typeof cardFrom>> {++ async function card(): Promise<MenuCard> {const at = now()if (cached && at - cachedAt < CACHE_MS) return cachedif (pending) return pending@@@ -75,39 +78,18 @@ export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions} catch (err) {if (!cached) throw err}-- return cached as ReturnType<typeof cardFrom>++ return cached as MenuCard})().finally(() => {pending = null})return pending}++ const route = menuRoute(async () => [await card()], { maxAgeSeconds: 60 })return (req: IncomingMessage, res: ServerResponse): boolean => {const path = (req.url ?? '/').split('?')[0] ?? '/'-- if (path !== '/.well-known/openvibe-menu.json') return false-- if (req.method !== 'GET' && req.method !== 'HEAD') {-- res.writeHead(405, { 'content-type': 'application/json', allow: 'GET, HEAD' })-- res.end('{"error":"method_not_allowed"}')-- return true-- }-- void card()-- .then((body) => {-- res.writeHead(200, {-- 'content-type': 'application/json; charset=utf-8',-- 'cache-control': 'public, max-age=60',-- 'access-control-allow-origin': '*',-- 'cross-origin-resource-policy': 'cross-origin',-- })-- res.end(req.method === 'HEAD' ? undefined : JSON.stringify([body]))-- })-- .catch(() => {-- res.writeHead(503, {-- 'content-type': 'application/json',-- 'cache-control': 'no-store',-- 'access-control-allow-origin': '*',-- })-- res.end('{"error":"menu_unavailable"}')-- })++ if (path !== MENU_PATH) return false++ void route(req, res)return true}}@@@ -15,6 +15,6 @@"@openvibe/gameplay": "workspace:*","@openvibe/protocol": "workspace:*","@openvibe/shared": "workspace:*",-- "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.97.1"}}@@@ -128,10 +128,10 @@ importers: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.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.133.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.97.1(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0)openvibe-sdk:-- specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0-- version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected])++ specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1++ version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])openvibe-shared:specifier: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0version: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0@@@ -198,8 +198,8 @@ importers:specifier: workspace:*version: link:../sharedopenvibe-sdk:-- specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0-- version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected])++ specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1++ version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])packages/physics:dependencies:@@@ -1432,9 +1432,9 @@ packages:openvibe-shared:optional: true-- openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0:-- resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0}-- version: 0.94.0++ openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1:++ resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1}++ version: 0.97.1engines: {node: '>=20'}hasBin: truepeerDependencies:@@@ -2935,13 +2935,13 @@ snapshots:ajv: 8.20.0ajv-formats: 3.0.1([email protected])-- 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(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.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.97.1(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0):dependencies:-- 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-sdk: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])optionalDependencies:openvibe-shared: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.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-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected]):optionalDependencies:'@electric-sql/pglite': 0.5.8iovalkey: 0.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.320.0, openvibe-sdk v0.94.0, openvibe-shared v4.133.0, openvibe-publishing v1.4.0 (apps/server/package.json)",
+ "contracts": "openvibe-contracts v0.320.0, openvibe-sdk v0.97.1, openvibe-shared v4.133.0, openvibe-publishing v1.4.0 (apps/server/package.json)",
"capabilities": [
"capabilities": [
"games.mod.manage",
"games.mod.manage",
"games.mod.read",
"games.mod.read",
@@ -23,7 +23,7 @@
@@ -23,7 +23,7 @@
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.320.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.97.1",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"quickjs-emscripten": "0.32.0",
"quickjs-emscripten": "0.32.0",
@@ -84,7 +84,7 @@ describe('the menu network card (frame.menu-card@1)', () => {
@@ -84,7 +84,7 @@ describe('the menu network card (frame.menu-card@1)', () => {
expect(card.title.length).toBeLessThanOrEqual(60)
expect(card.title.length).toBeLessThanOrEqual(60)
for (const item of card.items) {
for (const item of card.items) {
expect(item.title.length).toBeLessThanOrEqual(80)
expect(item.title.length).toBeLessThanOrEqual(80)
- expect(item.meta.length).toBeLessThanOrEqual(120)
+ expect(item.meta?.length ?? 0).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
// The menu's contract now allows an item image, but a creator world has no cover of its own: no picture is
@@ -131,7 +131,7 @@ describe('the menu network card (frame.menu-card@1)', () => {
@@ -131,7 +131,7 @@ describe('the menu network card (frame.menu-card@1)', () => {
expect(store.calls(), 'the second request is served from the cache').toBe(1)
expect(store.calls(), 'the second request is served from the cache').toBe(1)
})
})
- it('answers 503 when the store fails and no good card is cached, and keeps the last good one after', async () => {
+ it('answers [] when the store fails and no good card is cached, and keeps the last good one after', async () => {
let fail = false
let fail = false
let calls = 0
let calls = 0
const store = {
const store = {
@@ -146,7 +146,9 @@ describe('the menu network card (frame.menu-card@1)', () => {
@@ -146,7 +146,9 @@ describe('the menu network card (frame.menu-card@1)', () => {
fail = true
fail = true
handler(req('/.well-known/openvibe-menu.json'), bad.res)
handler(req('/.well-known/openvibe-menu.json'), bad.res)
await bad.ended
await bad.ended
- expect(bad.status()).toBe(503)
+ expect(bad.status()).toBe(200)
+ expect(JSON.parse(bad.body())).toEqual([])
+ expect(bad.headers['cache-control']).toBe('no-store')
fail = false
fail = false
const good = fakeRes()
const good = fakeRes()
@@ -1,5 +1,7 @@
@@ -1,5 +1,7 @@
import type { IncomingMessage, ServerResponse } from 'node:http'
import type { IncomingMessage, ServerResponse } from 'node:http'
import type { CreatorWorld, CreatorWorldStore } from '@openvibe/persistence'
import type { CreatorWorld, CreatorWorldStore } from '@openvibe/persistence'
+import { MENU_PATH, menuCard, menuRoute } from 'openvibe-sdk/menu'
+import type { MenuCard } from 'openvibe-sdk/menu'
/**
/**
* The menu's network card for OpenVibe.Games (frame.menu-card@1): GET /.well-known/openvibe-menu.json.
* The menu's network card for OpenVibe.Games (frame.menu-card@1): GET /.well-known/openvibe-menu.json.
@@ -28,7 +30,7 @@ export function plain(value: unknown, max: number): string {
@@ -28,7 +30,7 @@ export function plain(value: unknown, max: number): string {
}
}
/** The card itself, newest published world first (the store's order). */
/** The card itself, newest published world first (the store's order). */
-export function cardFrom(worlds: CreatorWorld[], at = Date.now()) {
+export function cardFrom(worlds: CreatorWorld[], at = Date.now()): MenuCard {
const items = (Array.isArray(worlds) ? worlds : [])
const items = (Array.isArray(worlds) ? worlds : [])
.filter((w) => w && w.id && w.status === 'published')
.filter((w) => w && w.id && w.status === 'published')
.slice(0, 6)
.slice(0, 6)
@@ -37,16 +39,17 @@ export function cardFrom(worlds: CreatorWorld[], at = Date.now()) {
@@ -37,16 +39,17 @@ export function cardFrom(worlds: CreatorWorld[], at = Date.now()) {
meta: `by ${plain(w.ownerName, 110)}`,
meta: `by ${plain(w.ownerName, 110)}`,
url: `${BASE}/worlds/${encodeURIComponent(w.id)}`,
url: `${BASE}/worlds/${encodeURIComponent(w.id)}`,
}))
}))
- return {
+ return menuCard({
id: CARD_ID,
id: CARD_ID,
site: SITE,
site: SITE,
title: 'New worlds',
title: 'New worlds',
kind: 'rows',
kind: 'rows',
+ origin: BASE,
items,
items,
more: { label: 'All worlds', url: `${BASE}/worlds` },
more: { label: 'All worlds', url: `${BASE}/worlds` },
- updated_at: new Date(at).toISOString(),
- ttl_s: CARD_TTL_S,
- }
+ ttlSeconds: CARD_TTL_S,
+ updatedAt: at,
+ })
}
}
export interface MenuCardOptions {
export interface MenuCardOptions {
@@ -56,15 +59,15 @@ export interface MenuCardOptions {
@@ -56,15 +59,15 @@ export interface MenuCardOptions {
/**
/**
* The route. Returns true when it answered the request (the platform handle stops there), false for any other
* The route. Returns true when it answered the request (the platform handle stops there), false for any other
- * path. A database failure keeps the last good card; before one exists it answers 503 and Network keeps the
- * site's previous card for its 30-minute window.
+ * path. A database failure keeps the last good card; before one exists openvibe-sdk/menu answers [] (never a
+ * 500), and Network keeps the site's previous card for its 30-minute window.
*/
*/
export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions) {
export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions) {
- let cached: ReturnType<typeof cardFrom> | null = null
+ let cached: MenuCard | null = null
let cachedAt = 0
let cachedAt = 0
- let pending: Promise<ReturnType<typeof cardFrom>> | null = null
+ let pending: Promise<MenuCard> | null = null
- async function card(): Promise<ReturnType<typeof cardFrom>> {
+ async function card(): Promise<MenuCard> {
const at = now()
const at = now()
if (cached && at - cachedAt < CACHE_MS) return cached
if (cached && at - cachedAt < CACHE_MS) return cached
if (pending) return pending
if (pending) return pending
@@ -75,39 +78,18 @@ export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions
@@ -75,39 +78,18 @@ export function createMenuCardHandler({ store, now = Date.now }: MenuCardOptions
} catch (err) {
} catch (err) {
if (!cached) throw err
if (!cached) throw err
}
}
- return cached as ReturnType<typeof cardFrom>
+ return cached as MenuCard
})().finally(() => {
})().finally(() => {
pending = null
pending = null
})
})
return pending
return pending
}
}
+ const route = menuRoute(async () => [await card()], { maxAgeSeconds: 60 })
return (req: IncomingMessage, res: ServerResponse): boolean => {
return (req: IncomingMessage, res: ServerResponse): boolean => {
const path = (req.url ?? '/').split('?')[0] ?? '/'
const path = (req.url ?? '/').split('?')[0] ?? '/'
- if (path !== '/.well-known/openvibe-menu.json') return false
- if (req.method !== 'GET' && req.method !== 'HEAD') {
- res.writeHead(405, { 'content-type': 'application/json', allow: 'GET, HEAD' })
- res.end('{"error":"method_not_allowed"}')
- return true
- }
- void card()
- .then((body) => {
- res.writeHead(200, {
- 'content-type': 'application/json; charset=utf-8',
- 'cache-control': 'public, max-age=60',
- 'access-control-allow-origin': '*',
- 'cross-origin-resource-policy': 'cross-origin',
- })
- res.end(req.method === 'HEAD' ? undefined : JSON.stringify([body]))
- })
- .catch(() => {
- res.writeHead(503, {
- 'content-type': 'application/json',
- 'cache-control': 'no-store',
- 'access-control-allow-origin': '*',
- })
- res.end('{"error":"menu_unavailable"}')
- })
+ if (path !== MENU_PATH) return false
+ void route(req, res)
return true
return true
}
}
}
}
@@ -15,6 +15,6 @@
@@ -15,6 +15,6 @@
"@openvibe/gameplay": "workspace:*",
"@openvibe/gameplay": "workspace:*",
"@openvibe/protocol": "workspace:*",
"@openvibe/protocol": "workspace:*",
"@openvibe/shared": "workspace:*",
"@openvibe/shared": "workspace:*",
- "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.97.1"
}
}
}
}
@@ -128,10 +128,10 @@ importers:
@@ -128,10 +128,10 @@ importers:
version: 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.133.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.97.1(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0)
openvibe-sdk:
openvibe-sdk:
- specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0
- version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected])
+ specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1
+ version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])
openvibe-shared:
openvibe-shared:
specifier: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0
specifier: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0
version: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0
version: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0
@@ -198,8 +198,8 @@ importers:
@@ -198,8 +198,8 @@ importers:
specifier: workspace:*
specifier: workspace:*
version: link:../shared
version: link:../shared
openvibe-sdk:
openvibe-sdk:
- specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0
- version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0(@electric-sql/[email protected])([email protected])([email protected])
+ specifier: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1
+ version: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])
packages/physics:
packages/physics:
dependencies:
dependencies:
@@ -1432,9 +1432,9 @@ packages:
@@ -1432,9 +1432,9 @@ packages:
openvibe-shared:
openvibe-shared:
optional: true
optional: true
- openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0:
- resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.94.0}
- version: 0.94.0
+ openvibe-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1:
+ resolution: {tarball: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1}
+ version: 0.97.1
engines: {node: '>=20'}
engines: {node: '>=20'}
hasBin: true
hasBin: true
peerDependencies:
peerDependencies:
@@ -2935,13 +2935,13 @@ snapshots:
@@ -2935,13 +2935,13 @@ snapshots:
ajv: 8.20.0
ajv: 8.20.0
ajv-formats: 3.0.1([email protected])
ajv-formats: 3.0.1([email protected])
- 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(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.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.97.1(@electric-sql/[email protected])([email protected])([email protected]))(openvibe-shared@https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0):
dependencies:
dependencies:
- 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-sdk: https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected])
optionalDependencies:
optionalDependencies:
openvibe-shared: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.0
openvibe-shared: https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.133.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-sdk@https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.97.1(@electric-sql/[email protected])([email protected])([email protected]):
optionalDependencies:
optionalDependencies:
'@electric-sql/pglite': 0.5.8
'@electric-sql/pglite': 0.5.8
iovalkey: 0.4.0
iovalkey: 0.4.0