camstreamerlib 4.0.0-beta.3 → 4.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/cjs/CamOverlayAPI.d.ts +47 -26
- package/cjs/CamOverlayAPI.js +171 -88
- package/cjs/CamOverlayDrawingAPI.d.ts +2 -47
- package/cjs/CamOverlayDrawingAPI.js +6 -3
- package/cjs/CamOverlayPainter/Frame.d.ts +8 -37
- package/cjs/CamOverlayPainter/Frame.js +33 -0
- package/cjs/CamOverlayPainter/Painter.d.ts +16 -10
- package/cjs/CamOverlayPainter/Painter.js +6 -5
- package/cjs/CamOverlayPainter/ResourceManager.d.ts +3 -2
- package/cjs/CamOverlayPainter/ResourceManager.js +8 -11
- package/cjs/CamScripterAPI.d.ts +33 -16
- package/cjs/CamScripterAPI.js +50 -41
- package/cjs/CamScripterAPICameraEventsGenerator.d.ts +1 -1
- package/cjs/CamScripterAPICameraEventsGenerator.js +6 -3
- package/cjs/CamStreamerAPI.d.ts +16 -14
- package/cjs/CamStreamerAPI.js +32 -32
- package/cjs/CamSwitcherAPI.d.ts +42 -37
- package/cjs/CamSwitcherAPI.js +123 -114
- package/cjs/CamSwitcherEvents.d.ts +1 -1
- package/cjs/PlaneTrackerAPI.d.ts +42 -0
- package/cjs/PlaneTrackerAPI.js +211 -0
- package/cjs/VapixAPI.d.ts +56 -43
- package/cjs/VapixAPI.js +305 -216
- package/cjs/VapixEvents.d.ts +1 -1
- package/cjs/VapixEvents.js +3 -3
- package/cjs/errors/errors.d.ts +3 -0
- package/cjs/errors/errors.js +8 -1
- package/cjs/events/AxisCameraStationEvents.d.ts +5 -4
- package/cjs/events/AxisCameraStationEvents.js +23 -18
- package/cjs/events/GenetecAgent.d.ts +6 -3
- package/cjs/events/GenetecAgent.js +30 -19
- package/cjs/index.d.ts +14 -1
- package/cjs/index.js +23 -2
- package/cjs/internal/Digest.js +6 -6
- package/cjs/internal/ProxyClient.d.ts +8 -9
- package/cjs/internal/ProxyClient.js +25 -29
- package/cjs/internal/types.d.ts +42 -0
- package/cjs/internal/types.js +2 -0
- package/cjs/internal/utils.d.ts +4 -1
- package/cjs/internal/utils.js +22 -3
- package/cjs/internal/versionCompare.d.ts +2 -2
- package/cjs/node/DefaultClient.d.ts +5 -6
- package/cjs/node/DefaultClient.js +12 -14
- package/cjs/node/HttpRequestSender.d.ts +1 -0
- package/cjs/node/HttpRequestSender.js +13 -3
- package/cjs/node/HttpServer.js +1 -1
- package/cjs/node/WsClient.d.ts +2 -1
- package/cjs/node/WsEventClient.d.ts +1 -1
- package/cjs/node/index.d.ts +2 -0
- package/cjs/node/index.js +18 -1
- package/cjs/types/CamOverlayAPI/CamOverlayAPI.d.ts +3073 -0
- package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +127 -0
- package/cjs/types/CamOverlayAPI/accuweatherSchema.d.ts +114 -0
- package/cjs/types/CamOverlayAPI/accuweatherSchema.js +50 -0
- package/cjs/types/CamOverlayAPI/customGraphicsSchema.d.ts +783 -0
- package/cjs/types/CamOverlayAPI/customGraphicsSchema.js +75 -0
- package/cjs/types/CamOverlayAPI/imagesSchema.d.ts +122 -0
- package/cjs/types/CamOverlayAPI/imagesSchema.js +12 -0
- package/cjs/types/CamOverlayAPI/index.d.ts +9 -0
- package/cjs/types/CamOverlayAPI/index.js +25 -0
- package/cjs/types/CamOverlayAPI/infotickerSchema.d.ts +130 -0
- package/cjs/types/CamOverlayAPI/infotickerSchema.js +29 -0
- package/cjs/types/CamOverlayAPI/pipSchema.d.ts +166 -0
- package/cjs/types/CamOverlayAPI/pipSchema.js +42 -0
- package/cjs/types/CamOverlayAPI/ptzCompassSchema.d.ts +126 -0
- package/cjs/types/CamOverlayAPI/ptzCompassSchema.js +28 -0
- package/cjs/types/CamOverlayAPI/ptzSchema.d.ts +146 -0
- package/cjs/types/CamOverlayAPI/ptzSchema.js +15 -0
- package/cjs/types/CamOverlayAPI/screenSharingSchema.d.ts +79 -0
- package/cjs/types/CamOverlayAPI/screenSharingSchema.js +11 -0
- package/cjs/types/CamOverlayAPI/webCameraSharingSchema.d.ts +79 -0
- package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +11 -0
- package/cjs/types/CamOverlayDrawingAPI.d.ts +58 -0
- package/cjs/types/CamOverlayDrawingAPI.js +2 -0
- package/cjs/types/CamOverlayPainter.d.ts +74 -0
- package/cjs/types/CamOverlayPainter.js +2 -0
- package/cjs/types/CamScripterAPI.d.ts +82 -17
- package/cjs/types/CamScripterAPI.js +22 -7
- package/cjs/types/CamStreamerAPI.d.ts +16 -5
- package/cjs/types/CamStreamerAPI.js +5 -1
- package/cjs/types/CamSwitcherAPI.d.ts +5 -5
- package/cjs/types/CamSwitcherEvents.d.ts +77 -0
- package/cjs/types/CamSwitcherEvents.js +8 -0
- package/cjs/types/PlaneTrackerAPI.d.ts +8 -0
- package/cjs/types/PlaneTrackerAPI.js +2 -0
- package/cjs/types/VapixAPI.d.ts +636 -519
- package/cjs/types/VapixAPI.js +62 -24
- package/cjs/types/common.d.ts +14 -5
- package/cjs/web/DefaultClient.d.ts +5 -5
- package/cjs/web/DefaultClient.js +22 -10
- package/cjs/web/WsClient.js +2 -2
- package/esm/CamOverlayAPI.d.ts +47 -26
- package/esm/CamOverlayAPI.js +169 -86
- package/esm/CamOverlayDrawingAPI.d.ts +2 -47
- package/esm/CamOverlayDrawingAPI.js +6 -3
- package/esm/CamOverlayPainter/Frame.d.ts +8 -37
- package/esm/CamOverlayPainter/Frame.js +33 -0
- package/esm/CamOverlayPainter/Painter.d.ts +16 -10
- package/esm/CamOverlayPainter/Painter.js +5 -3
- package/esm/CamOverlayPainter/ResourceManager.d.ts +3 -2
- package/esm/CamOverlayPainter/ResourceManager.js +7 -11
- package/esm/CamScripterAPI.d.ts +33 -16
- package/esm/CamScripterAPI.js +46 -37
- package/esm/CamScripterAPICameraEventsGenerator.d.ts +1 -1
- package/esm/CamScripterAPICameraEventsGenerator.js +6 -3
- package/esm/CamStreamerAPI.d.ts +16 -14
- package/esm/CamStreamerAPI.js +32 -32
- package/esm/CamSwitcherAPI.d.ts +42 -37
- package/esm/CamSwitcherAPI.js +116 -107
- package/esm/CamSwitcherEvents.d.ts +1 -1
- package/esm/PlaneTrackerAPI.d.ts +42 -0
- package/esm/PlaneTrackerAPI.js +207 -0
- package/esm/VapixAPI.d.ts +56 -43
- package/esm/VapixAPI.js +297 -208
- package/esm/VapixEvents.d.ts +1 -1
- package/esm/VapixEvents.js +3 -3
- package/esm/errors/errors.d.ts +3 -0
- package/esm/errors/errors.js +6 -0
- package/esm/events/AxisCameraStationEvents.d.ts +5 -4
- package/esm/events/AxisCameraStationEvents.js +18 -13
- package/esm/events/GenetecAgent.d.ts +6 -3
- package/esm/events/GenetecAgent.js +20 -9
- package/esm/index.d.ts +14 -1
- package/esm/index.js +14 -1
- package/esm/internal/Digest.js +6 -6
- package/esm/internal/ProxyClient.d.ts +8 -9
- package/esm/internal/ProxyClient.js +25 -29
- package/esm/internal/types.d.ts +42 -0
- package/esm/internal/types.js +1 -0
- package/esm/internal/utils.d.ts +4 -1
- package/esm/internal/utils.js +17 -1
- package/esm/internal/versionCompare.d.ts +2 -2
- package/esm/node/DefaultClient.d.ts +5 -6
- package/esm/node/DefaultClient.js +12 -14
- package/esm/node/HttpRequestSender.d.ts +1 -0
- package/esm/node/HttpRequestSender.js +13 -3
- package/esm/node/HttpServer.js +1 -1
- package/esm/node/WsClient.d.ts +2 -1
- package/esm/node/WsEventClient.d.ts +1 -1
- package/esm/node/index.d.ts +2 -0
- package/esm/node/index.js +2 -0
- package/esm/types/CamOverlayAPI/CamOverlayAPI.d.ts +3073 -0
- package/esm/types/CamOverlayAPI/CamOverlayAPI.js +124 -0
- package/esm/types/CamOverlayAPI/accuweatherSchema.d.ts +114 -0
- package/esm/types/CamOverlayAPI/accuweatherSchema.js +46 -0
- package/esm/types/CamOverlayAPI/customGraphicsSchema.d.ts +783 -0
- package/esm/types/CamOverlayAPI/customGraphicsSchema.js +71 -0
- package/esm/types/CamOverlayAPI/imagesSchema.d.ts +122 -0
- package/esm/types/CamOverlayAPI/imagesSchema.js +8 -0
- package/esm/types/CamOverlayAPI/index.d.ts +9 -0
- package/esm/types/CamOverlayAPI/index.js +9 -0
- package/esm/types/CamOverlayAPI/infotickerSchema.d.ts +130 -0
- package/esm/types/CamOverlayAPI/infotickerSchema.js +25 -0
- package/esm/types/CamOverlayAPI/pipSchema.d.ts +166 -0
- package/esm/types/CamOverlayAPI/pipSchema.js +38 -0
- package/esm/types/CamOverlayAPI/ptzCompassSchema.d.ts +126 -0
- package/esm/types/CamOverlayAPI/ptzCompassSchema.js +24 -0
- package/esm/types/CamOverlayAPI/ptzSchema.d.ts +146 -0
- package/esm/types/CamOverlayAPI/ptzSchema.js +11 -0
- package/esm/types/CamOverlayAPI/screenSharingSchema.d.ts +79 -0
- package/esm/types/CamOverlayAPI/screenSharingSchema.js +7 -0
- package/esm/types/CamOverlayAPI/webCameraSharingSchema.d.ts +79 -0
- package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +7 -0
- package/esm/types/CamOverlayDrawingAPI.d.ts +58 -0
- package/esm/types/CamOverlayDrawingAPI.js +1 -0
- package/esm/types/CamOverlayPainter.d.ts +74 -0
- package/esm/types/CamOverlayPainter.js +1 -0
- package/esm/types/CamScripterAPI.d.ts +82 -17
- package/esm/types/CamScripterAPI.js +21 -6
- package/esm/types/CamStreamerAPI.d.ts +16 -5
- package/esm/types/CamStreamerAPI.js +4 -0
- package/esm/types/CamSwitcherAPI.d.ts +5 -5
- package/esm/types/CamSwitcherEvents.d.ts +77 -0
- package/esm/types/CamSwitcherEvents.js +8 -0
- package/esm/types/PlaneTrackerAPI.d.ts +8 -0
- package/esm/types/PlaneTrackerAPI.js +1 -0
- package/esm/types/VapixAPI.d.ts +636 -519
- package/esm/types/VapixAPI.js +61 -23
- package/esm/types/common.d.ts +14 -5
- package/esm/web/DefaultClient.d.ts +5 -5
- package/esm/web/DefaultClient.js +22 -10
- package/esm/web/WsClient.js +2 -2
- package/package.json +9 -8
- package/cjs/internal/common.d.ts +0 -39
- package/cjs/internal/common.js +0 -27
- package/cjs/types/CamOverlayAPI.d.ts +0 -188
- package/cjs/types/CamOverlayAPI.js +0 -47
- package/esm/internal/common.d.ts +0 -39
- package/esm/internal/common.js +0 -20
- package/esm/types/CamOverlayAPI.d.ts +0 -188
- package/esm/types/CamOverlayAPI.js +0 -44
package/README.md
CHANGED
|
@@ -21,19 +21,25 @@ npm install camstreamerlib
|
|
|
21
21
|
|
|
22
22
|
- [VapixAPI](doc/VapixAPI.md) is a module to access Axis camera VAPIX interface.
|
|
23
23
|
|
|
24
|
+
- [VapixEvents](doc/VapixEvents.md) is a module which allows receiving camera events from the VAPIX API.
|
|
25
|
+
|
|
24
26
|
- [CamStreamerAPI](doc/CamStreamerAPI.md) is a module for easy control of video streaming in the CamStreamer ACAP application (RTMP, HLS, SRT and MPEG-TS protocols).
|
|
25
27
|
|
|
26
|
-
- [CamOverlayAPI](doc/CamOverlayAPI.md) is a module to access CamOverlay
|
|
28
|
+
- [CamOverlayAPI](doc/CamOverlayAPI.md) is a module to access CamOverlay API.
|
|
27
29
|
|
|
28
30
|
- [CamOverlayDrawingAPI](doc/CamOverlayDrawingAPI.md) is a module for easy control of CamOverlay drawing API. For more details on supported video overlay drawing functions see https://camstreamer.com/camoverlay-api1
|
|
29
31
|
|
|
30
32
|
- [CamOverlayPainter/](doc/CamOverlayPainter.md) contains three modules which makes easier to use CamOverlayDrawingAPI.
|
|
31
33
|
|
|
34
|
+
- [CamScripterAPI](doc/CamScripterAPI.md) is a module to access CamScripter API.
|
|
35
|
+
|
|
32
36
|
- [CamScripterAPICameraEventsGenerator](doc/CamScripterAPICameraEventsGenerator.md) is a module which allows generating events on an Axis camera. These events can be used for triggers in the Axis camera rule engine (events/actions). It is also an easy way how to integrate events and metadata in VMS systems which support Axis camera events.
|
|
33
37
|
|
|
38
|
+
- [CamSwitcherAPI](doc/CamSwitcherAPI.md) is a module to access CamSwitcher API.
|
|
39
|
+
|
|
34
40
|
- [CamSwitcherEvents](doc/CamSwitcherEvents.md) is a module which allows receiving events from CamSwitcher ACAP application.
|
|
35
41
|
|
|
36
|
-
- [
|
|
42
|
+
- [PlaneTrackerAPI](doc/PlaneTrackerAPI.md) is a module to access PlaneTracker API.
|
|
37
43
|
|
|
38
44
|
- [GenetecAgent](doc/GenetecAgent.md) is a module which allows receiving and sending data to Genetec VMS.
|
|
39
45
|
|
package/cjs/CamOverlayAPI.d.ts
CHANGED
|
@@ -1,31 +1,52 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { TNetworkCamera } from './types/common';
|
|
5
|
-
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { IClient, TBlobResponse, TResponse } from './internal/types';
|
|
4
|
+
import { THttpRequestOptions, TNetworkCamera } from './types/common';
|
|
5
|
+
import { ImageType, TCoordinates, TFile, TFileList, TFileType, TStorage, TStorageDataList, TWidget } from './types/CamOverlayAPI/CamOverlayAPI';
|
|
6
|
+
import { TField } from './types/CamOverlayAPI';
|
|
7
|
+
export declare const allowedWidgetNames: {
|
|
8
|
+
readonly accuweather: "accuweather";
|
|
9
|
+
readonly infoticker: "infoticker";
|
|
10
|
+
readonly customGraphics: "customGraphics";
|
|
11
|
+
readonly ptzCompass: "ptzCompass";
|
|
12
|
+
readonly images: "images";
|
|
13
|
+
readonly ptz: "ptz";
|
|
14
|
+
readonly pip: "pip";
|
|
15
|
+
readonly screenSharing: "screenSharing";
|
|
16
|
+
readonly web_camera: "web_camera";
|
|
17
|
+
};
|
|
18
|
+
export declare class CamOverlayAPI<Client extends IClient<TResponse> = IClient<TResponse>> {
|
|
6
19
|
private client;
|
|
7
|
-
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
constructor(client: Client);
|
|
21
|
+
static getBasePath: () => string;
|
|
22
|
+
static getProxyPath: () => string;
|
|
23
|
+
static getFilePreviewPath: (path: string) => string;
|
|
24
|
+
checkCameraTime(options?: THttpRequestOptions): Promise<boolean>;
|
|
25
|
+
getNetworkCameraList(options?: THttpRequestOptions): Promise<TNetworkCamera[]>;
|
|
26
|
+
wsAuthorization(options?: THttpRequestOptions): Promise<string>;
|
|
27
|
+
getMjpegStreamImage(mjpegUrl: string, options?: THttpRequestOptions): Promise<TBlobResponse<Client>>;
|
|
28
|
+
listFiles(fileType: TFileType, options?: THttpRequestOptions): Promise<TFileList>;
|
|
29
|
+
uploadFile(fileType: TFileType, formData: FormData, storage: TStorage, options?: THttpRequestOptions): Promise<void>;
|
|
30
|
+
removeFile(fileType: TFileType, fileParams: TFile, options?: THttpRequestOptions): Promise<void>;
|
|
31
|
+
getFileStorage(fileType: TFileType, options?: THttpRequestOptions): Promise<TStorageDataList>;
|
|
32
|
+
getFilePreviewFromCamera(path: string, options?: THttpRequestOptions): Promise<TBlobResponse<Client>>;
|
|
33
|
+
updateInfoticker(serviceId: number, text: string, options?: THttpRequestOptions): Promise<void>;
|
|
34
|
+
setEnabled(serviceId: number, enabled: boolean, options?: THttpRequestOptions): Promise<void>;
|
|
35
|
+
isEnabled(serviceId: number, options?: THttpRequestOptions): Promise<boolean>;
|
|
36
|
+
getSingleWidget(serviceId: number, options?: THttpRequestOptions): Promise<TWidget>;
|
|
37
|
+
getWidgets(options?: THttpRequestOptions): Promise<TWidget[]>;
|
|
38
|
+
updateSingleWidget(widget: TWidget, options?: THttpRequestOptions): Promise<void>;
|
|
39
|
+
updateWidgets(widgets: TWidget[], options?: THttpRequestOptions): Promise<void>;
|
|
40
|
+
updateCGText(serviceId: number, fields: TField[], options?: THttpRequestOptions): Promise<void>;
|
|
41
|
+
updateCGImagePos(serviceId: number, coordinates?: TCoordinates, x?: number, y?: number, options?: THttpRequestOptions): Promise<void>;
|
|
42
|
+
updateCGImage(serviceId: number, path: string, coordinates?: TCoordinates, x?: number, y?: number, options?: THttpRequestOptions): Promise<void>;
|
|
43
|
+
updateCGImageFromData(serviceId: number, imageType: ImageType, imageData: Buffer, coordinates?: TCoordinates, x?: number, y?: number, options?: THttpRequestOptions): Promise<void>;
|
|
27
44
|
private promiseCGUpdate;
|
|
28
|
-
private
|
|
29
|
-
private
|
|
45
|
+
private _get;
|
|
46
|
+
private _post;
|
|
47
|
+
private _getBlob;
|
|
30
48
|
private parseBlobResponse;
|
|
49
|
+
private _postUrlEncoded;
|
|
50
|
+
private _postJsonEncoded;
|
|
51
|
+
private getAgent;
|
|
31
52
|
}
|
package/cjs/CamOverlayAPI.js
CHANGED
|
@@ -1,100 +1,152 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CamOverlayAPI = void 0;
|
|
4
|
-
const
|
|
5
|
-
const DefaultClient_1 = require("./node/DefaultClient");
|
|
6
|
-
const CamOverlayAPI_1 = require("./types/CamOverlayAPI");
|
|
3
|
+
exports.CamOverlayAPI = exports.allowedWidgetNames = void 0;
|
|
4
|
+
const utils_1 = require("./internal/utils");
|
|
7
5
|
const errors_1 = require("./errors/errors");
|
|
8
|
-
const
|
|
6
|
+
const common_1 = require("./types/common");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const ProxyClient_1 = require("./internal/ProxyClient");
|
|
9
|
+
const CamOverlayAPI_1 = require("./types/CamOverlayAPI/CamOverlayAPI");
|
|
10
|
+
exports.allowedWidgetNames = {
|
|
11
|
+
accuweather: 'accuweather',
|
|
12
|
+
infoticker: 'infoticker',
|
|
13
|
+
customGraphics: 'customGraphics',
|
|
14
|
+
ptzCompass: 'ptzCompass',
|
|
15
|
+
images: 'images',
|
|
16
|
+
ptz: 'ptz',
|
|
17
|
+
pip: 'pip',
|
|
18
|
+
screenSharing: 'screenSharing',
|
|
19
|
+
web_camera: 'web_camera',
|
|
20
|
+
};
|
|
21
|
+
const BASE_PATH = '/local/camoverlay/api';
|
|
9
22
|
class CamOverlayAPI {
|
|
10
23
|
client;
|
|
11
|
-
constructor(
|
|
12
|
-
|
|
13
|
-
this.client = options;
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
this.client = new DefaultClient_1.DefaultClient(options);
|
|
17
|
-
}
|
|
24
|
+
constructor(client) {
|
|
25
|
+
this.client = client;
|
|
18
26
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
static getBasePath = () => BASE_PATH;
|
|
28
|
+
static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
|
|
29
|
+
static getFilePreviewPath = (path) => `${BASE_PATH}/image.cgi?path=${encodeURIComponent(path)}`;
|
|
30
|
+
async checkCameraTime(options) {
|
|
31
|
+
const response = await this._get({ path: `${BASE_PATH}/camera_time.cgi` }, options);
|
|
32
|
+
return zod_1.z.boolean().parse(response.state);
|
|
22
33
|
}
|
|
23
|
-
async getNetworkCameraList() {
|
|
24
|
-
const response = await this.
|
|
25
|
-
return
|
|
34
|
+
async getNetworkCameraList(options) {
|
|
35
|
+
const response = await this._get({ path: `${BASE_PATH}/network_camera_list.cgi` }, options);
|
|
36
|
+
return common_1.networkCameraListSchema.parse(response.camera_list);
|
|
26
37
|
}
|
|
27
|
-
async
|
|
28
|
-
const response = await this.
|
|
29
|
-
return response.data;
|
|
38
|
+
async wsAuthorization(options) {
|
|
39
|
+
const response = await this._get({ path: `${BASE_PATH}/ws_authorization.cgi` }, options);
|
|
40
|
+
return CamOverlayAPI_1.WSResponseSchema.parse(response).data;
|
|
30
41
|
}
|
|
31
|
-
async getMjpegStreamImage(mjpegUrl) {
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
async getMjpegStreamImage(mjpegUrl, options) {
|
|
43
|
+
return await this._getBlob({
|
|
44
|
+
path: `${BASE_PATH}/fetch_mjpeg_image.cgi?mjpeg_url=${encodeURIComponent(decodeURIComponent(mjpegUrl))}`,
|
|
45
|
+
}, options);
|
|
34
46
|
}
|
|
35
|
-
async listFiles(fileType) {
|
|
36
|
-
const files = await this.
|
|
47
|
+
async listFiles(fileType, options) {
|
|
48
|
+
const files = await this._get({
|
|
49
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
50
|
+
parameters: {
|
|
51
|
+
action: 'list',
|
|
52
|
+
},
|
|
53
|
+
}, options);
|
|
37
54
|
return CamOverlayAPI_1.fileListSchema.parse(files.list);
|
|
38
55
|
}
|
|
39
|
-
async uploadFile(fileType,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
async uploadFile(fileType, formData, storage, options) {
|
|
57
|
+
await this._post({
|
|
58
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
59
|
+
data: formData,
|
|
60
|
+
parameters: {
|
|
61
|
+
action: 'upload',
|
|
62
|
+
storage: storage,
|
|
63
|
+
},
|
|
64
|
+
}, options);
|
|
45
65
|
}
|
|
46
|
-
async removeFile(fileType,
|
|
47
|
-
const path =
|
|
48
|
-
await this.
|
|
66
|
+
async removeFile(fileType, fileParams, options) {
|
|
67
|
+
const path = `${BASE_PATH}/upload_${fileType}.cgi`;
|
|
68
|
+
await this._postUrlEncoded(path, {
|
|
69
|
+
action: 'remove',
|
|
70
|
+
...fileParams,
|
|
71
|
+
}, undefined, options);
|
|
72
|
+
}
|
|
73
|
+
async getFileStorage(fileType, options) {
|
|
74
|
+
const data = await this._get({
|
|
75
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
76
|
+
parameters: {
|
|
77
|
+
action: 'get_storage',
|
|
78
|
+
},
|
|
79
|
+
}, options);
|
|
80
|
+
if (data.code !== 200) {
|
|
81
|
+
throw new Error('Error occured while fetching file storage data');
|
|
82
|
+
}
|
|
83
|
+
return CamOverlayAPI_1.storageDataListSchema.parse(data.list);
|
|
49
84
|
}
|
|
50
|
-
async
|
|
51
|
-
|
|
52
|
-
return CamOverlayAPI_1.storageSchema.parse(data);
|
|
85
|
+
async getFilePreviewFromCamera(path, options) {
|
|
86
|
+
return await this._getBlob({ path: CamOverlayAPI.getFilePreviewPath(path) }, options);
|
|
53
87
|
}
|
|
54
|
-
async updateInfoticker(
|
|
55
|
-
await this.
|
|
88
|
+
async updateInfoticker(serviceId, text, options) {
|
|
89
|
+
await this._get({ path: `${BASE_PATH}/infoticker.cgi?service_id=${serviceId}&text=${text}` }, options);
|
|
56
90
|
}
|
|
57
|
-
async setEnabled(
|
|
58
|
-
await this.
|
|
91
|
+
async setEnabled(serviceId, enabled, options) {
|
|
92
|
+
await this._post({ path: `${BASE_PATH}/enabled.cgi?id_${serviceId}=${enabled ? 1 : 0}`, data: '' }, options);
|
|
59
93
|
}
|
|
60
|
-
async isEnabled(
|
|
61
|
-
const
|
|
94
|
+
async isEnabled(serviceId, options) {
|
|
95
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
96
|
+
const res = await agent.get({ path: `${BASE_PATH}/services.cgi?action=get`, timeout: options?.timeout });
|
|
62
97
|
if (res.ok) {
|
|
63
98
|
const data = JSON.parse(await res.text());
|
|
64
99
|
for (const service of data.services) {
|
|
65
|
-
if (service.id ===
|
|
100
|
+
if (service.id === serviceId) {
|
|
66
101
|
return service.enabled === 1;
|
|
67
102
|
}
|
|
68
103
|
}
|
|
69
104
|
throw new errors_1.ServiceNotFoundError();
|
|
70
105
|
}
|
|
71
106
|
else {
|
|
72
|
-
throw new Error(await (0,
|
|
107
|
+
throw new Error(await (0, utils_1.responseStringify)(res));
|
|
73
108
|
}
|
|
74
109
|
}
|
|
75
|
-
async
|
|
76
|
-
const data = await this.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
110
|
+
async getSingleWidget(serviceId, options) {
|
|
111
|
+
const data = await this._get({
|
|
112
|
+
path: `${BASE_PATH}/services.cgi`,
|
|
113
|
+
parameters: {
|
|
114
|
+
action: 'get',
|
|
115
|
+
service_id: serviceId.toString(),
|
|
116
|
+
},
|
|
117
|
+
}, options);
|
|
118
|
+
return CamOverlayAPI_1.widgetsSchema.parse(data);
|
|
81
119
|
}
|
|
82
|
-
async
|
|
83
|
-
const
|
|
84
|
-
|
|
120
|
+
async getWidgets(options) {
|
|
121
|
+
const widgetList = await this._get({
|
|
122
|
+
path: `${BASE_PATH}/services.cgi`,
|
|
123
|
+
parameters: {
|
|
124
|
+
action: 'get',
|
|
125
|
+
},
|
|
126
|
+
}, options);
|
|
127
|
+
const widgets = widgetList.services;
|
|
128
|
+
widgets.forEach((widget) => {
|
|
129
|
+
const parsedWidget = CamOverlayAPI_1.widgetsSchema.safeParse(widget);
|
|
130
|
+
if (!parsedWidget.success) {
|
|
131
|
+
console.warn(`[SERVICE SCHEMA MISMATCH]: Service ${widget.name} (${widget.id}) does not match the current schema, or is a hidden service.`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return widgets;
|
|
85
135
|
}
|
|
86
|
-
async
|
|
87
|
-
const path =
|
|
88
|
-
await this.
|
|
136
|
+
async updateSingleWidget(widget, options) {
|
|
137
|
+
const path = `${BASE_PATH}/services.cgi`;
|
|
138
|
+
await this._postJsonEncoded(path, JSON.stringify(widget), {
|
|
89
139
|
action: 'set',
|
|
90
|
-
service_id:
|
|
91
|
-
});
|
|
140
|
+
service_id: widget.id.toString(),
|
|
141
|
+
}, undefined, options);
|
|
92
142
|
}
|
|
93
|
-
async
|
|
94
|
-
const path =
|
|
95
|
-
await this.
|
|
143
|
+
async updateWidgets(widgets, options) {
|
|
144
|
+
const path = `${BASE_PATH}/services.cgi`;
|
|
145
|
+
await this._postJsonEncoded(path, JSON.stringify({ services: widgets }), {
|
|
146
|
+
action: 'set',
|
|
147
|
+
}, undefined, options);
|
|
96
148
|
}
|
|
97
|
-
updateCGText(
|
|
149
|
+
updateCGText(serviceId, fields, options) {
|
|
98
150
|
const params = {};
|
|
99
151
|
for (const field of fields) {
|
|
100
152
|
const name = field.field_name;
|
|
@@ -103,74 +155,105 @@ class CamOverlayAPI {
|
|
|
103
155
|
params[`${name}_color`] = field.color;
|
|
104
156
|
}
|
|
105
157
|
}
|
|
106
|
-
return this.promiseCGUpdate(
|
|
158
|
+
return this.promiseCGUpdate(serviceId, 'update_text', params, undefined, undefined, options);
|
|
107
159
|
}
|
|
108
|
-
updateCGImagePos(
|
|
160
|
+
updateCGImagePos(serviceId, coordinates = '', x = 0, y = 0, options) {
|
|
109
161
|
const params = {
|
|
110
162
|
coord_system: coordinates,
|
|
111
163
|
pos_x: x,
|
|
112
164
|
pos_y: y,
|
|
113
165
|
};
|
|
114
|
-
return this.promiseCGUpdate(
|
|
166
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
|
|
115
167
|
}
|
|
116
|
-
updateCGImage(
|
|
168
|
+
updateCGImage(serviceId, path, coordinates = '', x = 0, y = 0, options) {
|
|
117
169
|
const params = {
|
|
118
170
|
coord_system: coordinates,
|
|
119
171
|
pos_x: x,
|
|
120
172
|
pos_y: y,
|
|
121
173
|
image: path,
|
|
122
174
|
};
|
|
123
|
-
return this.promiseCGUpdate(
|
|
175
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
|
|
124
176
|
}
|
|
125
|
-
updateCGImageFromData(
|
|
177
|
+
updateCGImageFromData(serviceId, imageType, imageData, coordinates = '', x = 0, y = 0, options) {
|
|
126
178
|
const contentType = imageType === CamOverlayAPI_1.ImageType.PNG ? 'image/png' : 'image/jpeg';
|
|
127
179
|
const params = {
|
|
128
180
|
coord_system: coordinates,
|
|
129
181
|
pos_x: x,
|
|
130
182
|
pos_y: y,
|
|
131
183
|
};
|
|
132
|
-
return this.promiseCGUpdate(
|
|
184
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, contentType, imageData, options);
|
|
133
185
|
}
|
|
134
|
-
async promiseCGUpdate(
|
|
135
|
-
const path =
|
|
186
|
+
async promiseCGUpdate(serviceId, action, params = {}, contentType, data, options) {
|
|
187
|
+
const path = `${BASE_PATH}/customGraphics.cgi`;
|
|
136
188
|
let headers = {};
|
|
137
189
|
if (contentType !== undefined && data) {
|
|
138
190
|
headers = { 'Content-Type': contentType };
|
|
139
191
|
}
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
192
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
193
|
+
const res = await agent.post({
|
|
194
|
+
path,
|
|
195
|
+
data: data ?? '',
|
|
196
|
+
parameters: {
|
|
197
|
+
action: action,
|
|
198
|
+
service_id: serviceId.toString(),
|
|
199
|
+
...params,
|
|
200
|
+
},
|
|
201
|
+
headers,
|
|
202
|
+
timeout: options?.timeout,
|
|
203
|
+
});
|
|
145
204
|
if (!res.ok) {
|
|
146
|
-
throw new Error(await (0,
|
|
205
|
+
throw new Error(await (0, utils_1.responseStringify)(res));
|
|
147
206
|
}
|
|
148
207
|
}
|
|
149
|
-
async
|
|
150
|
-
const
|
|
208
|
+
async _get(params, options) {
|
|
209
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
210
|
+
const res = await agent.get({ ...params, timeout: options?.timeout });
|
|
151
211
|
if (res.ok) {
|
|
152
|
-
return await res.json();
|
|
212
|
+
return (await res.json());
|
|
153
213
|
}
|
|
154
214
|
else {
|
|
155
|
-
throw new Error(await (0,
|
|
215
|
+
throw new Error(await (0, utils_1.responseStringify)(res));
|
|
156
216
|
}
|
|
157
217
|
}
|
|
158
|
-
async
|
|
159
|
-
const
|
|
218
|
+
async _post(params, options) {
|
|
219
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
220
|
+
const res = await agent.post({ ...params, timeout: options?.timeout });
|
|
160
221
|
if (res.ok) {
|
|
161
|
-
return await res.json();
|
|
222
|
+
return (await res.json());
|
|
162
223
|
}
|
|
163
224
|
else {
|
|
164
|
-
throw new Error(await (0,
|
|
225
|
+
throw new Error(await (0, utils_1.responseStringify)(res));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async _getBlob(params, options) {
|
|
229
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
230
|
+
const res = await agent.get({ ...params, timeout: options?.timeout });
|
|
231
|
+
if (res.ok) {
|
|
232
|
+
return await this.parseBlobResponse(res);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
throw new Error(await (0, utils_1.responseStringify)(res));
|
|
165
236
|
}
|
|
166
237
|
}
|
|
167
238
|
async parseBlobResponse(response) {
|
|
168
239
|
try {
|
|
169
|
-
return await response.blob();
|
|
240
|
+
return (await response.blob());
|
|
170
241
|
}
|
|
171
242
|
catch (err) {
|
|
172
243
|
throw new errors_1.ParsingBlobError(err);
|
|
173
244
|
}
|
|
174
245
|
}
|
|
246
|
+
async _postUrlEncoded(path, params, headers, options) {
|
|
247
|
+
const data = (0, utils_1.paramToUrl)(params);
|
|
248
|
+
const baseHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
249
|
+
return this._post({ path, data, headers: { ...baseHeaders, ...headers } }, options);
|
|
250
|
+
}
|
|
251
|
+
async _postJsonEncoded(path, data, parameters, headers, options) {
|
|
252
|
+
const baseHeaders = { 'Accept': 'application/json', 'Content-Type': 'application/json' };
|
|
253
|
+
return this._post({ path, data, parameters, headers: { ...baseHeaders, ...headers } }, options);
|
|
254
|
+
}
|
|
255
|
+
getAgent(proxyParams) {
|
|
256
|
+
return proxyParams ? new ProxyClient_1.ProxyClient(this.client, proxyParams) : this.client;
|
|
257
|
+
}
|
|
175
258
|
}
|
|
176
259
|
exports.CamOverlayAPI = CamOverlayAPI;
|
|
@@ -1,53 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
3
4
|
import * as EventEmitter from 'events';
|
|
4
|
-
import {
|
|
5
|
-
export type CamOverlayDrawingOptions = WsOptions & {
|
|
6
|
-
camera?: number | number[];
|
|
7
|
-
zIndex?: number;
|
|
8
|
-
};
|
|
9
|
-
export type TCairoResponse = {
|
|
10
|
-
message: string;
|
|
11
|
-
call_id: number;
|
|
12
|
-
};
|
|
13
|
-
export type TCairoCreateResponse = {
|
|
14
|
-
var: string;
|
|
15
|
-
call_id: number;
|
|
16
|
-
};
|
|
17
|
-
export type TUploadImageResponse = {
|
|
18
|
-
var: string;
|
|
19
|
-
width: number;
|
|
20
|
-
height: number;
|
|
21
|
-
call_id: number;
|
|
22
|
-
};
|
|
23
|
-
export type TErrorResponse = {
|
|
24
|
-
error: string;
|
|
25
|
-
call_id?: number;
|
|
26
|
-
};
|
|
27
|
-
export type TService = {
|
|
28
|
-
id: number;
|
|
29
|
-
enabled: number;
|
|
30
|
-
schedule: string;
|
|
31
|
-
name: string;
|
|
32
|
-
identifier: string;
|
|
33
|
-
cameraList: number[];
|
|
34
|
-
};
|
|
35
|
-
export type TServiceList = {
|
|
36
|
-
services: TService[];
|
|
37
|
-
};
|
|
38
|
-
export type TAlign = 'A_RIGHT' | 'A_LEFT' | 'A_CENTER';
|
|
39
|
-
export type TextFit = 'TFM_SCALE' | 'TFM_TRUNCATE' | 'TFM_OVERFLOW';
|
|
40
|
-
export type TWriteTextParams = [string, string, number, number, number, number, TAlign, TextFit?];
|
|
41
|
-
export interface CamOverlayDrawingAPI {
|
|
42
|
-
on(event: 'open', listener: () => void): this;
|
|
43
|
-
on(event: 'close', listener: () => void): this;
|
|
44
|
-
on(event: 'error', listener: (err: Error) => void): this;
|
|
45
|
-
on(event: 'message', listener: (msg: string) => void): this;
|
|
46
|
-
emit(event: 'open'): boolean;
|
|
47
|
-
emit(event: 'close'): boolean;
|
|
48
|
-
emit(event: 'error', err: Error): boolean;
|
|
49
|
-
emit(event: 'message', msg: string): boolean;
|
|
50
|
-
}
|
|
5
|
+
import { CamOverlayDrawingOptions, TCairoCreateResponse, TCairoResponse, TUploadImageResponse, TWriteTextParams } from './types/CamOverlayDrawingAPI';
|
|
51
6
|
export declare class CamOverlayDrawingAPI extends EventEmitter {
|
|
52
7
|
private tls;
|
|
53
8
|
private tlsInsecure;
|
|
@@ -124,10 +124,10 @@ class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
124
124
|
}
|
|
125
125
|
if (dataJSON.call_id !== undefined) {
|
|
126
126
|
if (errorResponse !== undefined) {
|
|
127
|
-
this.sendMessages[dataJSON.call_id]
|
|
127
|
+
this.sendMessages[dataJSON.call_id]?.reject(new Error(errorResponse.error));
|
|
128
128
|
}
|
|
129
129
|
else {
|
|
130
|
-
this.sendMessages[dataJSON.call_id]
|
|
130
|
+
this.sendMessages[dataJSON.call_id]?.resolve(dataJSON);
|
|
131
131
|
}
|
|
132
132
|
delete this.sendMessages[dataJSON.call_id];
|
|
133
133
|
}
|
|
@@ -197,6 +197,9 @@ class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
197
197
|
const now = Date.now();
|
|
198
198
|
for (const callId in this.sendMessages) {
|
|
199
199
|
const msg = this.sendMessages[callId];
|
|
200
|
+
if (!msg) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
200
203
|
if (now - msg.sentTimestamp > 10000) {
|
|
201
204
|
reconnect = true;
|
|
202
205
|
msg.reject(new Error('Message timeout'));
|
|
@@ -223,7 +226,7 @@ class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
223
226
|
}
|
|
224
227
|
reportClose() {
|
|
225
228
|
for (const callId in this.sendMessages) {
|
|
226
|
-
this.sendMessages[callId]
|
|
229
|
+
this.sendMessages[callId]?.reject(new Error('Connection lost'));
|
|
227
230
|
}
|
|
228
231
|
this.sendMessages = {};
|
|
229
232
|
this.emit('close');
|
|
@@ -1,42 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { CamOverlayDrawingAPI
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export type TTmf = 'TFM_OVERFLOW' | 'TFM_SCALE' | 'TFM_TRUNCATE';
|
|
8
|
-
export type TObjectFitType = 'fill' | 'fit' | 'none';
|
|
9
|
-
export type TFrameOptions = {
|
|
10
|
-
enabled?: boolean;
|
|
11
|
-
x: number;
|
|
12
|
-
y: number;
|
|
13
|
-
width: number;
|
|
14
|
-
height: number;
|
|
15
|
-
text?: string;
|
|
16
|
-
fontColor?: TRgb;
|
|
17
|
-
font?: string;
|
|
18
|
-
bgColor?: TRgba;
|
|
19
|
-
bgImage?: string;
|
|
20
|
-
bgType?: TObjectFitType;
|
|
21
|
-
borderRadius?: number;
|
|
22
|
-
borderWidth?: number;
|
|
23
|
-
borderColor?: TRgba;
|
|
24
|
-
customDraw?: TDrawingCallback;
|
|
25
|
-
layer?: number;
|
|
26
|
-
};
|
|
27
|
-
export type TFrameInfo = {
|
|
28
|
-
width: number;
|
|
29
|
-
height: number;
|
|
30
|
-
};
|
|
31
|
-
export type TDrawingCallback = (cod: CamOverlayDrawingAPI, cairo: string, info: TFrameInfo) => Promise<void>;
|
|
32
|
-
export interface Frame {
|
|
33
|
-
on(event: 'open', listener: () => void): this;
|
|
34
|
-
on(event: 'close', listener: () => void): this;
|
|
35
|
-
on(event: 'layoutChanged', listener: () => void): this;
|
|
36
|
-
emit(event: 'open'): boolean;
|
|
37
|
-
emit(event: 'close'): boolean;
|
|
38
|
-
emit(event: 'layoutChanged'): boolean;
|
|
39
|
-
}
|
|
3
|
+
import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
|
|
4
|
+
import { TAlign, TCairoCreateResponse, TUploadImageResponse } from '../types/CamOverlayDrawingAPI';
|
|
5
|
+
import { ResourceManager } from './ResourceManager';
|
|
6
|
+
import { TBg, TBorder, TDrawingCallback, TFrame, TFrameOptions, TObjectFitType, TRgb, TRgba, TText, TTmf } from '../types/CamOverlayPainter';
|
|
40
7
|
export declare class Frame extends EventEmitter {
|
|
41
8
|
protected enabled: boolean;
|
|
42
9
|
protected posX: number;
|
|
@@ -64,17 +31,21 @@ export declare class Frame extends EventEmitter {
|
|
|
64
31
|
disable(): void;
|
|
65
32
|
setFramePosition(x: number, y: number): void;
|
|
66
33
|
setFrameSize(width: number, height: number): void;
|
|
34
|
+
getFrameInfo(): TFrame;
|
|
67
35
|
setText(text: string, align: TAlign, textType?: TTmf, fontColor?: TRgb): void;
|
|
68
36
|
setFontColor(fontColor: TRgb): void;
|
|
69
37
|
setFont(fontName: string): void;
|
|
70
38
|
setFontData(fontData: TCairoCreateResponse): void;
|
|
39
|
+
getTextInfo(): TText;
|
|
71
40
|
setBgColor(color: TRgba): void;
|
|
72
41
|
setBgImage(imageName: string, type?: TObjectFitType): void;
|
|
73
42
|
setBgImageData(imageData: TUploadImageResponse, type?: TObjectFitType): void;
|
|
74
43
|
setBgType(type: TObjectFitType): void;
|
|
44
|
+
getBgInfo(): TBg;
|
|
75
45
|
setBorderRadius(radius: number): void;
|
|
76
46
|
setBorderWidth(width: number): void;
|
|
77
47
|
setBorderColor(color: TRgba): void;
|
|
48
|
+
getBorderInfo(): TBorder;
|
|
78
49
|
setCustomDraw(customDraw: TDrawingCallback): void;
|
|
79
50
|
resetFont(): void;
|
|
80
51
|
resetBgColor(): void;
|