camstreamerlib 4.0.0-beta.36 → 4.0.0-beta.38

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 (101) hide show
  1. package/cjs/CamOverlayAPI.js +52 -79
  2. package/cjs/CamScripterAPI.js +30 -24
  3. package/cjs/CamStreamerAPI.js +30 -33
  4. package/cjs/CamSwitcherAPI.js +57 -52
  5. package/cjs/PlaneTrackerAPI.js +55 -66
  6. package/cjs/VapixAPI.js +23 -22
  7. package/cjs/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +1 -1
  8. package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +4 -14
  9. package/cjs/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +1 -1
  10. package/cjs/{VapixEvents.js → node/VapixEvents.js} +1 -1
  11. package/cjs/node/events/GenetecAgent.js +5 -27
  12. package/cjs/node/index.js +17 -0
  13. package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +18 -18
  14. package/cjs/types/CamOverlayAPI/accuweatherSchema.js +7 -7
  15. package/cjs/types/CamOverlayAPI/customGraphicsSchema.js +5 -5
  16. package/cjs/types/CamOverlayAPI/imagesSchema.js +4 -4
  17. package/cjs/types/CamOverlayAPI/index.js +1 -1
  18. package/cjs/types/CamOverlayAPI/infotickerSchema.js +6 -6
  19. package/cjs/types/CamOverlayAPI/pipSchema.js +4 -4
  20. package/cjs/types/CamOverlayAPI/ptzCompassSchema.js +4 -4
  21. package/cjs/types/CamOverlayAPI/ptzSchema.js +4 -4
  22. package/cjs/types/CamOverlayAPI/scoreBoardSchema.js +8 -8
  23. package/cjs/types/CamOverlayAPI/screenSharingSchema.js +3 -3
  24. package/cjs/types/CamOverlayAPI/{widgetCommonTypes.js → serviceCommonTypes.js} +8 -4
  25. package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +3 -3
  26. package/cjs/types/CamOverlayPainter.js +12 -0
  27. package/cjs/types/CamScripterAPICameraEventsGenerator.js +2 -0
  28. package/cjs/types/CamSwitcherAPI.js +38 -1
  29. package/cjs/types/GenetecAgent.js +31 -0
  30. package/cjs/types/PlaneTrackerAPI.js +277 -0
  31. package/cjs/types/VapixAPI.js +20 -2
  32. package/cjs/types/VapixEvents.js +2 -0
  33. package/esm/CamOverlayAPI.js +53 -80
  34. package/esm/CamScripterAPI.js +30 -24
  35. package/esm/CamStreamerAPI.js +30 -30
  36. package/esm/CamSwitcherAPI.js +58 -53
  37. package/esm/PlaneTrackerAPI.js +56 -67
  38. package/esm/VapixAPI.js +24 -23
  39. package/esm/{CamOverlayDrawingAPI.js → node/CamOverlayDrawingAPI.js} +1 -1
  40. package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Painter.js +1 -11
  41. package/esm/{CamScripterAPICameraEventsGenerator.js → node/CamScripterAPICameraEventsGenerator.js} +1 -1
  42. package/esm/{VapixEvents.js → node/VapixEvents.js} +1 -1
  43. package/esm/node/events/GenetecAgent.js +1 -23
  44. package/esm/node/index.js +10 -0
  45. package/esm/types/CamOverlayAPI/CamOverlayAPI.js +17 -17
  46. package/esm/types/CamOverlayAPI/accuweatherSchema.js +3 -3
  47. package/esm/types/CamOverlayAPI/customGraphicsSchema.js +3 -3
  48. package/esm/types/CamOverlayAPI/imagesSchema.js +3 -3
  49. package/esm/types/CamOverlayAPI/index.js +1 -1
  50. package/esm/types/CamOverlayAPI/infotickerSchema.js +3 -3
  51. package/esm/types/CamOverlayAPI/pipSchema.js +3 -3
  52. package/esm/types/CamOverlayAPI/ptzCompassSchema.js +3 -3
  53. package/esm/types/CamOverlayAPI/ptzSchema.js +3 -3
  54. package/esm/types/CamOverlayAPI/scoreBoardSchema.js +5 -5
  55. package/esm/types/CamOverlayAPI/screenSharingSchema.js +2 -2
  56. package/esm/types/CamOverlayAPI/{widgetCommonTypes.js → serviceCommonTypes.js} +7 -3
  57. package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +2 -2
  58. package/esm/types/CamOverlayPainter.js +11 -1
  59. package/esm/types/CamSwitcherAPI.js +38 -1
  60. package/esm/types/GenetecAgent.js +28 -0
  61. package/esm/types/PlaneTrackerAPI.js +276 -1
  62. package/esm/types/VapixAPI.js +19 -1
  63. package/esm/types/VapixEvents.js +1 -0
  64. package/package.json +1 -1
  65. package/types/CamOverlayAPI.d.ts +836 -10
  66. package/types/CamScripterAPI.d.ts +34 -9
  67. package/types/CamStreamerAPI.d.ts +27 -5
  68. package/types/CamSwitcherAPI.d.ts +136 -23
  69. package/types/PlaneTrackerAPI.d.ts +201 -20
  70. package/types/VapixAPI.d.ts +46 -12
  71. package/types/bin/CreatePackage.d.ts +1 -0
  72. package/types/{CamOverlayDrawingAPI.d.ts → node/CamOverlayDrawingAPI.d.ts} +1 -1
  73. package/types/{CamOverlayPainter → node/CamOverlayPainter}/Frame.d.ts +2 -2
  74. package/types/{CamOverlayPainter → node/CamOverlayPainter}/Painter.d.ts +2 -13
  75. package/types/{CamOverlayPainter → node/CamOverlayPainter}/ResourceManager.d.ts +1 -1
  76. package/types/node/CamScripterAPICameraEventsGenerator.d.ts +31 -0
  77. package/types/node/VapixEvents.d.ts +16 -0
  78. package/types/node/events/GenetecAgent.d.ts +1 -144
  79. package/types/node/index.d.ts +10 -0
  80. package/types/types/CamOverlayAPI/CamOverlayAPI.d.ts +20 -20
  81. package/types/types/CamOverlayAPI/index.d.ts +1 -1
  82. package/types/types/CamOverlayAPI/{widgetCommonTypes.d.ts → serviceCommonTypes.d.ts} +6 -2
  83. package/types/types/CamOverlayDrawingAPI.d.ts +3 -13
  84. package/types/types/CamOverlayPainter.d.ts +12 -10
  85. package/types/types/CamScripterAPICameraEventsGenerator.d.ts +45 -0
  86. package/types/types/CamStreamerAPI.d.ts +2 -2
  87. package/types/types/CamSwitcherAPI.d.ts +111 -30
  88. package/types/types/GenetecAgent.d.ts +174 -0
  89. package/types/types/PlaneTrackerAPI.d.ts +859 -0
  90. package/types/types/VapixAPI.d.ts +54 -8
  91. package/types/types/VapixEvents.d.ts +15 -0
  92. package/types/types/common.d.ts +1 -0
  93. package/types/CamScripterAPICameraEventsGenerator.d.ts +0 -74
  94. package/types/VapixEvents.d.ts +0 -43
  95. /package/cjs/{CreatePackage.js → bin/CreatePackage.js} +0 -0
  96. /package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +0 -0
  97. /package/cjs/{CamOverlayPainter → node/CamOverlayPainter}/ResourceManager.js +0 -0
  98. /package/esm/{CreatePackage.js → bin/CreatePackage.js} +0 -0
  99. /package/esm/{CamOverlayPainter → node/CamOverlayPainter}/Frame.js +0 -0
  100. /package/esm/{CamOverlayPainter → node/CamOverlayPainter}/ResourceManager.js +0 -0
  101. /package/{types/CreatePackage.d.ts → esm/types/CamScripterAPICameraEventsGenerator.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { AddNewClipError } from './errors/errors';
3
3
  import { isClip, isNullish, responseStringify } from './internal/utils';
4
- import { storageInfoListSchema, outputInfoSchema, audioPushInfoSchema, clipListSchema, playlistQueueSchema, streamSaveLoadSchema, clipSaveLoadSchema, playlistSaveLoadSchema, trackerSaveLoadSchema, } from './types/CamSwitcherAPI';
4
+ import { storageInfoListSchema, outputInfoSchema, audioPushInfoSchema, clipListSchema, playlistQueueSchema, streamSaveLoadSchema, clipSaveLoadSchema, playlistSaveLoadSchema, trackerSaveLoadSchema, secondaryAudioSettingsSchema, globalAudioSettingsSchema, } from './types/CamSwitcherAPI';
5
5
  import { networkCameraListSchema, } from './types/common';
6
6
  import { VapixAPI } from './VapixAPI';
7
7
  import { isFirmwareVersionAtLeast } from './internal/versionCompare';
@@ -17,9 +17,9 @@ export class CamSwitcherAPI {
17
17
  this.CustomFormData = CustomFormData;
18
18
  this.vapixAgent = new VapixAPI(client);
19
19
  }
20
- static getProxyUrlPath = () => `${BASE_PATH}/proxy.cgi`;
21
- static getWsEventsUrlPath = () => `/local/camswitcher/events`;
22
- static getClipPreviewUrlPath = (id, storage) => `${BASE_PATH}/clip_preview.cgi?clip_name=${id}&storage=${storage}`;
20
+ static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
21
+ static getWsEventsPath = () => `/local/camswitcher/events`;
22
+ static getClipPreviewPath = (id, storage) => `${BASE_PATH}/clip_preview.cgi?clip_name=${id}&storage=${storage}`;
23
23
  getClient(proxyParams) {
24
24
  return proxyParams ? new ProxyClient(this.client, proxyParams) : this.client;
25
25
  }
@@ -35,98 +35,105 @@ export class CamSwitcherAPI {
35
35
  });
