From 01a621545af498d4ca269974774778d429792df6 Mon Sep 17 00:00:00 2001 From: dev Date: Wed, 29 Apr 2026 17:51:18 +0200 Subject: [PATCH] Centralize timer entry creation --- NEXT_STEPS.md | 1 + src/arts/timr/engine-timers.ts | 18 ++++----------- src/arts/timr/timer-entry.ts | 42 +++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 94fd202..c25734b 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -23,6 +23,7 @@ Estado al cierre: - `arts/conn/connection.ts` delega decode/routing de frames entrantes en `connection-message-router.ts`. - `arts/conn/connection.ts` delega el intento open/auth/flush/join en `connection-connect.ts`. - `arts/timr/engine-timers.ts` delega fan-out de listeners y diagnostico de listeners en `timer-events.ts`. + - `arts/timr/engine-timers.ts` delega la construccion de entradas internas en `timer-entry.ts`. - Integracion total ampliada: `Auth.signOut()` valida anonimizacion, invalidacion de `Permissions` y evento `Cache.invalidate`. - Tanda focalizada verde: `npx vitest run src/arts/conn src/libs/cach src/arts/cach src/svrs/cach src/arts/auth src/svrs/auth src/libs/auth src/arts/aapp/test/ecosystem.integration.test.ts` -> 19 archivos, 82 tests. - `/test/ecosystem` revisado en navegador: carga sin errores de consola, `ar` cambia a `rtl`, Formats se actualiza por locale, Perm cambia con rol `viewer`, Cach re-scopea por locale y Conn loopback publica/recibe. diff --git a/src/arts/timr/engine-timers.ts b/src/arts/timr/engine-timers.ts index 700fbae..696fd23 100644 --- a/src/arts/timr/engine-timers.ts +++ b/src/arts/timr/engine-timers.ts @@ -47,6 +47,7 @@ import { import { createTimerDiagnostics, emitTimerDiagnostic } from './diagnostics.ts'; import { TimrDuplicateKeyError } from './errors.ts'; import { + createInternalTimerEntry, isTimerKeyInScope, timerEntrySnapshot, type InternalTimerEntry @@ -276,29 +277,20 @@ export function createEngineTimers(options: EngineTimersOptions = {}): EngineTim } const now = clock.now(); - const entry: InternalTimerEntry = { - id: nextId++, + const entry = createInternalTimerEntry({ + id: nextId, key, - version: 0, kind, - status: TIMER_STATUS_PENDING, task, - controller: new AbortController(), - native: null, scheduledAt: now, - dueAt: now + delayMs, delayMs, intervalMs, awaitTask, maxRuns, - runCount: 0, - lastFiredAt: null, - lastCompletedAt: null, - lastErrorAt: null, - error: null, removeOnComplete: kind === TIMER_KIND_INTERVAL ? false : options?.removeOnComplete !== false, meta: options?.meta - }; + }); + nextId += 1; entries.set(key, entry); armEntry(entry, delayMs); diff --git a/src/arts/timr/timer-entry.ts b/src/arts/timr/timer-entry.ts index 3289317..f205f74 100644 --- a/src/arts/timr/timer-entry.ts +++ b/src/arts/timr/timer-entry.ts @@ -1,4 +1,4 @@ -import { DEFAULT_TIMER_SCOPE_SEPARATOR } from './consts.ts'; +import { DEFAULT_TIMER_SCOPE_SEPARATOR, TIMER_STATUS_PENDING } from './consts.ts'; import type { TimerEntrySnapshot, TimerKind, @@ -31,6 +31,46 @@ export interface InternalTimerEntry { meta?: Readonly>; } +export interface CreateInternalTimerEntryInput { + readonly id: number; + readonly key: string; + readonly kind: TimerKind; + readonly task: TimerTask; + readonly scheduledAt: number; + readonly delayMs: number; + readonly intervalMs: number | null; + readonly awaitTask: boolean; + readonly maxRuns: number | undefined; + readonly removeOnComplete: boolean; + readonly meta?: Readonly>; +} + +export function createInternalTimerEntry(input: CreateInternalTimerEntryInput): InternalTimerEntry { + return { + id: input.id, + key: input.key, + version: 0, + kind: input.kind, + status: TIMER_STATUS_PENDING, + task: input.task, + controller: new AbortController(), + native: null, + scheduledAt: input.scheduledAt, + dueAt: input.scheduledAt + input.delayMs, + delayMs: input.delayMs, + intervalMs: input.intervalMs, + awaitTask: input.awaitTask, + maxRuns: input.maxRuns, + runCount: 0, + lastFiredAt: null, + lastCompletedAt: null, + lastErrorAt: null, + error: null, + removeOnComplete: input.removeOnComplete, + meta: input.meta + }; +} + export function scopeOfTimerKey(key: string): string { const idx = key.lastIndexOf(DEFAULT_TIMER_SCOPE_SEPARATOR); return idx === -1 ? key : key.slice(0, idx);