camstreamerlib 4.0.0-beta.16 → 4.0.0-beta.161
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 +143 -38
- package/cjs/CamOverlayAPI.d.ts +603 -327
- package/cjs/CamOverlayAPI.js +99 -184
- package/cjs/CamScripterAPI.d.ts +41 -17
- package/cjs/CamScripterAPI.js +54 -56
- package/cjs/CamStreamerAPI.d.ts +3557 -14
- package/cjs/CamStreamerAPI.js +174 -52
- package/cjs/CamSwitcherAPI.d.ts +158 -42
- package/cjs/CamSwitcherAPI.js +148 -189
- package/cjs/PlaneTrackerAPI.d.ts +238 -29
- package/cjs/PlaneTrackerAPI.js +187 -101
- package/cjs/VapixAPI.d.ts +97 -44
- package/cjs/VapixAPI.js +400 -207
- package/cjs/{CreatePackage.js → bin/CreatePackage.js} +44 -18
- package/cjs/errors/errors.d.ts +75 -4
- package/cjs/errors/errors.js +142 -7
- package/cjs/index.d.ts +20 -9
- package/cjs/index.js +28 -14
- package/cjs/internal/BasicAPI.d.ts +15 -0
- package/cjs/internal/BasicAPI.js +93 -0
- package/cjs/internal/ProxyClient.d.ts +8 -9
- package/cjs/internal/ProxyClient.js +28 -34
- package/cjs/internal/WsEvents.d.ts +38 -0
- package/cjs/{CamSwitcherEvents.js → internal/WsEvents.js} +33 -22
- package/cjs/internal/constants.d.ts +1 -0
- package/cjs/internal/constants.js +2 -1
- package/cjs/internal/convertors.d.ts +6 -0
- package/cjs/internal/convertors.js +115 -0
- package/cjs/internal/transformers.js +8 -8
- package/cjs/internal/types.d.ts +32 -20
- package/cjs/internal/utils.d.ts +1 -3
- package/cjs/internal/utils.js +1 -12
- package/cjs/internal/versionCompare.d.ts +2 -2
- package/cjs/node/CamOverlayDrawingAPI.d.ts +41 -0
- package/cjs/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +28 -20
- package/{esm → cjs/node}/CamOverlayPainter/Frame.d.ts +8 -37
- package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +33 -0
- package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.d.ts +5 -21
- package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +5 -17
- package/cjs/node/CamOverlayPainter/ResourceManager.d.ts +15 -0
- package/cjs/node/CamOverlayPainter/ResourceManager.js +72 -0
- package/cjs/node/CamScripterAPICameraEventsGenerator.d.ts +31 -0
- package/cjs/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +13 -13
- package/cjs/node/DefaultClient.d.ts +6 -6
- package/cjs/node/DefaultClient.js +12 -16
- package/cjs/{internal → node}/Digest.js +24 -1
- package/cjs/node/Digest.test.js +13 -0
- package/cjs/node/HttpRequestSender.d.ts +1 -0
- package/cjs/node/HttpRequestSender.js +14 -4
- package/cjs/node/HttpServer.d.ts +1 -1
- package/cjs/node/HttpServer.js +29 -6
- package/cjs/node/TimeZoneDaemon.d.ts +6 -0
- package/cjs/node/TimeZoneDaemon.js +29 -0
- package/cjs/node/VapixEvents.d.ts +16 -0
- package/cjs/{VapixEvents.js → node/VapixEvents.js} +10 -10
- package/cjs/node/WsClient.d.ts +9 -18
- package/cjs/node/WsClient.js +27 -20
- package/cjs/node/events/AxisCameraStationEvents.d.ts +12 -0
- package/cjs/{events → node/events}/AxisCameraStationEvents.js +18 -13
- package/cjs/node/events/GenetecAgent.d.ts +16 -0
- package/cjs/node/events/GenetecAgent.js +124 -0
- package/cjs/node/index.d.ts +18 -2
- package/cjs/node/index.js +39 -5
- package/cjs/{models/CamOverlayAPI/widgetsSchema.d.ts → types/CamOverlayAPI/CamOverlayAPI.d.ts} +2794 -767
- package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +135 -0
- package/cjs/{models → types}/CamOverlayAPI/accuweatherSchema.d.ts +19 -19
- package/cjs/{models → types}/CamOverlayAPI/accuweatherSchema.js +7 -8
- package/cjs/{models → types}/CamOverlayAPI/customGraphicsSchema.d.ts +108 -107
- package/cjs/{models → types}/CamOverlayAPI/customGraphicsSchema.js +5 -6
- package/cjs/types/CamOverlayAPI/htmlOverlaySchema.d.ts +81 -0
- package/cjs/types/CamOverlayAPI/htmlOverlaySchema.js +21 -0
- package/{esm/models → cjs/types}/CamOverlayAPI/imagesSchema.d.ts +19 -19
- package/cjs/types/CamOverlayAPI/imagesSchema.js +9 -0
- package/cjs/{models → types}/CamOverlayAPI/index.d.ts +3 -4
- package/cjs/{models → types}/CamOverlayAPI/index.js +3 -4
- package/cjs/{models → types}/CamOverlayAPI/infotickerSchema.d.ts +27 -27
- package/cjs/{models → types}/CamOverlayAPI/infotickerSchema.js +6 -7
- package/{esm/models → cjs/types}/CamOverlayAPI/pipSchema.d.ts +21 -21
- package/cjs/{models → types}/CamOverlayAPI/pipSchema.js +5 -6
- package/{esm/models → cjs/types}/CamOverlayAPI/ptzCompassSchema.d.ts +18 -15
- package/cjs/{models → types}/CamOverlayAPI/ptzCompassSchema.js +5 -5
- package/cjs/{models → types}/CamOverlayAPI/ptzSchema.d.ts +28 -28
- package/cjs/types/CamOverlayAPI/ptzSchema.js +12 -0
- package/cjs/types/CamOverlayAPI/scoreBoardSchema.d.ts +357 -0
- package/cjs/types/CamOverlayAPI/scoreBoardSchema.js +132 -0
- package/{esm/models → cjs/types}/CamOverlayAPI/screenSharingSchema.d.ts +15 -15
- package/cjs/types/CamOverlayAPI/screenSharingSchema.js +8 -0
- package/{esm/models/CamOverlayAPI/widgetCommonSchema.d.ts → cjs/types/CamOverlayAPI/serviceCommonTypes.d.ts} +80 -60
- package/cjs/{models/CamOverlayAPI/widgetCommonSchema.js → types/CamOverlayAPI/serviceCommonTypes.js} +39 -21
- package/{esm/models → cjs/types}/CamOverlayAPI/webCameraSharingSchema.d.ts +15 -15
- package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +8 -0
- package/cjs/types/CamOverlayDrawingAPI.d.ts +48 -0
- package/cjs/types/CamOverlayDrawingAPI.js +2 -0
- package/cjs/types/CamOverlayPainter.d.ts +76 -0
- package/cjs/types/CamOverlayPainter.js +14 -0
- package/cjs/types/CamScripterAPI.d.ts +75 -23
- package/cjs/types/CamScripterAPI.js +20 -8
- package/cjs/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
- package/cjs/types/CamScripterAPICameraEventsGenerator.js +2 -0
- package/cjs/types/CamStreamerAPI/CamStreamerAPI.d.ts +26085 -0
- package/cjs/types/CamStreamerAPI/CamStreamerAPI.js +222 -0
- package/cjs/types/CamStreamerAPI/facebookSchema.d.ts +574 -0
- package/cjs/types/CamStreamerAPI/facebookSchema.js +23 -0
- package/cjs/types/CamStreamerAPI/index.d.ts +6 -0
- package/cjs/types/CamStreamerAPI/index.js +22 -0
- package/cjs/types/{CamStreamerAPI.d.ts → CamStreamerAPI/oldStreamSchema.d.ts} +104 -35
- package/cjs/types/CamStreamerAPI/oldStreamSchema.js +53 -0
- package/cjs/types/CamStreamerAPI/streamCommonTypes.d.ts +570 -0
- package/cjs/types/CamStreamerAPI/streamCommonTypes.js +123 -0
- package/cjs/types/CamStreamerAPI/streamsSchema.d.ts +8642 -0
- package/cjs/types/CamStreamerAPI/streamsSchema.js +81 -0
- package/cjs/types/CamStreamerAPI/windySchema.d.ts +534 -0
- package/cjs/types/CamStreamerAPI/windySchema.js +19 -0
- package/cjs/types/CamStreamerAPI/youtubeSchema.d.ts +542 -0
- package/cjs/types/CamStreamerAPI/youtubeSchema.js +22 -0
- package/cjs/types/CamSwitcherAPI.d.ts +205 -121
- package/cjs/types/CamSwitcherAPI.js +38 -1
- package/cjs/{events → types}/GenetecAgent.d.ts +47 -47
- package/cjs/types/GenetecAgent.js +31 -0
- package/cjs/types/PlaneTrackerAPI.d.ts +993 -0
- package/cjs/types/PlaneTrackerAPI.js +336 -0
- package/cjs/types/VapixAPI.d.ts +281 -22
- package/cjs/types/VapixAPI.js +74 -4
- package/cjs/types/VapixEvents.d.ts +15 -0
- package/cjs/types/VapixEvents.js +2 -0
- package/cjs/types/common.d.ts +43 -3
- package/cjs/types/common.js +17 -2
- package/cjs/types/ws/CamOverlayEvents.d.ts +88 -0
- package/cjs/types/ws/CamOverlayEvents.js +19 -0
- package/cjs/types/ws/CamStreamerEvents.d.ts +282 -0
- package/cjs/types/ws/CamStreamerEvents.js +36 -0
- package/cjs/types/ws/PlaneTrackerEvents.d.ts +1703 -0
- package/cjs/types/ws/PlaneTrackerEvents.js +207 -0
- package/cjs/web/DefaultClient.d.ts +7 -5
- package/cjs/web/DefaultClient.js +25 -11
- package/cjs/web/WsClient.d.ts +9 -5
- package/cjs/web/WsClient.js +16 -18
- package/cjs/ws/CamOverlayEvents.d.ts +8 -0
- package/cjs/ws/CamOverlayEvents.js +24 -0
- package/cjs/ws/CamStreamerEvents.d.ts +8 -0
- package/cjs/ws/CamStreamerEvents.js +24 -0
- package/cjs/ws/CamSwitcherEvents.d.ts +8 -0
- package/cjs/ws/CamSwitcherEvents.js +24 -0
- package/cjs/ws/PlaneTrackerEvents.d.ts +9 -0
- package/cjs/ws/PlaneTrackerEvents.js +30 -0
- package/esm/CamOverlayAPI.js +99 -184
- package/esm/CamScripterAPI.js +52 -57
- package/esm/CamStreamerAPI.js +172 -51
- package/esm/CamSwitcherAPI.js +151 -192
- package/esm/PlaneTrackerAPI.js +186 -100
- package/esm/VapixAPI.js +402 -209
- package/esm/{CreatePackage.js → bin/CreatePackage.js} +16 -16
- package/esm/errors/errors.js +124 -6
- package/esm/index.js +20 -9
- package/esm/internal/BasicAPI.js +89 -0
- package/esm/internal/ProxyClient.js +28 -34
- package/esm/{CamSwitcherEvents.js → internal/WsEvents.js} +31 -20
- package/esm/internal/constants.js +1 -0
- package/esm/internal/convertors.js +108 -0
- package/esm/internal/transformers.js +1 -1
- package/esm/internal/utils.js +0 -9
- package/esm/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +26 -18
- 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 +12 -16
- package/esm/node/Digest.test.js +11 -0
- package/esm/node/HttpRequestSender.js +14 -4
- package/esm/node/HttpServer.js +1 -1
- package/esm/node/TimeZoneDaemon.js +25 -0
- 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 +120 -0
- package/esm/node/index.js +18 -2
- package/esm/types/CamOverlayAPI/CamOverlayAPI.js +113 -0
- package/esm/{models → types}/CamOverlayAPI/accuweatherSchema.js +3 -4
- package/esm/{models → types}/CamOverlayAPI/customGraphicsSchema.js +3 -4
- package/esm/types/CamOverlayAPI/htmlOverlaySchema.js +18 -0
- package/esm/types/CamOverlayAPI/imagesSchema.js +6 -0
- package/esm/{models → types}/CamOverlayAPI/index.js +3 -4
- package/esm/{models → types}/CamOverlayAPI/infotickerSchema.js +3 -4
- package/esm/{models → types}/CamOverlayAPI/pipSchema.js +4 -5
- package/esm/{models → types}/CamOverlayAPI/ptzCompassSchema.js +4 -4
- 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/{models/CamOverlayAPI/widgetCommonSchema.js → types/CamOverlayAPI/serviceCommonTypes.js} +38 -20
- package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +5 -0
- package/esm/types/CamOverlayDrawingAPI.js +1 -0
- package/esm/types/CamOverlayPainter.js +11 -0
- package/esm/types/CamScripterAPI.js +19 -7
- package/esm/types/CamScripterAPICameraEventsGenerator.js +1 -0
- package/esm/types/CamStreamerAPI/CamStreamerAPI.js +199 -0
- package/esm/types/CamStreamerAPI/facebookSchema.js +17 -0
- package/esm/types/CamStreamerAPI/index.js +6 -0
- package/esm/types/CamStreamerAPI/oldStreamSchema.js +50 -0
- package/esm/types/CamStreamerAPI/streamCommonTypes.js +120 -0
- package/esm/types/CamStreamerAPI/streamsSchema.js +75 -0
- package/esm/types/CamStreamerAPI/windySchema.js +13 -0
- package/esm/types/CamStreamerAPI/youtubeSchema.js +16 -0
- package/esm/types/CamSwitcherAPI.js +38 -1
- package/esm/types/GenetecAgent.js +28 -0
- package/esm/types/PlaneTrackerAPI.js +333 -0
- package/esm/types/VapixAPI.js +73 -3
- package/esm/types/VapixEvents.js +1 -0
- package/esm/types/common.js +16 -1
- package/esm/types/ws/CamOverlayEvents.js +16 -0
- package/esm/types/ws/CamStreamerEvents.js +33 -0
- package/esm/types/ws/PlaneTrackerEvents.js +204 -0
- package/esm/web/DefaultClient.js +25 -11
- 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 +46 -12
- package/{esm → types}/CamOverlayAPI.d.ts +603 -327
- package/types/CamScripterAPI.d.ts +43 -0
- package/types/CamStreamerAPI.d.ts +3559 -0
- package/types/CamSwitcherAPI.d.ts +168 -0
- package/types/PlaneTrackerAPI.d.ts +239 -0
- package/types/VapixAPI.d.ts +131 -0
- package/types/bin/CreatePackage.d.ts +1 -0
- package/types/errors/errors.d.ts +108 -0
- package/types/index.d.ts +28 -0
- package/types/internal/BasicAPI.d.ts +15 -0
- package/types/internal/ProxyClient.d.ts +10 -0
- package/types/internal/WsEvents.d.ts +38 -0
- package/{esm → types}/internal/constants.d.ts +1 -0
- package/types/internal/convertors.d.ts +6 -0
- package/types/internal/types.d.ts +47 -0
- package/{esm → types}/internal/utils.d.ts +1 -3
- package/{esm → types}/internal/versionCompare.d.ts +2 -2
- package/types/node/CamOverlayDrawingAPI.d.ts +41 -0
- package/{cjs → types/node}/CamOverlayPainter/Frame.d.ts +8 -37
- package/{esm → 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/{esm → types}/node/HttpServer.d.ts +1 -1
- package/types/node/TimeZoneDaemon.d.ts +6 -0
- 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 +18 -0
- package/{esm/models/CamOverlayAPI/widgetsSchema.d.ts → types/types/CamOverlayAPI/CamOverlayAPI.d.ts} +2794 -767
- package/{esm/models → types/types}/CamOverlayAPI/accuweatherSchema.d.ts +19 -19
- package/{esm/models → types/types}/CamOverlayAPI/customGraphicsSchema.d.ts +108 -107
- package/types/types/CamOverlayAPI/htmlOverlaySchema.d.ts +81 -0
- package/{cjs/models → types/types}/CamOverlayAPI/imagesSchema.d.ts +19 -19
- package/{esm/models → types/types}/CamOverlayAPI/index.d.ts +3 -4
- package/{esm/models → types/types}/CamOverlayAPI/infotickerSchema.d.ts +27 -27
- package/{cjs/models → types/types}/CamOverlayAPI/pipSchema.d.ts +21 -21
- package/{cjs/models → types/types}/CamOverlayAPI/ptzCompassSchema.d.ts +18 -15
- package/{esm/models → types/types}/CamOverlayAPI/ptzSchema.d.ts +28 -28
- package/types/types/CamOverlayAPI/scoreBoardSchema.d.ts +357 -0
- package/{cjs/models → types/types}/CamOverlayAPI/screenSharingSchema.d.ts +15 -15
- package/{cjs/models/CamOverlayAPI/widgetCommonSchema.d.ts → types/types/CamOverlayAPI/serviceCommonTypes.d.ts} +80 -60
- package/{cjs/models → types/types}/CamOverlayAPI/webCameraSharingSchema.d.ts +15 -15
- package/types/types/CamOverlayDrawingAPI.d.ts +48 -0
- package/types/types/CamOverlayPainter.d.ts +76 -0
- package/types/types/CamScripterAPI.d.ts +119 -0
- package/types/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
- package/types/types/CamStreamerAPI/CamStreamerAPI.d.ts +26085 -0
- package/types/types/CamStreamerAPI/facebookSchema.d.ts +574 -0
- package/types/types/CamStreamerAPI/index.d.ts +6 -0
- package/{esm/types/CamStreamerAPI.d.ts → types/types/CamStreamerAPI/oldStreamSchema.d.ts} +104 -35
- package/types/types/CamStreamerAPI/streamCommonTypes.d.ts +570 -0
- package/types/types/CamStreamerAPI/streamsSchema.d.ts +8642 -0
- package/types/types/CamStreamerAPI/windySchema.d.ts +534 -0
- package/types/types/CamStreamerAPI/youtubeSchema.d.ts +542 -0
- package/{esm → types}/types/CamSwitcherAPI.d.ts +205 -121
- package/{esm/events → types/types}/GenetecAgent.d.ts +47 -47
- package/types/types/PlaneTrackerAPI.d.ts +993 -0
- package/{esm → types}/types/VapixAPI.d.ts +281 -22
- package/types/types/VapixEvents.d.ts +15 -0
- package/types/types/common.d.ts +77 -0
- package/types/types/ws/CamOverlayEvents.d.ts +88 -0
- package/types/types/ws/CamStreamerEvents.d.ts +282 -0
- package/types/types/ws/PlaneTrackerEvents.d.ts +1703 -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/CamOverlayDrawingAPI.d.ts +0 -86
- package/cjs/CamOverlayPainter/ResourceManager.d.ts +0 -14
- package/cjs/CamOverlayPainter/ResourceManager.js +0 -46
- package/cjs/CamScripterAPICameraEventsGenerator.d.ts +0 -74
- package/cjs/CamSwitcherEvents.d.ts +0 -18
- package/cjs/VapixEvents.d.ts +0 -43
- package/cjs/events/AxisCameraStationEvents.d.ts +0 -10
- package/cjs/events/GenetecAgent.js +0 -123
- package/cjs/models/CamOverlayAPI/constants.d.ts +0 -11
- package/cjs/models/CamOverlayAPI/constants.js +0 -14
- package/cjs/models/CamOverlayAPI/fileSchema.d.ts +0 -28
- package/cjs/models/CamOverlayAPI/fileSchema.js +0 -17
- package/cjs/models/CamOverlayAPI/imagesSchema.js +0 -10
- package/cjs/models/CamOverlayAPI/ptzSchema.js +0 -13
- package/cjs/models/CamOverlayAPI/screenSharingSchema.js +0 -9
- package/cjs/models/CamOverlayAPI/webCameraSharingSchema.js +0 -9
- package/cjs/models/CamOverlayAPI/widgetsSchema.js +0 -27
- package/cjs/node/WsEventClient.d.ts +0 -13
- package/cjs/node/WsEventClient.js +0 -22
- package/cjs/types/CamOverlayAPI.d.ts +0 -328
- package/cjs/types/CamOverlayAPI.js +0 -26
- package/cjs/types/CamStreamerAPI.js +0 -28
- package/esm/CamOverlayDrawingAPI.d.ts +0 -86
- 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 -52
- package/esm/CamSwitcherEvents.d.ts +0 -18
- package/esm/PlaneTrackerAPI.d.ts +0 -30
- package/esm/VapixAPI.d.ts +0 -78
- package/esm/VapixEvents.d.ts +0 -43
- package/esm/errors/errors.d.ts +0 -37
- package/esm/events/AxisCameraStationEvents.d.ts +0 -10
- package/esm/events/GenetecAgent.js +0 -119
- package/esm/index.d.ts +0 -17
- package/esm/internal/ProxyClient.d.ts +0 -11
- package/esm/internal/types.d.ts +0 -35
- package/esm/models/CamOverlayAPI/constants.d.ts +0 -11
- package/esm/models/CamOverlayAPI/constants.js +0 -11
- package/esm/models/CamOverlayAPI/fileSchema.d.ts +0 -28
- package/esm/models/CamOverlayAPI/fileSchema.js +0 -14
- package/esm/models/CamOverlayAPI/imagesSchema.js +0 -7
- package/esm/models/CamOverlayAPI/ptzSchema.js +0 -10
- package/esm/models/CamOverlayAPI/screenSharingSchema.js +0 -6
- package/esm/models/CamOverlayAPI/webCameraSharingSchema.js +0 -6
- package/esm/models/CamOverlayAPI/widgetsSchema.js +0 -24
- package/esm/node/DefaultClient.d.ts +0 -16
- 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/types/CamOverlayAPI.d.ts +0 -328
- package/esm/types/CamOverlayAPI.js +0 -14
- package/esm/types/CamScripterAPI.d.ts +0 -67
- package/esm/types/CamStreamerAPI.js +0 -25
- 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 → bin/CreatePackage.d.ts} +0 -0
- package/cjs/{internal → node}/Digest.d.ts +0 -0
- package/{esm/CreatePackage.d.ts → cjs/node/Digest.test.d.ts} +0 -0
- package/{esm/types → cjs/types/ws}/CamSwitcherEvents.d.ts +8 -8
- package/cjs/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +0 -0
- package/esm/{internal → node}/Digest.js +0 -0
- package/esm/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +0 -0
- package/{esm → types}/internal/transformers.d.ts +0 -0
- package/{esm/internal → types/node}/Digest.d.ts +0 -0
- package/{cjs/types → types/types/ws}/CamSwitcherEvents.d.ts +8 -8
- /package/{esm/node → types/web}/index.d.ts +0 -0
package/esm/VapixAPI.js
CHANGED
|
@@ -1,54 +1,69 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { ApplicationAPIError, MaxFPSError, NoDeviceInfoError, PtzNotSupportedError, SDCardActionError, SDCardJobError, } from './errors/errors';
|
|
5
|
-
import { ProxyClient } from './internal/ProxyClient';
|
|
1
|
+
import { arrayToUrl, isNullish, paramToUrl } from './internal/utils';
|
|
2
|
+
import { sdCardWatchedStatuses, maxFpsResponseSchema, dateTimeinfoSchema, audioDeviceRequestSchema, audioSampleRatesResponseSchema, timeZoneSchema, getPortsResponseSchema, guardTourSchema, ptzOverviewSchema, cameraPTZItemDataSchema, applicationListSchema, sdCardInfoSchema, ALL_APP_IDS, } from './types/VapixAPI';
|
|
3
|
+
import { ApplicationAPIError, MaxFPSError, NoDeviceInfoError, PtzNotSupportedError, ErrorWithResponse, SDCardActionError, SDCardJobError, SettingParameterError, TimezoneFetchError, TimezoneNotSetupError, } from './errors/errors';
|
|
6
4
|
import { z } from 'zod';
|
|
7
5
|
import { XMLParser } from 'fast-xml-parser';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
import { BasicAPI } from './internal/BasicAPI';
|
|
7
|
+
export class VapixAPI extends BasicAPI {
|
|
8
|
+
CustomFormData;
|
|
9
|
+
constructor(client, CustomFormData = FormData) {
|
|
10
|
+
super(client);
|
|
11
|
+
this.CustomFormData = CustomFormData;
|
|
12
|
+
}
|
|
13
|
+
async postUrlEncoded(path, parameters, headers, options) {
|
|
14
14
|
const data = paramToUrl(parameters);
|
|
15
15
|
const head = { ...headers, 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
16
|
-
const
|
|
16
|
+
const agent = this.getClient(options?.proxyParams);
|
|
17
|
+
const res = await agent.post({ path, data, headers: head, timeout: options?.timeout });
|
|
17
18
|
if (!res.ok) {
|
|
18
|
-
throw new
|
|
19
|
+
throw new ErrorWithResponse(res);
|
|
19
20
|
}
|
|
20
21
|
return res;
|
|
21
22
|
}
|
|
22
|
-
async postJson(
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const res = await
|
|
23
|
+
async postJson(path, data, headers, options) {
|
|
24
|
+
const agent = this.getClient(options?.proxyParams);
|
|
25
|
+
const jsonData = JSON.stringify(data);
|
|
26
|
+
const res = await agent.post({
|
|
27
|
+
path,
|
|
28
|
+
data: jsonData,
|
|
29
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
30
|
+
timeout: options?.timeout,
|
|
31
|
+
});
|
|
26
32
|
if (!res.ok) {
|
|
27
|
-
throw new
|
|
33
|
+
throw new ErrorWithResponse(res);
|
|
28
34
|
}
|
|
29
35
|
return res;
|
|
30
36
|
}
|
|
31
|
-
async getCameraImage(
|
|
32
|
-
|
|
37
|
+
async getCameraImage(parameters, options) {
|
|
38
|
+
const agent = this.getClient(options?.proxyParams);
|
|
39
|
+
return (await agent.get({
|
|
40
|
+
path: '/axis-cgi/jpg/image.cgi',
|
|
41
|
+
parameters,
|
|
42
|
+
timeout: options?.timeout,
|
|
43
|
+
}));
|
|
33
44
|
}
|
|
34
|
-
async getEventDeclarations(
|
|
45
|
+
async getEventDeclarations(options) {
|
|
35
46
|
const data = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">' +
|
|
36
47
|
'<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
|
|
37
48
|
'xmlns:xsd="http://www.w3.org/2001/XMLSchema">' +
|
|
38
49
|
'<GetEventInstances xmlns="http://www.axis.com/vapix/ws/event1"/>' +
|
|
39
50
|
'</s:Body>' +
|
|
40
51
|
'</s:Envelope>';
|
|
41
|
-
const
|
|
52
|
+
const agent = this.getClient(options?.proxyParams);
|
|
53
|
+
const res = await agent.post({
|
|
54
|
+
path: '/vapix/services',
|
|
55
|
+
data,
|
|
56
|
+
headers: { 'Content-Type': 'application/soap+xml' },
|
|
57
|
+
});
|
|
42
58
|
if (!res.ok) {
|
|
43
|
-
throw new
|
|
59
|
+
throw new ErrorWithResponse(res);
|
|
44
60
|
}
|
|
45
|
-
|
|
46
|
-
return prettifyXml(declarations);
|
|
61
|
+
return await res.text();
|
|
47
62
|
}
|
|
48
|
-
async getSupportedAudioSampleRate(
|
|
49
|
-
const
|
|
63
|
+
async getSupportedAudioSampleRate(options) {
|
|
64
|
+
const path = '/axis-cgi/audio/streamingcapabilities.cgi';
|
|
50
65
|
const jsonData = { apiVersion: '1.0', method: 'list' };
|
|
51
|
-
const res = await this.
|
|
66
|
+
const res = await this._postJsonEncoded(path, jsonData, undefined, options);
|
|
52
67
|
const encoders = audioSampleRatesResponseSchema.parse(await res.json()).data.encoders;
|
|
53
68
|
const data = encoders.aac ?? encoders.AAC ?? [];
|
|
54
69
|
return data.map((item) => {
|
|
@@ -58,7 +73,7 @@ export class VapixAPI {
|
|
|
58
73
|
};
|
|
59
74
|
});
|
|
60
75
|
}
|
|
61
|
-
async performAutofocus(
|
|
76
|
+
async performAutofocus(options) {
|
|
62
77
|
try {
|
|
63
78
|
const data = {
|
|
64
79
|
apiVersion: '1',
|
|
@@ -71,19 +86,19 @@ export class VapixAPI {
|
|
|
71
86
|
],
|
|
72
87
|
},
|
|
73
88
|
};
|
|
74
|
-
await this.
|
|
89
|
+
await this._postJsonEncoded('/axis-cgi/opticscontrol.cgi', data, undefined, options);
|
|
75
90
|
}
|
|
76
91
|
catch (err) {
|
|
77
|
-
await this.
|
|
92
|
+
await this._postUrlEncoded('/axis-cgi/opticssetup.cgi', {
|
|
78
93
|
autofocus: 'perform',
|
|
79
94
|
source: '1',
|
|
80
|
-
});
|
|
95
|
+
}, options);
|
|
81
96
|
}
|
|
82
97
|
}
|
|
83
|
-
async checkSDCard(
|
|
84
|
-
const res = await this.
|
|
98
|
+
async checkSDCard(options) {
|
|
99
|
+
const res = await this._postUrlEncoded('/axis-cgi/disks/list.cgi', {
|
|
85
100
|
diskid: 'SD_DISK',
|
|
86
|
-
});
|
|
101
|
+
}, options);
|
|
87
102
|
const xmlText = await res.text();
|
|
88
103
|
const parser = new XMLParser({
|
|
89
104
|
ignoreAttributes: false,
|
|
@@ -92,23 +107,23 @@ export class VapixAPI {
|
|
|
92
107
|
});
|
|
93
108
|
const result = parser.parse(xmlText);
|
|
94
109
|
const data = result.root.disks.disk;
|
|
95
|
-
return {
|
|
110
|
+
return sdCardInfoSchema.parse({
|
|
96
111
|
totalSize: parseInt(data.totalsize),
|
|
97
112
|
freeSize: parseInt(data.freesize),
|
|
98
113
|
status: sdCardWatchedStatuses.includes(data.status) ? data.status : 'disconnected',
|
|
99
|
-
};
|
|
114
|
+
});
|
|
100
115
|
}
|
|
101
|
-
mountSDCard(
|
|
102
|
-
return this._doSDCardMountAction('MOUNT',
|
|
116
|
+
mountSDCard(options) {
|
|
117
|
+
return this._doSDCardMountAction('MOUNT', options);
|
|
103
118
|
}
|
|
104
|
-
unmountSDCard(
|
|
105
|
-
return this._doSDCardMountAction('UNMOUNT',
|
|
119
|
+
unmountSDCard(options) {
|
|
120
|
+
return this._doSDCardMountAction('UNMOUNT', options);
|
|
106
121
|
}
|
|
107
|
-
async _doSDCardMountAction(action,
|
|
108
|
-
const res = await this.
|
|
122
|
+
async _doSDCardMountAction(action, options) {
|
|
123
|
+
const res = await this._postUrlEncoded('/axis-cgi/disks/mount.cgi', {
|
|
109
124
|
action: action,
|
|
110
125
|
diskid: 'SD_DISK',
|
|
111
|
-
});
|
|
126
|
+
}, options);
|
|
112
127
|
const textXml = await res.text();
|
|
113
128
|
const parser = new XMLParser({
|
|
114
129
|
ignoreAttributes: false,
|
|
@@ -118,15 +133,15 @@ export class VapixAPI {
|
|
|
118
133
|
const result = parser.parse(textXml);
|
|
119
134
|
const job = result.root.job;
|
|
120
135
|
if (job.result !== 'OK') {
|
|
121
|
-
throw new SDCardActionError(action,
|
|
136
|
+
throw new SDCardActionError(action, job.description);
|
|
122
137
|
}
|
|
123
138
|
return Number(job.jobid);
|
|
124
139
|
}
|
|
125
|
-
async fetchSDCardJobProgress(jobId,
|
|
126
|
-
const res = await this.
|
|
140
|
+
async fetchSDCardJobProgress(jobId, options) {
|
|
141
|
+
const res = await this._postUrlEncoded('/axis-cgi/disks/job.cgi', {
|
|
127
142
|
jobid: String(jobId),
|
|
128
143
|
diskid: 'SD_DISK',
|
|
129
|
-
});
|
|
144
|
+
}, options);
|
|
130
145
|
const textXml = await res.text();
|
|
131
146
|
const parser = new XMLParser({
|
|
132
147
|
ignoreAttributes: false,
|
|
@@ -135,19 +150,20 @@ export class VapixAPI {
|
|
|
135
150
|
});
|
|
136
151
|
const job = parser.parse(textXml).root.job;
|
|
137
152
|
if (job.result !== 'OK') {
|
|
138
|
-
throw new SDCardJobError();
|
|
153
|
+
throw new SDCardJobError(job.description);
|
|
139
154
|
}
|
|
140
155
|
return Number(job.progress);
|
|
141
156
|
}
|
|
142
|
-
downloadCameraReport(
|
|
143
|
-
return this.
|
|
157
|
+
downloadCameraReport(options) {
|
|
158
|
+
return this._getText('/axis-cgi/serverreport.cgi', { mode: 'text' }, options);
|
|
144
159
|
}
|
|
145
|
-
getSystemLog(
|
|
146
|
-
|
|
160
|
+
async getSystemLog(options) {
|
|
161
|
+
const res = await this._postUrlEncoded('/axis-cgi/admin/systemlog.cgi', {}, options);
|
|
162
|
+
return res.text();
|
|
147
163
|
}
|
|
148
|
-
async getMaxFps(channel,
|
|
164
|
+
async getMaxFps(channel, options) {
|
|
149
165
|
const data = { apiVersion: '1.0', method: 'getCaptureModes' };
|
|
150
|
-
const res = await this.
|
|
166
|
+
const res = await this._postJsonEncoded('/axis-cgi/capturemode.cgi', data, undefined, options);
|
|
151
167
|
const response = maxFpsResponseSchema.parse(await res.json());
|
|
152
168
|
const channels = response.data;
|
|
153
169
|
if (channels === undefined) {
|
|
@@ -165,21 +181,40 @@ export class VapixAPI {
|
|
|
165
181
|
if (isNullish(captureMode.maxFPS)) {
|
|
166
182
|
throw new MaxFPSError('FPS_NOT_SPECIFIED');
|
|
167
183
|
}
|
|
168
|
-
return captureMode.maxFPS;
|
|
184
|
+
return z.number().parse(captureMode.maxFPS);
|
|
169
185
|
}
|
|
170
|
-
async getTimezone(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
186
|
+
async getTimezone(options) {
|
|
187
|
+
try {
|
|
188
|
+
const agent = this.getClient(options?.proxyParams);
|
|
189
|
+
const resV2 = await agent.get({ path: '/config/rest/time/v2/timeZone', timeout: options?.timeout });
|
|
190
|
+
if (!resV2.ok) {
|
|
191
|
+
throw new ErrorWithResponse(resV2);
|
|
192
|
+
}
|
|
193
|
+
const json = await resV2.json();
|
|
194
|
+
const data = timeZoneSchema.parse(json);
|
|
195
|
+
if (data.status === 'error') {
|
|
196
|
+
throw new TimezoneFetchError(data.error.message);
|
|
197
|
+
}
|
|
198
|
+
return data.data.activeTimeZone;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
console.warn('Failed to fetch time zone data from time API v2:', error instanceof Error ? error.message : JSON.stringify(error));
|
|
202
|
+
console.warn('Falling back to deprecated time API v1');
|
|
203
|
+
}
|
|
204
|
+
const data = await this.getDateTimeInfo(options);
|
|
205
|
+
if (data.data.timeZone === undefined) {
|
|
206
|
+
throw new TimezoneNotSetupError();
|
|
207
|
+
}
|
|
208
|
+
return z.string().parse(data.data.timeZone);
|
|
174
209
|
}
|
|
175
|
-
async getDateTimeInfo(
|
|
210
|
+
async getDateTimeInfo(options) {
|
|
176
211
|
const data = { apiVersion: '1.0', method: 'getDateTimeInfo' };
|
|
177
|
-
const res = await this.
|
|
212
|
+
const res = await this._postJsonEncoded('/axis-cgi/time.cgi', data, undefined, options);
|
|
178
213
|
return dateTimeinfoSchema.parse(await res.json());
|
|
179
214
|
}
|
|
180
|
-
async getDevicesSettings(
|
|
215
|
+
async getDevicesSettings(options) {
|
|
181
216
|
const data = { apiVersion: '1.0', method: 'getDevicesSettings' };
|
|
182
|
-
const res = await this.
|
|
217
|
+
const res = await this._postJsonEncoded('/axis-cgi/audiodevicecontrol.cgi', data, undefined, options);
|
|
183
218
|
const result = audioDeviceRequestSchema.parse(await res.json());
|
|
184
219
|
return result.data.devices.map((device) => ({
|
|
185
220
|
...device,
|
|
@@ -187,46 +222,45 @@ export class VapixAPI {
|
|
|
187
222
|
outputs: (device.outputs || []).sort((a, b) => a.id.localeCompare(b.id)),
|
|
188
223
|
}));
|
|
189
224
|
}
|
|
190
|
-
async fetchRemoteDeviceInfo(payload,
|
|
191
|
-
const res = await this.
|
|
225
|
+
async fetchRemoteDeviceInfo(payload, options) {
|
|
226
|
+
const res = await this._postJsonEncoded('/axis-cgi/basicdeviceinfo.cgi', payload, undefined, options);
|
|
192
227
|
const json = await res.json();
|
|
193
228
|
if (isNullish(json.data)) {
|
|
194
229
|
throw new NoDeviceInfoError();
|
|
195
230
|
}
|
|
196
231
|
return json.data;
|
|
197
232
|
}
|
|
198
|
-
async getHeaders(
|
|
233
|
+
async getHeaders(options) {
|
|
199
234
|
const data = { apiVersion: '1.0', method: 'list' };
|
|
200
|
-
const res = await this.
|
|
235
|
+
const res = await this._postJsonEncoded('/axis-cgi/customhttpheader.cgi', data, undefined, options);
|
|
201
236
|
return z.object({ data: z.record(z.string()) }).parse(await res.json()).data;
|
|
202
237
|
}
|
|
203
|
-
async setHeaders(headers,
|
|
238
|
+
async setHeaders(headers, options) {
|
|
204
239
|
const data = { apiVersion: '1.0', method: 'set', params: headers };
|
|
205
|
-
|
|
240
|
+
await this._postJsonEncoded('/axis-cgi/customhttpheader.cgi', data, undefined, options);
|
|
206
241
|
}
|
|
207
|
-
async getParameter(paramNames,
|
|
208
|
-
const response = await this.
|
|
242
|
+
async getParameter(paramNames, options) {
|
|
243
|
+
const response = await this._postUrlEncoded('/axis-cgi/param.cgi', {
|
|
209
244
|
action: 'list',
|
|
210
245
|
group: arrayToUrl(paramNames),
|
|
211
|
-
});
|
|
212
|
-
return parseParameters(await response.text());
|
|
246
|
+
}, options);
|
|
247
|
+
return VapixAPI.parseParameters(await response.text());
|
|
213
248
|
}
|
|
214
|
-
async setParameter(params,
|
|
215
|
-
const res = await this.
|
|
249
|
+
async setParameter(params, options) {
|
|
250
|
+
const res = await this._postUrlEncoded('/axis-cgi/param.cgi', {
|
|
216
251
|
...params,
|
|
217
252
|
action: 'update',
|
|
218
|
-
});
|
|
253
|
+
}, options);
|
|
219
254
|
const responseText = await res.text();
|
|
220
255
|
if (responseText.startsWith('# Error')) {
|
|
221
|
-
throw new
|
|
256
|
+
throw new SettingParameterError(responseText);
|
|
222
257
|
}
|
|
223
|
-
return true;
|
|
224
258
|
}
|
|
225
|
-
async getGuardTourList(
|
|
259
|
+
async getGuardTourList(options) {
|
|
226
260
|
const gTourList = new Array();
|
|
227
|
-
const response = await this.getParameter('GuardTour',
|
|
261
|
+
const response = await this.getParameter('GuardTour', options);
|
|
228
262
|
for (let i = 0; i < 20; i++) {
|
|
229
|
-
const gTourBaseName = '
|
|
263
|
+
const gTourBaseName = 'GuardTour.G' + i;
|
|
230
264
|
if (gTourBaseName + '.CamNbr' in response) {
|
|
231
265
|
const gTour = {
|
|
232
266
|
id: gTourBaseName,
|
|
@@ -238,7 +272,7 @@ export class VapixAPI {
|
|
|
238
272
|
tour: [],
|
|
239
273
|
};
|
|
240
274
|
for (let j = 0; j < 100; j++) {
|
|
241
|
-
const tourBaseName = '
|
|
275
|
+
const tourBaseName = 'GuardTour.G' + i + '.Tour.T' + j;
|
|
242
276
|
if (tourBaseName + '.MoveSpeed' in response) {
|
|
243
277
|
const tour = {
|
|
244
278
|
moveSpeed: response[tourBaseName + '.MoveSpeed'],
|
|
@@ -256,18 +290,18 @@ export class VapixAPI {
|
|
|
256
290
|
break;
|
|
257
291
|
}
|
|
258
292
|
}
|
|
259
|
-
return gTourList;
|
|
293
|
+
return guardTourSchema.parse(gTourList);
|
|
260
294
|
}
|
|
261
|
-
setGuardTourEnabled(
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
return this.setParameter(
|
|
295
|
+
setGuardTourEnabled(guardTourId, enable, options) {
|
|
296
|
+
const params = {};
|
|
297
|
+
params[guardTourId + '.Running'] = enable ? 'yes' : 'no';
|
|
298
|
+
return this.setParameter(params, options);
|
|
265
299
|
}
|
|
266
|
-
async getPTZPresetList(channel,
|
|
267
|
-
const res = await this.
|
|
300
|
+
async getPTZPresetList(channel, options) {
|
|
301
|
+
const res = await this._postUrlEncoded('/axis-cgi/com/ptz.cgi', {
|
|
268
302
|
query: 'presetposcam',
|
|
269
|
-
camera: channel
|
|
270
|
-
});
|
|
303
|
+
camera: channel,
|
|
304
|
+
}, options);
|
|
271
305
|
const text = await res.text();
|
|
272
306
|
const lines = text.split(/[\r\n]/);
|
|
273
307
|
const positions = [];
|
|
@@ -280,68 +314,178 @@ export class VapixAPI {
|
|
|
280
314
|
}
|
|
281
315
|
}
|
|
282
316
|
}
|
|
283
|
-
return positions;
|
|
317
|
+
return z.array(z.string()).parse(positions);
|
|
284
318
|
}
|
|
285
|
-
async listPTZ(camera,
|
|
319
|
+
async listPTZ(camera, options) {
|
|
286
320
|
const url = `/axis-cgi/com/ptz.cgi`;
|
|
287
|
-
const response = await this.
|
|
321
|
+
const response = await this._postUrlEncoded(url, {
|
|
288
322
|
camera,
|
|
289
323
|
query: 'presetposcamdata',
|
|
290
324
|
format: 'json',
|
|
291
|
-
});
|
|
325
|
+
}, options);
|
|
292
326
|
const text = await response.text();
|
|
293
327
|
if (text === '') {
|
|
294
328
|
throw new PtzNotSupportedError();
|
|
295
329
|
}
|
|
296
|
-
return parseCameraPtzResponse(text)[camera] ?? [];
|
|
330
|
+
return VapixAPI.parseCameraPtzResponse(text)[camera] ?? [];
|
|
297
331
|
}
|
|
298
|
-
async listPtzVideoSourceOverview(
|
|
299
|
-
const response = await this.
|
|
332
|
+
async listPtzVideoSourceOverview(options) {
|
|
333
|
+
const response = await this._postUrlEncoded('/axis-cgi/com/ptz.cgi', {
|
|
300
334
|
query: 'presetposall',
|
|
301
335
|
format: 'json',
|
|
302
|
-
});
|
|
336
|
+
}, options);
|
|
303
337
|
const text = await response.text();
|
|
304
338
|
if (text === '') {
|
|
305
339
|
throw new PtzNotSupportedError();
|
|
306
340
|
}
|
|
307
|
-
const data = parseCameraPtzResponse(text);
|
|
341
|
+
const data = VapixAPI.parseCameraPtzResponse(text);
|
|
308
342
|
const res = {};
|
|
309
343
|
Object.keys(data)
|
|
310
344
|
.map(Number)
|
|
311
345
|
.forEach((camera) => {
|
|
312
|
-
|
|
313
|
-
|
|
346
|
+
const item = data[camera];
|
|
347
|
+
if (item !== undefined) {
|
|
348
|
+
res[camera - 1] = item.map(({ data: itemData, ...d }) => d);
|
|
314
349
|
}
|
|
315
350
|
});
|
|
316
|
-
return res;
|
|
351
|
+
return ptzOverviewSchema.parse(res);
|
|
317
352
|
}
|
|
318
|
-
goToPreset(channel, presetName,
|
|
319
|
-
|
|
353
|
+
async goToPreset(channel, presetName, options) {
|
|
354
|
+
await this._postUrlEncoded('/axis-cgi/com/ptz.cgi', {
|
|
320
355
|
camera: channel.toString(),
|
|
321
356
|
gotoserverpresetname: presetName,
|
|
322
|
-
});
|
|
357
|
+
}, options);
|
|
323
358
|
}
|
|
324
|
-
async getPtzPosition(camera,
|
|
325
|
-
const res = await this.
|
|
359
|
+
async getPtzPosition(camera, options) {
|
|
360
|
+
const res = await this._postUrlEncoded('/axis-cgi/com/ptz.cgi', {
|
|
326
361
|
query: 'position',
|
|
327
362
|
camera: camera.toString(),
|
|
328
|
-
});
|
|
329
|
-
const params = parseParameters(await res.text());
|
|
330
|
-
return {
|
|
363
|
+
}, options);
|
|
364
|
+
const params = VapixAPI.parseParameters(await res.text());
|
|
365
|
+
return cameraPTZItemDataSchema.parse({
|
|
331
366
|
pan: Number(params.pan),
|
|
332
367
|
tilt: Number(params.tilt),
|
|
333
368
|
zoom: Number(params.zoom),
|
|
334
|
-
};
|
|
369
|
+
});
|
|
335
370
|
}
|
|
336
|
-
async
|
|
337
|
-
const
|
|
338
|
-
|
|
371
|
+
async getPorts(options) {
|
|
372
|
+
const res = await this._postJsonEncoded('/axis-cgi/io/portmanagement.cgi', {
|
|
373
|
+
apiVersion: '1.0',
|
|
374
|
+
context: '',
|
|
375
|
+
method: 'getPorts',
|
|
376
|
+
}, undefined, options);
|
|
377
|
+
const portResponseParsed = getPortsResponseSchema.parse(await res.json());
|
|
378
|
+
return portResponseParsed.data.items ?? [];
|
|
379
|
+
}
|
|
380
|
+
async setPorts(ports, options) {
|
|
381
|
+
await this._postJsonEncoded('/axis-cgi/io/portmanagement.cgi', {
|
|
382
|
+
apiVersion: '1.0',
|
|
383
|
+
context: '',
|
|
384
|
+
method: 'setPorts',
|
|
385
|
+
params: { ports },
|
|
386
|
+
}, undefined, options);
|
|
387
|
+
}
|
|
388
|
+
async setPortStateSequence(port, sequence, options) {
|
|
389
|
+
await this._postJsonEncoded('/axis-cgi/io/portmanagement.cgi', {
|
|
390
|
+
apiVersion: '1.0',
|
|
391
|
+
context: '',
|
|
392
|
+
method: 'setStateSequence',
|
|
393
|
+
params: { port, sequence },
|
|
394
|
+
}, undefined, options);
|
|
395
|
+
}
|
|
396
|
+
async addCameraUser(username, pass, sgrp, comment, options) {
|
|
397
|
+
const res = await this._postUrlEncoded('/axis-cgi/pwdgrp.cgi', {
|
|
398
|
+
action: 'add',
|
|
399
|
+
user: username,
|
|
400
|
+
pwd: pass,
|
|
401
|
+
grp: 'users',
|
|
402
|
+
sgrp,
|
|
403
|
+
comment,
|
|
404
|
+
}, options);
|
|
405
|
+
await VapixAPI.checkTextResponseForError(res);
|
|
406
|
+
}
|
|
407
|
+
async getCameraUsers(options) {
|
|
408
|
+
const res = await this._postUrlEncoded('/axis-cgi/pwdgrp.cgi', {
|
|
409
|
+
action: 'get',
|
|
410
|
+
}, options);
|
|
411
|
+
const responseText = await VapixAPI.checkTextResponseForError(res);
|
|
412
|
+
const viewersString = responseText.match(/^viewer="([a-z0-9,]*)"/im)?.[1] ?? '';
|
|
413
|
+
return viewersString.split(',');
|
|
414
|
+
}
|
|
415
|
+
async editCameraUser(username, pass, options) {
|
|
416
|
+
const res = await this._postUrlEncoded('/axis-cgi/pwdgrp.cgi', {
|
|
417
|
+
action: 'update',
|
|
418
|
+
user: username,
|
|
419
|
+
pwd: pass,
|
|
420
|
+
}, options);
|
|
421
|
+
await VapixAPI.checkTextResponseForError(res);
|
|
422
|
+
}
|
|
423
|
+
async getRecordingRuleList(options) {
|
|
424
|
+
const res = await this._getText('/axis-cgi/record/continuous/listconfiguration.cgi', undefined, options);
|
|
425
|
+
const resultNode = VapixAPI.parseXmlResponse(res, 'continuousrecordingconfigurations');
|
|
426
|
+
const configurationNodes = resultNode.getElementsByTagName('continuousrecordingconfiguration');
|
|
427
|
+
const configs = [];
|
|
428
|
+
for (const node of configurationNodes) {
|
|
429
|
+
if (isNullish(node)) {
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
configs.push({
|
|
433
|
+
profile: node.getAttribute('profile') ?? '',
|
|
434
|
+
diskid: node.getAttribute('diskid') ?? '',
|
|
435
|
+
options: VapixAPI.parseQueryString(node.getAttribute('options')),
|
|
436
|
+
eventid: node.getAttribute('eventid') ?? '',
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
return configs;
|
|
440
|
+
}
|
|
441
|
+
async addRecordingRule(params, options) {
|
|
442
|
+
const res = await this._getText('/axis-cgi/record/continuous/addconfiguration.cgi', params, options);
|
|
443
|
+
const resultNode = VapixAPI.parseXmlResponse(res, 'configure');
|
|
444
|
+
const result = resultNode.getAttribute('result');
|
|
445
|
+
if (result !== 'OK') {
|
|
446
|
+
throw new Error(resultNode.getAttribute('errormsg') ?? result ?? 'Unknown error');
|
|
447
|
+
}
|
|
448
|
+
return resultNode.getAttribute('profile');
|
|
449
|
+
}
|
|
450
|
+
async removeRecordingRule(profileId, options) {
|
|
451
|
+
const res = await this._getText('/axis-cgi/record/continuous/removeconfiguration.cgi', {
|
|
452
|
+
profile: profileId,
|
|
453
|
+
}, options);
|
|
454
|
+
const resultNode = VapixAPI.parseXmlResponse(res, 'remove');
|
|
455
|
+
const result = resultNode.getAttribute('result');
|
|
456
|
+
if (result !== 'OK') {
|
|
457
|
+
throw new Error(resultNode.getAttribute('errormsg') ?? result ?? 'Unknown error');
|
|
458
|
+
}
|
|
339
459
|
}
|
|
340
|
-
async
|
|
341
|
-
|
|
460
|
+
async getDiskInfo(diskId = 'all', options) {
|
|
461
|
+
const res = await this._getText('/axis-cgi/disks/list.cgi', {
|
|
462
|
+
diskid: diskId,
|
|
463
|
+
}, options);
|
|
464
|
+
const resultNode = VapixAPI.parseXmlResponse(res, 'disks');
|
|
465
|
+
const disks = resultNode.getElementsByTagName('disk');
|
|
466
|
+
if (isNullish(disks) || disks.length === 0) {
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
const requiredReadyProps = {
|
|
470
|
+
status: 'OK',
|
|
471
|
+
locked: 'no',
|
|
472
|
+
readonly: 'no',
|
|
473
|
+
};
|
|
474
|
+
for (const disk of disks) {
|
|
475
|
+
let isReady = true;
|
|
476
|
+
for (const name in requiredReadyProps) {
|
|
477
|
+
const value = disk.getAttribute(name);
|
|
478
|
+
isReady = isReady && requiredReadyProps[name] === value;
|
|
479
|
+
}
|
|
480
|
+
if (isReady) {
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return false;
|
|
342
485
|
}
|
|
343
|
-
async getApplicationList(
|
|
344
|
-
const
|
|
486
|
+
async getApplicationList(options) {
|
|
487
|
+
const agent = this.getClient(options?.proxyParams);
|
|
488
|
+
const res = await agent.get({ path: '/axis-cgi/applications/list.cgi', timeout: options?.timeout });
|
|
345
489
|
const xml = await res.text();
|
|
346
490
|
const parser = new XMLParser({
|
|
347
491
|
ignoreAttributes: false,
|
|
@@ -349,121 +493,170 @@ export class VapixAPI {
|
|
|
349
493
|
allowBooleanAttributes: true,
|
|
350
494
|
});
|
|
351
495
|
const result = parser.parse(xml);
|
|
352
|
-
|
|
496
|
+
let apps = result.reply.application ?? [];
|
|
497
|
+
if (!Array.isArray(apps)) {
|
|
498
|
+
apps = [apps];
|
|
499
|
+
}
|
|
500
|
+
const appList = apps.map((app) => {
|
|
353
501
|
return {
|
|
354
502
|
...app,
|
|
355
|
-
appId:
|
|
503
|
+
appId: ALL_APP_IDS.find((id) => id.toLowerCase() === app.Name.toLowerCase()) ?? null,
|
|
356
504
|
};
|
|
357
505
|
});
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
506
|
+
return applicationListSchema.parse(appList);
|
|
507
|
+
}
|
|
508
|
+
async startApplication(applicationId, options) {
|
|
509
|
+
const agent = this.getClient(options?.proxyParams);
|
|
510
|
+
const res = await agent.get({
|
|
511
|
+
path: '/axis-cgi/applications/control.cgi',
|
|
512
|
+
parameters: {
|
|
513
|
+
package: applicationId.toLowerCase(),
|
|
514
|
+
action: 'start',
|
|
515
|
+
},
|
|
516
|
+
timeout: options?.timeout,
|
|
363
517
|
});
|
|
364
518
|
const text = (await res.text()).trim().toLowerCase();
|
|
365
519
|
if (text !== 'ok' && !(text.startsWith('error:') && text.substring(7) === '6')) {
|
|
366
|
-
throw new ApplicationAPIError('START',
|
|
520
|
+
throw new ApplicationAPIError('START', text);
|
|
367
521
|
}
|
|
368
522
|
}
|
|
369
|
-
async restartApplication(
|
|
370
|
-
const
|
|
371
|
-
|
|
372
|
-
|
|
523
|
+
async restartApplication(applicationId, options) {
|
|
524
|
+
const agent = this.getClient(options?.proxyParams);
|
|
525
|
+
const res = await agent.get({
|
|
526
|
+
path: '/axis-cgi/applications/control.cgi',
|
|
527
|
+
parameters: {
|
|
528
|
+
package: applicationId.toLowerCase(),
|
|
529
|
+
action: 'restart',
|
|
530
|
+
},
|
|
531
|
+
timeout: options?.timeout,
|
|
373
532
|
});
|
|
374
533
|
const text = (await res.text()).trim().toLowerCase();
|
|
375
534
|
if (text !== 'ok') {
|
|
376
|
-
throw new ApplicationAPIError('RESTART',
|
|
535
|
+
throw new ApplicationAPIError('RESTART', text);
|
|
377
536
|
}
|
|
378
537
|
}
|
|
379
|
-
async stopApplication(
|
|
380
|
-
const
|
|
381
|
-
|
|
382
|
-
|
|
538
|
+
async stopApplication(applicationId, options) {
|
|
539
|
+
const agent = this.getClient(options?.proxyParams);
|
|
540
|
+
const res = await agent.get({
|
|
541
|
+
path: '/axis-cgi/applications/control.cgi',
|
|
542
|
+
parameters: {
|
|
543
|
+
package: applicationId.toLowerCase(),
|
|
544
|
+
action: 'stop',
|
|
545
|
+
},
|
|
546
|
+
timeout: options?.timeout,
|
|
383
547
|
});
|
|
384
548
|
const text = (await res.text()).trim().toLowerCase();
|
|
385
549
|
if (text !== 'ok' && !(text.startsWith('error:') && text.substring(7) === '6')) {
|
|
386
|
-
throw new ApplicationAPIError('STOP',
|
|
550
|
+
throw new ApplicationAPIError('STOP', text);
|
|
387
551
|
}
|
|
388
552
|
}
|
|
389
|
-
async installApplication(data, fileName) {
|
|
390
|
-
const formData = new
|
|
553
|
+
async installApplication(data, fileName, options) {
|
|
554
|
+
const formData = new this.CustomFormData();
|
|
391
555
|
formData.append('packfil', data, fileName);
|
|
392
|
-
const
|
|
393
|
-
|
|
556
|
+
const agent = this.getClient(options?.proxyParams);
|
|
557
|
+
const res = await agent.post({
|
|
558
|
+
path: '/axis-cgi/applications/upload.cgi',
|
|
559
|
+
data: formData,
|
|
560
|
+
headers: {
|
|
561
|
+
contentType: 'application/octet-stream',
|
|
562
|
+
},
|
|
563
|
+
timeout: options?.timeout ?? 300000,
|
|
394
564
|
});
|
|
395
565
|
if (!res.ok) {
|
|
396
|
-
throw new
|
|
566
|
+
throw new ErrorWithResponse(res);
|
|
397
567
|
}
|
|
398
568
|
const text = await res.text();
|
|
399
569
|
if (text.length > 5) {
|
|
400
|
-
throw new
|
|
570
|
+
throw new ApplicationAPIError('INSTALL', text);
|
|
401
571
|
}
|
|
402
572
|
}
|
|
403
|
-
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
};
|
|
420
|
-
const
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
if (!key.startsWith('Camera ')) {
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
const camera = Number(key.replace('Camera ', ''));
|
|
428
|
-
if (json[key].presets !== undefined) {
|
|
429
|
-
parsed[camera] = parsePtz(json[key].presets);
|
|
430
|
-
}
|
|
431
|
-
});
|
|
432
|
-
return parsed;
|
|
433
|
-
};
|
|
434
|
-
const parsePtz = (parsed) => {
|
|
435
|
-
const res = [];
|
|
436
|
-
parsed.forEach((value) => {
|
|
437
|
-
const delimiterPos = value.indexOf('=');
|
|
438
|
-
if (delimiterPos === -1) {
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
if (!value.startsWith('presetposno')) {
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
const id = Number(value.substring(11, delimiterPos));
|
|
445
|
-
if (Number.isNaN(id)) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
const data = value.substring(delimiterPos + 1).split(':');
|
|
449
|
-
const getValue = (valueName) => {
|
|
450
|
-
for (const d of data) {
|
|
451
|
-
const p = d.split('=');
|
|
452
|
-
if (p[0] === valueName) {
|
|
453
|
-
return Number(p[1]);
|
|
454
|
-
}
|
|
573
|
+
static parseQueryString = (queryString) => {
|
|
574
|
+
const entries = queryString
|
|
575
|
+
?.split('&')
|
|
576
|
+
.filter((x) => x !== '')
|
|
577
|
+
.map((x) => x.split('=', 2));
|
|
578
|
+
return !isNullish(entries) ? Object.fromEntries(entries) : {};
|
|
579
|
+
};
|
|
580
|
+
static checkTextResponseForError = async (response) => {
|
|
581
|
+
const responseText = await response.text();
|
|
582
|
+
const isError = responseText.match(/Error:([^<]*)/);
|
|
583
|
+
if (!isNullish(isError)) {
|
|
584
|
+
throw new ErrorWithResponse(response);
|
|
585
|
+
}
|
|
586
|
+
return responseText;
|
|
587
|
+
};
|
|
588
|
+
static parseParameters = (response) => {
|
|
589
|
+
const params = {};
|
|
590
|
+
const lines = response.split(/[\r\n]/);
|
|
591
|
+
for (const line of lines) {
|
|
592
|
+
if (line.length === 0 || line.substring(0, 7) === '# Error') {
|
|
593
|
+
continue;
|
|
455
594
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
595
|
+
const delimiterPos = line.indexOf('=');
|
|
596
|
+
if (delimiterPos !== -1) {
|
|
597
|
+
const paramName = line.substring(0, delimiterPos).replace('root.', '');
|
|
598
|
+
const paramValue = line.substring(delimiterPos + 1);
|
|
599
|
+
params[paramName] = paramValue;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return params;
|
|
603
|
+
};
|
|
604
|
+
static parseCameraPtzResponse = (response) => {
|
|
605
|
+
const json = JSON.parse(response);
|
|
606
|
+
const parsed = {};
|
|
607
|
+
Object.keys(json).forEach((key) => {
|
|
608
|
+
if (!key.startsWith('Camera ')) {
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
const camera = Number(key.replace('Camera ', ''));
|
|
612
|
+
if (json[key].presets !== undefined) {
|
|
613
|
+
parsed[camera] = VapixAPI.parsePtz(json[key].presets);
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
return parsed;
|
|
617
|
+
};
|
|
618
|
+
static parsePtz = (parsed) => {
|
|
619
|
+
const res = [];
|
|
620
|
+
parsed.forEach((value) => {
|
|
621
|
+
const delimiterPos = value.indexOf('=');
|
|
622
|
+
if (delimiterPos === -1) {
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (!value.startsWith('presetposno')) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
const id = Number(value.substring(11, delimiterPos));
|
|
629
|
+
if (Number.isNaN(id)) {
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
const data = value.substring(delimiterPos + 1).split(':');
|
|
633
|
+
const getValue = (valueName) => {
|
|
634
|
+
for (const d of data) {
|
|
635
|
+
const p = d.split('=');
|
|
636
|
+
if (p[0] === valueName) {
|
|
637
|
+
return Number(p[1]);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return 0;
|
|
641
|
+
};
|
|
642
|
+
res.push({
|
|
643
|
+
id,
|
|
644
|
+
name: data[0] ?? 'Preset ' + id,
|
|
645
|
+
data: {
|
|
646
|
+
pan: getValue('pan'),
|
|
647
|
+
tilt: getValue('tilt'),
|
|
648
|
+
zoom: getValue('zoom'),
|
|
649
|
+
},
|
|
650
|
+
});
|
|
466
651
|
});
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
652
|
+
return res;
|
|
653
|
+
};
|
|
654
|
+
static parseXmlResponse = (xml, nodeName) => {
|
|
655
|
+
const doc = new DOMParser().parseFromString(xml, 'text/xml');
|
|
656
|
+
const node = doc.getElementsByTagName(nodeName);
|
|
657
|
+
if (node.length !== 1 || isNullish(node[0])) {
|
|
658
|
+
throw new Error('Invalid XML from camera');
|
|
659
|
+
}
|
|
660
|
+
return node[0];
|
|
661
|
+
};
|
|
662
|
+
}
|