BREAKING CHANGE(service): expand service lifecycle management with instance-aware hooks, startup timeouts, labels, readiness waits, and auto-restart support
This commit is contained in:
@@ -94,17 +94,45 @@
|
||||
accessor count = 0;
|
||||
```
|
||||
|
||||
## Dependencies (as of v4.2.0)
|
||||
- `@design.estate/dees-element` ^2.1.6 - TC39 decorators with `accessor` keyword
|
||||
- `@push.rocks/lik` ^6.2.2 - Data structures
|
||||
## Service Lifecycle System (v7.0.0+)
|
||||
|
||||
### Service<T>
|
||||
- `new Service<T>(name)` or `new Service<T>(options: IServiceOptions<T>)`
|
||||
- Builder pattern: `.critical()`, `.optional()`, `.dependsOn(...)`, `.withStart(fn)`, `.withStop(fn)`, `.withHealthCheck(fn, config?)`, `.withRetry(config)`, `.withStartupTimeout(ms)`, `.withLabels(labels)`
|
||||
- Subclass pattern: override `serviceStart()`, `serviceStop()`, `serviceHealthCheck()`
|
||||
- State machine: `stopped` → `starting` → `running` → `degraded` → `failed` → `stopping`
|
||||
- `service.instance` — stores the value returned from `start()` (e.g. a database pool)
|
||||
- `withStop(fn)` and `withHealthCheck(fn)` receive the instance as argument: `(instance: T) => Promise<void>`
|
||||
- `waitForState(target, timeoutMs?)`, `waitForRunning(timeoutMs?)`, `waitForStopped(timeoutMs?)` — programmatic readiness gates
|
||||
- Per-service startup timeout via `withStartupTimeout(ms)` or `startupTimeoutMs` in options
|
||||
- Labels: `setLabel`, `getLabel`, `removeLabel`, `hasLabel`, `withLabels`
|
||||
- Health checks: configurable via `IHealthCheckConfig` with `intervalMs`, `timeoutMs`, `failuresBeforeDegraded`, `failuresBeforeFailed`
|
||||
- Auto-restart on health failure: `autoRestart: true` in `IHealthCheckConfig` with `maxAutoRestarts`, `autoRestartDelayMs`, `autoRestartBackoffFactor`
|
||||
- Events via `eventSubject`: `'started'`, `'stopped'`, `'failed'`, `'degraded'`, `'recovered'`, `'retrying'`, `'healthCheck'`, `'autoRestarting'`
|
||||
|
||||
### ServiceManager
|
||||
- `manager.addService(service)` / `manager.addServiceFromOptions(options)` / `manager.removeService(name)`
|
||||
- Dependency-ordered startup via topological sort (Kahn's algorithm), level-by-level parallel
|
||||
- Critical service failure aborts startup with rollback; optional service failure continues
|
||||
- Retry with exponential backoff + jitter
|
||||
- Reverse-dependency-ordered shutdown with per-service timeout
|
||||
- `restartService(name)` — cascade stops dependents, restarts target, restarts dependents
|
||||
- `getHealth()` — aggregated `'healthy' | 'degraded' | 'unhealthy'` status
|
||||
- `getServicesByLabel(key, value)` / `getServicesStatusByLabel(key, value)` — label-based queries
|
||||
- Circular dependency detection
|
||||
- Global startup timeout enforcement via `startupTimeoutMs` in `IServiceManagerOptions`
|
||||
|
||||
## Dependencies (as of v7.0.0)
|
||||
- `@design.estate/dees-element` ^2.2.3 - TC39 decorators with `accessor` keyword
|
||||
- `@push.rocks/lik` ^6.3.1 - Data structures
|
||||
- `@push.rocks/smartdelay` ^3.0.5 - Delay utilities
|
||||
- `@push.rocks/smartlog` ^3.1.11 - Logging
|
||||
- `@push.rocks/smartlog` ^3.2.1 - Logging
|
||||
- `@push.rocks/smartpromise` ^4.2.3 - Promise utilities
|
||||
- `@push.rocks/smartrx` ^3.0.10 - RxJS wrapper
|
||||
- `@push.rocks/smarttime` ^4.1.1 - Time/cron utilities
|
||||
- `@push.rocks/smarttime` ^4.2.3 - Time/cron utilities
|
||||
- `@push.rocks/smartunique` ^3.0.9 - Unique ID generation
|
||||
- `@git.zone/tsbuild` ^4.1.2 - Build tool
|
||||
- `@git.zone/tsbundle` ^2.8.3 - Bundler (for browser tests)
|
||||
- `@git.zone/tsbuild` ^4.3.0 - Build tool
|
||||
- `@git.zone/tsbundle` ^2.9.1 - Bundler (for browser tests)
|
||||
- `@git.zone/tsrun` ^2.0.1 - TypeScript runner
|
||||
- `@git.zone/tstest` ^3.1.8 - Test runner (supports `.chromium.ts` files)
|
||||
- `@types/node` ^25.2.3 - Node.js type definitions
|
||||
- `@git.zone/tstest` ^3.5.0 - Test runner (supports `.chromium.ts` files)
|
||||
- `@types/node` ^25.5.0 - Node.js type definitions
|
||||
|
||||
Reference in New Issue
Block a user