@rawdash/hono 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -33,6 +33,12 @@ interface HonoWidgetsRouterOptions extends HonoRouterOptions {
33
33
  }
34
34
  declare function createWidgetsRouter(opts: HonoWidgetsRouterOptions): Hono;
35
35
 
36
+ interface ConfigValidateRouterOptions {
37
+ connectorRegistry: ConnectorRegistry;
38
+ before?: MiddlewareHandler[];
39
+ }
40
+ declare function createConfigValidateRouter(opts: ConfigValidateRouterOptions): Hono;
41
+
36
42
  declare function createRetentionRouter(opts: HonoRouterOptions): Hono;
37
43
  interface RetentionLoopOptions {
38
44
  getConfig: () => DashboardConfig | Promise<DashboardConfig>;
@@ -54,4 +60,4 @@ interface MountEngineResult {
54
60
  }
55
61
  declare function mountEngine(config: DashboardConfig, options: MountEngineOptions): MountEngineResult;
56
62
 
57
- export { type HonoRouterOptions, type HonoStorageRouterOptions, type HonoWidgetsRouterOptions, type MountEngineOptions, type MountEngineResult, type RetentionLoopOptions, type SyncRouterOptions, createHealthRouter, createRetentionRouter, createSyncRouter, createSyncStateRouter, createWidgetsRouter, mountEngine, startRetentionLoop };
63
+ export { type ConfigValidateRouterOptions, type HonoRouterOptions, type HonoStorageRouterOptions, type HonoWidgetsRouterOptions, type MountEngineOptions, type MountEngineResult, type RetentionLoopOptions, type SyncRouterOptions, createConfigValidateRouter, createHealthRouter, createRetentionRouter, createSyncRouter, createSyncStateRouter, createWidgetsRouter, mountEngine, startRetentionLoop };
package/dist/index.js CHANGED
@@ -135,6 +135,33 @@ function createWidgetsRouter(opts) {
135
135
  return app;
136
136
  }
137
137
 
138
+ // src/config-validate.ts
139
+ import {
140
+ resourcesByConnectorIdFromRegistry,
141
+ validateConfigMetrics
142
+ } from "@rawdash/core";
143
+ import { Hono as Hono4 } from "hono";
144
+ function createConfigValidateRouter(opts) {
145
+ const app = new Hono4();
146
+ applyBefore(app, opts.before);
147
+ const resources = resourcesByConnectorIdFromRegistry(opts.connectorRegistry);
148
+ app.post("/", async (c) => {
149
+ try {
150
+ const body = await c.req.json();
151
+ if (!body || typeof body !== "object" || !Array.isArray(body.connectors) || !body.dashboards || typeof body.dashboards !== "object") {
152
+ return c.json(
153
+ { error: 'Body must be a config with "connectors" and "dashboards"' },
154
+ 400
155
+ );
156
+ }
157
+ return c.json(validateConfigMetrics(body, resources));
158
+ } catch (err) {
159
+ return mapError(c, err);
160
+ }
161
+ });
162
+ return app;
163
+ }
164
+
138
165
  // src/retention.ts
139
166
  import {
140
167
  DEFAULT_RETENTION_INTERVAL_MS,
@@ -142,9 +169,9 @@ import {
142
169
  runRetention,
143
170
  runRetentionOnce
144
171
  } from "@rawdash/server";
145
- import { Hono as Hono4 } from "hono";
172
+ import { Hono as Hono5 } from "hono";
146
173
  function createRetentionRouter(opts) {
147
- const app = new Hono4();
174
+ const app = new Hono5();
148
175
  applyBefore(app, opts.before);
149
176
  let inFlight = null;
150
177
  app.post("/retain", async (c) => {
@@ -219,13 +246,13 @@ function startRetentionLoop(opts) {
219
246
 
220
247
  // src/mount.ts
221
248
  import { InMemoryStorage, ROUTES } from "@rawdash/server";
222
- import { Hono as Hono5 } from "hono";
249
+ import { Hono as Hono6 } from "hono";
223
250
  function mountEngine(config, options) {
224
251
  const storage = options.storage ?? new InMemoryStorage();
225
252
  const { connectorRegistry, secretsResolver, loggerFactory } = options;
226
253
  const getConfig = () => config;
227
254
  const getStorage = () => storage;
228
- const app = new Hono5();
255
+ const app = new Hono6();
229
256
  app.route("/dashboards", createWidgetsRouter({ getConfig, getStorage }));
230
257
  app.route(
231
258
  ROUTES.sync,
@@ -238,6 +265,10 @@ function mountEngine(config, options) {
238
265
  })
239
266
  );
240
267
  app.route(ROUTES.syncState, createSyncStateRouter({ getStorage }));
268
+ app.route(
269
+ ROUTES.configValidate,
270
+ createConfigValidateRouter({ connectorRegistry })
271
+ );
241
272
  app.route("/retention", createRetentionRouter({ getConfig, getStorage }));
242
273
  app.route(ROUTES.health, createHealthRouter());
243
274
  let stopRetention = null;
@@ -254,6 +285,7 @@ function mountEngine(config, options) {
254
285
  };
255
286
  }
256
287
  export {
288
+ createConfigValidateRouter,
257
289
  createHealthRouter,
258
290
  createRetentionRouter,
259
291
  createSyncRouter,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/health.ts","../src/sync.ts","../src/shared.ts","../src/widgets.ts","../src/retention.ts","../src/mount.ts"],"sourcesContent":["import { getHealth } from '@rawdash/server';\nimport { Hono } from 'hono';\n\nexport function createHealthRouter(): Hono {\n const app = new Hono();\n app.get('/', (c) => c.json(getHealth()));\n return app;\n}\n","import type { ConnectorRegistry, SecretsResolver } from '@rawdash/core';\nimport type { ConnectorLoggerFactory } from '@rawdash/server';\nimport { getSyncStateHandler, triggerSync } from '@rawdash/server';\nimport type { MiddlewareHandler } from 'hono';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions, HonoStorageRouterOptions } from './shared';\nimport { applyBefore, mapError } from './shared';\n\nexport type SyncRouterOptions =\n | (HonoRouterOptions & {\n mode?: 'in-process';\n connectorRegistry: ConnectorRegistry;\n secretsResolver?: SecretsResolver;\n loggerFactory?: ConnectorLoggerFactory;\n })\n | {\n mode: 'deferred';\n getStorage: HonoRouterOptions['getStorage'];\n getConfig?: HonoRouterOptions['getConfig'];\n before?: MiddlewareHandler[];\n };\n\nexport function createSyncRouter(opts: SyncRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n app.post('/', async (c) => {\n try {\n if (opts.mode === 'deferred') {\n const getConfig = opts.getConfig;\n return c.json(\n await triggerSync(\n {\n getStorage: () => opts.getStorage(c),\n getConfig: getConfig ? () => getConfig(c) : undefined,\n },\n { mode: 'deferred' },\n ),\n );\n }\n return c.json(\n await triggerSync({\n getStorage: () => opts.getStorage(c),\n getConfig: () => opts.getConfig(c),\n connectorRegistry: opts.connectorRegistry,\n secretsResolver: opts.secretsResolver,\n loggerFactory: opts.loggerFactory,\n }),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n return app;\n}\n\nexport function createSyncStateRouter(opts: HonoStorageRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n app.get('/', async (c) => {\n try {\n return c.json(\n await getSyncStateHandler({\n getConfig: () => {\n throw new Error('getConfig should not be called by sync-state');\n },\n getStorage: () => opts.getStorage(c),\n }),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n return app;\n}\n","import type { EngineContext } from '@rawdash/server';\nimport type { DashboardConfig, ServerStorage } from '@rawdash/server';\nimport { isRawdashError } from '@rawdash/server';\nimport type { Context, MiddlewareHandler } from 'hono';\nimport { Hono } from 'hono';\n\nexport interface HonoRouterOptions {\n getConfig: (c: Context) => DashboardConfig | Promise<DashboardConfig>;\n getStorage: (c: Context) => ServerStorage | Promise<ServerStorage>;\n before?: MiddlewareHandler[];\n}\n\nexport interface HonoStorageRouterOptions {\n getStorage: (c: Context) => ServerStorage | Promise<ServerStorage>;\n before?: MiddlewareHandler[];\n}\n\nexport function makeEngineContext(\n c: Context,\n opts: HonoRouterOptions,\n): EngineContext {\n return {\n getConfig: () => opts.getConfig(c),\n getStorage: () => opts.getStorage(c),\n };\n}\n\nexport function applyBefore(app: Hono, before?: MiddlewareHandler[]): void {\n if (!before) {\n return;\n }\n for (const mw of before) {\n app.use('*', mw);\n }\n}\n\nexport function mapError(c: Context, err: unknown): Response {\n if (isRawdashError(err)) {\n return c.json(\n { error: err.message, code: err.code },\n err.status as Parameters<typeof c.json>[1],\n );\n }\n throw err;\n}\n","import type { WidgetCache } from '@rawdash/server';\nimport { getWidget, listWidgets } from '@rawdash/server';\nimport type { Context } from 'hono';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions } from './shared';\nimport { applyBefore, makeEngineContext, mapError } from './shared';\n\nexport interface HonoWidgetsRouterOptions extends HonoRouterOptions {\n cache?: (c: Context) => WidgetCache;\n}\n\nexport function createWidgetsRouter(opts: HonoWidgetsRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n\n app.get('/:dashboardId/widgets', async (c) => {\n try {\n return c.json(\n await listWidgets(\n makeEngineContext(c, opts),\n c.req.param('dashboardId'),\n opts.cache?.(c),\n ),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n\n app.get('/:dashboardId/widgets/:widgetId', async (c) => {\n try {\n const result = await getWidget(\n makeEngineContext(c, opts),\n c.req.param('dashboardId'),\n c.req.param('widgetId'),\n {\n cache: opts.cache?.(c),\n ifNoneMatch: c.req.header('if-none-match'),\n },\n );\n if (result.status === 'not-modified') {\n c.header('ETag', result.etag);\n return c.body(null, 304);\n }\n if (result.etag) {\n c.header('ETag', result.etag);\n }\n return c.json(result.widget);\n } catch (err) {\n return mapError(c, err);\n }\n });\n\n return app;\n}\n","import type { DashboardConfig, ServerStorage } from '@rawdash/server';\nimport {\n DEFAULT_RETENTION_INTERVAL_MS,\n hasPruningPolicy,\n runRetention,\n runRetentionOnce,\n} from '@rawdash/server';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions } from './shared';\nimport { applyBefore, makeEngineContext, mapError } from './shared';\n\nexport function createRetentionRouter(opts: HonoRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n\n let inFlight: Promise<void> | null = null;\n\n app.post('/retain', async (c) => {\n try {\n if (!inFlight) {\n const ctx = makeEngineContext(c, opts);\n inFlight = runRetentionOnce(ctx).finally(() => {\n inFlight = null;\n });\n }\n await inFlight;\n return c.json({ triggered: true });\n } catch (err) {\n console.error('retention run failed', err);\n return mapError(c, err);\n }\n });\n\n return app;\n}\n\nexport interface RetentionLoopOptions {\n getConfig: () => DashboardConfig | Promise<DashboardConfig>;\n getStorage: () => ServerStorage | Promise<ServerStorage>;\n intervalMs?: number;\n}\n\nexport function startRetentionLoop(opts: RetentionLoopOptions): () => void {\n let stopped = false;\n let inFlight: Promise<void> | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const tick = async (): Promise<void> => {\n if (inFlight || stopped) {\n return;\n }\n try {\n const config = await opts.getConfig();\n if (!config.retention || !hasPruningPolicy(config.retention)) {\n return;\n }\n const storage = await opts.getStorage();\n inFlight = runRetention(config, storage).finally(() => {\n inFlight = null;\n });\n await inFlight;\n } catch (err) {\n console.error('retention run failed', err);\n }\n };\n\n void (async () => {\n try {\n const config = await opts.getConfig();\n if (!config.retention || !hasPruningPolicy(config.retention)) {\n return;\n }\n if (stopped) {\n return;\n }\n const intervalMs =\n opts.intervalMs ??\n config.retention.intervalMs ??\n DEFAULT_RETENTION_INTERVAL_MS;\n const created = setInterval(() => {\n void tick();\n }, intervalMs);\n if (stopped) {\n clearInterval(created);\n } else {\n timer = created;\n }\n } catch (err) {\n console.error('retention loop startup failed', err);\n }\n })();\n\n return () => {\n stopped = true;\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n","import type {\n ConnectorLoggerFactory,\n ConnectorRegistry,\n DashboardConfig,\n SecretsResolver,\n ServerStorage,\n} from '@rawdash/server';\nimport { InMemoryStorage, ROUTES } from '@rawdash/server';\nimport { Hono } from 'hono';\n\nimport { createHealthRouter } from './health';\nimport { createRetentionRouter, startRetentionLoop } from './retention';\nimport { createSyncRouter, createSyncStateRouter } from './sync';\nimport { createWidgetsRouter } from './widgets';\n\nexport interface MountEngineOptions {\n storage?: ServerStorage;\n connectorRegistry: ConnectorRegistry;\n secretsResolver?: SecretsResolver;\n loggerFactory?: ConnectorLoggerFactory;\n startRetention?: boolean;\n}\n\nexport interface MountEngineResult {\n app: Hono;\n stop(): void;\n}\n\nexport function mountEngine(\n config: DashboardConfig,\n options: MountEngineOptions,\n): MountEngineResult {\n const storage: ServerStorage = options.storage ?? new InMemoryStorage();\n const { connectorRegistry, secretsResolver, loggerFactory } = options;\n const getConfig = (): DashboardConfig => config;\n const getStorage = (): ServerStorage => storage;\n\n const app = new Hono();\n app.route('/dashboards', createWidgetsRouter({ getConfig, getStorage }));\n app.route(\n ROUTES.sync,\n createSyncRouter({\n getConfig,\n getStorage,\n connectorRegistry,\n secretsResolver,\n loggerFactory,\n }),\n );\n app.route(ROUTES.syncState, createSyncStateRouter({ getStorage }));\n app.route('/retention', createRetentionRouter({ getConfig, getStorage }));\n app.route(ROUTES.health, createHealthRouter());\n\n let stopRetention: (() => void) | null = null;\n if (options.startRetention !== false) {\n stopRetention = startRetentionLoop({ getConfig, getStorage });\n }\n\n return {\n app,\n stop() {\n if (stopRetention) {\n stopRetention();\n }\n },\n };\n}\n"],"mappings":"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","names":["Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono"]}
1
+ {"version":3,"sources":["../src/health.ts","../src/sync.ts","../src/shared.ts","../src/widgets.ts","../src/config-validate.ts","../src/retention.ts","../src/mount.ts"],"sourcesContent":["import { getHealth } from '@rawdash/server';\nimport { Hono } from 'hono';\n\nexport function createHealthRouter(): Hono {\n const app = new Hono();\n app.get('/', (c) => c.json(getHealth()));\n return app;\n}\n","import type { ConnectorRegistry, SecretsResolver } from '@rawdash/core';\nimport type { ConnectorLoggerFactory } from '@rawdash/server';\nimport { getSyncStateHandler, triggerSync } from '@rawdash/server';\nimport type { MiddlewareHandler } from 'hono';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions, HonoStorageRouterOptions } from './shared';\nimport { applyBefore, mapError } from './shared';\n\nexport type SyncRouterOptions =\n | (HonoRouterOptions & {\n mode?: 'in-process';\n connectorRegistry: ConnectorRegistry;\n secretsResolver?: SecretsResolver;\n loggerFactory?: ConnectorLoggerFactory;\n })\n | {\n mode: 'deferred';\n getStorage: HonoRouterOptions['getStorage'];\n getConfig?: HonoRouterOptions['getConfig'];\n before?: MiddlewareHandler[];\n };\n\nexport function createSyncRouter(opts: SyncRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n app.post('/', async (c) => {\n try {\n if (opts.mode === 'deferred') {\n const getConfig = opts.getConfig;\n return c.json(\n await triggerSync(\n {\n getStorage: () => opts.getStorage(c),\n getConfig: getConfig ? () => getConfig(c) : undefined,\n },\n { mode: 'deferred' },\n ),\n );\n }\n return c.json(\n await triggerSync({\n getStorage: () => opts.getStorage(c),\n getConfig: () => opts.getConfig(c),\n connectorRegistry: opts.connectorRegistry,\n secretsResolver: opts.secretsResolver,\n loggerFactory: opts.loggerFactory,\n }),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n return app;\n}\n\nexport function createSyncStateRouter(opts: HonoStorageRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n app.get('/', async (c) => {\n try {\n return c.json(\n await getSyncStateHandler({\n getConfig: () => {\n throw new Error('getConfig should not be called by sync-state');\n },\n getStorage: () => opts.getStorage(c),\n }),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n return app;\n}\n","import type { EngineContext } from '@rawdash/server';\nimport type { DashboardConfig, ServerStorage } from '@rawdash/server';\nimport { isRawdashError } from '@rawdash/server';\nimport type { Context, MiddlewareHandler } from 'hono';\nimport { Hono } from 'hono';\n\nexport interface HonoRouterOptions {\n getConfig: (c: Context) => DashboardConfig | Promise<DashboardConfig>;\n getStorage: (c: Context) => ServerStorage | Promise<ServerStorage>;\n before?: MiddlewareHandler[];\n}\n\nexport interface HonoStorageRouterOptions {\n getStorage: (c: Context) => ServerStorage | Promise<ServerStorage>;\n before?: MiddlewareHandler[];\n}\n\nexport function makeEngineContext(\n c: Context,\n opts: HonoRouterOptions,\n): EngineContext {\n return {\n getConfig: () => opts.getConfig(c),\n getStorage: () => opts.getStorage(c),\n };\n}\n\nexport function applyBefore(app: Hono, before?: MiddlewareHandler[]): void {\n if (!before) {\n return;\n }\n for (const mw of before) {\n app.use('*', mw);\n }\n}\n\nexport function mapError(c: Context, err: unknown): Response {\n if (isRawdashError(err)) {\n return c.json(\n { error: err.message, code: err.code },\n err.status as Parameters<typeof c.json>[1],\n );\n }\n throw err;\n}\n","import type { WidgetCache } from '@rawdash/server';\nimport { getWidget, listWidgets } from '@rawdash/server';\nimport type { Context } from 'hono';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions } from './shared';\nimport { applyBefore, makeEngineContext, mapError } from './shared';\n\nexport interface HonoWidgetsRouterOptions extends HonoRouterOptions {\n cache?: (c: Context) => WidgetCache;\n}\n\nexport function createWidgetsRouter(opts: HonoWidgetsRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n\n app.get('/:dashboardId/widgets', async (c) => {\n try {\n return c.json(\n await listWidgets(\n makeEngineContext(c, opts),\n c.req.param('dashboardId'),\n opts.cache?.(c),\n ),\n );\n } catch (err) {\n return mapError(c, err);\n }\n });\n\n app.get('/:dashboardId/widgets/:widgetId', async (c) => {\n try {\n const result = await getWidget(\n makeEngineContext(c, opts),\n c.req.param('dashboardId'),\n c.req.param('widgetId'),\n {\n cache: opts.cache?.(c),\n ifNoneMatch: c.req.header('if-none-match'),\n },\n );\n if (result.status === 'not-modified') {\n c.header('ETag', result.etag);\n return c.body(null, 304);\n }\n if (result.etag) {\n c.header('ETag', result.etag);\n }\n return c.json(result.widget);\n } catch (err) {\n return mapError(c, err);\n }\n });\n\n return app;\n}\n","import type { ConnectorRegistry, DashboardConfig } from '@rawdash/core';\nimport {\n resourcesByConnectorIdFromRegistry,\n validateConfigMetrics,\n} from '@rawdash/core';\nimport type { MiddlewareHandler } from 'hono';\nimport { Hono } from 'hono';\n\nimport { applyBefore, mapError } from './shared';\n\nexport interface ConfigValidateRouterOptions {\n connectorRegistry: ConnectorRegistry;\n before?: MiddlewareHandler[];\n}\n\nexport function createConfigValidateRouter(\n opts: ConfigValidateRouterOptions,\n): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n const resources = resourcesByConnectorIdFromRegistry(opts.connectorRegistry);\n app.post('/', async (c) => {\n try {\n const body = (await c.req.json()) as Partial<DashboardConfig>;\n if (\n !body ||\n typeof body !== 'object' ||\n !Array.isArray(body.connectors) ||\n !body.dashboards ||\n typeof body.dashboards !== 'object'\n ) {\n return c.json(\n { error: 'Body must be a config with \"connectors\" and \"dashboards\"' },\n 400,\n );\n }\n return c.json(validateConfigMetrics(body as DashboardConfig, resources));\n } catch (err) {\n return mapError(c, err);\n }\n });\n return app;\n}\n","import type { DashboardConfig, ServerStorage } from '@rawdash/server';\nimport {\n DEFAULT_RETENTION_INTERVAL_MS,\n hasPruningPolicy,\n runRetention,\n runRetentionOnce,\n} from '@rawdash/server';\nimport { Hono } from 'hono';\n\nimport type { HonoRouterOptions } from './shared';\nimport { applyBefore, makeEngineContext, mapError } from './shared';\n\nexport function createRetentionRouter(opts: HonoRouterOptions): Hono {\n const app = new Hono();\n applyBefore(app, opts.before);\n\n let inFlight: Promise<void> | null = null;\n\n app.post('/retain', async (c) => {\n try {\n if (!inFlight) {\n const ctx = makeEngineContext(c, opts);\n inFlight = runRetentionOnce(ctx).finally(() => {\n inFlight = null;\n });\n }\n await inFlight;\n return c.json({ triggered: true });\n } catch (err) {\n console.error('retention run failed', err);\n return mapError(c, err);\n }\n });\n\n return app;\n}\n\nexport interface RetentionLoopOptions {\n getConfig: () => DashboardConfig | Promise<DashboardConfig>;\n getStorage: () => ServerStorage | Promise<ServerStorage>;\n intervalMs?: number;\n}\n\nexport function startRetentionLoop(opts: RetentionLoopOptions): () => void {\n let stopped = false;\n let inFlight: Promise<void> | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const tick = async (): Promise<void> => {\n if (inFlight || stopped) {\n return;\n }\n try {\n const config = await opts.getConfig();\n if (!config.retention || !hasPruningPolicy(config.retention)) {\n return;\n }\n const storage = await opts.getStorage();\n inFlight = runRetention(config, storage).finally(() => {\n inFlight = null;\n });\n await inFlight;\n } catch (err) {\n console.error('retention run failed', err);\n }\n };\n\n void (async () => {\n try {\n const config = await opts.getConfig();\n if (!config.retention || !hasPruningPolicy(config.retention)) {\n return;\n }\n if (stopped) {\n return;\n }\n const intervalMs =\n opts.intervalMs ??\n config.retention.intervalMs ??\n DEFAULT_RETENTION_INTERVAL_MS;\n const created = setInterval(() => {\n void tick();\n }, intervalMs);\n if (stopped) {\n clearInterval(created);\n } else {\n timer = created;\n }\n } catch (err) {\n console.error('retention loop startup failed', err);\n }\n })();\n\n return () => {\n stopped = true;\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n","import type {\n ConnectorLoggerFactory,\n ConnectorRegistry,\n DashboardConfig,\n SecretsResolver,\n ServerStorage,\n} from '@rawdash/server';\nimport { InMemoryStorage, ROUTES } from '@rawdash/server';\nimport { Hono } from 'hono';\n\nimport { createConfigValidateRouter } from './config-validate';\nimport { createHealthRouter } from './health';\nimport { createRetentionRouter, startRetentionLoop } from './retention';\nimport { createSyncRouter, createSyncStateRouter } from './sync';\nimport { createWidgetsRouter } from './widgets';\n\nexport interface MountEngineOptions {\n storage?: ServerStorage;\n connectorRegistry: ConnectorRegistry;\n secretsResolver?: SecretsResolver;\n loggerFactory?: ConnectorLoggerFactory;\n startRetention?: boolean;\n}\n\nexport interface MountEngineResult {\n app: Hono;\n stop(): void;\n}\n\nexport function mountEngine(\n config: DashboardConfig,\n options: MountEngineOptions,\n): MountEngineResult {\n const storage: ServerStorage = options.storage ?? new InMemoryStorage();\n const { connectorRegistry, secretsResolver, loggerFactory } = options;\n const getConfig = (): DashboardConfig => config;\n const getStorage = (): ServerStorage => storage;\n\n const app = new Hono();\n app.route('/dashboards', createWidgetsRouter({ getConfig, getStorage }));\n app.route(\n ROUTES.sync,\n createSyncRouter({\n getConfig,\n getStorage,\n connectorRegistry,\n secretsResolver,\n loggerFactory,\n }),\n );\n app.route(ROUTES.syncState, createSyncStateRouter({ getStorage }));\n app.route(\n ROUTES.configValidate,\n createConfigValidateRouter({ connectorRegistry }),\n );\n app.route('/retention', createRetentionRouter({ getConfig, getStorage }));\n app.route(ROUTES.health, createHealthRouter());\n\n let stopRetention: (() => void) | null = null;\n if (options.startRetention !== false) {\n stopRetention = startRetentionLoop({ getConfig, getStorage });\n }\n\n return {\n app,\n stop() {\n if (stopRetention) {\n stopRetention();\n }\n },\n };\n}\n"],"mappings":"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","names":["Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rawdash/hono",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "Hono adapter for rawdash — router factories and helpers that mount @rawdash/server handlers onto a Hono app. Runtime-agnostic (Workers, Node, Bun, Deno).",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -25,8 +25,8 @@
25
25
  "hono": "^4.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "@rawdash/core": "0.22.0",
29
- "@rawdash/server": "0.22.0"
28
+ "@rawdash/core": "0.23.0",
29
+ "@rawdash/server": "0.23.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "hono": "^4.7.7",