Skip to main content
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
TransportHTTP GETWebSocket
BehaviorReturns a single JPEG frame — you must poll continuouslyPushes frames automatically at ~15fps
EnvironmentBrowser + Node.jsNode.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,
});