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.
Files changed (361) hide show
  1. package/README.md +143 -38
  2. package/cjs/CamOverlayAPI.d.ts +603 -327
  3. package/cjs/CamOverlayAPI.js +99 -184
  4. package/cjs/CamScripterAPI.d.ts +41 -17
  5. package/cjs/CamScripterAPI.js +54 -56
  6. package/cjs/CamStreamerAPI.d.ts +3557 -14
  7. package/cjs/CamStreamerAPI.js +174 -52
  8. package/cjs/CamSwitcherAPI.d.ts +158 -42
  9. package/cjs/CamSwitcherAPI.js +148 -189
  10. package/cjs/PlaneTrackerAPI.d.ts +238 -29
  11. package/cjs/PlaneTrackerAPI.js +187 -101
  12. package/cjs/VapixAPI.d.ts +97 -44
  13. package/cjs/VapixAPI.js +400 -207
  14. package/cjs/{CreatePackage.js → bin/CreatePackage.js} +44 -18
  15. package/cjs/errors/errors.d.ts +75 -4
  16. package/cjs/errors/errors.js +142 -7
  17. package/cjs/index.d.ts +20 -9
  18. package/cjs/index.js +28 -14
  19. package/cjs/internal/BasicAPI.d.ts +15 -0
  20. package/cjs/internal/BasicAPI.js +93 -0
  21. package/cjs/internal/ProxyClient.d.ts +8 -9
  22. package/cjs/internal/ProxyClient.js +28 -34
  23. package/cjs/internal/WsEvents.d.ts +38 -0
  24. package/cjs/{CamSwitcherEvents.js → internal/WsEvents.js} +33 -22
  25. package/cjs/internal/constants.d.ts +1 -0
  26. package/cjs/internal/constants.js +2 -1
  27. package/cjs/internal/convertors.d.ts +6 -0
  28. package/cjs/internal/convertors.js +115 -0
  29. package/cjs/internal/transformers.js +8 -8
  30. package/cjs/internal/types.d.ts +32 -20
  31. package/cjs/internal/utils.d.ts +1 -3
  32. package/cjs/internal/utils.js +1 -12
  33. package/cjs/internal/versionCompare.d.ts +2 -2
  34. package/cjs/node/CamOverlayDrawingAPI.d.ts +41 -0
  35. package/cjs/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +28 -20
  36. package/{esm → cjs/node}/CamOverlayPainter/Frame.d.ts +8 -37
  37. package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +33 -0
  38. package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.d.ts +5 -21
  39. package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +5 -17
  40. package/cjs/node/CamOverlayPainter/ResourceManager.d.ts +15 -0
  41. package/cjs/node/CamOverlayPainter/ResourceManager.js +72 -0
  42. package/cjs/node/CamScripterAPICameraEventsGenerator.d.ts +31 -0
  43. package/cjs/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +13 -13
  44. package/cjs/node/DefaultClient.d.ts +6 -6
  45. package/cjs/node/DefaultClient.js +12 -16
  46. package/cjs/{internal → node}/Digest.js +24 -1
  47. package/cjs/node/Digest.test.js +13 -0
  48. package/cjs/node/HttpRequestSender.d.ts +1 -0
  49. package/cjs/node/HttpRequestSender.js +14 -4
  50. package/cjs/node/HttpServer.d.ts +1 -1
  51. package/cjs/node/HttpServer.js +29 -6
  52. package/cjs/node/TimeZoneDaemon.d.ts +6 -0
  53. package/cjs/node/TimeZoneDaemon.js +29 -0
  54. package/cjs/node/VapixEvents.d.ts +16 -0
  55. package/cjs/{VapixEvents.js → node/VapixEvents.js} +10 -10
  56. package/cjs/node/WsClient.d.ts +9 -18
  57. package/cjs/node/WsClient.js +27 -20
  58. package/cjs/node/events/AxisCameraStationEvents.d.ts +12 -0
  59. package/cjs/{events → node/events}/AxisCameraStationEvents.js +18 -13
  60. package/cjs/node/events/GenetecAgent.d.ts +16 -0
  61. package/cjs/node/events/GenetecAgent.js +124 -0
  62. package/cjs/node/index.d.ts +18 -2
  63. package/cjs/node/index.js +39 -5
  64. package/cjs/{models/CamOverlayAPI/widgetsSchema.d.ts → types/CamOverlayAPI/CamOverlayAPI.d.ts} +2794 -767
  65. package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +135 -0
  66. package/cjs/{models → types}/CamOverlayAPI/accuweatherSchema.d.ts +19 -19
  67. package/cjs/{models → types}/CamOverlayAPI/accuweatherSchema.js +7 -8
  68. package/cjs/{models → types}/CamOverlayAPI/customGraphicsSchema.d.ts +108 -107
  69. package/cjs/{models → types}/CamOverlayAPI/customGraphicsSchema.js +5 -6
  70. package/cjs/types/CamOverlayAPI/htmlOverlaySchema.d.ts +81 -0
  71. package/cjs/types/CamOverlayAPI/htmlOverlaySchema.js +21 -0
  72. package/{esm/models → cjs/types}/CamOverlayAPI/imagesSchema.d.ts +19 -19
  73. package/cjs/types/CamOverlayAPI/imagesSchema.js +9 -0
  74. package/cjs/{models → types}/CamOverlayAPI/index.d.ts +3 -4
  75. package/cjs/{models → types}/CamOverlayAPI/index.js +3 -4
  76. package/cjs/{models → types}/CamOverlayAPI/infotickerSchema.d.ts +27 -27
  77. package/cjs/{models → types}/CamOverlayAPI/infotickerSchema.js +6 -7
  78. package/{esm/models → cjs/types}/CamOverlayAPI/pipSchema.d.ts +21 -21
  79. package/cjs/{models → types}/CamOverlayAPI/pipSchema.js +5 -6
  80. package/{esm/models → cjs/types}/CamOverlayAPI/ptzCompassSchema.d.ts +18 -15
  81. package/cjs/{models → types}/CamOverlayAPI/ptzCompassSchema.js +5 -5
  82. package/cjs/{models → types}/CamOverlayAPI/ptzSchema.d.ts +28 -28
  83. package/cjs/types/CamOverlayAPI/ptzSchema.js +12 -0
  84. package/cjs/types/CamOverlayAPI/scoreBoardSchema.d.ts +357 -0
  85. package/cjs/types/CamOverlayAPI/scoreBoardSchema.js +132 -0
  86. package/{esm/models → cjs/types}/CamOverlayAPI/screenSharingSchema.d.ts +15 -15
  87. package/cjs/types/CamOverlayAPI/screenSharingSchema.js +8 -0
  88. package/{esm/models/CamOverlayAPI/widgetCommonSchema.d.ts → cjs/types/CamOverlayAPI/serviceCommonTypes.d.ts} +80 -60
  89. package/cjs/{models/CamOverlayAPI/widgetCommonSchema.js → types/CamOverlayAPI/serviceCommonTypes.js} +39 -21
  90. package/{esm/models → cjs/types}/CamOverlayAPI/webCameraSharingSchema.d.ts +15 -15
  91. package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +8 -0
  92. package/cjs/types/CamOverlayDrawingAPI.d.ts +48 -0
  93. package/cjs/types/CamOverlayDrawingAPI.js +2 -0
  94. package/cjs/types/CamOverlayPainter.d.ts +76 -0
  95. package/cjs/types/CamOverlayPainter.js +14 -0
  96. package/cjs/types/CamScripterAPI.d.ts +75 -23
  97. package/cjs/types/CamScripterAPI.js +20 -8
  98. package/cjs/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
  99. package/cjs/types/CamScripterAPICameraEventsGenerator.js +2 -0
  100. package/cjs/types/CamStreamerAPI/CamStreamerAPI.d.ts +26085 -0
  101. package/cjs/types/CamStreamerAPI/CamStreamerAPI.js +222 -0
  102. package/cjs/types/CamStreamerAPI/facebookSchema.d.ts +574 -0
  103. package/cjs/types/CamStreamerAPI/facebookSchema.js +23 -0
  104. package/cjs/types/CamStreamerAPI/index.d.ts +6 -0
  105. package/cjs/types/CamStreamerAPI/index.js +22 -0
  106. package/cjs/types/{CamStreamerAPI.d.ts → CamStreamerAPI/oldStreamSchema.d.ts} +104 -35
  107. package/cjs/types/CamStreamerAPI/oldStreamSchema.js +53 -0
  108. package/cjs/types/CamStreamerAPI/streamCommonTypes.d.ts +570 -0
  109. package/cjs/types/CamStreamerAPI/streamCommonTypes.js +123 -0
  110. package/cjs/types/CamStreamerAPI/streamsSchema.d.ts +8642 -0
  111. package/cjs/types/CamStreamerAPI/streamsSchema.js +81 -0
  112. package/cjs/types/CamStreamerAPI/windySchema.d.ts +534 -0
  113. package/cjs/types/CamStreamerAPI/windySchema.js +19 -0
  114. package/cjs/types/CamStreamerAPI/youtubeSchema.d.ts +542 -0
  115. package/cjs/types/CamStreamerAPI/youtubeSchema.js +22 -0
  116. package/cjs/types/CamSwitcherAPI.d.ts +205 -121
  117. package/cjs/types/CamSwitcherAPI.js +38 -1
  118. package/cjs/{events → types}/GenetecAgent.d.ts +47 -47
  119. package/cjs/types/GenetecAgent.js +31 -0
  120. package/cjs/types/PlaneTrackerAPI.d.ts +993 -0
  121. package/cjs/types/PlaneTrackerAPI.js +336 -0
  122. package/cjs/types/VapixAPI.d.ts +281 -22
  123. package/cjs/types/VapixAPI.js +74 -4
  124. package/cjs/types/VapixEvents.d.ts +15 -0
  125. package/cjs/types/VapixEvents.js +2 -0
  126. package/cjs/types/common.d.ts +43 -3
  127. package/cjs/types/common.js +17 -2
  128. package/cjs/types/ws/CamOverlayEvents.d.ts +88 -0
  129. package/cjs/types/ws/CamOverlayEvents.js +19 -0
  130. package/cjs/types/ws/CamStreamerEvents.d.ts +282 -0
  131. package/cjs/types/ws/CamStreamerEvents.js +36 -0
  132. package/cjs/types/ws/PlaneTrackerEvents.d.ts +1703 -0
  133. package/cjs/types/ws/PlaneTrackerEvents.js +207 -0
  134. package/cjs/web/DefaultClient.d.ts +7 -5
  135. package/cjs/web/DefaultClient.js +25 -11
  136. package/cjs/web/WsClient.d.ts +9 -5
  137. package/cjs/web/WsClient.js +16 -18
  138. package/cjs/ws/CamOverlayEvents.d.ts +8 -0
  139. package/cjs/ws/CamOverlayEvents.js +24 -0
  140. package/cjs/ws/CamStreamerEvents.d.ts +8 -0
  141. package/cjs/ws/CamStreamerEvents.js +24 -0
  142. package/cjs/ws/CamSwitcherEvents.d.ts +8 -0
  143. package/cjs/ws/CamSwitcherEvents.js +24 -0
  144. package/cjs/ws/PlaneTrackerEvents.d.ts +9 -0
  145. package/cjs/ws/PlaneTrackerEvents.js +30 -0
  146. package/esm/CamOverlayAPI.js +99 -184
  147. package/esm/CamScripterAPI.js +52 -57
  148. package/esm/CamStreamerAPI.js +172 -51
  149. package/esm/CamSwitcherAPI.js +151 -192
  150. package/esm/PlaneTrackerAPI.js +186 -100
  151. package/esm/VapixAPI.js +402 -209
  152. package/esm/{CreatePackage.js → bin/CreatePackage.js} +16 -16
  153. package/esm/errors/errors.js +124 -6
  154. package/esm/index.js +20 -9
  155. package/esm/internal/BasicAPI.js +89 -0
  156. package/esm/internal/ProxyClient.js +28 -34
  157. package/esm/{CamSwitcherEvents.js → internal/WsEvents.js} +31 -20
  158. package/esm/internal/constants.js +1 -0
  159. package/esm/internal/convertors.js +108 -0
  160. package/esm/internal/transformers.js +1 -1
  161. package/esm/internal/utils.js +0 -9
  162. package/esm/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +26 -18
  163. package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +33 -0
  164. package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +2 -13
  165. package/esm/{CamOverlayPainter → node/CamOverlayPainter}/ResourceManager.js +7 -5
  166. package/esm/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +11 -11
  167. package/esm/node/DefaultClient.js +12 -16
  168. package/esm/node/Digest.test.js +11 -0
  169. package/esm/node/HttpRequestSender.js +14 -4
  170. package/esm/node/HttpServer.js +1 -1
  171. package/esm/node/TimeZoneDaemon.js +25 -0
  172. package/esm/{VapixEvents.js → node/VapixEvents.js} +10 -10
  173. package/esm/node/WsClient.js +22 -15
  174. package/esm/{events → node/events}/AxisCameraStationEvents.js +18 -13
  175. package/esm/node/events/GenetecAgent.js +120 -0
  176. package/esm/node/index.js +18 -2
  177. package/esm/types/CamOverlayAPI/CamOverlayAPI.js +113 -0
  178. package/esm/{models → types}/CamOverlayAPI/accuweatherSchema.js +3 -4
  179. package/esm/{models → types}/CamOverlayAPI/customGraphicsSchema.js +3 -4
  180. package/esm/types/CamOverlayAPI/htmlOverlaySchema.js +18 -0
  181. package/esm/types/CamOverlayAPI/imagesSchema.js +6 -0
  182. package/esm/{models → types}/CamOverlayAPI/index.js +3 -4
  183. package/esm/{models → types}/CamOverlayAPI/infotickerSchema.js +3 -4
  184. package/esm/{models → types}/CamOverlayAPI/pipSchema.js +4 -5
  185. package/esm/{models → types}/CamOverlayAPI/ptzCompassSchema.js +4 -4
  186. package/esm/types/CamOverlayAPI/ptzSchema.js +9 -0
  187. package/esm/types/CamOverlayAPI/scoreBoardSchema.js +129 -0
  188. package/esm/types/CamOverlayAPI/screenSharingSchema.js +5 -0
  189. package/esm/{models/CamOverlayAPI/widgetCommonSchema.js → types/CamOverlayAPI/serviceCommonTypes.js} +38 -20
  190. package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +5 -0
  191. package/esm/types/CamOverlayDrawingAPI.js +1 -0
  192. package/esm/types/CamOverlayPainter.js +11 -0
  193. package/esm/types/CamScripterAPI.js +19 -7
  194. package/esm/types/CamScripterAPICameraEventsGenerator.js +1 -0
  195. package/esm/types/CamStreamerAPI/CamStreamerAPI.js +199 -0
  196. package/esm/types/CamStreamerAPI/facebookSchema.js +17 -0
  197. package/esm/types/CamStreamerAPI/index.js +6 -0
  198. package/esm/types/CamStreamerAPI/oldStreamSchema.js +50 -0
  199. package/esm/types/CamStreamerAPI/streamCommonTypes.js +120 -0
  200. package/esm/types/CamStreamerAPI/streamsSchema.js +75 -0
  201. package/esm/types/CamStreamerAPI/windySchema.js +13 -0
  202. package/esm/types/CamStreamerAPI/youtubeSchema.js +16 -0
  203. package/esm/types/CamSwitcherAPI.js +38 -1
  204. package/esm/types/GenetecAgent.js +28 -0
  205. package/esm/types/PlaneTrackerAPI.js +333 -0
  206. package/esm/types/VapixAPI.js +73 -3
  207. package/esm/types/VapixEvents.js +1 -0
  208. package/esm/types/common.js +16 -1
  209. package/esm/types/ws/CamOverlayEvents.js +16 -0
  210. package/esm/types/ws/CamStreamerEvents.js +33 -0
  211. package/esm/types/ws/PlaneTrackerEvents.js +204 -0
  212. package/esm/web/DefaultClient.js +25 -11
  213. package/esm/web/WsClient.js +16 -18
  214. package/esm/ws/CamOverlayEvents.js +20 -0
  215. package/esm/ws/CamStreamerEvents.js +20 -0
  216. package/esm/ws/CamSwitcherEvents.js +20 -0
  217. package/esm/ws/PlaneTrackerEvents.js +26 -0
  218. package/package.json +46 -12
  219. package/{esm → types}/CamOverlayAPI.d.ts +603 -327
  220. package/types/CamScripterAPI.d.ts +43 -0
  221. package/types/CamStreamerAPI.d.ts +3559 -0
  222. package/types/CamSwitcherAPI.d.ts +168 -0
  223. package/types/PlaneTrackerAPI.d.ts +239 -0
  224. package/types/VapixAPI.d.ts +131 -0
  225. package/types/bin/CreatePackage.d.ts +1 -0
  226. package/types/errors/errors.d.ts +108 -0
  227. package/types/index.d.ts +28 -0
  228. package/types/internal/BasicAPI.d.ts +15 -0
  229. package/types/internal/ProxyClient.d.ts +10 -0
  230. package/types/internal/WsEvents.d.ts +38 -0
  231. package/{esm → types}/internal/constants.d.ts +1 -0
  232. package/types/internal/convertors.d.ts +6 -0
  233. package/types/internal/types.d.ts +47 -0
  234. package/{esm → types}/internal/utils.d.ts +1 -3
  235. package/{esm → types}/internal/versionCompare.d.ts +2 -2
  236. package/types/node/CamOverlayDrawingAPI.d.ts +41 -0
  237. package/{cjs → types/node}/CamOverlayPainter/Frame.d.ts +8 -37
  238. package/{esm → types/node}/CamOverlayPainter/Painter.d.ts +5 -21
  239. package/types/node/CamOverlayPainter/ResourceManager.d.ts +15 -0
  240. package/types/node/CamScripterAPICameraEventsGenerator.d.ts +31 -0
  241. package/types/node/DefaultClient.d.ts +16 -0
  242. package/types/node/Digest.test.d.ts +1 -0
  243. package/{esm → types}/node/HttpRequestSender.d.ts +1 -0
  244. package/{esm → types}/node/HttpServer.d.ts +1 -1
  245. package/types/node/TimeZoneDaemon.d.ts +6 -0
  246. package/types/node/VapixEvents.d.ts +16 -0
  247. package/types/node/WsClient.d.ts +30 -0
  248. package/types/node/events/AxisCameraStationEvents.d.ts +12 -0
  249. package/types/node/events/GenetecAgent.d.ts +16 -0
  250. package/types/node/index.d.ts +18 -0
  251. package/{esm/models/CamOverlayAPI/widgetsSchema.d.ts → types/types/CamOverlayAPI/CamOverlayAPI.d.ts} +2794 -767
  252. package/{esm/models → types/types}/CamOverlayAPI/accuweatherSchema.d.ts +19 -19
  253. package/{esm/models → types/types}/CamOverlayAPI/customGraphicsSchema.d.ts +108 -107
  254. package/types/types/CamOverlayAPI/htmlOverlaySchema.d.ts +81 -0
  255. package/{cjs/models → types/types}/CamOverlayAPI/imagesSchema.d.ts +19 -19
  256. package/{esm/models → types/types}/CamOverlayAPI/index.d.ts +3 -4
  257. package/{esm/models → types/types}/CamOverlayAPI/infotickerSchema.d.ts +27 -27
  258. package/{cjs/models → types/types}/CamOverlayAPI/pipSchema.d.ts +21 -21
  259. package/{cjs/models → types/types}/CamOverlayAPI/ptzCompassSchema.d.ts +18 -15
  260. package/{esm/models → types/types}/CamOverlayAPI/ptzSchema.d.ts +28 -28
  261. package/types/types/CamOverlayAPI/scoreBoardSchema.d.ts +357 -0
  262. package/{cjs/models → types/types}/CamOverlayAPI/screenSharingSchema.d.ts +15 -15
  263. package/{cjs/models/CamOverlayAPI/widgetCommonSchema.d.ts → types/types/CamOverlayAPI/serviceCommonTypes.d.ts} +80 -60
  264. package/{cjs/models → types/types}/CamOverlayAPI/webCameraSharingSchema.d.ts +15 -15
  265. package/types/types/CamOverlayDrawingAPI.d.ts +48 -0
  266. package/types/types/CamOverlayPainter.d.ts +76 -0
  267. package/types/types/CamScripterAPI.d.ts +119 -0
  268. package/types/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
  269. package/types/types/CamStreamerAPI/CamStreamerAPI.d.ts +26085 -0
  270. package/types/types/CamStreamerAPI/facebookSchema.d.ts +574 -0
  271. package/types/types/CamStreamerAPI/index.d.ts +6 -0
  272. package/{esm/types/CamStreamerAPI.d.ts → types/types/CamStreamerAPI/oldStreamSchema.d.ts} +104 -35
  273. package/types/types/CamStreamerAPI/streamCommonTypes.d.ts +570 -0
  274. package/types/types/CamStreamerAPI/streamsSchema.d.ts +8642 -0
  275. package/types/types/CamStreamerAPI/windySchema.d.ts +534 -0
  276. package/types/types/CamStreamerAPI/youtubeSchema.d.ts +542 -0
  277. package/{esm → types}/types/CamSwitcherAPI.d.ts +205 -121
  278. package/{esm/events → types/types}/GenetecAgent.d.ts +47 -47
  279. package/types/types/PlaneTrackerAPI.d.ts +993 -0
  280. package/{esm → types}/types/VapixAPI.d.ts +281 -22
  281. package/types/types/VapixEvents.d.ts +15 -0
  282. package/types/types/common.d.ts +77 -0
  283. package/types/types/ws/CamOverlayEvents.d.ts +88 -0
  284. package/types/types/ws/CamStreamerEvents.d.ts +282 -0
  285. package/types/types/ws/PlaneTrackerEvents.d.ts +1703 -0
  286. package/types/web/DefaultClient.d.ts +8 -0
  287. package/types/web/WsClient.d.ts +17 -0
  288. package/types/ws/CamOverlayEvents.d.ts +8 -0
  289. package/types/ws/CamStreamerEvents.d.ts +8 -0
  290. package/types/ws/CamSwitcherEvents.d.ts +8 -0
  291. package/types/ws/PlaneTrackerEvents.d.ts +9 -0
  292. package/cjs/CamOverlayDrawingAPI.d.ts +0 -86
  293. package/cjs/CamOverlayPainter/ResourceManager.d.ts +0 -14
  294. package/cjs/CamOverlayPainter/ResourceManager.js +0 -46
  295. package/cjs/CamScripterAPICameraEventsGenerator.d.ts +0 -74
  296. package/cjs/CamSwitcherEvents.d.ts +0 -18
  297. package/cjs/VapixEvents.d.ts +0 -43
  298. package/cjs/events/AxisCameraStationEvents.d.ts +0 -10
  299. package/cjs/events/GenetecAgent.js +0 -123
  300. package/cjs/models/CamOverlayAPI/constants.d.ts +0 -11
  301. package/cjs/models/CamOverlayAPI/constants.js +0 -14
  302. package/cjs/models/CamOverlayAPI/fileSchema.d.ts +0 -28
  303. package/cjs/models/CamOverlayAPI/fileSchema.js +0 -17
  304. package/cjs/models/CamOverlayAPI/imagesSchema.js +0 -10
  305. package/cjs/models/CamOverlayAPI/ptzSchema.js +0 -13
  306. package/cjs/models/CamOverlayAPI/screenSharingSchema.js +0 -9
  307. package/cjs/models/CamOverlayAPI/webCameraSharingSchema.js +0 -9
  308. package/cjs/models/CamOverlayAPI/widgetsSchema.js +0 -27
  309. package/cjs/node/WsEventClient.d.ts +0 -13
  310. package/cjs/node/WsEventClient.js +0 -22
  311. package/cjs/types/CamOverlayAPI.d.ts +0 -328
  312. package/cjs/types/CamOverlayAPI.js +0 -26
  313. package/cjs/types/CamStreamerAPI.js +0 -28
  314. package/esm/CamOverlayDrawingAPI.d.ts +0 -86
  315. package/esm/CamOverlayPainter/ResourceManager.d.ts +0 -14
  316. package/esm/CamScripterAPI.d.ts +0 -19
  317. package/esm/CamScripterAPICameraEventsGenerator.d.ts +0 -74
  318. package/esm/CamStreamerAPI.d.ts +0 -16
  319. package/esm/CamSwitcherAPI.d.ts +0 -52
  320. package/esm/CamSwitcherEvents.d.ts +0 -18
  321. package/esm/PlaneTrackerAPI.d.ts +0 -30
  322. package/esm/VapixAPI.d.ts +0 -78
  323. package/esm/VapixEvents.d.ts +0 -43
  324. package/esm/errors/errors.d.ts +0 -37
  325. package/esm/events/AxisCameraStationEvents.d.ts +0 -10
  326. package/esm/events/GenetecAgent.js +0 -119
  327. package/esm/index.d.ts +0 -17
  328. package/esm/internal/ProxyClient.d.ts +0 -11
  329. package/esm/internal/types.d.ts +0 -35
  330. package/esm/models/CamOverlayAPI/constants.d.ts +0 -11
  331. package/esm/models/CamOverlayAPI/constants.js +0 -11
  332. package/esm/models/CamOverlayAPI/fileSchema.d.ts +0 -28
  333. package/esm/models/CamOverlayAPI/fileSchema.js +0 -14
  334. package/esm/models/CamOverlayAPI/imagesSchema.js +0 -7
  335. package/esm/models/CamOverlayAPI/ptzSchema.js +0 -10
  336. package/esm/models/CamOverlayAPI/screenSharingSchema.js +0 -6
  337. package/esm/models/CamOverlayAPI/webCameraSharingSchema.js +0 -6
  338. package/esm/models/CamOverlayAPI/widgetsSchema.js +0 -24
  339. package/esm/node/DefaultClient.d.ts +0 -16
  340. package/esm/node/WsClient.d.ts +0 -39
  341. package/esm/node/WsEventClient.d.ts +0 -13
  342. package/esm/node/WsEventClient.js +0 -18
  343. package/esm/types/CamOverlayAPI.d.ts +0 -328
  344. package/esm/types/CamOverlayAPI.js +0 -14
  345. package/esm/types/CamScripterAPI.d.ts +0 -67
  346. package/esm/types/CamStreamerAPI.js +0 -25
  347. package/esm/types/common.d.ts +0 -37
  348. package/esm/web/DefaultClient.d.ts +0 -6
  349. package/esm/web/WsClient.d.ts +0 -13
  350. package/esm/web/index.d.ts +0 -2
  351. package/cjs/{CreatePackage.d.ts → bin/CreatePackage.d.ts} +0 -0
  352. package/cjs/{internal → node}/Digest.d.ts +0 -0
  353. package/{esm/CreatePackage.d.ts → cjs/node/Digest.test.d.ts} +0 -0
  354. package/{esm/types → cjs/types/ws}/CamSwitcherEvents.d.ts +8 -8
  355. package/cjs/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +0 -0
  356. package/esm/{internal → node}/Digest.js +0 -0
  357. package/esm/types/{CamSwitcherEvents.js → ws/CamSwitcherEvents.js} +0 -0
  358. package/{esm → types}/internal/transformers.d.ts +0 -0
  359. package/{esm/internal → types/node}/Digest.d.ts +0 -0
  360. package/{cjs/types → types/types/ws}/CamSwitcherEvents.d.ts +8 -8
  361. /package/{esm/node → types/web}/index.d.ts +0 -0
