Skip to content
reaatechREAATECH

@reaatech/secret-rotation-sidecar

pending npm

Exposes a REST API and SSE stream for managing secret rotations, health checks, and Prometheus metrics. It provides a `SidecarServer` class that wraps a `RotationManager` instance from the Secret Rotation Kit to handle HTTP requests.

@reaatech/secret-rotation-sidecar

npm version License: MIT CI

Status: Pre-1.0 — APIs may change in minor versions. Pin to a specific version in production.

HTTP sidecar server for Secret Rotation Kit. Exposes rotation operations, health checks, Prometheus metrics, and SSE event streaming over a REST API. Built on Node.js’s built-in http module with zero framework dependencies.

Installation

terminal
npm install @reaatech/secret-rotation-sidecar
# or
pnpm add @reaatech/secret-rotation-sidecar

Feature Overview

  • REST API — trigger rotations, query secret state, check health, export metrics
  • SSE streaming — real-time rotation event stream for external consumers
  • Bearer auth — optional shared-secret authentication on write endpoints
  • CORS support — configurable origin for browser-based clients
  • Built-in metrics — automatic Prometheus counters for rotation requests and failures
  • Zero framework dependencies — uses Node.js http.createServer directly
  • Graceful shutdown — closes SSE connections on server stop

Quick Start

typescript
import { RotationManager } from '@reaatech/secret-rotation-core';
import { AWSProvider } from '@reaatech/secret-rotation-provider-aws';
import { SidecarServer } from '@reaatech/secret-rotation-sidecar';
 
const provider = new AWSProvider({ region: 'us-east-1' });
const manager = new RotationManager({ providerInstance: provider });
 
const server = new SidecarServer({
  manager,
  port: 8080,
  authToken: process.env.SIDECAR_AUTH_TOKEN,
});
 
await server.start();
console.log(`Sidecar running at ${server.address}`);

API Reference

SidecarServer

Constructor

typescript
new SidecarServer(options: SidecarOptions)

SidecarOptions

PropertyTypeDefaultDescription
managerRotationManager(required)Rotation manager instance
portnumber8080HTTP server port
hoststring127.0.0.1Bind address
eventEmitterEventEmitterEvent source for SSE streaming
metricsMetricsServiceMetricsService()Metrics collector
loggerLoggerStructured logger
corsOriginstringhttp://localhost:*Allowed CORS origin
authTokenstringBearer token for write endpoint auth

Methods

MethodReturnsDescription
start()Promise<void>Start the HTTP server
stop()Promise<void>Stop the server and close SSE connections
addressstringServer address as http://host:port
listeningPortnumberActual port (useful when port is set to 0)

Endpoints

MethodPathAuthDescription
POST/rotateBearerTrigger a secret rotation. Body: { "secretName": "...", "force": false }
GET/secrets/:nameBearerGet rotation state for a secret
GET/healthHealth check. Returns { status: "healthy", timestamp, uptime }
GET/metricsPrometheus-format metrics
GET/eventsSSE event stream
OPTIONS*CORS preflight

SSE Events

Connected clients receive typed events:

Event TypeWhen
key_generatedNew key material created
key_propagatedKey stored in provider
key_verifiedPropagation confirmed
key_activatedNew key became active
rotation_failedRotation failed

Built-in Metrics

The sidecar automatically tracks:

MetricTypeDescription
srk_rotate_requests_totalCounterTotal rotation requests
srk_rotate_failures_totalCounterFailed rotation requests

Usage Patterns

Authenticated Access

typescript
const server = new SidecarServer({
  manager,
  port: 8080,
  authToken: 'my-shared-secret',
});
 
// Write endpoints require: Authorization: Bearer my-shared-secret

With SSE Event Streaming

typescript
const server = new SidecarServer({
  manager,
  port: 8080,
  eventEmitter: manager.events, // expose rotation events as SSE
});
 
// Connect: curl -N http://localhost:8080/events

Custom CORS

typescript
const server = new SidecarServer({
  manager,
  port: 8080,
  corsOrigin: '*', // allow any origin
});

Rotate via HTTP

terminal
curl -X POST http://localhost:8080/rotate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer my-token" \
  -d '{"secretName": "database-password"}'

Query Secret State

terminal
curl http://localhost:8080/secrets/database-password

Scrape Metrics

terminal
curl http://localhost:8080/metrics

License

MIT