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/esm/CamOverlayAPI.js
CHANGED
|
@@ -1,65 +1,100 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DefaultClient } from './node/DefaultClient';
|
|
3
|
-
import { fileListSchema, ImageType, serviceSchema, storageSchema, } from './types/CamOverlayAPI';
|
|
1
|
+
import { paramToUrl, responseStringify } from './internal/utils';
|
|
4
2
|
import { ParsingBlobError, ServiceNotFoundError } from './errors/errors';
|
|
5
3
|
import { networkCameraListSchema } from './types/common';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { ProxyClient } from './internal/ProxyClient';
|
|
6
|
+
import { fileListSchema, ImageType, storageDataListSchema, widgetsSchema, WSResponseSchema, } from './types/CamOverlayAPI/CamOverlayAPI';
|
|
7
|
+
export const allowedWidgetNames = {
|
|
8
|
+
accuweather: 'accuweather',
|
|
9
|
+
infoticker: 'infoticker',
|
|
10
|
+
customGraphics: 'customGraphics',
|
|
11
|
+
ptzCompass: 'ptzCompass',
|
|
12
|
+
images: 'images',
|
|
13
|
+
ptz: 'ptz',
|
|
14
|
+
pip: 'pip',
|
|
15
|
+
screenSharing: 'screenSharing',
|
|
16
|
+
web_camera: 'web_camera',
|
|
17
|
+
};
|
|
18
|
+
const BASE_PATH = '/local/camoverlay/api';
|
|
6
19
|
export class CamOverlayAPI {
|
|
7
20
|
client;
|
|
8
|
-
constructor(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
async getNetworkCameraList() {
|
|
21
|
-
const response = await this.get('/local/camoverlay/api/network_camera_list.cgi');
|
|
21
|
+
constructor(client) {
|
|
22
|
+
this.client = client;
|
|
23
|
+
}
|
|
24
|
+
static getBasePath = () => BASE_PATH;
|
|
25
|
+
static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
|
|
26
|
+
static getFilePreviewPath = (path) => `${BASE_PATH}/image.cgi?path=${encodeURIComponent(path)}`;
|
|
27
|
+
async checkCameraTime(options) {
|
|
28
|
+
const response = await this._get({ path: `${BASE_PATH}/camera_time.cgi` }, options);
|
|
29
|
+
return z.boolean().parse(response.state);
|
|
30
|
+
}
|
|
31
|
+
async getNetworkCameraList(options) {
|
|
32
|
+
const response = await this._get({ path: `${BASE_PATH}/network_camera_list.cgi` }, options);
|
|
22
33
|
return networkCameraListSchema.parse(response.camera_list);
|
|
23
34
|
}
|
|
24
|
-
async
|
|
25
|
-
const response = await this.
|
|
26
|
-
return response.data;
|
|
27
|
-
}
|
|
28
|
-
async getMjpegStreamImage(mjpegUrl) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
async wsAuthorization(options) {
|
|
36
|
+
const response = await this._get({ path: `${BASE_PATH}/ws_authorization.cgi` }, options);
|
|
37
|
+
return WSResponseSchema.parse(response).data;
|
|
38
|
+
}
|
|
39
|
+
async getMjpegStreamImage(mjpegUrl, options) {
|
|
40
|
+
return await this._getBlob({
|
|
41
|
+
path: `${BASE_PATH}/fetch_mjpeg_image.cgi?mjpeg_url=${encodeURIComponent(decodeURIComponent(mjpegUrl))}`,
|
|
42
|
+
}, options);
|
|
43
|
+
}
|
|
44
|
+
async listFiles(fileType, options) {
|
|
45
|
+
const files = await this._get({
|
|
46
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
47
|
+
parameters: {
|
|
48
|
+
action: 'list',
|
|
49
|
+
},
|
|
50
|
+
}, options);
|
|
34
51
|
return fileListSchema.parse(files.list);
|
|
35
52
|
}
|
|
36
|
-
async uploadFile(fileType,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
async uploadFile(fileType, formData, storage, options) {
|
|
54
|
+
await this._post({
|
|
55
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
56
|
+
data: formData,
|
|
57
|
+
parameters: {
|
|
58
|
+
action: 'upload',
|
|
59
|
+
storage: storage,
|
|
60
|
+
},
|
|
61
|
+
}, options);
|
|
62
|
+
}
|
|
63
|
+
async removeFile(fileType, fileParams, options) {
|
|
64
|
+
const path = `${BASE_PATH}/upload_${fileType}.cgi`;
|
|
65
|
+
await this._postUrlEncoded(path, {
|
|
66
|
+
action: 'remove',
|
|
67
|
+
...fileParams,
|
|
68
|
+
}, undefined, options);
|
|
69
|
+
}
|
|
70
|
+
async getFileStorage(fileType, options) {
|
|
71
|
+
const data = await this._get({
|
|
72
|
+
path: `${BASE_PATH}/upload_${fileType}.cgi`,
|
|
73
|
+
parameters: {
|
|
74
|
+
action: 'get_storage',
|
|
75
|
+
},
|
|
76
|
+
}, options);
|
|
77
|
+
if (data.code !== 200) {
|
|
78
|
+
throw new Error('Error occured while fetching file storage data');
|
|
79
|
+
}
|
|
80
|
+
return storageDataListSchema.parse(data.list);
|
|
46
81
|
}
|
|
47
|
-
async
|
|
48
|
-
|
|
49
|
-
return storageSchema.parse(data);
|
|
82
|
+
async getFilePreviewFromCamera(path, options) {
|
|
83
|
+
return await this._getBlob({ path: CamOverlayAPI.getFilePreviewPath(path) }, options);
|
|
50
84
|
}
|
|
51
|
-
async updateInfoticker(
|
|
52
|
-
await this.
|
|
85
|
+
async updateInfoticker(serviceId, text, options) {
|
|
86
|
+
await this._get({ path: `${BASE_PATH}/infoticker.cgi?service_id=${serviceId}&text=${text}` }, options);
|
|
53
87
|
}
|
|
54
|
-
async setEnabled(
|
|
55
|
-
await this.
|
|
88
|
+
async setEnabled(serviceId, enabled, options) {
|
|
89
|
+
await this._post({ path: `${BASE_PATH}/enabled.cgi?id_${serviceId}=${enabled ? 1 : 0}`, data: '' }, options);
|
|
56
90
|
}
|
|
57
|
-
async isEnabled(
|
|
58
|
-
const
|
|
91
|
+
async isEnabled(serviceId, options) {
|
|
92
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
93
|
+
const res = await agent.get({ path: `${BASE_PATH}/services.cgi?action=get`, timeout: options?.timeout });
|
|
59
94
|
if (res.ok) {
|
|
60
95
|
const data = JSON.parse(await res.text());
|
|
61
96
|
for (const service of data.services) {
|
|
62
|
-
if (service.id ===
|
|
97
|
+
if (service.id === serviceId) {
|
|
63
98
|
return service.enabled === 1;
|
|
64
99
|
}
|
|
65
100
|
}
|
|
@@ -69,29 +104,46 @@ export class CamOverlayAPI {
|
|
|
69
104
|
throw new Error(await responseStringify(res));
|
|
70
105
|
}
|
|
71
106
|
}
|
|
72
|
-
async
|
|
73
|
-
const data = await this.
|
|
74
|
-
|
|
75
|
-
|
|
107
|
+
async getSingleWidget(serviceId, options) {
|
|
108
|
+
const data = await this._get({
|
|
109
|
+
path: `${BASE_PATH}/services.cgi`,
|
|
110
|
+
parameters: {
|
|
111
|
+
action: 'get',
|
|
112
|
+
service_id: serviceId.toString(),
|
|
113
|
+
},
|
|
114
|
+
}, options);
|
|
115
|
+
return widgetsSchema.parse(data);
|
|
116
|
+
}
|
|
117
|
+
async getWidgets(options) {
|
|
118
|
+
const widgetList = await this._get({
|
|
119
|
+
path: `${BASE_PATH}/services.cgi`,
|
|
120
|
+
parameters: {
|
|
121
|
+
action: 'get',
|
|
122
|
+
},
|
|
123
|
+
}, options);
|
|
124
|
+
const widgets = widgetList.services;
|
|
125
|
+
widgets.forEach((widget) => {
|
|
126
|
+
const parsedWidget = widgetsSchema.safeParse(widget);
|
|
127
|
+
if (!parsedWidget.success) {
|
|
128
|
+
console.warn(`[SERVICE SCHEMA MISMATCH]: Service ${widget.name} (${widget.id}) does not match the current schema, or is a hidden service.`);
|
|
129
|
+
}
|
|
76
130
|
});
|
|
77
|
-
return
|
|
78
|
-
}
|
|
79
|
-
async getServices() {
|
|
80
|
-
const serviceList = await this.get('/local/camoverlay/api/services.cgi?action=get');
|
|
81
|
-
return serviceSchema.parse(serviceList).services;
|
|
131
|
+
return widgets;
|
|
82
132
|
}
|
|
83
|
-
async
|
|
84
|
-
const path =
|
|
85
|
-
await this.
|
|
133
|
+
async updateSingleWidget(widget, options) {
|
|
134
|
+
const path = `${BASE_PATH}/services.cgi`;
|
|
135
|
+
await this._postJsonEncoded(path, JSON.stringify(widget), {
|
|
86
136
|
action: 'set',
|
|
87
|
-
service_id:
|
|
88
|
-
});
|
|
137
|
+
service_id: widget.id.toString(),
|
|
138
|
+
}, undefined, options);
|
|
89
139
|
}
|
|
90
|
-
async
|
|
91
|
-
const path =
|
|
92
|
-
await this.
|
|
140
|
+
async updateWidgets(widgets, options) {
|
|
141
|
+
const path = `${BASE_PATH}/services.cgi`;
|
|
142
|
+
await this._postJsonEncoded(path, JSON.stringify({ services: widgets }), {
|
|
143
|
+
action: 'set',
|
|
144
|
+
}, undefined, options);
|
|
93
145
|
}
|
|
94
|
-
updateCGText(
|
|
146
|
+
updateCGText(serviceId, fields, options) {
|
|
95
147
|
const params = {};
|
|
96
148
|
for (const field of fields) {
|
|
97
149
|
const name = field.field_name;
|
|
@@ -100,62 +152,81 @@ export class CamOverlayAPI {
|
|
|
100
152
|
params[`${name}_color`] = field.color;
|
|
101
153
|
}
|
|
102
154
|
}
|
|
103
|
-
return this.promiseCGUpdate(
|
|
155
|
+
return this.promiseCGUpdate(serviceId, 'update_text', params, undefined, undefined, options);
|
|
104
156
|
}
|
|
105
|
-
updateCGImagePos(
|
|
157
|
+
updateCGImagePos(serviceId, coordinates = '', x = 0, y = 0, options) {
|
|
106
158
|
const params = {
|
|
107
159
|
coord_system: coordinates,
|
|
108
160
|
pos_x: x,
|
|
109
161
|
pos_y: y,
|
|
110
162
|
};
|
|
111
|
-
return this.promiseCGUpdate(
|
|
163
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
|
|
112
164
|
}
|
|
113
|
-
updateCGImage(
|
|
165
|
+
updateCGImage(serviceId, path, coordinates = '', x = 0, y = 0, options) {
|
|
114
166
|
const params = {
|
|
115
167
|
coord_system: coordinates,
|
|
116
168
|
pos_x: x,
|
|
117
169
|
pos_y: y,
|
|
118
170
|
image: path,
|
|
119
171
|
};
|
|
120
|
-
return this.promiseCGUpdate(
|
|
172
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
|
|
121
173
|
}
|
|
122
|
-
updateCGImageFromData(
|
|
174
|
+
updateCGImageFromData(serviceId, imageType, imageData, coordinates = '', x = 0, y = 0, options) {
|
|
123
175
|
const contentType = imageType === ImageType.PNG ? 'image/png' : 'image/jpeg';
|
|
124
176
|
const params = {
|
|
125
177
|
coord_system: coordinates,
|
|
126
178
|
pos_x: x,
|
|
127
179
|
pos_y: y,
|
|
128
180
|
};
|
|
129
|
-
return this.promiseCGUpdate(
|
|
181
|
+
return this.promiseCGUpdate(serviceId, 'update_image', params, contentType, imageData, options);
|
|
130
182
|
}
|
|
131
|
-
async promiseCGUpdate(
|
|
132
|
-
const path =
|
|
183
|
+
async promiseCGUpdate(serviceId, action, params = {}, contentType, data, options) {
|
|
184
|
+
const path = `${BASE_PATH}/customGraphics.cgi`;
|
|
133
185
|
let headers = {};
|
|
134
186
|
if (contentType !== undefined && data) {
|
|
135
187
|
headers = { 'Content-Type': contentType };
|
|
136
188
|
}
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
189
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
190
|
+
const res = await agent.post({
|
|
191
|
+
path,
|
|
192
|
+
data: data ?? '',
|
|
193
|
+
parameters: {
|
|
194
|
+
action: action,
|
|
195
|
+
service_id: serviceId.toString(),
|
|
196
|
+
...params,
|
|
197
|
+
},
|
|
198
|
+
headers,
|
|
199
|
+
timeout: options?.timeout,
|
|
200
|
+
});
|
|
142
201
|
if (!res.ok) {
|
|
143
202
|
throw new Error(await responseStringify(res));
|
|
144
203
|
}
|
|
145
204
|
}
|
|
146
|
-
async
|
|
147
|
-
const
|
|
205
|
+
async _get(params, options) {
|
|
206
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
207
|
+
const res = await agent.get({ ...params, timeout: options?.timeout });
|
|
148
208
|
if (res.ok) {
|
|
149
|
-
return await res.json();
|
|
209
|
+
return (await res.json());
|
|
150
210
|
}
|
|
151
211
|
else {
|
|
152
212
|
throw new Error(await responseStringify(res));
|
|
153
213
|
}
|
|
154
214
|
}
|
|
155
|
-
async
|
|
156
|
-
const
|
|
215
|
+
async _post(params, options) {
|
|
216
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
217
|
+
const res = await agent.post({ ...params, timeout: options?.timeout });
|
|
157
218
|
if (res.ok) {
|
|
158
|
-
return await res.json();
|
|
219
|
+
return (await res.json());
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
throw new Error(await responseStringify(res));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async _getBlob(params, options) {
|
|
226
|
+
const agent = this.getAgent(options?.proxyParams);
|
|
227
|
+
const res = await agent.get({ ...params, timeout: options?.timeout });
|
|
228
|
+
if (res.ok) {
|
|
229
|
+
return await this.parseBlobResponse(res);
|
|
159
230
|
}
|
|
160
231
|
else {
|
|
161
232
|
throw new Error(await responseStringify(res));
|
|
@@ -163,10 +234,22 @@ export class CamOverlayAPI {
|
|
|
163
234
|
}
|
|
164
235
|
async parseBlobResponse(response) {
|
|
165
236
|
try {
|
|
166
|
-
return await response.blob();
|
|
237
|
+
return (await response.blob());
|
|
167
238
|
}
|
|
168
239
|
catch (err) {
|
|
169
240
|
throw new ParsingBlobError(err);
|
|
170
241
|
}
|
|
171
242
|
}
|
|
243
|
+
async _postUrlEncoded(path, params, headers, options) {
|
|
244
|
+
const data = paramToUrl(params);
|
|
245
|
+
const baseHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
246
|
+
return this._post({ path, data, headers: { ...baseHeaders, ...headers } }, options);
|
|
247
|
+
}
|
|
248
|
+
async _postJsonEncoded(path, data, parameters, headers, options) {
|
|
249
|
+
const baseHeaders = { 'Accept': 'application/json', 'Content-Type': 'application/json' };
|
|
250
|
+
return this._post({ path, data, parameters, headers: { ...baseHeaders, ...headers } }, options);
|
|
251
|
+
}
|
|
252
|
+
getAgent(proxyParams) {
|
|
253
|
+
return proxyParams ? new ProxyClient(this.client, proxyParams) : this.client;
|
|
254
|
+
}
|
|
172
255
|
}
|
|
@@ -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;
|
|
@@ -121,10 +121,10 @@ export class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
121
121
|
}
|
|
122
122
|
if (dataJSON.call_id !== undefined) {
|
|
123
123
|
if (errorResponse !== undefined) {
|
|
124
|
-
this.sendMessages[dataJSON.call_id]
|
|
124
|
+
this.sendMessages[dataJSON.call_id]?.reject(new Error(errorResponse.error));
|
|
125
125
|
}
|
|
126
126
|
else {
|
|
127
|
-
this.sendMessages[dataJSON.call_id]
|
|
127
|
+
this.sendMessages[dataJSON.call_id]?.resolve(dataJSON);
|
|
128
128
|
}
|
|
129
129
|
delete this.sendMessages[dataJSON.call_id];
|
|
130
130
|
}
|
|
@@ -194,6 +194,9 @@ export class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
194
194
|
const now = Date.now();
|
|
195
195
|
for (const callId in this.sendMessages) {
|
|
196
196
|
const msg = this.sendMessages[callId];
|
|
197
|
+
if (!msg) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
197
200
|
if (now - msg.sentTimestamp > 10000) {
|
|
198
201
|
reconnect = true;
|
|
199
202
|
msg.reject(new Error('Message timeout'));
|
|
@@ -220,7 +223,7 @@ export class CamOverlayDrawingAPI extends EventEmitter {
|
|
|
220
223
|
}
|
|
221
224
|
reportClose() {
|
|
222
225
|
for (const callId in this.sendMessages) {
|
|
223
|
-
this.sendMessages[callId]
|
|
226
|
+
this.sendMessages[callId]?.reject(new Error('Connection lost'));
|
|
224
227
|
}
|
|
225
228
|
this.sendMessages = {};
|
|
226
229
|
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;
|
|
@@ -54,6 +54,14 @@ export class Frame extends EventEmitter {
|
|
|
54
54
|
this.width = width;
|
|
55
55
|
this.height = height;
|
|
56
56
|
}
|
|
57
|
+
getFrameInfo() {
|
|
58
|
+
return {
|
|
59
|
+
x: this.posX,
|
|
60
|
+
y: this.posY,
|
|
61
|
+
width: this.width,
|
|
62
|
+
height: this.height,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
57
65
|
setText(text, align, textType = 'TFM_OVERFLOW', fontColor) {
|
|
58
66
|
this.text = text;
|
|
59
67
|
this.align = align;
|
|
@@ -73,6 +81,16 @@ export class Frame extends EventEmitter {
|
|
|
73
81
|
this.fontName = undefined;
|
|
74
82
|
this.font = fontData;
|
|
75
83
|
}
|
|
84
|
+
getTextInfo() {
|
|
85
|
+
return {
|
|
86
|
+
text: this.text,
|
|
87
|
+
textAlign: this.align,
|
|
88
|
+
textType: this.textType,
|
|
89
|
+
fontColor: this.fontColor,
|
|
90
|
+
font: this.font,
|
|
91
|
+
fontName: this.fontName,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
76
94
|
setBgColor(color) {
|
|
77
95
|
this.bgColor = color;
|
|
78
96
|
}
|
|
@@ -89,6 +107,14 @@ export class Frame extends EventEmitter {
|
|
|
89
107
|
setBgType(type) {
|
|
90
108
|
this.bgType = type;
|
|
91
109
|
}
|
|
110
|
+
getBgInfo() {
|
|
111
|
+
return {
|
|
112
|
+
bgColor: this.bgColor,
|
|
113
|
+
bgImage: this.bgImage,
|
|
114
|
+
bgImageName: this.bgImageName,
|
|
115
|
+
bgType: this.bgType,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
92
118
|
setBorderRadius(radius) {
|
|
93
119
|
this.borderRadius = radius;
|
|
94
120
|
}
|
|
@@ -98,6 +124,13 @@ export class Frame extends EventEmitter {
|
|
|
98
124
|
setBorderColor(color) {
|
|
99
125
|
this.borderColor = color;
|
|
100
126
|
}
|
|
127
|
+
getBorderInfo() {
|
|
128
|
+
return {
|
|
129
|
+
borderRadius: this.borderRadius,
|
|
130
|
+
borderWidth: this.borderWidth,
|
|
131
|
+
borderColor: this.borderColor,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
101
134
|
setCustomDraw(customDraw) {
|
|
102
135
|
this.customDraw = customDraw;
|
|
103
136
|
}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import { CamOverlayDrawingAPI
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
|
|
2
|
+
import { CamOverlayDrawingOptions } from '../types/CamOverlayDrawingAPI';
|
|
3
|
+
import { ResourceManager } from './ResourceManager';
|
|
4
|
+
import { Frame } from './Frame';
|
|
5
|
+
import { TCoAlignment, TPainterOptions } from '../types/CamOverlayPainter';
|
|
6
|
+
export declare const COORD: {
|
|
7
|
+
readonly top_left: readonly [-1, -1];
|
|
8
|
+
readonly center_left: readonly [-1, 0];
|
|
9
|
+
readonly bottom_left: readonly [-1, 1];
|
|
10
|
+
readonly top_center: readonly [0, -1];
|
|
11
|
+
readonly center: readonly [0, 0];
|
|
12
|
+
readonly bottom_center: readonly [0, 1];
|
|
13
|
+
readonly top_right: readonly [1, -1];
|
|
14
|
+
readonly center_right: readonly [1, 0];
|
|
15
|
+
readonly bottom_right: readonly [1, 1];
|
|
9
16
|
};
|
|
10
17
|
export declare class Painter extends Frame {
|
|
11
18
|
private screenWidth;
|
|
@@ -24,7 +31,7 @@ export declare class Painter extends Frame {
|
|
|
24
31
|
registerImage(moniker: string, fileName: string): void;
|
|
25
32
|
registerFont(moniker: string, fileName: string): void;
|
|
26
33
|
setScreenSize(sw: number, sh: number): void;
|
|
27
|
-
setCoAlignment(coAlignment:
|
|
34
|
+
setCoAlignment(coAlignment: TCoAlignment): void;
|
|
28
35
|
protected layoutChanged(): void;
|
|
29
36
|
display(scale?: number): Promise<void>;
|
|
30
37
|
hide(): Promise<void>;
|
|
@@ -34,4 +41,3 @@ export declare class Painter extends Frame {
|
|
|
34
41
|
private cleanupSurface;
|
|
35
42
|
private positionConvertor;
|
|
36
43
|
}
|
|
37
|
-
export { Frame, TFrameOptions as FrameOptions, ResourceManager, CamOverlayDrawingOptions };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
|
|
2
|
-
import ResourceManager from './ResourceManager';
|
|
2
|
+
import { ResourceManager } from './ResourceManager';
|
|
3
3
|
import { Frame } from './Frame';
|
|
4
4
|
export const COORD = {
|
|
5
5
|
top_left: [-1, -1],
|
|
@@ -82,6 +82,9 @@ export class Painter extends Frame {
|
|
|
82
82
|
let lastCachedLayer;
|
|
83
83
|
for (let i = 0; i < this.layers.length; i++) {
|
|
84
84
|
const layer = this.layers[i];
|
|
85
|
+
if (layer === undefined) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
85
88
|
if (layer.cairoCache !== undefined &&
|
|
86
89
|
layer.surfaceCache !== undefined &&
|
|
87
90
|
surface === undefined &&
|
|
@@ -115,7 +118,7 @@ export class Painter extends Frame {
|
|
|
115
118
|
}
|
|
116
119
|
for (let i = layerIdx; i < this.layers.length; i++) {
|
|
117
120
|
const currentLayer = this.layers[i];
|
|
118
|
-
if (currentLayer
|
|
121
|
+
if (currentLayer?.surfaceCache !== undefined && currentLayer.cairoCache !== undefined) {
|
|
119
122
|
await this.cleanupSurface(currentLayer.surfaceCache, currentLayer.cairoCache);
|
|
120
123
|
currentLayer.surfaceCache = undefined;
|
|
121
124
|
currentLayer.cairoCache = undefined;
|
|
@@ -160,4 +163,3 @@ export class Painter extends Frame {
|
|
|
160
163
|
}
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
|
-
export { Frame, ResourceManager };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { CamOverlayDrawingAPI
|
|
2
|
-
|
|
1
|
+
import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
|
|
2
|
+
import { TUploadImageResponse, TCairoCreateResponse } from '../types/CamOverlayDrawingAPI';
|
|
3
|
+
export declare class ResourceManager {
|
|
3
4
|
private co;
|
|
4
5
|
private imgFileNames;
|
|
5
6
|
private fontFileNames;
|