A Node.js library written in TypeScript containing shared behavior for the other packages, e.g. code handling communication and authentication with Axis Communication cameras.
// fetchBuilder is building a version of fetch that can handle the
// authentication protocols used by Axis devices.
const fetch = fetchBuilder(global.fetch);
// This package is exporting utility classes and methods. In this case we rely
// on DeviceRequest to build a request that is reading the product short name.
class GetProdShortNameRequest extends DeviceRequest {
constructor(connection: Connection) {
super(connection, '/axis-cgi/param.cgi?action=list&group=Brand.ProdShortName');
}
}
// This is a custom response handler that reads the response body and extracts
// the parameter name and value from the text.
const responseHandler = async (res: Response): Promise<{ name: string; value: string }> => {
if (!res.ok) {
throw new Error(`Request failed with status ${res.status} ${res.statusText}`);
}
// text/plain;charset=UTF-8
const contentType = res.headers.get('content-type')?.split(';')[0];
if (contentType !== 'text/plain') {
throw new Error(`Response with invalid content type: ${contentType}`);
}
const text = await res.text();
const [name, value] = text.trim().split('=');
return { name, value };
};
// This code is creating a connection to a device and sending a request to read
// the product short name. The response is then handled by the custom response
// handler.
const connection = new Connection(Protocol.Http, '<ip address>', 80, '<username>', '<password>');
const req = new GetProdShortNameRequest(connection);
const res = await fetch(req);
const { name, value } = await responseHandler(res);
console.log(`Status: ${res.status}`);
console.log(`Parameter: ${name}=${value}`);
npm install axis-core
# or
yarn add axis-core
The Connection
class encapsulates all information needed in order to start communicating with a camera on the network.
/**
* Class describing a connection to a device.
*/
class Connection {
/**
* Gets the protocol to use when creating the connection.
*/
readonly protocol: Protocol;
/**
* Gets the address or hostname of the device.
*/
readonly address: string;
/**
* Gets the port of the device.
*/
readonly port: number;
/**
* Gets the username.
*/
readonly username: string;
/**
* Gets the password.
*/
readonly password: string;
/**
* Gets the url.
*/
get url(): string;
}
enum Protocol {
/**
* Hypertext Transfer Protocol (HTTP).
*/
Http = 0,
/**
* HTTP over Transport Layer Security (TLS).
*/
Https = 1
}
The fetchBuilder
function builds a version of fetch
that can authenticates with the camera using either Basic access authentication or Digest access authentication, depending on the camera configuration.
type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
type DeviceFetch = (input: DeviceRequest, init?: RequestInit) => Promise<Response>;
const fetchBuilder = (fetch: Fetch): DeviceFetch