@kinesisjs/core
v0.2.0
Published
TypeScript-first, framework-agnostic vehicle interpolation engine — core
Maintainers
Readme
@kinesisjs/core
Pure-TypeScript interpolation engine — framework-agnostic, ~5 KB minified+gzipped.
Mathematical engine for smooth movement between periodic position updates. No dependency on any map library or UI framework; extends through the adapter pattern.
Scope
- rAF-based clock — 60fps tick, no tab-background catch-up jumps
- Interpolation modes — linear, cubic, geodesic, none, adaptive
- Bounded memory — ring slot pattern, allocation-free hot path
- Multi-state lifecycle —
active/warning/stale/completed+markCompletedAPI - Sanity checks — anomalous-jump (distance vs. speed) and sharp-turn (heading) detection
- Typed event bus —
tick,vehicleadded,vehiclewarning,vehiclestale,vehiclecompleted,vehicleremoved,ingest,error TrackAdapterinterface — map adapters implement this contractCustomInterpolatorinterface — sync/async; foundation for route-aware extensionsmath-utils—haversineDistance,shortestArcDiff,linearLerpas public exports
Out of scope
- Map feature lifecycle → adapter packages
- Framework lifecycle → wrapper packages
- Data fetching, WebSocket management → application code
Installation
pnpm add @kinesisjs/coreUsage
import { Tracker } from '@kinesisjs/core';
import type { TrackAdapter, TrailPoint, Position } from '@kinesisjs/core';
class MyAdapter implements TrackAdapter {
addVehicle(id: string, p: TrailPoint): void {
/* draw on your map */
}
updatePosition(id: string, p: TrailPoint): void {
/* feature.setCoordinates */
}
removeVehicle(id: string): void {
/* remove from layer */
}
destroy(): void {
/* cleanup */
}
// Optional: updateOpacity(id, opacity), getMemoryEstimate()
}
const tracker = new Tracker({
adapter: new MyAdapter(),
interpolation: 'adaptive',
});
tracker.start();
tracker.on('vehiclestale', ({ vehicleId }) => console.log(`${vehicleId} stale`));
tracker.on('error', (e) => console.warn(`[${e.code}]`, e.message));
// From your WebSocket handler:
const positions: Position[] = [{ id: 'v1', lng: 29, lat: 41 }];
tracker.ingest(positions);Public API
// Classes
export { Tracker, Clock, Interpolator, AdaptiveInterpolator, EventBus, Sweeper };
// Utilities
export { haversineDistance, shortestArcDiff, linearLerp };
// Types
export type {
Position,
TrailPoint,
VehicleSlot,
VehicleState,
SweepResult,
InitialPositionBehavior,
TrackerOptions,
TrackerStats,
TrackerEventMap,
TrackAdapter,
InterpolationMode,
CustomInterpolator,
InterpolationOptions,
AdaptiveOptions,
AdaptiveBehavior,
TrackerError,
TrackerErrorCode,
FadeAnimationOptions,
};Performance
Interpolator.compute linear: ~50 ns/call (20M ops/sec). Tracker.tick with 1000 vehicles: ~0.15 ms (about 1% of the 60fps tick budget).
