From f0be039da1112d29824051c8008c686abc709803 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:57:47 +0200 Subject: [PATCH 01/15] refactor(events): improve adapter semantics and typing --- packages/vitnode/src/api/models/events.ts | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/vitnode/src/api/models/events.ts b/packages/vitnode/src/api/models/events.ts index 39eb12873..cfbb2d6aa 100644 --- a/packages/vitnode/src/api/models/events.ts +++ b/packages/vitnode/src/api/models/events.ts @@ -71,6 +71,11 @@ export interface EventEnvelope { pluginId: string; } +/** A discriminated union of every registered event envelope. */ +export type AnyEventEnvelope = { + [K in VitNodeEventName]: EventEnvelope; +}[VitNodeEventName]; + export interface EventEmitFailure { error: string; /** Listener `name` as declared in `buildEventListener`. */ @@ -88,10 +93,11 @@ export interface EventEmitResult { /** * `delivered` - listeners ran in-process before `emit()` resolved (the * bundled Local adapter). `queued` - the envelope was handed to a broker and - * delivery happens out-of-band; `delivered`/`failures` say nothing about the - * eventual listener runs. + * delivery happens out-of-band. `failed` - the adapter could not publish the + * event. For queued and failed events, `delivered`/`failures` do not describe + * eventual listener execution. */ - status: "delivered" | "queued"; + status: "delivered" | "failed" | "queued"; } /** @@ -99,9 +105,12 @@ export interface EventEmitResult { * to the listeners registered in `c.get("core").events.listeners`; a broker * adapter publishes the envelope and returns `status: "queued"`. */ -export interface EventsApiPlugin { +export interface EventsAdapter { name: string; - publish: (c: Context, envelope: EventEnvelope) => Promise; + publish: ( + c: Context, + envelope: AnyEventEnvelope, + ) => Promise; } export class EventsModel { @@ -111,7 +120,7 @@ export class EventsModel { protected readonly c: Context; - private adapter(): EventsApiPlugin { + private adapter(): EventsAdapter { return this.c.get("core").events.adapter; } @@ -143,7 +152,7 @@ export class EventsModel { const adapter = this.adapter(); try { - return await adapter.publish(this.c, envelope); + return await adapter.publish(this.c, envelope as AnyEventEnvelope); } catch (err) { const error = err instanceof Error ? err.message : String(err); await this.c @@ -154,7 +163,7 @@ export class EventsModel { return { eventId: envelope.eventId, - status: "delivered", + status: "failed", delivered: 0, failures: [ { From 07b1d7cdeed9582e46bf9e63c8ba8870455f69c2 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:58:00 +0200 Subject: [PATCH 02/15] refactor(events): rename adapter contract --- packages/vitnode/src/api/adapters/events/local.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vitnode/src/api/adapters/events/local.ts b/packages/vitnode/src/api/adapters/events/local.ts index aed210a5e..eee22385b 100644 --- a/packages/vitnode/src/api/adapters/events/local.ts +++ b/packages/vitnode/src/api/adapters/events/local.ts @@ -2,9 +2,9 @@ import type { Context } from "hono"; import type { EnvVitNode } from "@/api/middlewares/global.middleware"; import type { + AnyEventEnvelope, EventEmitResult, - EventEnvelope, - EventsApiPlugin, + EventsAdapter, } from "@/api/models/events"; /** @@ -14,12 +14,12 @@ import type { * on the instance that emitted the event - swap the adapter for a broker to * fan out across instances. */ -export const LocalEventsAdapter = (): EventsApiPlugin => ({ +export const LocalEventsAdapter = (): EventsAdapter => ({ name: "local", publish: async ( c: Context, - envelope: EventEnvelope, + envelope: AnyEventEnvelope, ): Promise => { const listeners = c .get("core") From cf01b0e51b163292d65bf260884c618592403ab6 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:58:36 +0200 Subject: [PATCH 03/15] refactor(events): preserve adapter type compatibility --- packages/vitnode/src/api/models/events.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vitnode/src/api/models/events.ts b/packages/vitnode/src/api/models/events.ts index cfbb2d6aa..07e42f5db 100644 --- a/packages/vitnode/src/api/models/events.ts +++ b/packages/vitnode/src/api/models/events.ts @@ -113,6 +113,9 @@ export interface EventsAdapter { ) => Promise; } +/** @deprecated Use `EventsAdapter` instead. */ +export type EventsApiPlugin = EventsAdapter; + export class EventsModel { constructor(c: Context) { this.c = c; From 66b9d6d6d0a8c09e683091bce6e91390db0a22f3 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:58:50 +0200 Subject: [PATCH 04/15] chore: noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From d41642279a17657c5fe9f27a9e0eb3e7885ba508 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:00 +0200 Subject: [PATCH 05/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000 From 1b3dd54d608cf1ed020bf637f5685baec4f9f075 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:05 +0200 Subject: [PATCH 06/15] noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From 96d47539b465d8bea99b806c98daa2081748b2a1 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:15 +0200 Subject: [PATCH 07/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000 From 7810a1b3794b2db77e1c41f96eaf24ba146d499c Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:19 +0200 Subject: [PATCH 08/15] noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From 9ab2399e16ff73d748fb8fa843a90a20322efb05 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:28 +0200 Subject: [PATCH 09/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000 From a111c8f65881613f9f75d2dcffd83b93da68ecb9 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:35 +0200 Subject: [PATCH 10/15] noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From ea68f80a00a7987ecac64e8d2805078837ed863f Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:47 +0200 Subject: [PATCH 11/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000 From 1058a045a3c3e59229a228191ff851350f18a2c7 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 22:59:53 +0200 Subject: [PATCH 12/15] noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From 026f191faa8040503f9bd7b6392a8385145599db Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 23:00:04 +0200 Subject: [PATCH 13/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000 From 4e9a44b51f05629d4f1d5161f953cf6b0fa25a06 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 23:00:10 +0200 Subject: [PATCH 14/15] noop --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/empty diff --git a/.github/empty b/.github/empty new file mode 100644 index 000000000..e69de29bb From c502e5e247a39d9dcbc79d816e5b48dbe82076a2 Mon Sep 17 00:00:00 2001 From: Maciej Piotr Balcerzak Date: Wed, 22 Jul 2026 23:00:21 +0200 Subject: [PATCH 15/15] chore: remove temporary file --- .github/empty | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/empty diff --git a/.github/empty b/.github/empty deleted file mode 100644 index e69de29bb..000000000