From ef41b71921563defe85480495d752b36fc728721 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 28 Oct 2025 09:18:16 +0100 Subject: [PATCH] fix: add modes export, fix event firing with modes and cloudflare --- app/build.ts | 7 ++++++- app/package.json | 5 +++++ app/src/App.ts | 1 + .../adapter/cloudflare/cloudflare-workers.adapter.ts | 10 +++++----- app/src/adapter/cloudflare/config.ts | 1 + app/src/core/events/EventManager.ts | 12 +++++++++++- app/src/data/api/DataController.ts | 1 - app/src/index.ts | 1 + app/src/modes/hybrid.ts | 1 + app/src/modes/shared.ts | 4 ++-- 10 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/build.ts b/app/build.ts index b8729bd..4a30da9 100644 --- a/app/build.ts +++ b/app/build.ts @@ -85,7 +85,12 @@ async function buildApi() { sourcemap, watch, define, - entry: ["src/index.ts", "src/core/utils/index.ts", "src/plugins/index.ts"], + entry: [ + "src/index.ts", + "src/core/utils/index.ts", + "src/plugins/index.ts", + "src/modes/index.ts", + ], outDir: "dist", external: [...external], metafile: true, diff --git a/app/package.json b/app/package.json index e7b522b..7d2f2fc 100644 --- a/app/package.json +++ b/app/package.json @@ -180,6 +180,11 @@ "import": "./dist/plugins/index.js", "require": "./dist/plugins/index.js" }, + "./modes": { + "types": "./dist/types/modes/index.d.ts", + "import": "./dist/modes/index.js", + "require": "./dist/modes/index.js" + }, "./adapter/sqlite": { "types": "./dist/types/adapter/sqlite/edge.d.ts", "import": { diff --git a/app/src/App.ts b/app/src/App.ts index ed6d765..5658d90 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -295,6 +295,7 @@ export class App< return this.module.auth.createUser(p); } + // @todo: potentially add option to clone the app, so that when used in listeners, it won't trigger listeners getApi(options?: LocalApiOptions) { const fetcher = this.server.request as typeof fetch; if (options && options instanceof Request) { diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts index fe278c4..e263756 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts @@ -37,19 +37,19 @@ export async function createApp( config: CloudflareBkndConfig = {}, ctx: Partial> = {}, ) { - const appConfig = await makeConfig( + const appConfig = await makeConfig(config, ctx); + return await createRuntimeApp( { - ...config, + ...appConfig, onBuilt: async (app) => { if (ctx.ctx) { registerAsyncsExecutionContext(app, ctx?.ctx); } - await config.onBuilt?.(app); + await appConfig.onBuilt?.(app); }, }, - ctx, + ctx?.env, ); - return await createRuntimeApp(appConfig, ctx?.env); } // compatiblity diff --git a/app/src/adapter/cloudflare/config.ts b/app/src/adapter/cloudflare/config.ts index 86a7722..5803757 100644 --- a/app/src/adapter/cloudflare/config.ts +++ b/app/src/adapter/cloudflare/config.ts @@ -158,6 +158,7 @@ export async function makeConfig( sessionHelper.set(c, session); await next(); }); + appConfig.options?.manager?.onServerInit?.(server); }, }, }; diff --git a/app/src/core/events/EventManager.ts b/app/src/core/events/EventManager.ts index 8370f2b..1ac8bc4 100644 --- a/app/src/core/events/EventManager.ts +++ b/app/src/core/events/EventManager.ts @@ -205,7 +205,17 @@ export class EventManager< if (listener.mode === "sync") { syncs.push(listener); } else { - asyncs.push(async () => await listener.handler(event, listener.event.slug)); + asyncs.push(async () => { + try { + await listener.handler(event, listener.event.slug); + } catch (e) { + if (this.options?.onError) { + this.options.onError(event, e); + } else { + $console.error("Error executing async listener", listener, e); + } + } + }); } // Remove if `once` is true, otherwise keep return !listener.once; diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 315a58d..082ae0c 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -9,7 +9,6 @@ import { pickKeys, mcpTool, convertNumberedObjectToArray, - mergeObject, } from "bknd/utils"; import * as SystemPermissions from "modules/permissions"; import type { AppDataConfig } from "../data-schema"; diff --git a/app/src/index.ts b/app/src/index.ts index 22c2368..e30af8a 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -50,6 +50,7 @@ export { getFlashMessage } from "core/server/flash"; export * from "core/drivers"; export { Event, InvalidEventReturn } from "core/events/Event"; export type { + EventListener, ListenerMode, ListenerHandler, } from "core/events/EventListener"; diff --git a/app/src/modes/hybrid.ts b/app/src/modes/hybrid.ts index b545270..7a8022b 100644 --- a/app/src/modes/hybrid.ts +++ b/app/src/modes/hybrid.ts @@ -68,6 +68,7 @@ export function hybrid({ const mm = app.modules as DbModuleManager; mm.buildSyncConfig = syncSchemaOptions; } + await appConfig.beforeBuild?.(app); }, config: fileConfig, options: { diff --git a/app/src/modes/shared.ts b/app/src/modes/shared.ts index afc2c6a..706a411 100644 --- a/app/src/modes/shared.ts +++ b/app/src/modes/shared.ts @@ -59,8 +59,8 @@ export type BkndModeConfig = BkndConfig< export async function makeModeConfig< Args = any, Config extends BkndModeConfig = BkndModeConfig, ->(_config: Config, args: Args) { - const appConfig = typeof _config.app === "function" ? await _config.app(args) : _config.app; +>({ app, ..._config }: Config, args: Args) { + const appConfig = typeof app === "function" ? await app(args) : app; const config = { ..._config,