axis-core
Version:
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.
142 lines (108 loc) • 4.14 kB
Markdown
<!-- omit in toc -->
[](https://github.com/FantasticFiasco/axis-js/actions/workflows/axis-core.yml)
[](https://www.npmjs.com/package/axis-core)
[](https://semver.org/)
A Node.js library written in TypeScript containing shared behavior for the other packages, e.g. code handling communication and authentication with [Axis Communication](http://www.axis.com) cameras.
<!-- omit in toc -->
## Table of contents
- [Super simple to use](
- [Installation](
- [API](
- [`Connection`](
- [`fetchBuilder`](
---
## Super simple to use
```typescript
// 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}`);
```
## Installation
```sh
npm install axis-core
yarn add axis-core
```
## API
### `Connection`
The `Connection` class encapsulates all information needed in order to start communicating with a camera on the network.
```typescript
/**
* 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
}
```
### `fetchBuilder`
The `fetchBuilder` function builds a version of `fetch` that can authenticates with the camera using either [Basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) or [Digest access authentication](https://en.wikipedia.org/wiki/Digest_access_authentication), depending on the camera configuration.
```typescript
type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
type DeviceFetch = (input: DeviceRequest, init?: RequestInit) => Promise<Response>;
const fetchBuilder = (fetch: Fetch): DeviceFetch
```