All camera control goes through manager.client, which is a full CameraClient instance. It provides typed methods for every Camera Remote Web API endpoint.
Properties
Read properties
// Single property
const iso = await manager.client.getProperty(cameraId, 'iso');
console.log(iso.data.formatted); // "ISO 400"
// All properties
const all = await manager.client.getAllProperties(cameraId);
console.log(all.properties);
Write properties
await manager.client.setProperty(cameraId, 'iso', { value: '800' });
await manager.client.setProperty(cameraId, 'aperture', { value: 'f/2.8' });
await manager.client.setProperty(cameraId, 'shutter-speed', { value: '1/250' });
Priority key
Required before changing settings or triggering actions in remote control mode:
await manager.client.setPriorityKey(cameraId, { setting: 'pc-remote' });
Listening for property changes
Use an EventStream to get notified when properties change on the camera:
import { EventStream } from 'camera-remote-web-api';
const events = new EventStream('http://localhost:8080', cameraId);
events.on('propertyChanged', async (data) => {
console.log('Changed properties:', data.codes);
// Re-read the updated values
const updated = await manager.client.getAllProperties(cameraId);
});
Actions
Shutter
// Single shot
await manager.client.triggerShutter(cameraId);
// Continuous start/stop
await manager.client.triggerShutter(cameraId, { action: 'down' }); // start burst
await manager.client.triggerShutter(cameraId, { action: 'up' }); // stop burst
Focus
// Autofocus + capture
await manager.client.afShutter(cameraId);
// Focus lock (half-press)
await manager.client.halfPress(cameraId);
// Manual focus — negative = near, positive = far (1–7 speed)
await manager.client.focusNearFar(cameraId, { step: -3 }); // near, medium
await manager.client.focusNearFar(cameraId, { step: 7 }); // far, max speed
Zoom
await manager.client.controlZoom(cameraId, { direction: 'in', speed: 'normal' });
await manager.client.stopZoom(cameraId);
Live View
Live view is disabled by default in remote-transfer mode. You must call enableLiveView() before requesting frames.
There are two ways to consume live view frames:
| getLiveViewFrame() | LiveViewStream |
|---|
| Transport | HTTP GET | WebSocket |
| Behavior | Returns a single JPEG frame — you must poll continuously | Pushes frames automatically at ~15fps |
| Environment | Browser + Node.js | Node.js only |
HTTP polling (single frame)
getLiveViewFrame() returns one JPEG frame per call. Poll it in a loop to simulate a video stream:
await manager.client.enableLiveView(cameraId);
const poll = setInterval(async () => {
const frame = await manager.client.getLiveViewFrame(cameraId);
// frame is an ArrayBuffer containing JPEG data
}, 66); // ~15fps
WebSocket streaming (continuous)
LiveViewStream handles continuous frame delivery automatically:
import { LiveViewStream } from 'camera-remote-web-api/server';
const liveView = new LiveViewStream(`ws://localhost:${manager.getPort()}`, cameraId);
liveView.onFrame((jpeg: ArrayBuffer) => {
console.log(`Frame: ${jpeg.byteLength} bytes`);
});
liveView.close();
OSD overlay
Enable on-screen display (exposure info, focus area, etc.) on live view frames:
await manager.client.enableLiveView(cameraId, { osd: true });
SD Card
List and download files from the camera’s SD card. Requires remote-transfer or contents connection mode.
// List files on slot 1
const { files } = await manager.client.listSDCardFiles(cameraId, 1);
console.log(`Found ${files.length} files`);
// Download a file
if (files.length > 0) {
const file = files[0];
await manager.client.downloadSDCardFile(cameraId, 1, file.content_id, file.file_id);
}
Download notifications
Listen for completed downloads via EventStream:
import { EventStream } from 'camera-remote-web-api';
const events = new EventStream('http://localhost:8080', cameraId);
events.on('downloadComplete', (data) => {
console.log('File saved:', data.filename);
});
events.on('transferProgress', (data) => {
console.log(`Transfer: ${data.percent}%`, data.filename);
});
Save Settings
Configure where and how the server saves transferred files:
// Read current settings
const info = await manager.client.getSaveInfo(cameraId);
// Update save settings
await manager.client.setSaveInfo(cameraId, {
path: '/tmp/photos',
prefix: 'IMG_',
startNo: 1,
});