36
36
  }
37
37
  async checkCameraTime(options) {
38
- const data = await this.get(`${BASE_PATH}/camera_time.cgi`, undefined, options);
39
- return z.boolean().parse(data);
38
+ const res = await this._getJson(`${BASE_PATH}/camera_time.cgi`, undefined, options);
39
+ return z.boolean().parse(res.data);
40
40
  }
41
41
  async getNetworkCameraList(options) {
42
- const data = await this.get(`${BASE_PATH}/network_camera_list.cgi`, undefined, options);
43
- return networkCameraListSchema.parse(data);
42
+ const res = await this._getJson(`${BASE_PATH}/network_camera_list.cgi`, undefined, options);
43
+ return networkCameraListSchema.parse(res.data);
44
44
  }
45
45
  async getMaxFps(source, options) {
46
- const data = await this.get(`${BASE_PATH}/get_max_framerate.cgi`, {
47
- video_source: source.toString(),
46
+ const res = await this._getJson(`${BASE_PATH}/get_max_framerate.cgi`, {
47
+ video_source: source,
48
48
  }, options);
49
- return z.number().parse(data);
49
+ return z.number().parse(res.data);
50
50
  }
51
51
  async getStorageInfo(options) {
52
- const data = await this.get(`${BASE_PATH}/get_storage.cgi`, undefined, options);
53
- return storageInfoListSchema.parse(data);
52
+ const res = await this._getJson(`${BASE_PATH}/get_storage.cgi`, undefined, options);
53
+ return storageInfoListSchema.parse(res.data);
54
54
  }
55
55
  async wsAuthorization(options) {
56
- const data = await this.get(`${BASE_PATH}/ws_authorization.cgi`, undefined, options);
57
- return z.string().parse(data);
56
+ const res = await this._getJson(`${BASE_PATH}/ws_authorization.cgi`, undefined, options);
57
+ return z.string().parse(res.data);
58
58
  }
59
59
  async getOutputInfo(options) {
60
- const data = await this.get(`${BASE_PATH}/output_info.cgi`, undefined, options);
61
- return outputInfoSchema.parse(data);
60
+ const res = await this._getJson(`${BASE_PATH}/output_info.cgi`, undefined, options);
61
+ return outputInfoSchema.parse(res.data);
62
62
  }
63
63
  async getAudioPushInfo(options) {
64
- const data = await this.get(`${BASE_PATH}/audio_push_info.cgi`, undefined, options);
65
- return audioPushInfoSchema.parse(data);
64
+ const res = await this._getJson(`${BASE_PATH}/audio_push_info.cgi`, undefined, options);
65
+ return audioPushInfoSchema.parse(res.data);
66
66
  }
67
67
  async getStreamSaveList(options) {
68
- const data = await this.get(`${BASE_PATH}/streams.cgi`, { action: 'get' }, options);
69
- return streamSaveLoadSchema.parse(data);
68
+ const res = await this._getJson(`${BASE_PATH}/streams.cgi`, { action: 'get' }, options);
69
+ return streamSaveLoadSchema.parse(res.data);
70
70
  }
71
71
  async getClipSaveList(options) {
72
- const data = await this.get(`${BASE_PATH}/clips.cgi`, { action: 'get' }, options);
73
- return clipSaveLoadSchema.parse(data);
72
+ const res = await this._getJson(`${BASE_PATH}/clips.cgi`, { action: 'get' }, options);
73
+ return clipSaveLoadSchema.parse(res.data);
74
74
  }
75
75
  async getPlaylistSaveList(options) {
76
- const data = await this.get(`${BASE_PATH}/playlists.cgi`, { action: 'get' }, options);
77
- return playlistSaveLoadSchema.parse(data);
76
+ const res = await this._getJson(`${BASE_PATH}/playlists.cgi`, { action: 'get' }, options);
77
+ return playlistSaveLoadSchema.parse(res.data);
78
78
  }
79
79
  async getTrackerSaveList(options) {
80
- const data = await this.get(`${BASE_PATH}/trackers.cgi`, { action: 'get' }, options);
81
- return trackerSaveLoadSchema.parse(data);
80
+ const res = await this._getJson(`${BASE_PATH}/trackers.cgi`, { action: 'get' }, options);
81
+ return trackerSaveLoadSchema.parse(res.data);
82
82
  }
83
83
  async setStreamSaveList(data, options) {
84
- return await this.set(`${BASE_PATH}/streams.cgi`, data, { action: 'set' }, options);
84
+ return await this._post(`${BASE_PATH}/streams.cgi`, data, { action: 'set' }, options);
85
85
  }
86
86
  async setClipSaveList(data, options) {
87
- return await this.set(`${BASE_PATH}/clips.cgi`, data, { action: 'set' }, options);
87
+ return await this._post(`${BASE_PATH}/clips.cgi`, data, { action: 'set' }, options);
88
88
  }
89
89
  async setPlaylistSaveList(data, options) {
90
- return await this.set(`${BASE_PATH}/playlists.cgi`, data, { action: 'set' }, options);
90
+ return await this._post(`${BASE_PATH}/playlists.cgi`, data, { action: 'set' }, options);
91
91
  }
92
92
  async setTrackerSaveList(data, options) {
93
- return await this.set(`${BASE_PATH}/trackers.cgi`, data, { action: 'set' }, options);
93
+ return await this._post(`${BASE_PATH}/trackers.cgi`, data, { action: 'set' }, options);
94
94
  }
95
95
  async playlistSwitch(playlistName, options) {
96
- await this.get(`${BASE_PATH}/playlist_switch.cgi`, { playlist_name: playlistName }, options);
96
+ await this._getJson(`${BASE_PATH}/playlist_switch.cgi`, { playlist_name: playlistName }, options);
97
97
  }
98
98
  async playlistQueuePush(playlistName, options) {
99
- await this.get(`${BASE_PATH}/playlist_queue_push.cgi`, { playlist_name: playlistName }, options);
99
+ await this._getJson(`${BASE_PATH}/playlist_queue_push.cgi`, { playlist_name: playlistName }, options);
100
100
  }
101
101
  async playlistQueueClear(options) {
102
- await this.get(`${BASE_PATH}/playlist_queue_clear.cgi`, undefined, options);
102
+ await this._getJson(`${BASE_PATH}/playlist_queue_clear.cgi`, undefined, options);
103
103
  }
104
104
  async playlistQueueList(options) {
105
- const data = await this.get(`${BASE_PATH}/playlist_queue_list.cgi`, undefined, options);
106
- return playlistQueueSchema.parse(data).playlistQueueList;
105
+ const res = await this._getJson(`${BASE_PATH}/playlist_queue_list.cgi`, undefined, options);
106
+ return playlistQueueSchema.parse(res.data).playlistQueueList;
107
107
  }
108
108
  async playlistQueuePlayNext(options) {
109
- await this.get(`${BASE_PATH}/playlist_queue_play_next.cgi`, undefined, options);
109
+ await this._getJson(`${BASE_PATH}/playlist_queue_play_next.cgi`, undefined, options);
110
110
  }
111
111
  async addNewClip(file, clipType, storage, clipId, fileName, options) {
112
- const path = `${BASE_PATH}/clip_upload.cgi?storage=${storage}`;
112
+ const path = `${BASE_PATH}/clip_upload.cgi`;
113
113
  const formData = new this.CustomFormData();
114
114
  formData.append('clip_name', clipId);
115
115
  formData.append('clip_type', clipType);
116
116
  formData.append('file', file, fileName);
117
117
  const agent = this.getClient(options?.proxyParams);
118
- const res = await agent.post({ path, data: formData, timeout: options?.timeout });
118
+ const res = await agent.post({
119
+ path,
120
+ data: formData,
121
+ parameters: {
122
+ storage: storage,
123
+ },
124
+ timeout: options?.timeout,
125
+ });
119
126
  const output = (await res.json());
120
127
  if (output.status !== 200) {
121
128
  throw new AddNewClipError(output.message);
122
129
  }
123
130
  }
124
131
  removeClip(clipId, storage, options) {
125
- return this.get(`${BASE_PATH}/clip_remove.cgi`, { clip_name: clipId, storage }, options);
132
+ return this._getJson(`${BASE_PATH}/clip_remove.cgi`, { clip_name: clipId, storage }, options);
126
133
  }
127
134
  async getClipList(options) {
128
- const data = await this.get(`${BASE_PATH}/clip_list.cgi`, undefined, options);
129
- return clipListSchema.parse(data).clip_list;
135
+ const res = await this._getJson(`${BASE_PATH}/clip_list.cgi`, undefined, options);
136
+ return clipListSchema.parse(res.data).clip_list;
130
137
  }
131
138
  setCamSwitchOptions(data, cameraFWVersion, options) {
132
139
  const bitrateVapixParams = parseBitrateOptionsToBitrateVapixParams(cameraFWVersion, data.bitrateMode, data);
@@ -227,7 +234,7 @@ export class CamSwitcherAPI {
227
234
  settings.source = res.clip_name;
228
235
  settings.storage = res.storage;
229
236
  }
230
- return settings;
237
+ return globalAudioSettingsSchema.parse(settings);
231
238
  }
232
239
  async getSecondaryAudioSettings(options) {
233
240
  const res = await this.getParamFromCameraAndJSONParse(CSW_PARAM_NAMES.SECONDARY_AUDIO, options);
@@ -239,30 +246,28 @@ export class CamSwitcherAPI {
239
246
  secondaryAudioLevel: res.secondary_audio_level ?? 1,
240
247
  masterAudioLevel: res.master_audio_level ?? 1,
241
248
  };
242
- return settings;
249
+ return secondaryAudioSettingsSchema.parse(settings);
243
250
  }
244
251
  async getPermanentRtspUrlToken(options) {
245
252
  const paramName = CSW_PARAM_NAMES.RTSP_TOKEN;
246
253
  const res = await this.vapixAgent.getParameter([paramName], options);
247
- return res[paramName] ?? '';
254
+ return z.string().parse(res[paramName] ?? '');
248
255
  }
249
- async get(path, parameters, options) {
256
+ async _getJson(path, parameters, options) {
250
257
  const agent = this.getClient(options?.proxyParams);
251
258
  const res = await agent.get({ path, parameters, timeout: options?.timeout });
252
259
  if (res.ok) {
253
- const d = await res.json();
254
- return d.data;
260
+ return await res.json();
255
261
  }
256
262
  else {
257
263
  throw new Error(await responseStringify(res));
258
264
  }
259
265
  }
260
- async set(path, data, parameters, options) {
266
+ async _post(path, data, parameters, options, headers) {
261
267
  const agent = this.getClient(options?.proxyParams);
262
- const res = await agent.post({ path, data: JSON.stringify(data), parameters, timeout: options?.timeout });
268
+ const res = await agent.post({ path, data, parameters, timeout: options?.timeout, headers });
263
269
  if (res.ok) {
264
- const parsed = await res.json();
265
- return parsed.message === 'OK';
270
+ return await res.json();
266
271
  }
267
272
  else {
268
273
  throw new Error(await responseStringify(res));
@@ -302,7 +307,7 @@ const parseBitrateOptionsToBitrateVapixParams = (firmWareVersion, bitrateMode, c
302
307
  if (!isFirmwareVersionAtLeast(firmWareVersion, FIRMWARE_WITH_BITRATE_MODES_SUPPORT)) {
303
308
  return `videomaxbitrate=${cameraOptions.maximumBitRate}`;
304
309
  }
305
- if (bitrateMode === null) {
310
+ if (bitrateMode === undefined) {
306
311
  return '';
307
312
  }
308
313
  const data = {
@@ -1,7 +1,9 @@
1
1
  import { z } from 'zod';
2
- import { paramToUrl, responseStringify } from './internal/utils';
2
+ import { responseStringify } from './internal/utils';
3
+ import { blackListSchema, cameraSettingsSchema, flightInfoSchema, mapInfoSchema, priorityListSchema, serverSettingsSchema, trackingModeSchema, whiteListSchema, zonesSchema, } from './types/PlaneTrackerAPI';
3
4
  import { ParsingBlobError } from './errors/errors';
4
5
  import { ProxyClient } from './internal/ProxyClient';
6
+ import { cameraListSchema } from './types/GenetecAgent';
5
7
  const BASE_PATH = '/local/planetracker';
6
8
  export class PlaneTrackerAPI {
7
9
  client;
@@ -10,13 +12,13 @@ export class PlaneTrackerAPI {
10
12
  this.client = client;
11
13
  this.apiUser = apiUser;
12
14
  }
13
- static getProxyUrlPath = () => `${BASE_PATH}/proxy.cgi`;
15
+ static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
14
16
  getClient(proxyParams) {
15
17
  return proxyParams ? new ProxyClient(this.client, proxyParams) : this.client;
16
18
  }
17
19
  async checkCameraTime(options) {
18
- const response = await this._getJson(`${BASE_PATH}/camera_time.cgi`, undefined, options);
19
- return z.boolean().parse(response.state);
20
+ const res = await this._getJson(`${BASE_PATH}/camera_time.cgi`, undefined, options);
21
+ return z.boolean().parse(res.state);
20
22
  }
21
23
  async resetPtzCalibration(options) {
22
24
  const agent = this.getClient(options?.proxyParams);
@@ -47,7 +49,8 @@ export class PlaneTrackerAPI {
47
49
  });
48
50
  }
49
51
  async fetchCameraSettings(options) {
50
- return await this._getJson(`${BASE_PATH}/package_camera_settings.cgi`, { action: 'get' }, options);
52
+ const res = await this._getJson(`${BASE_PATH}/package_camera_settings.cgi`, { action: 'get' }, options);
53
+ return cameraSettingsSchema.parse(res);
51
54
  }
52
55
  async setCameraSettings(settingsJsonString, options) {
53
56
  return await this._postJsonEncoded(`${BASE_PATH}/package_camera_settings.cgi`, settingsJsonString, {
@@ -55,7 +58,8 @@ export class PlaneTrackerAPI {
55
58
  }, options);
56
59
  }
57
60
  async fetchServerSettings(options) {
58
- return await this._getJson(`${BASE_PATH}/package_server_settings.cgi`, { action: 'get' }, options);
61
+ const res = await this._getJson(`${BASE_PATH}/package_server_settings.cgi`, { action: 'get' }, options);
62
+ return serverSettingsSchema.parse(res);
59
63
  }
60
64
  async exportAppSettings(dataType, options) {
61
65
  return await this._getBlob(`${BASE_PATH}/package_data.cgi`, { action: 'EXPORT', dataType }, options);
@@ -70,13 +74,15 @@ export class PlaneTrackerAPI {
70
74
  });
71
75
  }
72
76
  async fetchFlightInfo(icao, options) {
73
- return await this._getJson(`${BASE_PATH}/package/flightInfo.cgi`, { icao: encodeURIComponent(icao) }, options);
77
+ const res = await this._getJson(`${BASE_PATH}/package/flightInfo.cgi`, { icao }, options);
78
+ return flightInfoSchema.parse(res);
74
79
  }
75
80
  async getTrackingMode(options) {
76
- return await this._getJson(`${BASE_PATH}/package/getTrackingMode.cgi`, undefined, options);
81
+ const res = await this._getJson(`${BASE_PATH}/package/getTrackingMode.cgi`, undefined, options);
82
+ return trackingModeSchema.parse(res);
77
83
  }
78
- async setTrackingMode(modeJsonString, options) {
79
- return await this._postJsonEncoded(`${BASE_PATH}/package/setTrackingMode.cgi`, modeJsonString, this.apiUser, options);
84
+ async setTrackingMode(mode, options) {
85
+ return await this._postJsonEncoded(`${BASE_PATH}/package/setTrackingMode.cgi`, { mode }, this.apiUser, options);
80
86
  }
81
87
  async startTrackingPlane(icao, options) {
82
88
  const agent = this.getClient(options?.proxyParams);
@@ -95,31 +101,36 @@ export class PlaneTrackerAPI {
95
101
  });
96
102
  }
97
103
  async getPriorityList(options) {
98
- return await this._getJson(`${BASE_PATH}/package/getPriorityList.cgi`, undefined, options);
104
+ const res = await this._getJson(`${BASE_PATH}/package/getPriorityList.cgi`, undefined, options);
105
+ return priorityListSchema.parse(res);
99
106
  }
100
- async setPriorityList(priorityListJsonString, options) {
101
- return await this._postJsonEncoded(`${BASE_PATH}/package/setPriorityList.cgi`, priorityListJsonString, this.apiUser, options);
107
+ async setPriorityList(priorityList, options) {
108
+ return await this._postJsonEncoded(`${BASE_PATH}/package/setPriorityList.cgi`, { priorityList }, this.apiUser, options);
102
109
  }
103
110
  async getWhiteList(options) {
104
- return await this._getJson(`${BASE_PATH}/package/getWhiteList.cgi`, undefined, options);
111
+ const res = await this._getJson(`${BASE_PATH}/package/getWhiteList.cgi`, undefined, options);
112
+ return whiteListSchema.parse(res);
105
113
  }
106
- async setWhiteList(whiteListJsonString, options) {
107
- return await this._postJsonEncoded(`${BASE_PATH}/package/setWhiteList.cgi`, whiteListJsonString, this.apiUser, options);
114
+ async setWhiteList(whiteList, options) {
115
+ return await this._postJsonEncoded(`${BASE_PATH}/package/setWhiteList.cgi`, { whiteList }, this.apiUser, options);
108
116
  }
109
117
  async getBlackList(options) {
110
- return await this._getJson(`${BASE_PATH}/package/getBlackList.cgi`, undefined, options);
118
+ const res = await this._getJson(`${BASE_PATH}/package/getBlackList.cgi`, undefined, options);
119
+ return blackListSchema.parse(res);
111
120
  }
112
- async setBlackList(blackListJsonString, options) {
113
- return await this._postJsonEncoded(`${BASE_PATH}/package/setBlackList.cgi`, blackListJsonString, this.apiUser, options);
121
+ async setBlackList(blackList, options) {
122
+ return await this._postJsonEncoded(`${BASE_PATH}/package/setBlackList.cgi`, { blackList }, this.apiUser, options);
114
123
  }
115
124
  async fetchMapInfo(options) {
116
- return await this._getJson(`${BASE_PATH}/package/getMapInfo.cgi`, undefined, options);
125
+ const res = await this._getJson(`${BASE_PATH}/package/getMapInfo.cgi`, undefined, options);
126
+ return mapInfoSchema.parse(res);
117
127
  }
118
128
  async getZones(options) {
119
- return await this._getJson(`${BASE_PATH}/package/getZones.cgi`, undefined, options);
129
+ const res = await this._getJson(`${BASE_PATH}/package/getZones.cgi`, undefined, options);
130
+ return zonesSchema.parse(res);
120
131
  }
121
- async setZones(zonesJsonString, options) {
122
- return await this._postJsonEncoded(`${BASE_PATH}/package/setZones.cgi`, zonesJsonString, this.apiUser, options);
132
+ async setZones(zones, options) {
133
+ return await this._postJsonEncoded(`${BASE_PATH}/package/setZones.cgi`, { zones }, this.apiUser, options);
123
134
  }
124
135
  async goToCoordinates(lat, lon, alt, options) {
125
136
  const agent = this.getClient(options?.proxyParams);
@@ -130,19 +141,25 @@ export class PlaneTrackerAPI {
130
141
  });
131
142
  }
132
143
  async checkGenetecConnection(params, options) {
133
- return await this._postUrlEncoded(`${BASE_PATH}/package/checkGenetecConnection.cgi`, params, options);
144
+ return await this._postUrlEncoded(`${BASE_PATH}/package/checkGenetecConnection.cgi`, '', params, options);
134
145
  }
135
146
  async getGenetecCameraList(params, options) {
136
- const res = await this._postUrlEncoded(`${BASE_PATH}/package/getGenetecCameraList.cgi`, params, options);
137
- return await res.json();
147
+ const res = await this._postUrlEncoded(`${BASE_PATH}/package/getGenetecCameraList.cgi`, '', params, options);
148
+ return cameraListSchema.parse(res);
138
149
  }
139
- async _getJson(path, parameters, options) {
150
+ async _getJson(path, parameters, options, headers) {
140
151
  const agent = this.getClient(options?.proxyParams);
141
- const res = await agent.get({
142
- path,
143
- parameters,
144
- timeout: options?.timeout,
145
- });
152
+ const res = await agent.get({ path, parameters, timeout: options?.timeout, headers });
153
+ if (res.ok) {
154
+ return await res.json();
155
+ }
156
+ else {
157
+ throw new Error(await responseStringify(res));
158
+ }
159
+ }
160
+ async _post(path, data, parameters, options, headers) {
161
+ const agent = this.getClient(options?.proxyParams);
162
+ const res = await agent.post({ path, data, parameters, headers, timeout: options?.timeout });
146
163
  if (res.ok) {
147
164
  return await res.json();
148
165
  }
@@ -152,11 +169,7 @@ export class PlaneTrackerAPI {
152
169
  }
153
170
  async _getBlob(path, parameters, options) {
154
171
  const agent = this.getClient(options?.proxyParams);
155
- const res = await agent.get({
156
- path,
157
- parameters,
158
- timeout: options?.timeout,
159
- });
172
+ const res = await agent.get({ path, parameters, timeout: options?.timeout });
160
173
  if (res.ok) {
161
174
  return await this.parseBlobResponse(res);
162
175
  }
@@ -172,36 +185,12 @@ export class PlaneTrackerAPI {
172
185
  throw new ParsingBlobError(err);
173
186
  }
174
187
  }
175
- async _postJsonEncoded(path, data, parameters, options) {
176
- const agent = this.getClient(options?.proxyParams);
177
- const res = await agent.post({
178
- path,
179
- data,
180
- parameters,
181
- headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
182
- timeout: options?.timeout,
183
- });
184
- if (res.ok) {
185
- return res;
186
- }
187
- else {
188
- throw new Error(await responseStringify(res));
189
- }
188
+ async _postUrlEncoded(path, data, parameters, options, headers) {
189
+ const baseHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
190
+ return this._post(path, data, parameters, options, { ...baseHeaders, ...headers });
190
191
  }
191
- async _postUrlEncoded(path, params, options) {
192
- const data = paramToUrl(params);
193
- const agent = this.getClient(options?.proxyParams);
194
- const res = await agent.post({
195
- path,
196
- data,
197
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
198
- timeout: options?.timeout,
199
- });
200
- if (res.ok) {
201
- return res;
202
- }
203
- else {
204
- throw new Error(await responseStringify(res));
205
- }
192
+ async _postJsonEncoded(path, data, parameters, options, headers) {
193
+ const baseHeaders = { 'Accept': 'application/json', 'Content-Type': 'application/json' };
194
+ return this._post(path, data, parameters, options, { ...baseHeaders, ...headers });
206
195
  }
207
196
  }
package/esm/VapixAPI.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { arrayToUrl, isNullish, paramToUrl, responseStringify } from './internal/utils';
2
- import { sdCardWatchedStatuses, APP_IDS, maxFpsResponseSchema, dateTimeinfoSchema, audioDeviceRequestSchema, audioSampleRatesResponseSchema, timeZoneSchema, getPortsResponseSchema, } from './types/VapixAPI';
2
+ import { sdCardWatchedStatuses, APP_IDS, maxFpsResponseSchema, dateTimeinfoSchema, audioDeviceRequestSchema, audioSampleRatesResponseSchema, timeZoneSchema, getPortsResponseSchema, guardTourSchema, ptzOverviewSchema, cameraPTZItemDataSchema, applicationListSchema, sdCardInfoSchema, } from './types/VapixAPI';
3
3
  import { ApplicationAPIError, MaxFPSError, NoDeviceInfoError, PtzNotSupportedError, SDCardActionError, SDCardJobError, } from './errors/errors';
4
4
  import { ProxyClient } from './internal/ProxyClient';
5
5
  import { z } from 'zod';
@@ -107,11 +107,11 @@ export class VapixAPI {
107
107
  });
108
108
  const result = parser.parse(xmlText);
109
109
  const data = result.root.disks.disk;
110
- return {
110
+ return sdCardInfoSchema.parse({
111
111
  totalSize: parseInt(data.totalsize),
112
112
  freeSize: parseInt(data.freesize),
113
113
  status: sdCardWatchedStatuses.includes(data.status) ? data.status : 'disconnected',
114
- };
114
+ });
115
115
  }
116
116
  mountSDCard(options) {
117
117
  return this._doSDCardMountAction('MOUNT', options);
@@ -180,7 +180,7 @@ export class VapixAPI {
180
180
  if (isNullish(captureMode.maxFPS)) {
181
181
  throw new MaxFPSError('FPS_NOT_SPECIFIED');
182
182
  }
183
- return captureMode.maxFPS;
183
+ return z.number().parse(captureMode.maxFPS);
184
184
  }
185
185
  async getTimezone(options) {
186
186
  try {
@@ -204,7 +204,7 @@ export class VapixAPI {
204
204
  if (data.data.timeZone === undefined) {
205
205
  throw new Error('Time zone not setup on the device');
206
206
  }
207
- return data.data.timeZone;
207
+ return z.string().parse(data.data.timeZone);
208
208
  }
209
209
  async getDateTimeInfo(options) {
210
210
  const data = { apiVersion: '1.0', method: 'getDateTimeInfo' };
@@ -259,7 +259,7 @@ export class VapixAPI {
259
259
  const gTourList = new Array();
260
260
  const response = await this.getParameter('GuardTour', options);
261
261
  for (let i = 0; i < 20; i++) {
262
- const gTourBaseName = 'root.GuardTour.G' + i;
262
+ const gTourBaseName = 'GuardTour.G' + i;
263
263
  if (gTourBaseName + '.CamNbr' in response) {
264
264
  const gTour = {
265
265
  id: gTourBaseName,
@@ -271,7 +271,7 @@ export class VapixAPI {
271
271
  tour: [],
272
272
  };
273
273
  for (let j = 0; j < 100; j++) {
274
- const tourBaseName = 'root.GuardTour.G' + i + '.Tour.T' + j;
274
+ const tourBaseName = 'GuardTour.G' + i + '.Tour.T' + j;
275
275
  if (tourBaseName + '.MoveSpeed' in response) {
276
276
  const tour = {
277
277
  moveSpeed: response[tourBaseName + '.MoveSpeed'],
@@ -289,17 +289,17 @@ export class VapixAPI {
289
289
  break;
290
290
  }
291
291
  }
292
- return gTourList;
292
+ return guardTourSchema.parse(gTourList);
293
293
  }
294
- setGuardTourEnabled(guardTourID, enable, options) {
294
+ setGuardTourEnabled(guardTourId, enable, options) {
295
295
  const params = {};
296
- params[guardTourID + '.Running'] = enable ? 'yes' : 'no';
296
+ params[guardTourId + '.Running'] = enable ? 'yes' : 'no';
297
297
  return this.setParameter(params, options);
298
298
  }
299
299
  async getPTZPresetList(channel, options) {
300
300
  const res = await this.postUrlEncoded('/axis-cgi/com/ptz.cgi', {
301
301
  query: 'presetposcam',
302
- camera: channel.toString(),
302
+ camera: channel,
303
303
  }, undefined, options);
304
304
  const text = await res.text();
305
305
  const lines = text.split(/[\r\n]/);
@@ -313,7 +313,7 @@ export class VapixAPI {
313
313
  }
314
314
  }
315
315
  }
316
- return positions;
316
+ return z.array(z.string()).parse(positions);
317
317
  }
318
318
  async listPTZ(camera, options) {
319
319
  const url = `/axis-cgi/com/ptz.cgi`;
@@ -347,7 +347,7 @@ export class VapixAPI {
347
347
  res[camera - 1] = item.map(({ data: itemData, ...d }) => d);
348
348
  }
349
349
  });
350
- return res;
350
+ return ptzOverviewSchema.parse(res);
351
351
  }
352
352
  goToPreset(channel, presetName, options) {
353
353
  return this.postUrlEncoded('/axis-cgi/com/ptz.cgi', {
@@ -361,11 +361,11 @@ export class VapixAPI {
361
361
  camera: camera.toString(),
362
362
  }, undefined, options);
363
363
  const params = VapixAPI.parseParameters(await res.text());
364
- return {
364
+ return cameraPTZItemDataSchema.parse({
365
365
  pan: Number(params.pan),
366
366
  tilt: Number(params.tilt),
367
367
  zoom: Number(params.zoom),
368
- };
368
+ });
369
369
  }
370
370
  async getPorts(options) {
371
371
  const res = await this.postJson('/axis-cgi/io/portmanagement.cgi', {
@@ -373,7 +373,7 @@ export class VapixAPI {
373
373
  context: '',
374
374
  method: 'getPorts',
375
375
  }, undefined, options);
376
- const portResponseParsed = await getPortsResponseSchema.parse(res.json());
376
+ const portResponseParsed = getPortsResponseSchema.parse(await res.json());
377
377
  return portResponseParsed.data.items;
378
378
  }
379
379
  async setPorts(ports, options) {
@@ -406,19 +406,20 @@ export class VapixAPI {
406
406
  if (!Array.isArray(apps)) {
407
407
  apps = [apps];
408
408
  }
409
- return apps.map((app) => {
409
+ const appList = apps.map((app) => {
410
410
  return {
411
411
  ...app,
412
412
  appId: APP_IDS.find((id) => id.toLowerCase() === app.Name.toLowerCase()) ?? null,
413
413
  };
414
414
  });
415
+ return applicationListSchema.parse(appList);
415
416
  }
416
- async startApplication(applicationID, options) {
417
+ async startApplication(applicationId, options) {
417
418
  const agent = this.getClient(options?.proxyParams);
418
419
  const res = await agent.get({
419
420
  path: '/axis-cgi/applications/control.cgi',
420
421
  parameters: {
421
- package: applicationID.toLowerCase(),
422
+ package: applicationId.toLowerCase(),
422
423
  action: 'start',
423
424
  },
424
425
  timeout: options?.timeout,
@@ -428,12 +429,12 @@ export class VapixAPI {
428
429
  throw new ApplicationAPIError('START', await responseStringify(res));
429
430
  }
430
431
  }
431
- async restartApplication(applicationID, options) {
432
+ async restartApplication(applicationId, options) {
432
433
  const agent = this.getClient(options?.proxyParams);
433
434
  const res = await agent.get({
434
435
  path: '/axis-cgi/applications/control.cgi',
435
436
  parameters: {
436
- package: applicationID.toLowerCase(),
437
+ package: applicationId.toLowerCase(),
437
438
  action: 'restart',
438
439
  },
439
440
  timeout: options?.timeout,
@@ -443,12 +444,12 @@ export class VapixAPI {
443
444
  throw new ApplicationAPIError('RESTART', await responseStringify(res));
444
445
  }
445
446
  }
446
- async stopApplication(applicationID, options) {
447
+ async stopApplication(applicationId, options) {
447
448
  const agent = this.getClient(options?.proxyParams);
448
449
  const res = await agent.get({
449
450
  path: '/axis-cgi/applications/control.cgi',
450
451
  parameters: {
451
- package: applicationID.toLowerCase(),
452
+ package: applicationId.toLowerCase(),
452
453
  action: 'stop',
453
454
  },
454
455
  timeout: options?.timeout,
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from 'events';
2
- import { WsClient } from './node/WsClient';
2
+ import { WsClient } from './WsClient';
3
3
  export class CamOverlayDrawingAPI extends EventEmitter {
4
4
  tls;
5
5
  tlsInsecure;
@@ -1,17 +1,7 @@
1
1
  import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
2
2
  import { ResourceManager } from './ResourceManager';
3
3
  import { Frame } from './Frame';
4
- export const COORD = {
5
- top_left: [-1, -1],
6
- center_left: [-1, 0],
7
- bottom_left: [-1, 1],
8
- top_center: [0, -1],
9
- center: [0, 0],
10
- bottom_center: [0, 1],
11
- top_right: [1, -1],
12
- center_right: [1, 0],
13
- bottom_right: [1, 1],
14
- };
4
+ import { COORD } from '../../types/CamOverlayPainter';
15
5
  export class Painter extends Frame {
16
6
  screenWidth;
17
7
  screenHeight;
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from 'events';
2
- import { WsClient } from './node/WsClient';
2
+ import { WsClient } from './WsClient';
3
3
  export class CamScripterAPICameraEventsGenerator extends EventEmitter {
4
4
  tls;
5
5
  tlsInsecure;
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter2 as EventEmitter } from 'eventemitter2';
2
- import { WsClient } from './node/WsClient';
2
+ import { WsClient } from './WsClient';
3
3
  export class VapixEvents extends EventEmitter {
4
4
  tls;
5
5
  tlsInsecure;