package/esm/VapixAPI.js CHANGED
@@ -1,54 +1,69 @@
1
- import * as prettifyXml from 'prettify-xml';
2
- import { arrayToUrl, isNullish, paramToUrl, responseStringify } from './internal/utils';
3
- import { sdCardWatchedStatuses, APP_IDS, maxFpsResponseSchema, dateTimeinfoSchema, audioDeviceRequestSchema, audioSampleRatesResponseSchema, } from './types/VapixAPI';
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
- export class VapixAPI {
9
- client;
10
- constructor(client, getProxyUrl) {
11
- this.client = new ProxyClient(client, getProxyUrl);
12
- }
13
- async getUrlEncoded(proxy, path, parameters, headers = {}) {
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 res = await this.client.post(proxy, path, data, {}, head);
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 Error(await responseStringify(res));
19
+ throw new ErrorWithResponse(res);
19
20
  }
20
21
  return res;
21
22
  }
22
- async postJson(proxy, path, jsonData, headers = {}) {
23
- const data = JSON.stringify(jsonData);
24
- const head = { ...headers, 'Content-Type': 'application/json' };
25
- const res = await this.client.post(proxy, path, data, {}, head);
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 Error(await responseStringify(res));
33
+ throw new ErrorWithResponse(res);
28
34
  }
