openvibers/openvibe.examples Commits

openvibe-sdk v0.43.0 (was v0.42.0) (#15)

OP OpenVibers committed 11 Oct 2026 · 135bf162b0 · 14 files, +54 −52

* openvibe-sdk v0.43.0 (was v0.42.0)

Opened by scripts/pin-bump.js in OpenVibers/OpenVibe.Shared after the v0.43.0 release.

* event-subscriber: callbacks get { cursor, via } (Events hands out no sequence number since Events#60)

SDK 0.43.0's pages, publish answers and realtime callbacks carry the cursor and no seq. The subscriber passes { cursor, via } to onEvent and logs the event id; the smoke test follows events by id and positions by the publish answer's cursor.

Changes

ddiff --git a/README.md b/README.md
iindex 7395cbc..058a0f5 100644
---- a/README.md
++++ b/README.md
@@@ -9,7 +9,7 @@ of them (Media, Events pull, a Tools job) against the real platform with your ow
is not part of CI or `npm test`, and it was not run against production as part of this release.
`npm run developer-path` is the Wave 20 exit check (account to Media and Events to revoked
credentials); CI runs it against the mock platform, and a person runs it against production.
--**Built on:** [openvibe-sdk v0.42.0](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.37.2), and
++**Built on:** [openvibe-sdk v0.43.0](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.37.2), and
openvibe-contracts v0.129.0 for the mod manifest.
**Plan:** OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §15.1
and §18.9; roadmap Wave 20, §30 (public SDK surface), ADR-014 (developer projects).
@@@ -349,5 +349,5 @@ own app.
Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).
<!-- versions:start -->
--- openvibe-sdk: v0.42.0
++- openvibe-sdk: v0.43.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex 39d036a..6fab82b 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,7 +4,7 @@
"code": true,
"wave": "W20",
"version": "0.3.0",
-- "sdk": "openvibe-sdk v0.42.0",
++ "sdk": "openvibe-sdk v0.43.0",
"contracts": "openvibe-contracts v0.126.0 (mod-manifest example)",
"deployed": false,
"deployment": "none: a repository with CI, not a runtime and not a published package",
@@@ -28,5 +28,5 @@
"mod publishing is first-party"
],
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §15.1, §18.9; roadmap Wave 20, §30, ADR-014",
-- "updated": "2026-10-10"
++ "updated": "2026-10-11"
}
ddiff --git a/examples/browser-app/package.json b/examples/browser-app/package.json
iindex 29b91a9..abece1e 100644
---- a/examples/browser-app/package.json
++++ b/examples/browser-app/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/event-subscriber/package.json b/examples/event-subscriber/package.json
iindex bc8766b..3025789 100644
---- a/examples/event-subscriber/package.json
++++ b/examples/event-subscriber/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/event-subscriber/subscriber.js b/examples/event-subscriber/subscriber.js
iindex 38292fe..ccc8a4a 100644
---- a/examples/event-subscriber/subscriber.js
++++ b/examples/event-subscriber/subscriber.js
@@@ -79,7 +79,7 @@ function createCursorStore(file) {
/**
* createSubscriber(config, { onEvent, onResync, fetch, log })
-- * onEvent(event, { seq, via }) handle one event (may be async)
++ * onEvent(event, { cursor, via }) handle one event (may be async); dedupe on event.event_id
* onResync(gap, { via }) state derived from events may be stale: reload it
*/
function createSubscriber(config, { onEvent, onResync = () => {}, fetch, log = console, cursor = createCursorStore(config.cursorPath) } = {}) {
@@@ -131,8 +131,8 @@ function createSubscriber(config, { onEvent, onResync = () => {}, fetch, log = c
// After every item of the page was handled: also moves past events of other topics.
onPage: (page) => cursor.set('pull', page.next_cursor),
});
-- for await (const { seq, cursor: at, event } of iterator) {
-- await onEvent(event, { seq, via: 'pull' });
++ for await (const { cursor: at, event } of iterator) {
++ await onEvent(event, { cursor: at, via: 'pull' });
cursor.set('pull', at);
handled++;
stats.handled++;
@@@ -157,13 +157,13 @@ function createSubscriber(config, { onEvent, onResync = () => {}, fetch, log = c
// ── realtime ────────────────────────────────────────────
function startRealtime() {
let chain = Promise.resolve();
-- sub = subscribe(config.topics, (event, { seq, cursor: at }) => {
++ sub = subscribe(config.topics, (event, { cursor: at }) => {
// Handle strictly in order; save the cursor (the event's SSE id) only after the handler finished.
chain = chain.then(async () => {
-- await onEvent(event, { seq, via: 'realtime' });
++ await onEvent(event, { cursor: at, via: 'realtime' });
cursor.set('realtime', at);
stats.handled++;
-- }).catch((err) => log.error(`[events] handler failed at seq ${seq}: ${err.message}`));
++ }).catch((err) => log.error(`[events] handler failed at ${event.event_id}: ${err.message}`));
}, {
client: anonymous,
fetch,
@@@ -209,8 +209,8 @@ if (require.main === module) {
let config;
try { config = loadConfig(); } catch (err) { console.error(err.message); process.exit(2); }
const s = createSubscriber(config, {
-- onEvent(event, { seq, via }) {
-- console.log(`${via} #${seq} ${event.event_type} ${event.event_id} subject=${event.subject && `${event.subject.type}:${event.subject.id}`}`);
++ onEvent(event, { via }) {
++ console.log(`${via} ${event.event_type} ${event.event_id} subject=${event.subject && `${event.subject.type}:${event.subject.id}`}`);
},
onResync(gap) {
console.log(`resync needed: events ${gap.from_seq}..${gap.to_seq} are gone; reload your state from its source`);
ddiff --git a/examples/event-subscriber/test/smoke.test.js b/examples/event-subscriber/test/smoke.test.js
iindex 6b82c18..2d72480 100644
---- a/examples/event-subscriber/test/smoke.test.js
++++ b/examples/event-subscriber/test/smoke.test.js
@@@ -56,7 +56,7 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
const stored = platform.state.events.find((x) => x.event.event_id === a.event_id).event;
assert.equal(stored.source, appSource(app.id));
assert.deepEqual(stored.actor, { type: 'app', id: app.id });
-- // Same event_id again: Events answers with the stored seq, nothing new.
++ // Same event_id again: Events answers with the stored position, nothing new.
assert.equal((await pub(env, { name: 'order.created', eventId: a.event_id })).duplicate, true);
await assert.rejects(pub(env, { name: 'Bad Name' }), /dot-separated/);
@@@ -67,22 +67,24 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
// ── pull: own topic by default, durable cursor ──────────
// Saved positions are Events' opaque cursors; the mock makes them as Events does (c1.<epoch>.<base64url(seq)>).
++ // A publish answer carries its event's cursor (no sequence number); posOf reads the position back, test only.
const cur = (seq) => `c1.0.${Buffer.from(String(seq), 'utf8').toString('base64url')}`;
++ const posOf = (c) => Number(Buffer.from(String(c).split('.')[2], 'base64url').toString('utf8'));
const pullEnv = { ...env, OV_CURSOR_PATH: path.join(dir, 'pull.json') };
let seen = [];
-- let s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (e, { seq }) => { seen.push(seq); } });
++ let s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (ev) => { seen.push(ev.event_id); } });
assert.deepEqual(await s.resolveTopics(), [`app.${key}.*`], 'the project id comes from the app token');
assert.equal(await s.pullOnce({ limit: 2 }), 2);
-- assert.deepEqual(seen, [a.seq, b.seq], 'own project only: not the other project, not the forged one');
++ assert.deepEqual(seen, [a.event_id, b.event_id], 'own project only: not the other project, not the forged one');
const head = platform.state.events.at(-1).seq;
assert.equal(createCursorStore(pullEnv.OV_CURSOR_PATH).get('pull'), cur(head), 'cursor saved at the head, as an opaque cursor');
// A new process resumes from the cursor: only what is new.
const c = await pub(env, { name: 'order.shipped' });
seen = [];
-- s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (e, { seq }) => { seen.push(seq); } });
++ s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (ev) => { seen.push(ev.event_id); } });
assert.equal(await s.pullOnce(), 1);
-- assert.deepEqual(seen, [c.seq]);
++ assert.deepEqual(seen, [c.event_id]);
// A handler that fails leaves the cursor on the last event that succeeded.
const d = await pub(env);
@@@ -90,25 +92,25 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
seen = [];
s = createSubscriber(loadConfig(pullEnv), {
fetch, log: quiet,
-- onEvent: (ev, { seq }) => { if (seq === e.seq) throw new Error('boom'); seen.push(seq); },
++ onEvent: (ev) => { if (ev.event_id === e.event_id) throw new Error('boom'); seen.push(ev.event_id); },
});
await assert.rejects(s.pullOnce(), /boom/);
-- assert.equal(createCursorStore(pullEnv.OV_CURSOR_PATH).get('pull'), cur(d.seq));
-- s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (ev, { seq }) => { seen.push(seq); } });
++ assert.equal(createCursorStore(pullEnv.OV_CURSOR_PATH).get('pull'), d.cursor);
++ s = createSubscriber(loadConfig(pullEnv), { fetch, log: quiet, onEvent: (ev) => { seen.push(ev.event_id); } });
await s.pullOnce();
-- assert.deepEqual(seen, [d.seq, e.seq], 'the failed event is retried, nothing is skipped');
++ assert.deepEqual(seen, [d.event_id, e.event_id], 'the failed event is retried, nothing is skipped');
// A gap: retention pruned the range the cursor still needs. onResync is told, reading continues.
const gapEnv = { ...env, OV_CURSOR_PATH: path.join(dir, 'gap.json') };
-- createCursorStore(gapEnv.OV_CURSOR_PATH).set('pull', cur(a.seq));
-- platform.pruneEvents(c.seq);
++ createCursorStore(gapEnv.OV_CURSOR_PATH).set('pull', a.cursor);
++ platform.pruneEvents(posOf(c.cursor));
const f = await pub(env);
const resyncs = [];
seen = [];
-- s = createSubscriber(loadConfig(gapEnv), { fetch, log: quiet, onEvent: (ev, { seq }) => { seen.push(seq); }, onResync: (g, { via }) => resyncs.push({ ...g, via }) });
++ s = createSubscriber(loadConfig(gapEnv), { fetch, log: quiet, onEvent: (ev) => { seen.push(ev.event_id); }, onResync: (g, { via }) => resyncs.push({ ...g, via }) });
await s.pullOnce();
-- assert.deepEqual(resyncs, [{ from_seq: a.seq + 1, to_seq: c.seq, via: 'pull' }]);
-- assert.deepEqual(seen, [d.seq, e.seq, f.seq]);
++ assert.deepEqual(resyncs, [{ from_seq: posOf(a.cursor) + 1, to_seq: posOf(c.cursor), via: 'pull' }]);
++ assert.deepEqual(seen, [d.event_id, e.event_id, f.event_id]);
// Public first-party topics can be added (the earlier one was pruned: publish another).
platform.publishEvent(firstParty('public', 'live.stream.started'));
@@@ -137,14 +139,14 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
// ── realtime: anonymous, public first-party events only, resume ──
const rtEnv = { OV_EVENTS_MODE: 'realtime', OV_TOPICS: 'media.object.*', OV_CURSOR_PATH: path.join(dir, 'realtime.json') };
const live = [];
-- const rt = createSubscriber(loadConfig(rtEnv), { fetch, log: quiet, onEvent: (ev, { seq }) => { live.push({ seq, type: ev.event_type }); } });
++ const rt = createSubscriber(loadConfig(rtEnv), { fetch, log: quiet, onEvent: (ev) => { live.push({ id: ev.event_id, type: ev.event_type }); } });
const subscription = rt.start();
await waitFor(() => subscription.connected, 'the realtime connection');
const p1 = platform.publishEvent(firstParty());
platform.publishEvent(firstParty('internal')); // never reaches an anonymous viewer
const p2 = platform.publishEvent(firstParty('public', 'media.object.deleted'));
await waitFor(() => live.length === 2, 'two public events');
-- assert.deepEqual(live.map((x) => x.seq), [p1.seq, p2.seq]);
++ assert.deepEqual(live.map((x) => x.id), [p1.event_id, p2.event_id]);
// The realtime position is the SSE id as sent: Events' opaque cursor (the mock emits the same form; never parsed).
const cursorOf = (seq) => `c1.0.${Buffer.from(String(seq), 'utf8').toString('base64url')}`;
await waitFor(() => createCursorStore(rtEnv.OV_CURSOR_PATH).get('realtime') === cursorOf(p2.seq), 'the realtime cursor');
@@@ -153,7 +155,7 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
platform.dropRealtime();
const p3 = platform.publishEvent(firstParty());
await waitFor(() => live.length === 3, 'the event published during the drop');
-- assert.equal(live[2].seq, p3.seq);
++ assert.equal(live[2].id, p3.event_id);
await new Promise((r) => setTimeout(r, 100));
assert.equal(live.length, 3, 'no duplicates after resuming');
rt.stop();
@@@ -161,10 +163,10 @@ const firstParty = (visibility = 'public', type = 'media.object.uploaded') => ({
// A restart resumes from the saved cursor: the event published while stopped is delivered.
const p4 = platform.publishEvent(firstParty());
const after = [];
-- const rt2 = createSubscriber(loadConfig(rtEnv), { fetch, log: quiet, onEvent: (ev, { seq }) => { after.push(seq); } });
++ const rt2 = createSubscriber(loadConfig(rtEnv), { fetch, log: quiet, onEvent: (ev) => { after.push(ev.event_id); } });
rt2.start();
await waitFor(() => after.length === 1, 'the event published while stopped');
-- assert.deepEqual(after, [p4.seq]);
++ assert.deepEqual(after, [p4.event_id]);
rt2.stop();
// A cursor ahead of the stream (restored from another environment): a gap, then live events.
ddiff --git a/examples/media-uploader/package.json b/examples/media-uploader/package.json
iindex 051c6b3..e893dac 100644
---- a/examples/media-uploader/package.json
++++ b/examples/media-uploader/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/mod-manifest/package.json b/examples/mod-manifest/package.json
iindex 236330e..39aaa22 100644
---- a/examples/mod-manifest/package.json
++++ b/examples/mod-manifest/package.json
@@@ -13,7 +13,7 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0",
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.129.0"
}
}
ddiff --git a/examples/node-server-app/package.json b/examples/node-server-app/package.json
iindex f1314e4..43e8a63 100644
---- a/examples/node-server-app/package.json
++++ b/examples/node-server-app/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/oauth-app/package.json b/examples/oauth-app/package.json
iindex 1ab9a21..5b1a890 100644
---- a/examples/oauth-app/package.json
++++ b/examples/oauth-app/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/tool-job/package.json b/examples/tool-job/package.json
iindex b7533a0..849dca9 100644
---- a/examples/tool-job/package.json
++++ b/examples/tool-job/package.json
@@@ -13,6 +13,6 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}
ddiff --git a/examples/webhook-consumer/package.json b/examples/webhook-consumer/package.json
iindex 4f6a453..1d11e80 100644
---- a/examples/webhook-consumer/package.json
++++ b/examples/webhook-consumer/package.json
@@@ -13,7 +13,7 @@
"node": ">=22"
},
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0",
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0",
"better-sqlite3": "^11.10.0"
}
}
ddiff --git a/package-lock.json b/package-lock.json
iindex 8787694..d1dfffd 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -15,7 +15,7 @@
"create-openvibe-app": "scripts/create-openvibe-app.js"
},
"devDependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -26,7 +26,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -48,7 +48,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -59,7 +59,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -71,7 +71,7 @@
"license": "MIT",
"dependencies": {
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.129.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -82,7 +82,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -93,7 +93,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -104,7 +104,7 @@
"version": "0.2.0",
"license": "MIT",
"dependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -116,7 +116,7 @@
"license": "MIT",
"dependencies": {
"better-sqlite3": "^11.10.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
},
"engines": {
"node": ">=22"
@@@ -472,9 +472,9 @@
"link": true
},
"node_modules/openvibe-sdk": {
-- "version": "0.42.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0",
-- "integrity": "sha512-MpUPLW8iBviKYcnjvNffQ6pshDCMT9ETj70hYoh6VFtwu1rxCs2DwSs8B84yPLRIyTKNxiMFchTd7tLnOUZAtg==",
++ "version": "0.43.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0",
++ "integrity": "sha512-Pgh/6gFna/h1o5+r0UZ2XHS3QkjD0Ti/bHO4LKvnCguS0cS1aDqbX5q4BGYEPWTW4IJUrvCYISEjbxIkCkm26w==",
"license": "MIT",
"engines": {
"node": ">=20"
ddiff --git a/package.json b/package.json
iindex 49ca5ae..29cb959 100644
---- a/package.json
++++ b/package.json
@@@ -23,6 +23,6 @@
"node": ">=22"
},
"devDependencies": {
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.42.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.43.0"
}
}