amaran-light-cli
Version:
Command line tool for controlling Aputure Amaran lights via WebSocket to a local Amaran desktop app.
263 lines • 11.1 kB
JavaScript
import { WebSocketServer } from 'ws';
export class MockLightServer {
wss;
devices = [
{ node_id: '400J5-F2C008', device_name: 'Test Light 1' },
{ node_id: '400J5-F2C009', device_name: 'Test Light 2' },
];
nodeConfigs = new Map();
// Store state for each device
deviceStates = new Map();
constructor(port) {
this.wss = new WebSocketServer({ port });
this.initializeState();
this.wss.on('connection', (ws) => {
ws.on('message', (message) => {
try {
const cmd = JSON.parse(message.toString());
this.handleCommand(ws, cmd);
}
catch (error) {
console.error('Failed to parse message:', error);
}
});
});
}
initializeState() {
this.devices.forEach((device) => {
if (device.node_id) {
this.deviceStates.set(device.node_id, {
sleep: false,
intensity: 0,
cct: 3200,
hue: 0,
sat: 0,
work_mode: 'CCT',
});
this.nodeConfigs.set(device.node_id, {
product_cct_min: 2700,
product_cct_max: 6500,
});
}
});
}
resetState() {
this.initializeState();
}
handleCommand(ws, cmd) {
const response = {
code: 0,
message: 'OK',
request: { type: cmd.type, node_id: cmd.node_id },
node_id: cmd.node_id,
};
// Update state based on commands
if (cmd.node_id && this.deviceStates.has(cmd.node_id)) {
const state = this.deviceStates.get(cmd.node_id);
if (state) {
switch (cmd.type) {
case 'set_sleep':
if (cmd.args?.sleep !== undefined)
state.sleep = cmd.args.sleep;
break;
case 'toggle_sleep':
state.sleep = !state.sleep;
break;
case 'set_intensity':
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
break;
case 'increase_intensity':
case 'increment_intensity':
if (typeof cmd.args?.delta === 'number') {
state.intensity = Math.max(0, Math.min(1000, state.intensity + cmd.args.delta));
}
break;
case 'set_cct':
if (cmd.args?.cct !== undefined)
state.cct = cmd.args.cct;
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
state.work_mode = 'CCT';
break;
case 'increase_cct':
case 'increment_cct':
if (typeof cmd.args?.delta === 'number') {
state.cct = Math.max(2700, Math.min(6500, state.cct + cmd.args.delta));
}
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
break;
case 'set_hsi':
if (cmd.args?.hue !== undefined)
state.hue = cmd.args.hue;
if (cmd.args?.sat !== undefined)
state.sat = cmd.args.sat;
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
state.work_mode = 'HSI';
break;
case 'set_rgb':
if (cmd.args?.r !== undefined)
state.r = cmd.args.r;
if (cmd.args?.g !== undefined)
state.g = cmd.args.g;
if (cmd.args?.b !== undefined)
state.b = cmd.args.b;
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
state.work_mode = 'RGB';
break;
case 'set_xy':
if (cmd.args?.x !== undefined)
state.x = cmd.args.x;
if (cmd.args?.y !== undefined)
state.y = cmd.args.y;
if (cmd.args?.intensity !== undefined)
state.intensity = cmd.args.intensity;
state.work_mode = 'XY';
break;
case 'set_fan_mode':
if (cmd.args?.mode !== undefined)
state.fan_mode = cmd.args.mode;
break;
case 'set_fan_speed':
if (cmd.args?.speed !== undefined)
state.fan_speed = cmd.args.speed;
break;
case 'set_effect_speed':
if (cmd.args?.speed !== undefined)
state.effect_speed = cmd.args.speed;
break;
case 'set_effect_intensity':
if (cmd.args?.intensity !== undefined)
state.effect_intensity = cmd.args.intensity;
break;
case 'set_system_effect':
if (cmd.args?.effect_type !== undefined)
state.effect_type = cmd.args.effect_type;
state.work_mode = 'EFFECT';
break;
case 'set_effect':
if (cmd.args?.name !== undefined)
state.effect_name = cmd.args.name;
state.work_mode = 'CUSTOM_EFFECT';
break;
}
}
}
// Generate response data
switch (cmd.type) {
case 'get_device_list':
case 'get_fixture_list':
response.data = { data: this.devices };
break;
case 'get_device_info':
response.data = { model: 'Mock LED', version: '1.0.0' };
break;
case 'get_firmware_version':
response.data = { version: '1.0.0' };
break;
case 'check_for_updates':
response.data = { update_available: false };
break;
case 'update_firmware':
response.data = { status: 'updating' };
break;
case 'get_scene_list':
response.data = { data: [] };
break;
case 'save_scene':
case 'delete_scene':
case 'recall_scene':
case 'update_scene':
response.data = { id: 'scene-123' };
break;
case 'get_preset_list':
response.data = { data: { cct: [], color: [], effect: [] } };
break;
case 'recall_preset':
case 'set_preset':
response.data = { id: cmd.args?.preset_id || cmd.args?.id || 'preset-123' };
break;
case 'get_system_effect_list':
response.data = { data: ['fire', 'lightning'] };
break;
case 'get_quickshot_list':
response.data = { data: [{ id: 'qs-123', name: 'Quickshot 1' }] };
break;
case 'set_quickshot':
response.data = cmd.args?.quickshot_id;
break;
case 'get_group_list':
response.data = { data: [] };
break;
case 'create_group':
response.data = { id: 'group-123', name: cmd.args?.name };
break;
case 'delete_group':
response.data = { id: cmd.args?.id };
break;
case 'add_to_group':
case 'remove_from_group':
response.data = { group_id: cmd.args?.group_id, node_id: cmd.args?.node_id };
break;
case 'get_node_config': {
const config = this.nodeConfigs.get(cmd.node_id || '') || { config: 'mock' };
const state = cmd.node_id ? this.deviceStates.get(cmd.node_id) : {};
response.data = {
node_id: cmd.node_id,
data: { ...config, ...state },
};
response.node_id = cmd.node_id;
break;
}
case 'get_sleep':
if (cmd.node_id && this.deviceStates.has(cmd.node_id)) {
response.data = { sleep: this.deviceStates.get(cmd.node_id)?.sleep };
}
break;
case 'get_intensity':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id)?.intensity : 0;
break;
case 'get_cct':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id) : {};
break;
case 'get_hsi':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id) : {};
break;
case 'get_rgb':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id) : {};
break;
case 'get_xy':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id) : {};
break;
case 'get_fan_mode':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id)?.fan_mode : 0;
break;
case 'get_fan_speed':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id)?.fan_speed : 0;
break;
case 'get_system_effect':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id)?.effect_type : '';
break;
case 'get_effect':
response.data = cmd.node_id ? this.deviceStates.get(cmd.node_id)?.effect_name : '';
break;
default:
response.data = {};
}
ws.send(JSON.stringify(response));
}
close(callback) {
this.wss.clients.forEach((client) => {
client.terminate();
});
this.wss.close(callback);
}
// Helper to check state in tests
getDeviceState(nodeId) {
return this.deviceStates.get(nodeId);
}
}
//# sourceMappingURL=MockLightServer.js.map