import env from '#start/env' const exchangeStoreConfig = { /** * Maximum number of exchanges stored per device. * Oldest messages are deleted when this cap is exceeded. */ maxMessagesPerDevice: env.get('EXCHANGE_STORE_MAX_MESSAGES', 5000), /** * TTL (time-to-live) in seconds for exchanges. * MongoDB TTL index auto-removes documents older than this value. * Default: 86400 seconds (24 hours). */ ttlSeconds: env.get('EXCHANGE_STORE_TTL_SECONDS', 86400), /** * SSE (Server-Sent Events) configuration. */ sse: { /** * Inactivity timeout in milliseconds. * Connection is closed if no new exchange is pushed within this period. * Default: 300000ms (5 minutes). */ inactivityTimeoutMs: env.get('EXCHANGE_STORE_SSE_INACTIVITY_TIMEOUT_MS', 300_000), /** * Absolute timeout in milliseconds. * Connection is closed after this duration regardless of activity. * Default: 7200000ms (2 hours). */ absoluteTimeoutMs: env.get('EXCHANGE_STORE_SSE_ABSOLUTE_TIMEOUT_MS', 7_200_000), /** * Maximum concurrent SSE connections per device. * Additional connections beyond this limit are rejected. */ maxConnectionsPerDevice: env.get('EXCHANGE_STORE_SSE_MAX_CONNECTIONS_PER_DEVICE', 5), /** * Retry interval in milliseconds sent to clients via SSE `retry` field. * Clients use this value when reconnecting after a disconnect. * Default: 3000ms (3 seconds). */ retryIntervalMs: env.get('EXCHANGE_STORE_SSE_RETRY_INTERVAL_MS', 3000), }, /** * Retry policy for critical message persistence. */ retry: { /** * Maximum number of retry attempts for critical messages. */ maxAttempts: env.get('EXCHANGE_STORE_RETRY_MAX_ATTEMPTS', 3), /** * Base delay in milliseconds for exponential backoff. * Actual delays: baseDelayMs, baseDelayMs*2, baseDelayMs*4, ... * Default: 1000ms → retries at 1s, 2s, 4s. */ baseDelayMs: env.get('EXCHANGE_STORE_RETRY_BASE_DELAY_MS', 1000), }, /** * Read timeout in milliseconds for exchange retrieval queries. * If a query exceeds this duration, partial results are returned with `isTruncated: true`. * Default: 5000ms (5 seconds). */ readTimeoutMs: env.get('EXCHANGE_STORE_READ_TIMEOUT_MS', 5000), /** * Feature flags for gradual rollout and rollback. */ featureFlags: { /** * Enable/disable MongoDB persistence of exchanges. * When false, exchanges are not written to MongoDB (CWMP sessions unaffected). */ persistence: env.get('FEATURE_EXCHANGE_PERSISTENCE', true), /** * Enable/disable SSE streaming endpoint. * When false, the SSE endpoint returns 503 and clients fall back to REST polling. */ sseEnabled: env.get('FEATURE_SSE_ENABLED', true), /** * Data source for the Exchange API. * 'mongodb': read from structured MongoDB collection (new system). * 'file': read from legacy file-based logs (old system). */ apiSource: env.get('FEATURE_EXCHANGE_API_SOURCE', 'mongodb') as 'mongodb' | 'file', }, } export default exchangeStoreConfig