Recordings were just a thin named pointer over an already-captured session's events, so the whole separate feature (recordings table, API routes, pages, UI) is gone: any completed session can now be named and replayed directly. Replaying no longer creates a session or duplicates events of its own - it just bumps the source session's playCount/lastPlayedAt. Also renames play_sessions/playSession(s) to sessions/session(s) throughout the schema, queries, API routes, and UI for consistency, and updates the README to match the new flow. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
/**
|
|
* Normalized, app-level types for the Buttplug integration. Kept separate
|
|
* from `buttplug`'s own types so the rest of the app (UI, API payloads, DB
|
|
* rows) never has to import the client library directly.
|
|
*/
|
|
|
|
import type { DeviceCapabilities } from "@/lib/db/schema";
|
|
|
|
export type NormalizedOutputType = "vibrate" | "rotate" | "linear";
|
|
export type CommandType = NormalizedOutputType | "stop";
|
|
|
|
export interface ActuatorInfo {
|
|
featureIndex: number;
|
|
outputType: NormalizedOutputType;
|
|
/** True for outputs (e.g. HwPositionWithDuration) that require a move duration. */
|
|
requiresDuration: boolean;
|
|
descriptor: string;
|
|
}
|
|
|
|
export interface ConnectedDeviceInfo {
|
|
index: number;
|
|
name: string;
|
|
displayName?: string;
|
|
actuators: ActuatorInfo[];
|
|
hasBattery: boolean;
|
|
}
|
|
|
|
/** A single dispatched command, timestamped relative to session start. */
|
|
export interface CommandEvent {
|
|
tsMs: number;
|
|
deviceIndex: number;
|
|
commandType: CommandType;
|
|
featureIndex: number;
|
|
value: number;
|
|
durationMs?: number;
|
|
}
|
|
|
|
/**
|
|
* A device that took part in a session, as needed to remap it onto a
|
|
* currently-connected device for replay. Computed live from that session's
|
|
* session_devices/devices rows - not a frozen snapshot.
|
|
*/
|
|
export interface ReplayDeviceSlot {
|
|
slotLabel: string;
|
|
recordedBleName: string;
|
|
deviceClass: string | null;
|
|
capabilities: DeviceCapabilities | null;
|
|
/** The session_devices.id this slot was captured from - lets the replay UI
|
|
* map a chosen live device back to this slot's session_events. */
|
|
sourceSessionDeviceId: number;
|
|
}
|