Files
sexy/packages/buttplug/src/core/Messages.ts

210 lines
4.4 KiB
TypeScript
Raw Normal View History

2025-10-25 22:04:41 +02:00
/*!
* Buttplug JS Source Code File - Visit https://buttplug.io for more info about
* the project. Licensed under the BSD 3-Clause license. See LICENSE file in the
* project root for full license information.
*
* @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.
*/
// tslint:disable:max-classes-per-file
"use strict";
2025-10-25 22:04:41 +02:00
import { ButtplugMessageError } from "./Exceptions";
2025-10-25 22:04:41 +02:00
export const SYSTEM_MESSAGE_ID = 0;
export const DEFAULT_MESSAGE_ID = 1;
export const MAX_ID = 4294967295;
export const MESSAGE_SPEC_VERSION_MAJOR = 4;
export const MESSAGE_SPEC_VERSION_MINOR = 0;
// Base message interfaces
export interface ButtplugMessage {
Ok?: Ok;
Ping?: Ping;
Error?: Error;
RequestServerInfo?: RequestServerInfo;
ServerInfo?: ServerInfo;
RequestDeviceList?: RequestDeviceList;
StartScanning?: StartScanning;
StopScanning?: StopScanning;
ScanningFinished?: ScanningFinished;
StopCmd?: StopCmd;
InputCmd?: InputCmd;
InputReading?: InputReading;
OutputCmd?: OutputCmd;
DeviceList?: DeviceList;
}
export function msgId(msg: ButtplugMessage): number {
for (let [_, entry] of Object.entries(msg)) {
if (entry != undefined) {
return entry.Id;
}
}
throw new ButtplugMessageError(`Message ${msg} does not have an ID.`);
}
export function setMsgId(msg: ButtplugMessage, id: number) {
for (let [_, entry] of Object.entries(msg)) {
if (entry != undefined) {
entry.Id = id;
return;
}
}
throw new ButtplugMessageError(`Message ${msg} does not have an ID.`);
}
export interface Ok {
Id: number | undefined;
}
export interface Ping {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export enum ErrorClass {
ERROR_UNKNOWN,
ERROR_INIT,
ERROR_PING,
ERROR_MSG,
ERROR_DEVICE,
2025-10-25 22:04:41 +02:00
}
export interface Error {
ErrorMessage: string;
ErrorCode: ErrorClass;
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface RequestDeviceList {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface StartScanning {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface StopScanning {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface StopAllDevices {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface ScanningFinished {
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface RequestServerInfo {
ClientName: string;
ProtocolVersionMajor: number;
ProtocolVersionMinor: number;
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface ServerInfo {
MaxPingTime: number;
ServerName: string;
ProtocolVersionMajor: number;
ProtocolVersionMinor: number;
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface DeviceFeature {
FeatureDescription: string;
Output: { [key: string]: DeviceFeatureOutput };
Input: { [key: string]: DeviceFeatureInput };
FeatureIndex: number;
2025-10-25 22:04:41 +02:00
}
export interface DeviceInfo {
DeviceIndex: number;
DeviceName: string;
DeviceFeatures: { [key: number]: DeviceFeature };
DeviceDisplayName?: string;
DeviceMessageTimingGap?: number;
2025-10-25 22:04:41 +02:00
}
export interface DeviceList {
Devices: { [key: number]: DeviceInfo };
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export enum OutputType {
Unknown = "Unknown",
Vibrate = "Vibrate",
Rotate = "Rotate",
Oscillate = "Oscillate",
Constrict = "Constrict",
Inflate = "Inflate",
Position = "Position",
HwPositionWithDuration = "HwPositionWithDuration",
Temperature = "Temperature",
Spray = "Spray",
Led = "Led",
2025-10-25 22:04:41 +02:00
}
export enum InputType {
Unknown = "Unknown",
Battery = "Battery",
RSSI = "RSSI",
Button = "Button",
Pressure = "Pressure",
// Temperature,
// Accelerometer,
// Gyro,
2025-10-25 22:04:41 +02:00
}
export enum InputCommandType {
Read = "Read",
Subscribe = "Subscribe",
Unsubscribe = "Unsubscribe",
2025-10-25 22:04:41 +02:00
}
export interface DeviceFeatureInput {
Value: number[];
Command: InputCommandType[];
2025-10-25 22:04:41 +02:00
}
export interface DeviceFeatureOutput {
Value: number;
Duration?: number;
2025-10-25 22:04:41 +02:00
}
export interface OutputCmd {
DeviceIndex: number;
FeatureIndex: number;
Command: { [key: string]: DeviceFeatureOutput };
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
// Device Input Commands
2025-10-25 22:04:41 +02:00
export interface InputCmd {
DeviceIndex: number;
FeatureIndex: number;
Type: InputType;
Command: InputCommandType;
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface InputValue {
Value: number;
2025-10-25 22:04:41 +02:00
}
export interface InputReading {
DeviceIndex: number;
FeatureIndex: number;
Reading: { [key: string]: InputValue };
Id: number | undefined;
2025-10-25 22:04:41 +02:00
}
export interface StopCmd {
Id: number | undefined;
DeviceIndex: number | undefined;
FeatureIndex: number | undefined;
Inputs: boolean | undefined;
Outputs: boolean | undefined;
2025-10-25 22:04:41 +02:00
}