29
35
  return res;
30
36
  }
31
- async getCameraImage(params, proxy = null) {
32
- return await this.client.get(proxy, '/axis-cgi/jpg/image.cgi', params);
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(proxy = null) {
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 res = await this.client.post(proxy, '/vapix/services', data, { 'Content-Type': 'application/soap+xml' });
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 Error(await responseStringify(res));
59
+ throw new ErrorWithResponse(res);
44
60
  }
45
- const declarations = await res.text();
46
- return prettifyXml(declarations);
61
+ return await res.text();
47
62
  }
48
- async getSupportedAudioSampleRate(proxy = null) {
49
- const url = '/axis-cgi/audio/streamingcapabilities.cgi';
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.postJson(proxy, url, jsonData);
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(proxy = null) {
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.postJson(proxy, '/axis-cgi/opticscontrol.cgi', data);
89
+ await this._postJsonEncoded('/axis-cgi/opticscontrol.cgi', data, undefined, options);
75
90
  }
76
91
  catch (err) {
77
- await this.getUrlEncoded(proxy, '/axis-cgi/opticssetup.cgi', {
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(proxy = null) {
84
- const res = await this.getUrlEncoded(proxy, '/axis-cgi/disks/list.cgi', {
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(proxy = null) {
102
- return this._doSDCardMountAction('MOUNT', proxy);
116
+ mountSDCard(options) {
117
+ return this._doSDCardMountAction('MOUNT', options);
103
118
  }
104
- unmountSDCard(proxy = null) {
105
- return this._doSDCardMountAction('UNMOUNT', proxy);
119
+ unmountSDCard(options) {
120
+ return this._doSDCardMountAction('UNMOUNT', options);
106
121
  }
107
- async _doSDCardMountAction(action, proxy = null) {
108
- const res = await this.getUrlEncoded(proxy, '/axis-cgi/disks/mount.cgi', {
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, await responseStringify(res));
136
+ throw new SDCardActionError(action, job.description);
122
137
  }
123
138
  return Number(job.jobid);
124
139
  }
125
- async fetchSDCardJobProgress(jobId, proxy = null) {
126
- const res = await this.getUrlEncoded(proxy, '/disks/job.cgi', {
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(proxy = null) {
143
- return this.getUrlEncoded(proxy, '/axis-cgi/serverreport.cgi', { mode: 'text' });
157
+ downloadCameraReport(options) {
158
+ return this._getText('/axis-cgi/serverreport.cgi', { mode: 'text' }, options);
144
159
  }
145
- getSystemLog(proxy = null) {
146
- return this.getUrlEncoded(proxy, '/axis-cgi/admin/systemlog.cgi');
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, proxy = null) {
164
+ async getMaxFps(channel, options) {
149
165
  const data = { apiVersion: '1.0', method: 'getCaptureModes' };
150
- const res = await this.postJson(proxy, '/axis-cgi/capturemode.cgi', data);
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(proxy = null) {
171
- const data = { apiVersion: '1.0', method: 'getDateTimeInfo' };
172
- const res = await this.postJson(proxy, '/axis-cgi/time.cgi', data);
173
- return (await res.json())?.timeZone ?? 'Europe/Prague';
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(proxy = null) {
210
+ async getDateTimeInfo(options) {
176
211
  const data = { apiVersion: '1.0', method: 'getDateTimeInfo' };
177
- const res = await this.postJson(proxy, '/axis-cgi/time.cgi', data);
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(proxy = null) {
215
+ async getDevicesSettings(options) {
181
216
  const data = { apiVersion: '1.0', method: 'getDevicesSettings' };
182
- const res = await this.postJson(proxy, '/axis-cgi/audiodevicecontrol.cgi', data);
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, proxy = null) {
191
- const res = await this.postJson(proxy, '/axis-cgi/basicdeviceinfo.cgi', payload);
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(proxy = null) {
233
+ async getHeaders(options) {
199
234
  const data = { apiVersion: '1.0', method: 'list' };
200
- const res = await this.postJson(proxy, '/axis-cgi/customhttpheader.cgi', data);
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, proxy = null) {
238
+ async setHeaders(headers, options) {
204
239
  const data = { apiVersion: '1.0', method: 'set', params: headers };
205
- return this.postJson(proxy, '/axis-cgi/customhttpheader.cgi', data);
240
+ await this._postJsonEncoded('/axis-cgi/customhttpheader.cgi', data, undefined, options);
206
241
  }
207
- async getParameter(paramNames, proxy = null) {
208
- const response = await this.getUrlEncoded(proxy, '/axis-cgi/param.cgi', {
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, proxy = null) {
215
- const res = await this.getUrlEncoded(proxy, '/axis-cgi/param.cgi', {
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 Error(responseText);
256
+ throw new SettingParameterError(responseText);
222
257
  }
223
- return true;
224
258
  }
225
- async getGuardTourList(proxy = null) {
259
+ async getGuardTourList(options) {
226
260
  const gTourList = new Array();
227
- const response = await this.getParameter('GuardTour', proxy);
261
+ const response = await this.getParameter('GuardTour', options);
228
262
  for (let i = 0; i < 20; i++) {
229
- const gTourBaseName = 'root.GuardTour.G' + i;
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 = 'root.GuardTour.G' + i + '.Tour.T' + j;
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(guardTourID, enable, proxy = null) {
262
- const options = {};
263
- options[guardTourID + '.Running'] = enable ? 'yes' : 'no';
264
- return this.setParameter(options, proxy);
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, proxy = null) {
267
- const res = await this.getUrlEncoded(proxy, '/axis-cgi/com/ptz.cgi', {
300
+ async getPTZPresetList(channel, options) {
301
+ const res = await this._postUrlEncoded('/axis-cgi/com/ptz.cgi', {
268
302
  query: 'presetposcam',
269
- camera: channel.toString(),
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, proxy = null) {
319
+ async listPTZ(camera, options) {
286
320
  const url = `/axis-cgi/com/ptz.cgi`;
287
- const response = await this.getUrlEncoded(proxy, url, {
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(proxy = null) {
299
- const response = await this.getUrlEncoded(proxy, '/axis-cgi/com/ptz.cgi', {
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
- if (data[camera] !== undefined) {
313
- res[camera - 1] = data[camera]?.map(({ data: itemData, ...d }) => d);
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, proxy = null) {
319
- return this.getUrlEncoded(proxy, '/axis-cgi/com/ptz.cgi', {
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, proxy = null) {
325
- const res = await this.getUrlEncoded(proxy, '/axis-cgi/com/ptz.cgi', {
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 getInputState(port, proxy = null) {
337
- const response = await (await this.getUrlEncoded(proxy, '/axis-cgi/io/port.cgi', { checkactive: port.toString() })).text();
338
- return response.split('=')[1]?.indexOf('active') === 0;
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 setOutputState(port, active, proxy = null) {
341
- return this.getUrlEncoded(proxy, '/axis-cgi/io/port.cgi', { action: active ? `${port}:/` : `${port}:\\` });
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(proxy = null) {
344
- const res = await this.client.get(proxy, '/axis-cgi/applications/list.cgi');
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
- return result.reply.application.map((app) => {
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: APP_IDS.find((id) => id.toLowerCase() === app.Name.toLowerCase()) ?? null,
503
+ appId: ALL_APP_IDS.find((id) => id.toLowerCase() === app.Name.toLowerCase()) ?? null,
356
504
  };
357
505
  });
358
- }
359
- async startApplication(applicationID, proxy = null) {
360
- const res = await this.client.get(proxy, '/axis-cgi/applications/control.cgi', {
361
- package: applicationID.toLowerCase(),
362
- action: 'start',
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', await responseStringify(res));
520
+ throw new ApplicationAPIError('START', text);
367
521
  }
368
522
  }
369
- async restartApplication(applicationID, proxy = null) {
370
- const res = await this.client.get(proxy, '/axis-cgi/applications/control.cgi', {
371
- package: applicationID.toLowerCase(),
372
- action: 'restart',
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', await responseStringify(res));
535
+ throw new ApplicationAPIError('RESTART', text);
377
536
  }
378
537
  }
379
- async stopApplication(applicationID, proxy = null) {
380
- const res = await this.client.get(proxy, '/axis-cgi/applications/control.cgi', {
381
- package: applicationID.toLowerCase(),
382
- action: 'stop',
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', await responseStringify(res));
550
+ throw new ApplicationAPIError('STOP', text);
387
551
  }
388
552
  }
389
- async installApplication(data, fileName) {
390
- const formData = new FormData();
553
+ async installApplication(data, fileName, options) {
554
+ const formData = new this.CustomFormData();
391
555
  formData.append('packfil', data, fileName);
392
- const res = await this.client.post(null, '/axis-cgi/applications/upload.cgi', formData, {}, {
393
- contentType: 'application/octet-stream',
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 Error(await responseStringify(res));
566
+ throw new ErrorWithResponse(res);
397
567
  }
398
568
  const text = await res.text();
399
569
  if (text.length > 5) {
400
- throw new Error('installing error: ' + text);
570
+ throw new ApplicationAPIError('INSTALL', text);
401
571
  }
402
572
  }
403
- }
404
- const parseParameters = (response) => {
405
- const params = {};
406
- const lines = response.split(/[\r\n]/);
407
- for (const line of lines) {
408
- if (line.length === 0 || line.substring(0, 7) === '# Error') {
409
- continue;
410
- }
411
- const delimiterPos = line.indexOf('=');
412
- if (delimiterPos !== -1) {
413
- const paramName = line.substring(0, delimiterPos).replace('root.', '');
414
- const paramValue = line.substring(delimiterPos + 1);
415
- params[paramName] = paramValue;
416
- }
417
- }
418
- return params;
419
- };
420
- const parseCameraPtzResponse = (response) => {
421
- const json = JSON.parse(response);
422
- const parsed = {};
423
- Object.keys(json).forEach((key) => {
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
- return 0;
457
- };
458
- res.push({
459
- id,
460
- name: data[0] ?? 'Preset ' + id,
461
- data: {
462
- pan: getValue('pan'),
463
- tilt: getValue('tilt'),
464
- zoom: getValue('zoom'),
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
- return res;
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
+ }