camstreamerlib 4.0.0-beta.6 → 4.0.0-beta.60
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 +142 -38
- package/cjs/CamOverlayAPI.js +135 -92
- package/cjs/CamScripterAPI.js +52 -42
- package/cjs/CamStreamerAPI.js +83 -39
- package/cjs/CamSwitcherAPI.js +141 -123
- package/cjs/PlaneTrackerAPI.js +247 -0
- package/cjs/VapixAPI.js +323 -233
- package/cjs/{CreatePackage.js → bin/CreatePackage.js} +22 -19
- package/cjs/errors/errors.js +113 -1
- package/cjs/index.js +28 -5
- package/cjs/internal/ProxyClient.js +28 -32
- package/cjs/{CamSwitcherEvents.js → internal/WsEvents.js} +28 -22
- package/cjs/internal/types.js +2 -0
- package/cjs/internal/utils.js +22 -3
- package/cjs/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +17 -14
- package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +33 -0
- package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +5 -17
- package/cjs/node/CamOverlayPainter/ResourceManager.js +72 -0
- package/cjs/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +16 -13
- package/cjs/node/DefaultClient.js +10 -12
- package/cjs/{internal → node}/Digest.js +8 -5
- package/cjs/node/Digest.test.js +13 -0
- package/cjs/node/HttpRequestSender.js +14 -4
- package/cjs/node/HttpServer.js +15 -12
- package/cjs/{VapixEvents.js → node/VapixEvents.js} +10 -10
- package/cjs/node/WsClient.js +30 -20
- package/cjs/node/events/AxisCameraStationEvents.js +53 -0
- package/cjs/node/events/GenetecAgent.js +123 -0
- package/cjs/node/index.js +38 -5
- package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +92 -0
- package/cjs/types/CamOverlayAPI/accuweatherSchema.js +47 -0
- package/cjs/types/CamOverlayAPI/customGraphicsSchema.js +72 -0
- package/cjs/types/CamOverlayAPI/imagesSchema.js +9 -0
- package/cjs/types/CamOverlayAPI/index.js +27 -0
- package/cjs/types/CamOverlayAPI/infotickerSchema.js +26 -0
- package/cjs/types/CamOverlayAPI/pipSchema.js +39 -0
- package/cjs/types/CamOverlayAPI/ptzCompassSchema.js +26 -0
- package/cjs/types/CamOverlayAPI/ptzSchema.js +12 -0
- package/cjs/types/CamOverlayAPI/scoreBoardSchema.js +132 -0
- package/cjs/types/CamOverlayAPI/screenSharingSchema.js +8 -0
- package/cjs/types/CamOverlayAPI/serviceCommonTypes.js +91 -0
- package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +8 -0
- package/cjs/types/CamOverlayDrawingAPI.js +2 -0
- package/cjs/types/CamOverlayPainter.js +14 -0
- package/cjs/types/CamScripterAPI.js +24 -8
- package/cjs/types/CamScripterAPICameraEventsGenerator.js +2 -0
- package/cjs/types/CamStreamerAPI.js +34 -3
- package/cjs/types/CamSwitcherAPI.js +38 -1
- package/cjs/types/GenetecAgent.js +31 -0
- package/cjs/types/PlaneTrackerAPI.js +310 -0
- package/cjs/types/VapixAPI.js +71 -13
- package/cjs/types/VapixEvents.js +2 -0
- package/cjs/types/common.js +4 -2
- package/cjs/types/ws/CamOverlayEvents.js +19 -0
- package/cjs/types/ws/CamStreamerEvents.js +32 -0
- package/cjs/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +8 -0
- package/cjs/types/ws/PlaneTrackerEvents.js +194 -0
- package/cjs/web/DefaultClient.js +26 -10
- package/cjs/web/WsClient.js +16 -18
- package/cjs/ws/CamOverlayEvents.js +24 -0
- package/cjs/ws/CamStreamerEvents.js +24 -0
- package/cjs/ws/CamSwitcherEvents.js +24 -0
- package/cjs/ws/PlaneTrackerEvents.js +30 -0
- package/esm/CamOverlayAPI.js +131 -88
- package/esm/CamScripterAPI.js +48 -38
- package/esm/CamStreamerAPI.js +81 -38
- package/esm/CamSwitcherAPI.js +137 -119
- package/esm/PlaneTrackerAPI.js +243 -0
- package/esm/VapixAPI.js +315 -225
- package/esm/{CreatePackage.js → bin/CreatePackage.js} +3 -3
- package/esm/errors/errors.js +96 -0
- package/esm/index.js +20 -4
- package/esm/internal/ProxyClient.js +28 -32
- package/esm/{CamSwitcherEvents.js → internal/WsEvents.js} +26 -20
- package/esm/internal/utils.js +17 -1
- package/esm/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +12 -12
- package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +33 -0
- package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +2 -13
- package/esm/{CamOverlayPainter → node/CamOverlayPainter}/ResourceManager.js +7 -5
- package/esm/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +11 -11
- package/esm/node/DefaultClient.js +10 -12
- package/esm/{internal → node}/Digest.js +1 -1
- package/esm/node/Digest.test.js +11 -0
- package/esm/node/HttpRequestSender.js +14 -4
- package/esm/node/HttpServer.js +5 -5
- package/esm/{VapixEvents.js → node/VapixEvents.js} +10 -10
- package/esm/node/WsClient.js +22 -15
- package/esm/{events → node/events}/AxisCameraStationEvents.js +18 -13
- package/esm/node/events/GenetecAgent.js +119 -0
- package/esm/node/index.js +17 -2
- package/esm/types/CamOverlayAPI/CamOverlayAPI.js +76 -0
- package/esm/types/CamOverlayAPI/accuweatherSchema.js +44 -0
- package/esm/types/CamOverlayAPI/customGraphicsSchema.js +69 -0
- package/esm/types/CamOverlayAPI/imagesSchema.js +6 -0
- package/esm/types/CamOverlayAPI/index.js +11 -0
- package/esm/types/CamOverlayAPI/infotickerSchema.js +23 -0
- package/esm/types/CamOverlayAPI/pipSchema.js +36 -0
- package/esm/types/CamOverlayAPI/ptzCompassSchema.js +23 -0
- package/esm/types/CamOverlayAPI/ptzSchema.js +9 -0
- package/esm/types/CamOverlayAPI/scoreBoardSchema.js +129 -0
- package/esm/types/CamOverlayAPI/screenSharingSchema.js +5 -0
- package/esm/types/CamOverlayAPI/serviceCommonTypes.js +88 -0
- package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +5 -0
- package/esm/types/CamOverlayPainter.js +11 -0
- package/esm/types/CamScripterAPI.js +23 -7
- package/esm/types/CamScripterAPICameraEventsGenerator.js +1 -0
- package/esm/types/CamStreamerAPI.js +33 -2
- package/esm/types/CamSwitcherAPI.js +38 -1
- package/esm/types/GenetecAgent.js +28 -0
- package/esm/types/PlaneTrackerAPI.js +307 -0
- package/esm/types/VapixAPI.js +70 -12
- package/esm/types/VapixEvents.js +1 -0
- package/esm/types/common.js +3 -1
- package/esm/types/ws/CamOverlayEvents.js +16 -0
- package/esm/types/ws/CamStreamerEvents.js +29 -0
- package/esm/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +8 -0
- package/esm/types/ws/PlaneTrackerEvents.js +191 -0
- package/esm/web/DefaultClient.js +26 -10
- package/esm/web/WsClient.js +16 -18
- package/esm/ws/CamOverlayEvents.js +20 -0
- package/esm/ws/CamStreamerEvents.js +20 -0
- package/esm/ws/CamSwitcherEvents.js +20 -0
- package/esm/ws/PlaneTrackerEvents.js +26 -0
- package/package.json +29 -11
- package/types/CamOverlayAPI.d.ts +867 -0
- package/types/CamScripterAPI.d.ts +46 -0
- package/types/CamStreamerAPI.d.ts +64 -0
- package/types/CamSwitcherAPI.d.ts +167 -0
- package/types/PlaneTrackerAPI.d.ts +229 -0
- package/types/VapixAPI.d.ts +118 -0
- package/types/bin/CreatePackage.d.ts +1 -0
- package/types/errors/errors.d.ts +83 -0
- package/types/index.d.ts +27 -0
- package/types/internal/ProxyClient.d.ts +10 -0
- package/types/internal/WsEvents.d.ts +37 -0
- package/types/internal/types.d.ts +47 -0
- package/{cjs → types}/internal/utils.d.ts +4 -1
- package/{cjs → types}/internal/versionCompare.d.ts +2 -2
- package/types/node/CamOverlayDrawingAPI.d.ts +41 -0
- package/{esm → types/node}/CamOverlayPainter/Frame.d.ts +8 -37
- package/{cjs → types/node}/CamOverlayPainter/Painter.d.ts +5 -21
- package/types/node/CamOverlayPainter/ResourceManager.d.ts +15 -0
- package/types/node/CamScripterAPICameraEventsGenerator.d.ts +31 -0
- package/types/node/DefaultClient.d.ts +16 -0
- package/types/node/Digest.test.d.ts +1 -0
- package/{esm → types}/node/HttpRequestSender.d.ts +1 -0
- package/{cjs → types}/node/HttpServer.d.ts +2 -2
- package/types/node/VapixEvents.d.ts +16 -0
- package/types/node/WsClient.d.ts +30 -0
- package/types/node/events/AxisCameraStationEvents.d.ts +12 -0
- package/types/node/events/GenetecAgent.d.ts +16 -0
- package/types/node/index.d.ts +17 -0
- package/types/types/CamOverlayAPI/CamOverlayAPI.d.ts +4330 -0
- package/types/types/CamOverlayAPI/accuweatherSchema.d.ts +84 -0
- package/types/types/CamOverlayAPI/customGraphicsSchema.d.ts +700 -0
- package/types/types/CamOverlayAPI/imagesSchema.d.ts +95 -0
- package/types/types/CamOverlayAPI/index.d.ts +11 -0
- package/types/types/CamOverlayAPI/infotickerSchema.d.ts +96 -0
- package/types/types/CamOverlayAPI/pipSchema.d.ts +125 -0
- package/types/types/CamOverlayAPI/ptzCompassSchema.d.ts +96 -0
- package/types/types/CamOverlayAPI/ptzSchema.d.ts +118 -0
- package/types/types/CamOverlayAPI/scoreBoardSchema.d.ts +357 -0
- package/types/types/CamOverlayAPI/screenSharingSchema.d.ts +58 -0
- package/types/types/CamOverlayAPI/serviceCommonTypes.d.ts +145 -0
- package/types/types/CamOverlayAPI/webCameraSharingSchema.d.ts +58 -0
- package/types/types/CamOverlayDrawingAPI.d.ts +48 -0
- package/types/types/CamOverlayPainter.d.ts +76 -0
- package/types/types/CamScripterAPI.d.ts +130 -0
- package/types/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
- package/types/types/CamStreamerAPI.d.ts +272 -0
- package/{esm → types}/types/CamSwitcherAPI.d.ts +145 -66
- package/{esm/events → types/types}/GenetecAgent.d.ts +47 -47
- package/types/types/PlaneTrackerAPI.d.ts +918 -0
- package/{cjs → types}/types/VapixAPI.d.ts +647 -465
- package/types/types/VapixEvents.d.ts +15 -0
- package/{cjs → types}/types/common.d.ts +17 -5
- package/types/types/ws/CamOverlayEvents.d.ts +88 -0
- package/types/types/ws/CamStreamerEvents.d.ts +249 -0
- package/{cjs/types → types/types/ws}/CamSwitcherEvents.d.ts +77 -0
- package/types/types/ws/PlaneTrackerEvents.d.ts +1597 -0
- package/types/web/DefaultClient.d.ts +8 -0
- package/types/web/WsClient.d.ts +17 -0
- package/types/ws/CamOverlayEvents.d.ts +8 -0
- package/types/ws/CamStreamerEvents.d.ts +8 -0
- package/types/ws/CamSwitcherEvents.d.ts +8 -0
- package/types/ws/PlaneTrackerEvents.d.ts +9 -0
- package/cjs/CamOverlayAPI.d.ts +0 -31
- package/cjs/CamOverlayDrawingAPI.d.ts +0 -86
- package/cjs/CamOverlayPainter/Frame.d.ts +0 -96
- package/cjs/CamOverlayPainter/ResourceManager.d.ts +0 -14
- package/cjs/CamOverlayPainter/ResourceManager.js +0 -46
- package/cjs/CamScripterAPI.d.ts +0 -19
- package/cjs/CamScripterAPICameraEventsGenerator.d.ts +0 -74
- package/cjs/CamStreamerAPI.d.ts +0 -16
- package/cjs/CamSwitcherAPI.d.ts +0 -48
- package/cjs/CamSwitcherEvents.d.ts +0 -18
- package/cjs/VapixAPI.d.ts +0 -66
- package/cjs/VapixEvents.d.ts +0 -43
- package/cjs/errors/errors.d.ts +0 -34
- package/cjs/events/AxisCameraStationEvents.d.ts +0 -9
- package/cjs/events/AxisCameraStationEvents.js +0 -48
- package/cjs/events/GenetecAgent.d.ts +0 -174
- package/cjs/events/GenetecAgent.js +0 -123
- package/cjs/index.d.ts +0 -11
- package/cjs/internal/ProxyClient.d.ts +0 -11
- package/cjs/internal/common.d.ts +0 -39
- package/cjs/internal/common.js +0 -27
- package/cjs/node/DefaultClient.d.ts +0 -15
- package/cjs/node/HttpRequestSender.d.ts +0 -28
- package/cjs/node/WsClient.d.ts +0 -39
- package/cjs/node/WsEventClient.d.ts +0 -13
- package/cjs/node/WsEventClient.js +0 -22
- package/cjs/types/CamOverlayAPI.d.ts +0 -188
- package/cjs/types/CamOverlayAPI.js +0 -47
- package/cjs/types/CamScripterAPI.d.ts +0 -67
- package/cjs/types/CamStreamerAPI.d.ts +0 -139
- package/cjs/types/CamSwitcherAPI.d.ts +0 -814
- package/cjs/web/DefaultClient.d.ts +0 -6
- package/cjs/web/WsClient.d.ts +0 -13
- package/cjs/web/index.d.ts +0 -2
- package/esm/CamOverlayAPI.d.ts +0 -31
- package/esm/CamOverlayDrawingAPI.d.ts +0 -86
- package/esm/CamOverlayPainter/Painter.d.ts +0 -48
- package/esm/CamOverlayPainter/ResourceManager.d.ts +0 -14
- package/esm/CamScripterAPI.d.ts +0 -19
- package/esm/CamScripterAPICameraEventsGenerator.d.ts +0 -74
- package/esm/CamStreamerAPI.d.ts +0 -16
- package/esm/CamSwitcherAPI.d.ts +0 -48
- package/esm/CamSwitcherEvents.d.ts +0 -18
- package/esm/VapixAPI.d.ts +0 -66
- package/esm/VapixEvents.d.ts +0 -43
- package/esm/errors/errors.d.ts +0 -34
- package/esm/events/AxisCameraStationEvents.d.ts +0 -9
- package/esm/events/GenetecAgent.js +0 -119
- package/esm/index.d.ts +0 -11
- package/esm/internal/Digest.d.ts +0 -4
- package/esm/internal/ProxyClient.d.ts +0 -11
- package/esm/internal/common.d.ts +0 -39
- package/esm/internal/common.js +0 -20
- package/esm/internal/constants.d.ts +0 -1
- package/esm/internal/transformers.d.ts +0 -5
- package/esm/internal/utils.d.ts +0 -11
- package/esm/internal/versionCompare.d.ts +0 -6
- package/esm/node/DefaultClient.d.ts +0 -15
- package/esm/node/HttpServer.d.ts +0 -21
- package/esm/node/WsClient.d.ts +0 -39
- package/esm/node/WsEventClient.d.ts +0 -13
- package/esm/node/WsEventClient.js +0 -18
- package/esm/node/index.d.ts +0 -2
- package/esm/types/CamOverlayAPI.d.ts +0 -188
- package/esm/types/CamOverlayAPI.js +0 -44
- package/esm/types/CamScripterAPI.d.ts +0 -67
- package/esm/types/CamStreamerAPI.d.ts +0 -139
- package/esm/types/CamSwitcherEvents.d.ts +0 -491
- package/esm/types/VapixAPI.d.ts +0 -1683
- package/esm/types/common.d.ts +0 -37
- package/esm/web/DefaultClient.d.ts +0 -6
- package/esm/web/WsClient.d.ts +0 -13
- package/esm/web/index.d.ts +0 -2
- /package/{cjs/CreatePackage.d.ts → esm/internal/types.js} +0 -0
- /package/esm/{CreatePackage.d.ts → types/CamOverlayDrawingAPI.js} +0 -0
- /package/{cjs → types}/internal/constants.d.ts +0 -0
- /package/{cjs → types}/internal/transformers.d.ts +0 -0
- /package/{cjs/internal → types/node}/Digest.d.ts +0 -0
- /package/{cjs/node → types/web}/index.d.ts +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ResourceManager = void 0;
|
|
27
|
+
const fs = __importStar(require("fs/promises"));
|
|
28
|
+
class ResourceManager {
|
|
29
|
+
co;
|
|
30
|
+
imgFileNames = {};
|
|
31
|
+
fontFileNames = {};
|
|
32
|
+
images = {};
|
|
33
|
+
fonts = {};
|
|
34
|
+
constructor(co) {
|
|
35
|
+
this.co = co;
|
|
36
|
+
}
|
|
37
|
+
registerImage(moniker, fileName) {
|
|
38
|
+
this.imgFileNames[moniker] = process.env.INSTALL_PATH + '/images/' + fileName;
|
|
39
|
+
}
|
|
40
|
+
registerFont(moniker, fileName) {
|
|
41
|
+
this.fontFileNames[moniker] = process.env.INSTALL_PATH + '/fonts/' + fileName;
|
|
42
|
+
}
|
|
43
|
+
async image(moniker) {
|
|
44
|
+
if (this.images[moniker] !== undefined) {
|
|
45
|
+
return this.images[moniker];
|
|
46
|
+
}
|
|
47
|
+
const path = this.imgFileNames[moniker];
|
|
48
|
+
if (path !== undefined) {
|
|
49
|
+
const imgData = await fs.readFile(path);
|
|
50
|
+
this.images[moniker] = await this.co.uploadImageData(imgData);
|
|
51
|
+
return this.images[moniker];
|
|
52
|
+
}
|
|
53
|
+
throw new Error('Error! Unknown image requested!');
|
|
54
|
+
}
|
|
55
|
+
async font(moniker) {
|
|
56
|
+
if (this.fonts[moniker] !== undefined) {
|
|
57
|
+
return this.fonts[moniker];
|
|
58
|
+
}
|
|
59
|
+
const path = this.fontFileNames[moniker];
|
|
60
|
+
if (path !== undefined) {
|
|
61
|
+
const fontData = await fs.readFile(path);
|
|
62
|
+
this.fonts[moniker] = await this.co.uploadFontData(fontData);
|
|
63
|
+
return this.fonts[moniker];
|
|
64
|
+
}
|
|
65
|
+
throw new Error('Error! Unknown font requested!');
|
|
66
|
+
}
|
|
67
|
+
clear() {
|
|
68
|
+
this.images = {};
|
|
69
|
+
this.fonts = {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.ResourceManager = ResourceManager;
|
package/cjs/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js}
RENAMED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.CamScripterAPICameraEventsGenerator = void 0;
|
|
4
|
-
const
|
|
5
|
-
const WsClient_1 = require("./
|
|
6
|
-
class CamScripterAPICameraEventsGenerator extends
|
|
7
|
+
const events_1 = __importDefault(require("events"));
|
|
8
|
+
const WsClient_1 = require("./WsClient");
|
|
9
|
+
class CamScripterAPICameraEventsGenerator extends events_1.default {
|
|
7
10
|
tls;
|
|
8
11
|
tlsInsecure;
|
|
9
12
|
ip;
|
|
@@ -27,14 +30,14 @@ class CamScripterAPICameraEventsGenerator extends EventEmitter {
|
|
|
27
30
|
this.sendMessages = {};
|
|
28
31
|
this.wsConnected = false;
|
|
29
32
|
this.createWsClient();
|
|
30
|
-
|
|
33
|
+
events_1.default.call(this);
|
|
31
34
|
}
|
|
32
35
|
connect() {
|
|
33
36
|
this.ws.open();
|
|
34
37
|
this.startMsgsTimeoutCheck();
|
|
35
38
|
}
|
|
36
39
|
disconnect() {
|
|
37
|
-
this.ws.
|
|
40
|
+
this.ws.destroy();
|
|
38
41
|
this.stopMsgsTimeoutCheck();
|
|
39
42
|
}
|
|
40
43
|
declareEvent(eventDeclaration) {
|
|
@@ -70,21 +73,21 @@ class CamScripterAPICameraEventsGenerator extends EventEmitter {
|
|
|
70
73
|
protocol: 'camera-events',
|
|
71
74
|
};
|
|
72
75
|
this.ws = new WsClient_1.WsClient(options);
|
|
73
|
-
this.ws.
|
|
76
|
+
this.ws.onOpen = () => {
|
|
74
77
|
this.wsConnected = true;
|
|
75
78
|
this.emit('open');
|
|
76
|
-
}
|
|
77
|
-
this.ws.
|
|
78
|
-
this.ws.
|
|
79
|
+
};
|
|
80
|
+
this.ws.onMessage = (data) => this.incomingWsMessageHandler(data.toString());
|
|
81
|
+
this.ws.onError = (error) => {
|
|
79
82
|
this.reportErr(error);
|
|
80
|
-
}
|
|
81
|
-
this.ws.
|
|
83
|
+
};
|
|
84
|
+
this.ws.onClose = () => {
|
|
82
85
|
this.wsConnected = false;
|
|
83
86
|
this.reportClose();
|
|
84
|
-
}
|
|
87
|
+
};
|
|
85
88
|
}
|
|
86
89
|
incomingWsMessageHandler(msgData) {
|
|
87
|
-
const dataJSON = JSON.parse(msgData
|
|
90
|
+
const dataJSON = JSON.parse(msgData);
|
|
88
91
|
let errorResponse;
|
|
89
92
|
if ('error' in dataJSON) {
|
|
90
93
|
errorResponse = dataJSON;
|
|
@@ -25,29 +25,27 @@ class DefaultClient {
|
|
|
25
25
|
}
|
|
26
26
|
this.httpRequestSender = new HttpRequestSender_1.HttpRequestSender(agentOptions);
|
|
27
27
|
}
|
|
28
|
-
get
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
async get(path, parameters = {}, headers) {
|
|
32
|
-
const options = this.getBaseConnectionParams('GET', path, parameters);
|
|
33
|
-
options.headers = headers;
|
|
28
|
+
get(params) {
|
|
29
|
+
const { path, parameters, headers, timeout } = params;
|
|
30
|
+
const options = this.getBaseConnectionParams('GET', path, parameters, headers, timeout);
|
|
34
31
|
return this.httpRequestSender.sendRequest(options);
|
|
35
32
|
}
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
options
|
|
33
|
+
post(params) {
|
|
34
|
+
const { path, data, parameters, headers, timeout } = params;
|
|
35
|
+
const options = this.getBaseConnectionParams('POST', path, parameters, headers, timeout);
|
|
39
36
|
return this.httpRequestSender.sendRequest(options, data);
|
|
40
37
|
}
|
|
41
|
-
getBaseConnectionParams(method, path, params) {
|
|
42
|
-
const pathName = (0, utils_1.addParametersToPath)(path, params);
|
|
38
|
+
getBaseConnectionParams(method, path, params, headers, timeout) {
|
|
43
39
|
return {
|
|
44
40
|
method: method,
|
|
45
41
|
protocol: this.tls ? 'https:' : 'http:',
|
|
46
42
|
host: this.ip,
|
|
47
43
|
port: this.port,
|
|
48
|
-
path:
|
|
44
|
+
path: (0, utils_1.addParametersToPath)(path, params),
|
|
49
45
|
user: this.user,
|
|
50
46
|
pass: this.pass,
|
|
47
|
+
headers,
|
|
48
|
+
timeout,
|
|
51
49
|
};
|
|
52
50
|
}
|
|
53
51
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.Digest = void 0;
|
|
4
|
-
const
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
5
8
|
class Digest {
|
|
6
9
|
nonceCount = 1;
|
|
7
10
|
getAuthHeader(user, pass, method, uri, wwwAuthenticateHeader) {
|
|
@@ -13,18 +16,18 @@ class Digest {
|
|
|
13
16
|
const value = arg.substring(pos + 1).trim();
|
|
14
17
|
digestItems[key] = value.replace(/"/g, '');
|
|
15
18
|
}
|
|
16
|
-
const HA1 =
|
|
17
|
-
const HA2 =
|
|
19
|
+
const HA1 = crypto_1.default.createHash('md5').update(`${user}:${digestItems['realm']}:${pass}`).digest('hex');
|
|
20
|
+
const HA2 = crypto_1.default.createHash('md5').update(`${method}:${uri}`).digest('hex');
|
|
18
21
|
const ncValue = ('00000000' + this.nonceCount.toString(16)).slice(-8);
|
|
19
22
|
let response;
|
|
20
23
|
if (digestItems['qop'] !== undefined) {
|
|
21
|
-
response =
|
|
24
|
+
response = crypto_1.default
|
|
22
25
|
.createHash('md5')
|
|
23
26
|
.update(`${HA1}:${digestItems['nonce']}:${ncValue}:162d50aa594e9648:auth:${HA2}`)
|
|
24
27
|
.digest('hex');
|
|
25
28
|
}
|
|
26
29
|
else {
|
|
27
|
-
response =
|
|
30
|
+
response = crypto_1.default.createHash('md5').update(`${HA1}:${digestItems['nonce']}:${HA2}`).digest('hex');
|
|
28
31
|
}
|
|
29
32
|
let header = 'Digest ' +
|
|
30
33
|
`username="${user}",` +
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Digest_1 = require("./Digest");
|
|
4
|
+
const globals_1 = require("@jest/globals");
|
|
5
|
+
(0, globals_1.describe)('Digest', () => {
|
|
6
|
+
(0, globals_1.describe)('getAuthHeader', () => {
|
|
7
|
+
(0, globals_1.test)('Checks, that Digest.getAuthHeader() returns correct value.', () => {
|
|
8
|
+
const testString = 'Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"';
|
|
9
|
+
const value = 'Digest username="root",realm="testrealm@host.com",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",uri="www.cz",response="63f54af3ce5cf193a7435d5c68625472",qop=auth,nc=00000001,cnonce="162d50aa594e9648"';
|
|
10
|
+
(0, globals_1.expect)(new Digest_1.Digest().getAuthHeader('root', 'pass', 'GET', 'www.cz', testString)).toBe(value);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HttpRequestSender = void 0;
|
|
4
|
-
const Digest_1 = require("
|
|
4
|
+
const Digest_1 = require("./Digest");
|
|
5
5
|
const undici_1 = require("undici");
|
|
6
6
|
class HttpRequestSender {
|
|
7
7
|
agent;
|
|
@@ -11,8 +11,18 @@ class HttpRequestSender {
|
|
|
11
11
|
connect: { rejectUnauthorized: agentOptions?.rejectUnaurhorized, keepAlive: agentOptions?.keepAlive },
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
sendRequest(options, postData) {
|
|
15
|
-
|
|
14
|
+
async sendRequest(options, postData) {
|
|
15
|
+
const stackHolder = { stack: '' };
|
|
16
|
+
Error.captureStackTrace(stackHolder, this.sendRequest);
|
|
17
|
+
try {
|
|
18
|
+
return await this.sendRequestWithAuth(options, postData);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err instanceof Error) {
|
|
22
|
+
err.stack = `${err.stack}\nCaptured at:\n${stackHolder.stack}`;
|
|
23
|
+
}
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
16
26
|
}
|
|
17
27
|
async sendRequestWithAuth(options, postData, wwwAuthenticateHeader) {
|
|
18
28
|
options.timeout ??= 10000;
|
|
@@ -82,7 +92,7 @@ class HttpRequestSender {
|
|
|
82
92
|
return authData.digest.getAuthHeader(options.user, options.pass, options.method ?? 'GET', options.path, authData.wwwAuthenticateHeader);
|
|
83
93
|
}
|
|
84
94
|
else {
|
|
85
|
-
return `Basic ${
|
|
95
|
+
return `Basic ${Buffer.from(`${options.user}:${options.pass}`).toString('base64')}`;
|
|
86
96
|
}
|
|
87
97
|
}
|
|
88
98
|
}
|
package/cjs/node/HttpServer.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.HttpServer = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
class HttpServer extends
|
|
7
|
+
const http_1 = __importDefault(require("http"));
|
|
8
|
+
const url_1 = __importDefault(require("url"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const events_1 = __importDefault(require("events"));
|
|
12
|
+
class HttpServer extends events_1.default {
|
|
10
13
|
host;
|
|
11
14
|
port;
|
|
12
15
|
registeredPaths;
|
|
@@ -17,9 +20,9 @@ class HttpServer extends EventEmitter {
|
|
|
17
20
|
this.host = options?.host ?? process.env.HTTP_HOST ?? '0.0.0.0';
|
|
18
21
|
this.port = options?.port ?? parseInt(process.env.HTTP_PORT ?? '80');
|
|
19
22
|
this.registeredPaths = new Map();
|
|
20
|
-
this.server =
|
|
23
|
+
this.server = http_1.default.createServer((req, res) => {
|
|
21
24
|
this.emit('access', req.method + ' ' + req.url);
|
|
22
|
-
const parsedUrl =
|
|
25
|
+
const parsedUrl = url_1.default.parse(req.url ?? '');
|
|
23
26
|
parsedUrl.pathname ??= '';
|
|
24
27
|
const requestCallback = this.registeredPaths.get(parsedUrl.pathname);
|
|
25
28
|
if (requestCallback) {
|
|
@@ -27,7 +30,7 @@ class HttpServer extends EventEmitter {
|
|
|
27
30
|
return;
|
|
28
31
|
}
|
|
29
32
|
let pathname = `./html${parsedUrl.pathname}`;
|
|
30
|
-
const ext =
|
|
33
|
+
const ext = path_1.default.parse(pathname).ext;
|
|
31
34
|
const map = {
|
|
32
35
|
'.ico': 'image/x-icon',
|
|
33
36
|
'.html': 'text/html',
|
|
@@ -42,17 +45,17 @@ class HttpServer extends EventEmitter {
|
|
|
42
45
|
'.pdf': 'application/pdf',
|
|
43
46
|
'.doc': 'application/msword',
|
|
44
47
|
};
|
|
45
|
-
|
|
48
|
+
fs_1.default.access(pathname, fs_1.default.constants.R_OK, (err) => {
|
|
46
49
|
if (err) {
|
|
47
50
|
res.statusCode = 404;
|
|
48
51
|
res.end(`File ${pathname} not found!`);
|
|
49
52
|
this.emit('error', `File ${pathname} not found!`);
|
|
50
53
|
return;
|
|
51
54
|
}
|
|
52
|
-
if (
|
|
55
|
+
if (fs_1.default.statSync(pathname).isDirectory()) {
|
|
53
56
|
pathname += `/index${ext}`;
|
|
54
57
|
}
|
|
55
|
-
|
|
58
|
+
fs_1.default.readFile(pathname, (error, data) => {
|
|
56
59
|
if (error) {
|
|
57
60
|
res.statusCode = 500;
|
|
58
61
|
res.end(`Error getting the file: ${error}`);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VapixEvents = void 0;
|
|
4
4
|
const eventemitter2_1 = require("eventemitter2");
|
|
5
|
-
const WsClient_1 = require("./
|
|
5
|
+
const WsClient_1 = require("./WsClient");
|
|
6
6
|
class VapixEvents extends eventemitter2_1.EventEmitter2 {
|
|
7
7
|
tls;
|
|
8
8
|
tlsInsecure;
|
|
@@ -26,7 +26,7 @@ class VapixEvents extends eventemitter2_1.EventEmitter2 {
|
|
|
26
26
|
this.ws.open();
|
|
27
27
|
}
|
|
28
28
|
disconnect() {
|
|
29
|
-
this.ws.
|
|
29
|
+
this.ws.destroy();
|
|
30
30
|
}
|
|
31
31
|
createWsClient() {
|
|
32
32
|
const options = {
|
|
@@ -39,7 +39,7 @@ class VapixEvents extends eventemitter2_1.EventEmitter2 {
|
|
|
39
39
|
address: '/vapix/ws-data-stream?sources=events',
|
|
40
40
|
};
|
|
41
41
|
this.ws = new WsClient_1.WsClient(options);
|
|
42
|
-
this.ws.
|
|
42
|
+
this.ws.onOpen = () => {
|
|
43
43
|
const topics = [];
|
|
44
44
|
const eventNames = this.eventNames();
|
|
45
45
|
for (const eventName of eventNames) {
|
|
@@ -58,8 +58,8 @@ class VapixEvents extends eventemitter2_1.EventEmitter2 {
|
|
|
58
58
|
},
|
|
59
59
|
};
|
|
60
60
|
this.ws.send(JSON.stringify(topicFilter));
|
|
61
|
-
}
|
|
62
|
-
this.ws.
|
|
61
|
+
};
|
|
62
|
+
this.ws.onMessage = (data) => {
|
|
63
63
|
const dataJSON = JSON.parse(data.toString());
|
|
64
64
|
if (dataJSON.method === 'events:configure') {
|
|
65
65
|
if (dataJSON.error === undefined) {
|
|
@@ -73,13 +73,13 @@ class VapixEvents extends eventemitter2_1.EventEmitter2 {
|
|
|
73
73
|
}
|
|
74
74
|
const eventName = dataJSON.params.notification.topic;
|
|
75
75
|
this.emit(eventName, dataJSON);
|
|
76
|
-
}
|
|
77
|
-
this.ws.
|
|
76
|
+
};
|
|
77
|
+
this.ws.onError = (error) => {
|
|
78
78
|
this.emit('error', error);
|
|
79
|
-
}
|
|
80
|
-
this.ws.
|
|
79
|
+
};
|
|
80
|
+
this.ws.onClose = () => {
|
|
81
81
|
this.emit('close');
|
|
82
|
-
}
|
|
82
|
+
};
|
|
83
83
|
}
|
|
84
84
|
isReservedEventName(eventName) {
|
|
85
85
|
return eventName === 'open' || eventName === 'close' || eventName === 'error';
|
package/cjs/node/WsClient.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.WsClient = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
class WsClient extends EventEmitter {
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const Digest_1 = require("./Digest");
|
|
9
|
+
class WsClient {
|
|
8
10
|
user;
|
|
9
11
|
pass;
|
|
10
12
|
address;
|
|
@@ -17,7 +19,6 @@ class WsClient extends EventEmitter {
|
|
|
17
19
|
ws;
|
|
18
20
|
isClosed = false;
|
|
19
21
|
constructor(options) {
|
|
20
|
-
super();
|
|
21
22
|
const tls = options.tls ?? false;
|
|
22
23
|
const tlsInsecure = options.tlsInsecure ?? false;
|
|
23
24
|
const ip = options.ip ?? '127.0.0.1';
|
|
@@ -42,17 +43,17 @@ class WsClient extends EventEmitter {
|
|
|
42
43
|
}
|
|
43
44
|
this.isClosed = false;
|
|
44
45
|
if (this.protocol === undefined) {
|
|
45
|
-
this.ws = new
|
|
46
|
+
this.ws = new ws_1.default(this.address, this.wsOptions);
|
|
46
47
|
}
|
|
47
48
|
else {
|
|
48
|
-
this.ws = new
|
|
49
|
+
this.ws = new ws_1.default(this.address, this.protocol, this.wsOptions);
|
|
49
50
|
}
|
|
50
51
|
this.ws.binaryType = 'arraybuffer';
|
|
51
52
|
this.isAlive = true;
|
|
52
|
-
this.pingTimer = setInterval(
|
|
53
|
-
if ((this.ws && this.ws.readyState !==
|
|
54
|
-
this.
|
|
55
|
-
|
|
53
|
+
this.pingTimer = setInterval(() => {
|
|
54
|
+
if ((this.ws && this.ws.readyState !== ws_1.default.OPEN) || this.isAlive === false) {
|
|
55
|
+
this.onError(new Error('Connection timeout'));
|
|
56
|
+
this.closeWsConnection();
|
|
56
57
|
}
|
|
57
58
|
else {
|
|
58
59
|
this.isAlive = false;
|
|
@@ -75,23 +76,32 @@ class WsClient extends EventEmitter {
|
|
|
75
76
|
this.open(res.headers['www-authenticate']);
|
|
76
77
|
}
|
|
77
78
|
else {
|
|
78
|
-
this.
|
|
79
|
+
this.onError(new Error('Status code: ' + res.statusCode));
|
|
79
80
|
this.closeWsConnection();
|
|
80
81
|
}
|
|
81
82
|
});
|
|
82
|
-
this.ws.on('open', () => this.
|
|
83
|
-
this.ws.on('message', (data) =>
|
|
83
|
+
this.ws.on('open', () => this.onOpen());
|
|
84
|
+
this.ws.on('message', (data, isBinary) => {
|
|
85
|
+
const message = isBinary ? data : data.toString();
|
|
86
|
+
this.onMessage(message);
|
|
87
|
+
});
|
|
84
88
|
this.ws.on('error', (error) => {
|
|
85
|
-
this.
|
|
89
|
+
this.onError(error);
|
|
86
90
|
this.closeWsConnection();
|
|
87
91
|
});
|
|
88
92
|
this.ws.on('close', () => this.closeWsConnection());
|
|
89
93
|
}
|
|
90
94
|
catch (error) {
|
|
91
|
-
this.
|
|
95
|
+
this.onError(error instanceof Error ? error : new Error('Unknown error'));
|
|
92
96
|
this.closeWsConnection();
|
|
93
97
|
}
|
|
94
98
|
}
|
|
99
|
+
onMessage = (_) => { };
|
|
100
|
+
onOpen = () => { };
|
|
101
|
+
onClose = () => { };
|
|
102
|
+
onError = (error) => {
|
|
103
|
+
console.error(error);
|
|
104
|
+
};
|
|
95
105
|
send(data) {
|
|
96
106
|
if (this.ws === undefined) {
|
|
97
107
|
throw new Error("This websocket hasn't been opened yet.");
|
|
@@ -100,7 +110,7 @@ class WsClient extends EventEmitter {
|
|
|
100
110
|
this.ws.send(data);
|
|
101
111
|
}
|
|
102
112
|
}
|
|
103
|
-
|
|
113
|
+
destroy() {
|
|
104
114
|
if (this.isClosed) {
|
|
105
115
|
return;
|
|
106
116
|
}
|
|
@@ -122,15 +132,15 @@ class WsClient extends EventEmitter {
|
|
|
122
132
|
}
|
|
123
133
|
wsCopy.removeAllListeners();
|
|
124
134
|
wsCopy.on('error', () => { });
|
|
125
|
-
if (wsCopy.readyState !==
|
|
135
|
+
if (wsCopy.readyState !== ws_1.default.CLOSING && wsCopy.readyState !== ws_1.default.CLOSED) {
|
|
126
136
|
wsCopy.close();
|
|
127
137
|
}
|
|
128
138
|
setTimeout(() => {
|
|
129
|
-
if (wsCopy.readyState !==
|
|
139
|
+
if (wsCopy.readyState !== ws_1.default.CLOSED) {
|
|
130
140
|
wsCopy.terminate();
|
|
131
141
|
}
|
|
132
142
|
}, 5000);
|
|
133
|
-
this.
|
|
143
|
+
this.onClose();
|
|
134
144
|
}
|
|
135
145
|
catch (err) {
|
|
136
146
|
console.error(err);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AxisCameraStationEvents = void 0;
|
|
4
|
+
const utils_1 = require("../../internal/utils");
|
|
5
|
+
const ProxyClient_1 = require("../../internal/ProxyClient");
|
|
6
|
+
const DefaultClient_1 = require("../DefaultClient");
|
|
7
|
+
class AxisCameraStationEvents {
|
|
8
|
+
sourceKey;
|
|
9
|
+
client;
|
|
10
|
+
constructor(clientOptions, sourceKey) {
|
|
11
|
+
this.sourceKey = sourceKey;
|
|
12
|
+
this.client = new DefaultClient_1.DefaultClient(clientOptions);
|
|
13
|
+
}
|
|
14
|
+
getClient(proxyParams) {
|
|
15
|
+
return proxyParams ? new ProxyClient_1.ProxyClient(this.client, proxyParams) : this.client;
|
|
16
|
+
}
|
|
17
|
+
async sendEvent(data, eventType, options) {
|
|
18
|
+
const dateString = this.getDate();
|
|
19
|
+
const event = {
|
|
20
|
+
addExternalDataRequest: {
|
|
21
|
+
occurrenceTime: dateString,
|
|
22
|
+
source: this.sourceKey,
|
|
23
|
+
externalDataType: eventType,
|
|
24
|
+
data: data,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const eventData = JSON.stringify(event);
|
|
28
|
+
const agent = this.getClient(options?.proxyParams);
|
|
29
|
+
const res = await agent.post({
|
|
30
|
+
path: '/Acs/Api/ExternalDataFacade/AddExternalData',
|
|
31
|
+
data: eventData,
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Content-Length': eventData.length.toString(),
|
|
35
|
+
},
|
|
36
|
+
timeout: options?.timeout,
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
throw new Error(`ACS status code: ${res.status}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
getDate() {
|
|
43
|
+
const date = new Date();
|
|
44
|
+
const year = date.getUTCFullYear();
|
|
45
|
+
const month = (0, utils_1.pad)(date.getUTCMonth() + 1, 2);
|
|
46
|
+
const day = (0, utils_1.pad)(date.getUTCDate(), 2);
|
|
47
|
+
const hours = (0, utils_1.pad)(date.getUTCHours(), 2);
|
|
48
|
+
const minutes = (0, utils_1.pad)(date.getUTCMinutes(), 2);
|
|
49
|
+
const seconds = (0, utils_1.pad)(date.getUTCSeconds(), 2);
|
|
50
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.AxisCameraStationEvents = AxisCameraStationEvents;
|