camstreamerlib 4.0.0-beta.3 → 4.0.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +8 -2
  2. package/cjs/CamOverlayAPI.d.ts +47 -26
  3. package/cjs/CamOverlayAPI.js +171 -88
  4. package/cjs/CamOverlayDrawingAPI.d.ts +2 -47
  5. package/cjs/CamOverlayDrawingAPI.js +6 -3
  6. package/cjs/CamOverlayPainter/Frame.d.ts +8 -37
  7. package/cjs/CamOverlayPainter/Frame.js +33 -0
  8. package/cjs/CamOverlayPainter/Painter.d.ts +16 -10
  9. package/cjs/CamOverlayPainter/Painter.js +6 -5
  10. package/cjs/CamOverlayPainter/ResourceManager.d.ts +3 -2
  11. package/cjs/CamOverlayPainter/ResourceManager.js +8 -11
  12. package/cjs/CamScripterAPI.d.ts +33 -16
  13. package/cjs/CamScripterAPI.js +50 -41
  14. package/cjs/CamScripterAPICameraEventsGenerator.d.ts +1 -1
  15. package/cjs/CamScripterAPICameraEventsGenerator.js +6 -3
  16. package/cjs/CamStreamerAPI.d.ts +16 -14
  17. package/cjs/CamStreamerAPI.js +32 -32
  18. package/cjs/CamSwitcherAPI.d.ts +42 -37
  19. package/cjs/CamSwitcherAPI.js +123 -114
  20. package/cjs/CamSwitcherEvents.d.ts +1 -1
  21. package/cjs/PlaneTrackerAPI.d.ts +42 -0
  22. package/cjs/PlaneTrackerAPI.js +211 -0
  23. package/cjs/VapixAPI.d.ts +56 -43
  24. package/cjs/VapixAPI.js +305 -216
  25. package/cjs/VapixEvents.d.ts +1 -1
  26. package/cjs/VapixEvents.js +3 -3
  27. package/cjs/errors/errors.d.ts +3 -0
  28. package/cjs/errors/errors.js +8 -1
  29. package/cjs/events/AxisCameraStationEvents.d.ts +5 -4
  30. package/cjs/events/AxisCameraStationEvents.js +23 -18
  31. package/cjs/events/GenetecAgent.d.ts +6 -3
  32. package/cjs/events/GenetecAgent.js +30 -19
  33. package/cjs/index.d.ts +14 -1
  34. package/cjs/index.js +23 -2
  35. package/cjs/internal/Digest.js +6 -6
  36. package/cjs/internal/ProxyClient.d.ts +8 -9
  37. package/cjs/internal/ProxyClient.js +25 -29
  38. package/cjs/internal/types.d.ts +42 -0
  39. package/cjs/internal/types.js +2 -0
  40. package/cjs/internal/utils.d.ts +4 -1
  41. package/cjs/internal/utils.js +22 -3
  42. package/cjs/internal/versionCompare.d.ts +2 -2
  43. package/cjs/node/DefaultClient.d.ts +5 -6
  44. package/cjs/node/DefaultClient.js +12 -14
  45. package/cjs/node/HttpRequestSender.d.ts +1 -0
  46. package/cjs/node/HttpRequestSender.js +13 -3
  47. package/cjs/node/HttpServer.js +1 -1
  48. package/cjs/node/WsClient.d.ts +2 -1
  49. package/cjs/node/WsEventClient.d.ts +1 -1
  50. package/cjs/node/index.d.ts +2 -0
  51. package/cjs/node/index.js +18 -1
  52. package/cjs/types/CamOverlayAPI/CamOverlayAPI.d.ts +3073 -0
  53. package/cjs/types/CamOverlayAPI/CamOverlayAPI.js +127 -0
  54. package/cjs/types/CamOverlayAPI/accuweatherSchema.d.ts +114 -0
  55. package/cjs/types/CamOverlayAPI/accuweatherSchema.js +50 -0
  56. package/cjs/types/CamOverlayAPI/customGraphicsSchema.d.ts +783 -0
  57. package/cjs/types/CamOverlayAPI/customGraphicsSchema.js +75 -0
  58. package/cjs/types/CamOverlayAPI/imagesSchema.d.ts +122 -0
  59. package/cjs/types/CamOverlayAPI/imagesSchema.js +12 -0
  60. package/cjs/types/CamOverlayAPI/index.d.ts +9 -0
  61. package/cjs/types/CamOverlayAPI/index.js +25 -0
  62. package/cjs/types/CamOverlayAPI/infotickerSchema.d.ts +130 -0
  63. package/cjs/types/CamOverlayAPI/infotickerSchema.js +29 -0
  64. package/cjs/types/CamOverlayAPI/pipSchema.d.ts +166 -0
  65. package/cjs/types/CamOverlayAPI/pipSchema.js +42 -0
  66. package/cjs/types/CamOverlayAPI/ptzCompassSchema.d.ts +126 -0
  67. package/cjs/types/CamOverlayAPI/ptzCompassSchema.js +28 -0
  68. package/cjs/types/CamOverlayAPI/ptzSchema.d.ts +146 -0
  69. package/cjs/types/CamOverlayAPI/ptzSchema.js +15 -0
  70. package/cjs/types/CamOverlayAPI/screenSharingSchema.d.ts +79 -0
  71. package/cjs/types/CamOverlayAPI/screenSharingSchema.js +11 -0
  72. package/cjs/types/CamOverlayAPI/webCameraSharingSchema.d.ts +79 -0
  73. package/cjs/types/CamOverlayAPI/webCameraSharingSchema.js +11 -0
  74. package/cjs/types/CamOverlayDrawingAPI.d.ts +58 -0
  75. package/cjs/types/CamOverlayDrawingAPI.js +2 -0
  76. package/cjs/types/CamOverlayPainter.d.ts +74 -0
  77. package/cjs/types/CamOverlayPainter.js +2 -0
  78. package/cjs/types/CamScripterAPI.d.ts +82 -17
  79. package/cjs/types/CamScripterAPI.js +22 -7
  80. package/cjs/types/CamStreamerAPI.d.ts +16 -5
  81. package/cjs/types/CamStreamerAPI.js +5 -1
  82. package/cjs/types/CamSwitcherAPI.d.ts +5 -5
  83. package/cjs/types/CamSwitcherEvents.d.ts +77 -0
  84. package/cjs/types/CamSwitcherEvents.js +8 -0
  85. package/cjs/types/PlaneTrackerAPI.d.ts +8 -0
  86. package/cjs/types/PlaneTrackerAPI.js +2 -0
  87. package/cjs/types/VapixAPI.d.ts +636 -519
  88. package/cjs/types/VapixAPI.js +62 -24
  89. package/cjs/types/common.d.ts +14 -5
  90. package/cjs/web/DefaultClient.d.ts +5 -5
  91. package/cjs/web/DefaultClient.js +22 -10
  92. package/cjs/web/WsClient.js +2 -2
  93. package/esm/CamOverlayAPI.d.ts +47 -26
  94. package/esm/CamOverlayAPI.js +169 -86
  95. package/esm/CamOverlayDrawingAPI.d.ts +2 -47
  96. package/esm/CamOverlayDrawingAPI.js +6 -3
  97. package/esm/CamOverlayPainter/Frame.d.ts +8 -37
  98. package/esm/CamOverlayPainter/Frame.js +33 -0
  99. package/esm/CamOverlayPainter/Painter.d.ts +16 -10
  100. package/esm/CamOverlayPainter/Painter.js +5 -3
  101. package/esm/CamOverlayPainter/ResourceManager.d.ts +3 -2
  102. package/esm/CamOverlayPainter/ResourceManager.js +7 -11
  103. package/esm/CamScripterAPI.d.ts +33 -16
  104. package/esm/CamScripterAPI.js +46 -37
  105. package/esm/CamScripterAPICameraEventsGenerator.d.ts +1 -1
  106. package/esm/CamScripterAPICameraEventsGenerator.js +6 -3
  107. package/esm/CamStreamerAPI.d.ts +16 -14
  108. package/esm/CamStreamerAPI.js +32 -32
  109. package/esm/CamSwitcherAPI.d.ts +42 -37
  110. package/esm/CamSwitcherAPI.js +116 -107
  111. package/esm/CamSwitcherEvents.d.ts +1 -1
  112. package/esm/PlaneTrackerAPI.d.ts +42 -0
  113. package/esm/PlaneTrackerAPI.js +207 -0
  114. package/esm/VapixAPI.d.ts +56 -43
  115. package/esm/VapixAPI.js +297 -208
  116. package/esm/VapixEvents.d.ts +1 -1
  117. package/esm/VapixEvents.js +3 -3
  118. package/esm/errors/errors.d.ts +3 -0
  119. package/esm/errors/errors.js +6 -0
  120. package/esm/events/AxisCameraStationEvents.d.ts +5 -4
  121. package/esm/events/AxisCameraStationEvents.js +18 -13
  122. package/esm/events/GenetecAgent.d.ts +6 -3
  123. package/esm/events/GenetecAgent.js +20 -9
  124. package/esm/index.d.ts +14 -1
  125. package/esm/index.js +14 -1
  126. package/esm/internal/Digest.js +6 -6
  127. package/esm/internal/ProxyClient.d.ts +8 -9
  128. package/esm/internal/ProxyClient.js +25 -29
  129. package/esm/internal/types.d.ts +42 -0
  130. package/esm/internal/types.js +1 -0
  131. package/esm/internal/utils.d.ts +4 -1
  132. package/esm/internal/utils.js +17 -1
  133. package/esm/internal/versionCompare.d.ts +2 -2
  134. package/esm/node/DefaultClient.d.ts +5 -6
  135. package/esm/node/DefaultClient.js +12 -14
  136. package/esm/node/HttpRequestSender.d.ts +1 -0
  137. package/esm/node/HttpRequestSender.js +13 -3
  138. package/esm/node/HttpServer.js +1 -1
  139. package/esm/node/WsClient.d.ts +2 -1
  140. package/esm/node/WsEventClient.d.ts +1 -1
  141. package/esm/node/index.d.ts +2 -0
  142. package/esm/node/index.js +2 -0
  143. package/esm/types/CamOverlayAPI/CamOverlayAPI.d.ts +3073 -0
  144. package/esm/types/CamOverlayAPI/CamOverlayAPI.js +124 -0
  145. package/esm/types/CamOverlayAPI/accuweatherSchema.d.ts +114 -0
  146. package/esm/types/CamOverlayAPI/accuweatherSchema.js +46 -0
  147. package/esm/types/CamOverlayAPI/customGraphicsSchema.d.ts +783 -0
  148. package/esm/types/CamOverlayAPI/customGraphicsSchema.js +71 -0
  149. package/esm/types/CamOverlayAPI/imagesSchema.d.ts +122 -0
  150. package/esm/types/CamOverlayAPI/imagesSchema.js +8 -0
  151. package/esm/types/CamOverlayAPI/index.d.ts +9 -0
  152. package/esm/types/CamOverlayAPI/index.js +9 -0
  153. package/esm/types/CamOverlayAPI/infotickerSchema.d.ts +130 -0
  154. package/esm/types/CamOverlayAPI/infotickerSchema.js +25 -0
  155. package/esm/types/CamOverlayAPI/pipSchema.d.ts +166 -0
  156. package/esm/types/CamOverlayAPI/pipSchema.js +38 -0
  157. package/esm/types/CamOverlayAPI/ptzCompassSchema.d.ts +126 -0
  158. package/esm/types/CamOverlayAPI/ptzCompassSchema.js +24 -0
  159. package/esm/types/CamOverlayAPI/ptzSchema.d.ts +146 -0
  160. package/esm/types/CamOverlayAPI/ptzSchema.js +11 -0
  161. package/esm/types/CamOverlayAPI/screenSharingSchema.d.ts +79 -0
  162. package/esm/types/CamOverlayAPI/screenSharingSchema.js +7 -0
  163. package/esm/types/CamOverlayAPI/webCameraSharingSchema.d.ts +79 -0
  164. package/esm/types/CamOverlayAPI/webCameraSharingSchema.js +7 -0
  165. package/esm/types/CamOverlayDrawingAPI.d.ts +58 -0
  166. package/esm/types/CamOverlayDrawingAPI.js +1 -0
  167. package/esm/types/CamOverlayPainter.d.ts +74 -0
  168. package/esm/types/CamOverlayPainter.js +1 -0
  169. package/esm/types/CamScripterAPI.d.ts +82 -17
  170. package/esm/types/CamScripterAPI.js +21 -6
  171. package/esm/types/CamStreamerAPI.d.ts +16 -5
  172. package/esm/types/CamStreamerAPI.js +4 -0
  173. package/esm/types/CamSwitcherAPI.d.ts +5 -5
  174. package/esm/types/CamSwitcherEvents.d.ts +77 -0
  175. package/esm/types/CamSwitcherEvents.js +8 -0
  176. package/esm/types/PlaneTrackerAPI.d.ts +8 -0
  177. package/esm/types/PlaneTrackerAPI.js +1 -0
  178. package/esm/types/VapixAPI.d.ts +636 -519
  179. package/esm/types/VapixAPI.js +61 -23
  180. package/esm/types/common.d.ts +14 -5
  181. package/esm/web/DefaultClient.d.ts +5 -5
  182. package/esm/web/DefaultClient.js +22 -10
  183. package/esm/web/WsClient.js +2 -2
  184. package/package.json +9 -8
  185. package/cjs/internal/common.d.ts +0 -39
  186. package/cjs/internal/common.js +0 -27
  187. package/cjs/types/CamOverlayAPI.d.ts +0 -188
  188. package/cjs/types/CamOverlayAPI.js +0 -47
  189. package/esm/internal/common.d.ts +0 -39
  190. package/esm/internal/common.js +0 -20
  191. package/esm/types/CamOverlayAPI.d.ts +0 -188
  192. package/esm/types/CamOverlayAPI.js +0 -44
@@ -1,65 +1,100 @@
1
- import { isClient, responseStringify } from './internal/common';
2
- import { DefaultClient } from './node/DefaultClient';
3
- import { fileListSchema, ImageType, serviceSchema, storageSchema, } from './types/CamOverlayAPI';
1
+ import { paramToUrl, responseStringify } from './internal/utils';
4
2
  import { ParsingBlobError, ServiceNotFoundError } from './errors/errors';
5
3
  import { networkCameraListSchema } from './types/common';
4
+ import { z } from 'zod';
5
+ import { ProxyClient } from './internal/ProxyClient';
6
+ import { fileListSchema, ImageType, storageDataListSchema, widgetsSchema, WSResponseSchema, } from './types/CamOverlayAPI/CamOverlayAPI';
7
+ export const allowedWidgetNames = {
8
+ accuweather: 'accuweather',
9
+ infoticker: 'infoticker',
10
+ customGraphics: 'customGraphics',
11
+ ptzCompass: 'ptzCompass',
12
+ images: 'images',
13
+ ptz: 'ptz',
14
+ pip: 'pip',
15
+ screenSharing: 'screenSharing',
16
+ web_camera: 'web_camera',
17
+ };
18
+ const BASE_PATH = '/local/camoverlay/api';
6
19
  export class CamOverlayAPI {
7
20
  client;
8
- constructor(options = {}) {
9
- if (isClient(options)) {
10
- this.client = options;
11
- }
12
- else {
13
- this.client = new DefaultClient(options);
14
- }
15
- }
16
- async checkCameraTime() {
17
- const cameraTime = await this.get('/local/camoverlay/api/camera_time.cgi');
18
- return cameraTime.state;
19
- }
20
- async getNetworkCameraList() {
21
- const response = await this.get('/local/camoverlay/api/network_camera_list.cgi');
21
+ constructor(client) {
22
+ this.client = client;
23
+ }
24
+ static getBasePath = () => BASE_PATH;
25
+ static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
26
+ static getFilePreviewPath = (path) => `${BASE_PATH}/image.cgi?path=${encodeURIComponent(path)}`;
27
+ async checkCameraTime(options) {
28
+ const response = await this._get({ path: `${BASE_PATH}/camera_time.cgi` }, options);
29
+ return z.boolean().parse(response.state);
30
+ }
31
+ async getNetworkCameraList(options) {
32
+ const response = await this._get({ path: `${BASE_PATH}/network_camera_list.cgi` }, options);
22
33
  return networkCameraListSchema.parse(response.camera_list);
23
34
  }
24
- async wsAutoratization() {
25
- const response = await this.get(`/local/camoverlay/api/ws_authorization.cgi`);
26
- return response.data;
27
- }
28
- async getMjpegStreamImage(mjpegUrl) {
29
- const res = await this.get(`/local/camoverlay/api/fetch_mjpeg_image.cgi?mjpeg_url=${encodeURIComponent(decodeURIComponent(mjpegUrl))}`);
30
- return await this.parseBlobResponse(res);
31
- }
32
- async listFiles(fileType) {
33
- const files = await this.get(`/local/camoverlay/api/upload_${fileType}.cgi?action=list`);
35
+ async wsAuthorization(options) {
36
+ const response = await this._get({ path: `${BASE_PATH}/ws_authorization.cgi` }, options);
37
+ return WSResponseSchema.parse(response).data;
38
+ }
39
+ async getMjpegStreamImage(mjpegUrl, options) {
40
+ return await this._getBlob({
41
+ path: `${BASE_PATH}/fetch_mjpeg_image.cgi?mjpeg_url=${encodeURIComponent(decodeURIComponent(mjpegUrl))}`,
42
+ }, options);
43
+ }
44
+ async listFiles(fileType, options) {
45
+ const files = await this._get({
46
+ path: `${BASE_PATH}/upload_${fileType}.cgi`,
47
+ parameters: {
48
+ action: 'list',
49
+ },
50
+ }, options);
34
51
  return fileListSchema.parse(files.list);
35
52
  }
36
- async uploadFile(fileType, file, fileName) {
37
- const formData = new FormData();
38
- formData.append('target', 'SD0');
39
- formData.append('uploadedFile[]', file, fileName);
40
- const path = `/local/camoverlay/api/upload_${fileType}.cgi?action=upload`;
41
- await this.post(path, formData);
42
- }
43
- async removeFile(fileType, file) {
44
- const path = `/local/camoverlay/api/upload_${fileType}.cgi?action=remove`;
45
- await this.post(path, JSON.stringify(file));
53
+ async uploadFile(fileType, formData, storage, options) {
54
+ await this._post({
55
+ path: `${BASE_PATH}/upload_${fileType}.cgi`,
56
+ data: formData,
57
+ parameters: {
58
+ action: 'upload',
59
+ storage: storage,
60
+ },
61
+ }, options);
62
+ }
63
+ async removeFile(fileType, fileParams, options) {
64
+ const path = `${BASE_PATH}/upload_${fileType}.cgi`;
65
+ await this._postUrlEncoded(path, {
66
+ action: 'remove',
67
+ ...fileParams,
68
+ }, undefined, options);
69
+ }
70
+ async getFileStorage(fileType, options) {
71
+ const data = await this._get({
72
+ path: `${BASE_PATH}/upload_${fileType}.cgi`,
73
+ parameters: {
74
+ action: 'get_storage',
75
+ },
76
+ }, options);
77
+ if (data.code !== 200) {
78
+ throw new Error('Error occured while fetching file storage data');
79
+ }
80
+ return storageDataListSchema.parse(data.list);
46
81
  }
47
- async getFileStorage(fileType) {
48
- const data = await this.get(`/local/camoverlay/api/upload_${fileType}.cgi?action=get_storage`);
49
- return storageSchema.parse(data);
82
+ async getFilePreviewFromCamera(path, options) {
83
+ return await this._getBlob({ path: CamOverlayAPI.getFilePreviewPath(path) }, options);
50
84
  }
51
- async updateInfoticker(serviceID, text) {
52
- await this.get(`/local/camoverlay/api/infoticker.cgi?service_id=${serviceID}&text=${text}`);
85
+ async updateInfoticker(serviceId, text, options) {
86
+ await this._get({ path: `${BASE_PATH}/infoticker.cgi?service_id=${serviceId}&text=${text}` }, options);
53
87
  }
54
- async setEnabled(serviceID, enabled) {
55
- await this.post(`/local/camoverlay/api/enabled.cgi?id_${serviceID}=${enabled ? 1 : 0}`, '');
88
+ async setEnabled(serviceId, enabled, options) {
89
+ await this._post({ path: `${BASE_PATH}/enabled.cgi?id_${serviceId}=${enabled ? 1 : 0}`, data: '' }, options);
56
90
  }
57
- async isEnabled(serviceID) {
58
- const res = await this.client.get('/local/camoverlay/api/services.cgi?action=get');
91
+ async isEnabled(serviceId, options) {
92
+ const agent = this.getAgent(options?.proxyParams);
93
+ const res = await agent.get({ path: `${BASE_PATH}/services.cgi?action=get`, timeout: options?.timeout });
59
94
  if (res.ok) {
60
95
  const data = JSON.parse(await res.text());
61
96
  for (const service of data.services) {
62
- if (service.id === serviceID) {
97
+ if (service.id === serviceId) {
63
98
  return service.enabled === 1;
64
99
  }
65
100
  }
@@ -69,29 +104,46 @@ export class CamOverlayAPI {
69
104
  throw new Error(await responseStringify(res));
70
105
  }
71
106
  }
72
- async getSingleService(serviceId) {
73
- const data = await this.get('/local/camoverlay/api/services.cgi', {
74
- action: 'get',
75
- service_id: serviceId.toString(),
107
+ async getSingleWidget(serviceId, options) {
108
+ const data = await this._get({
109
+ path: `${BASE_PATH}/services.cgi`,
110
+ parameters: {
111
+ action: 'get',
112
+ service_id: serviceId.toString(),
113
+ },
114
+ }, options);
115
+ return widgetsSchema.parse(data);
116
+ }
117
+ async getWidgets(options) {
118
+ const widgetList = await this._get({
119
+ path: `${BASE_PATH}/services.cgi`,
120
+ parameters: {
121
+ action: 'get',
122
+ },
123
+ }, options);
124
+ const widgets = widgetList.services;
125
+ widgets.forEach((widget) => {
126
+ const parsedWidget = widgetsSchema.safeParse(widget);
127
+ if (!parsedWidget.success) {
128
+ console.warn(`[SERVICE SCHEMA MISMATCH]: Service ${widget.name} (${widget.id}) does not match the current schema, or is a hidden service.`);
129
+ }
76
130
  });
77
- return serviceSchema.parse(data);
78
- }
79
- async getServices() {
80
- const serviceList = await this.get('/local/camoverlay/api/services.cgi?action=get');
81
- return serviceSchema.parse(serviceList).services;
131
+ return widgets;
82
132
  }
83
- async updateSingleService(serviceId, serviceJson) {
84
- const path = '/local/camoverlay/api/services.cgi';
85
- await this.post(path, JSON.stringify(serviceJson), {
133
+ async updateSingleWidget(widget, options) {
134
+ const path = `${BASE_PATH}/services.cgi`;
135
+ await this._postJsonEncoded(path, JSON.stringify(widget), {
86
136
  action: 'set',
87
- service_id: serviceId.toString(),
88
- });
137
+ service_id: widget.id.toString(),
138
+ }, undefined, options);
89
139
  }
90
- async updateServices(servicesJson) {
91
- const path = '/local/camoverlay/api/services.cgi?action=set';
92
- await this.post(path, JSON.stringify(servicesJson));
140
+ async updateWidgets(widgets, options) {
141
+ const path = `${BASE_PATH}/services.cgi`;
142
+ await this._postJsonEncoded(path, JSON.stringify({ services: widgets }), {
143
+ action: 'set',
144
+ }, undefined, options);
93
145
  }
94
- updateCGText(serviceID, fields) {
146
+ updateCGText(serviceId, fields, options) {
95
147
  const params = {};
96
148
  for (const field of fields) {
97
149
  const name = field.field_name;
@@ -100,62 +152,81 @@ export class CamOverlayAPI {
100
152
  params[`${name}_color`] = field.color;
101
153
  }
102
154
  }
103
- return this.promiseCGUpdate(serviceID, 'update_text', params);
155
+ return this.promiseCGUpdate(serviceId, 'update_text', params, undefined, undefined, options);
104
156
  }
105
- updateCGImagePos(serviceID, coordinates = '', x = 0, y = 0) {
157
+ updateCGImagePos(serviceId, coordinates = '', x = 0, y = 0, options) {
106
158
  const params = {
107
159
  coord_system: coordinates,
108
160
  pos_x: x,
109
161
  pos_y: y,
110
162
  };
111
- return this.promiseCGUpdate(serviceID, 'update_image', params);
163
+ return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
112
164
  }
113
- updateCGImage(serviceID, path, coordinates = '', x = 0, y = 0) {
165
+ updateCGImage(serviceId, path, coordinates = '', x = 0, y = 0, options) {
114
166
  const params = {
115
167
  coord_system: coordinates,
116
168
  pos_x: x,
117
169
  pos_y: y,
118
170
  image: path,
119
171
  };
120
- return this.promiseCGUpdate(serviceID, 'update_image', params);
172
+ return this.promiseCGUpdate(serviceId, 'update_image', params, undefined, undefined, options);
121
173
  }
122
- updateCGImageFromData(serviceID, imageType, imageData, coordinates = '', x = 0, y = 0) {
174
+ updateCGImageFromData(serviceId, imageType, imageData, coordinates = '', x = 0, y = 0, options) {
123
175
  const contentType = imageType === ImageType.PNG ? 'image/png' : 'image/jpeg';
124
176
  const params = {
125
177
  coord_system: coordinates,
126
178
  pos_x: x,
127
179
  pos_y: y,
128
180
  };
129
- return this.promiseCGUpdate(serviceID, 'update_image', params, contentType, imageData);
181
+ return this.promiseCGUpdate(serviceId, 'update_image', params, contentType, imageData, options);
130
182
  }
131
- async promiseCGUpdate(serviceID, action, params = {}, contentType, data) {
132
- const path = `/local/camoverlay/api/customGraphics.cgi`;
183
+ async promiseCGUpdate(serviceId, action, params = {}, contentType, data, options) {
184
+ const path = `${BASE_PATH}/customGraphics.cgi`;
133
185
  let headers = {};
134
186
  if (contentType !== undefined && data) {
135
187
  headers = { 'Content-Type': contentType };
136
188
  }
137
- const res = await this.client.post(path, data ?? '', {
138
- action: action,
139
- service_id: serviceID.toString(),
140
- ...params,
141
- }, headers);
189
+ const agent = this.getAgent(options?.proxyParams);
190
+ const res = await agent.post({
191
+ path,
192
+ data: data ?? '',
193
+ parameters: {
194
+ action: action,
195
+ service_id: serviceId.toString(),
196
+ ...params,
197
+ },
198
+ headers,
199
+ timeout: options?.timeout,
200
+ });
142
201
  if (!res.ok) {
143
202
  throw new Error(await responseStringify(res));
144
203
  }
145
204
  }
146
- async get(path, params) {
147
- const res = await this.client.get(path, params);
205
+ async _get(params, options) {
206
+ const agent = this.getAgent(options?.proxyParams);
207
+ const res = await agent.get({ ...params, timeout: options?.timeout });
148
208
  if (res.ok) {
149
- return await res.json();
209
+ return (await res.json());
150
210
  }
151
211
  else {
152
212
  throw new Error(await responseStringify(res));
153
213
  }
154
214
  }
155
- async post(path, data, params) {
156
- const res = await this.client.post(path, data, params);
215
+ async _post(params, options) {
216
+ const agent = this.getAgent(options?.proxyParams);
217
+ const res = await agent.post({ ...params, timeout: options?.timeout });
157
218
  if (res.ok) {
158
- return await res.json();
219
+ return (await res.json());
220
+ }
221
+ else {
222
+ throw new Error(await responseStringify(res));
223
+ }
224
+ }
225
+ async _getBlob(params, options) {
226
+ const agent = this.getAgent(options?.proxyParams);
227
+ const res = await agent.get({ ...params, timeout: options?.timeout });
228
+ if (res.ok) {
229
+ return await this.parseBlobResponse(res);
159
230
  }
160
231
  else {
161
232
  throw new Error(await responseStringify(res));
@@ -163,10 +234,22 @@ export class CamOverlayAPI {
163
234
  }
164
235
  async parseBlobResponse(response) {
165
236
  try {
166
- return await response.blob();
237
+ return (await response.blob());
167
238
  }
168
239
  catch (err) {
169
240
  throw new ParsingBlobError(err);
170
241
  }
171
242
  }
243
+ async _postUrlEncoded(path, params, headers, options) {
244
+ const data = paramToUrl(params);
245
+ const baseHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
246
+ return this._post({ path, data, headers: { ...baseHeaders, ...headers } }, options);
247
+ }
248
+ async _postJsonEncoded(path, data, parameters, headers, options) {
249
+ const baseHeaders = { 'Accept': 'application/json', 'Content-Type': 'application/json' };
250
+ return this._post({ path, data, parameters, headers: { ...baseHeaders, ...headers } }, options);
251
+ }
252
+ getAgent(proxyParams) {
253
+ return proxyParams ? new ProxyClient(this.client, proxyParams) : this.client;
254
+ }
172
255
  }
@@ -1,53 +1,8 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
+ /// <reference types="node" />
3
4
  import * as EventEmitter from 'events';
4
- import { WsOptions } from './internal/common';
5
- export type CamOverlayDrawingOptions = WsOptions & {
6
- camera?: number | number[];
7
- zIndex?: number;
8
- };
9
- export type TCairoResponse = {
10
- message: string;
11
- call_id: number;
12
- };
13
- export type TCairoCreateResponse = {
14
- var: string;
15
- call_id: number;
16
- };
17
- export type TUploadImageResponse = {
18
- var: string;
19
- width: number;
20
- height: number;
21
- call_id: number;
22
- };
23
- export type TErrorResponse = {
24
- error: string;
25
- call_id?: number;
26
- };
27
- export type TService = {
28
- id: number;
29
- enabled: number;
30
- schedule: string;
31
- name: string;
32
- identifier: string;
33
- cameraList: number[];
34
- };
35
- export type TServiceList = {
36
- services: TService[];
37
- };
38
- export type TAlign = 'A_RIGHT' | 'A_LEFT' | 'A_CENTER';
39
- export type TextFit = 'TFM_SCALE' | 'TFM_TRUNCATE' | 'TFM_OVERFLOW';
40
- export type TWriteTextParams = [string, string, number, number, number, number, TAlign, TextFit?];
41
- export interface CamOverlayDrawingAPI {
42
- on(event: 'open', listener: () => void): this;
43
- on(event: 'close', listener: () => void): this;
44
- on(event: 'error', listener: (err: Error) => void): this;
45
- on(event: 'message', listener: (msg: string) => void): this;
46
- emit(event: 'open'): boolean;
47
- emit(event: 'close'): boolean;
48
- emit(event: 'error', err: Error): boolean;
49
- emit(event: 'message', msg: string): boolean;
50
- }
5
+ import { CamOverlayDrawingOptions, TCairoCreateResponse, TCairoResponse, TUploadImageResponse, TWriteTextParams } from './types/CamOverlayDrawingAPI';
51
6
  export declare class CamOverlayDrawingAPI extends EventEmitter {
52
7
  private tls;
53
8
  private tlsInsecure;
@@ -121,10 +121,10 @@ export class CamOverlayDrawingAPI extends EventEmitter {
121
121
  }
122
122
  if (dataJSON.call_id !== undefined) {
123
123
  if (errorResponse !== undefined) {
124
- this.sendMessages[dataJSON.call_id].reject(new Error(errorResponse.error));
124
+ this.sendMessages[dataJSON.call_id]?.reject(new Error(errorResponse.error));
125
125
  }
126
126
  else {
127
- this.sendMessages[dataJSON.call_id].resolve(dataJSON);
127
+ this.sendMessages[dataJSON.call_id]?.resolve(dataJSON);
128
128
  }
129
129
  delete this.sendMessages[dataJSON.call_id];
130
130
  }
@@ -194,6 +194,9 @@ export class CamOverlayDrawingAPI extends EventEmitter {
194
194
  const now = Date.now();
195
195
  for (const callId in this.sendMessages) {
196
196
  const msg = this.sendMessages[callId];
197
+ if (!msg) {
198
+ continue;
199
+ }
197
200
  if (now - msg.sentTimestamp > 10000) {
198
201
  reconnect = true;
199
202
  msg.reject(new Error('Message timeout'));
@@ -220,7 +223,7 @@ export class CamOverlayDrawingAPI extends EventEmitter {
220
223
  }
221
224
  reportClose() {
222
225
  for (const callId in this.sendMessages) {
223
- this.sendMessages[callId].reject(new Error('Connection lost'));
226
+ this.sendMessages[callId]?.reject(new Error('Connection lost'));
224
227
  }
225
228
  this.sendMessages = {};
226
229
  this.emit('close');
@@ -1,42 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from 'events';
3
- import { CamOverlayDrawingAPI, TAlign, TCairoCreateResponse, TUploadImageResponse } from '../CamOverlayDrawingAPI';
4
- import ResourceManager from './ResourceManager';
5
- export type TRgb = [number, number, number];
6
- export type TRgba = [number, number, number, number];
7
- export type TTmf = 'TFM_OVERFLOW' | 'TFM_SCALE' | 'TFM_TRUNCATE';
8
- export type TObjectFitType = 'fill' | 'fit' | 'none';
9
- export type TFrameOptions = {
10
- enabled?: boolean;
11
- x: number;
12
- y: number;
13
- width: number;
14
- height: number;
15
- text?: string;
16
- fontColor?: TRgb;
17
- font?: string;
18
- bgColor?: TRgba;
19
- bgImage?: string;
20
- bgType?: TObjectFitType;
21
- borderRadius?: number;
22
- borderWidth?: number;
23
- borderColor?: TRgba;
24
- customDraw?: TDrawingCallback;
25
- layer?: number;
26
- };
27
- export type TFrameInfo = {
28
- width: number;
29
- height: number;
30
- };
31
- export type TDrawingCallback = (cod: CamOverlayDrawingAPI, cairo: string, info: TFrameInfo) => Promise<void>;
32
- export interface Frame {
33
- on(event: 'open', listener: () => void): this;
34
- on(event: 'close', listener: () => void): this;
35
- on(event: 'layoutChanged', listener: () => void): this;
36
- emit(event: 'open'): boolean;
37
- emit(event: 'close'): boolean;
38
- emit(event: 'layoutChanged'): boolean;
39
- }
3
+ import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
4
+ import { TAlign, TCairoCreateResponse, TUploadImageResponse } from '../types/CamOverlayDrawingAPI';
5
+ import { ResourceManager } from './ResourceManager';
6
+ import { TBg, TBorder, TDrawingCallback, TFrame, TFrameOptions, TObjectFitType, TRgb, TRgba, TText, TTmf } from '../types/CamOverlayPainter';
40
7
  export declare class Frame extends EventEmitter {
41
8
  protected enabled: boolean;
42
9
  protected posX: number;
@@ -64,17 +31,21 @@ export declare class Frame extends EventEmitter {
64
31
  disable(): void;
65
32
  setFramePosition(x: number, y: number): void;
66
33
  setFrameSize(width: number, height: number): void;
34
+ getFrameInfo(): TFrame;
67
35
  setText(text: string, align: TAlign, textType?: TTmf, fontColor?: TRgb): void;
68
36
  setFontColor(fontColor: TRgb): void;
69
37
  setFont(fontName: string): void;
70
38
  setFontData(fontData: TCairoCreateResponse): void;
39
+ getTextInfo(): TText;
71
40
  setBgColor(color: TRgba): void;
72
41
  setBgImage(imageName: string, type?: TObjectFitType): void;
73
42
  setBgImageData(imageData: TUploadImageResponse, type?: TObjectFitType): void;
74
43
  setBgType(type: TObjectFitType): void;
44
+ getBgInfo(): TBg;
75
45
  setBorderRadius(radius: number): void;
76
46
  setBorderWidth(width: number): void;
77
47
  setBorderColor(color: TRgba): void;
48
+ getBorderInfo(): TBorder;
78
49
  setCustomDraw(customDraw: TDrawingCallback): void;
79
50
  resetFont(): void;
80
51
  resetBgColor(): void;
@@ -54,6 +54,14 @@ export class Frame extends EventEmitter {
54
54
  this.width = width;
55
55
  this.height = height;
56
56
  }
57
+ getFrameInfo() {
58
+ return {
59
+ x: this.posX,
60
+ y: this.posY,
61
+ width: this.width,
62
+ height: this.height,
63
+ };
64
+ }
57
65
  setText(text, align, textType = 'TFM_OVERFLOW', fontColor) {
58
66
  this.text = text;
59
67
  this.align = align;
@@ -73,6 +81,16 @@ export class Frame extends EventEmitter {
73
81
  this.fontName = undefined;
74
82
  this.font = fontData;
75
83
  }
84
+ getTextInfo() {
85
+ return {
86
+ text: this.text,
87
+ textAlign: this.align,
88
+ textType: this.textType,
89
+ fontColor: this.fontColor,
90
+ font: this.font,
91
+ fontName: this.fontName,
92
+ };
93
+ }
76
94
  setBgColor(color) {
77
95
  this.bgColor = color;
78
96
  }
@@ -89,6 +107,14 @@ export class Frame extends EventEmitter {
89
107
  setBgType(type) {
90
108
  this.bgType = type;
91
109
  }
110
+ getBgInfo() {
111
+ return {
112
+ bgColor: this.bgColor,
113
+ bgImage: this.bgImage,
114
+ bgImageName: this.bgImageName,
115
+ bgType: this.bgType,
116
+ };
117
+ }
92
118
  setBorderRadius(radius) {
93
119
  this.borderRadius = radius;
94
120
  }
@@ -98,6 +124,13 @@ export class Frame extends EventEmitter {
98
124
  setBorderColor(color) {
99
125
  this.borderColor = color;
100
126
  }
127
+ getBorderInfo() {
128
+ return {
129
+ borderRadius: this.borderRadius,
130
+ borderWidth: this.borderWidth,
131
+ borderColor: this.borderColor,
132
+ };
133
+ }
101
134
  setCustomDraw(customDraw) {
102
135
  this.customDraw = customDraw;
103
136
  }
@@ -1,11 +1,18 @@
1
- import { CamOverlayDrawingAPI, CamOverlayDrawingOptions } from '../CamOverlayDrawingAPI';
2
- import ResourceManager from './ResourceManager';
3
- import { Frame, TFrameOptions } from './Frame';
4
- export declare const COORD: Record<string, [number, number]>;
5
- export type TPainterOptions = TFrameOptions & {
6
- screenWidth: number;
7
- screenHeight: number;
8
- coAlignment: string;
1
+ import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
2
+ import { CamOverlayDrawingOptions } from '../types/CamOverlayDrawingAPI';
3
+ import { ResourceManager } from './ResourceManager';
4
+ import { Frame } from './Frame';
5
+ import { TCoAlignment, TPainterOptions } from '../types/CamOverlayPainter';
6
+ export declare const COORD: {
7
+ readonly top_left: readonly [-1, -1];
8
+ readonly center_left: readonly [-1, 0];
9
+ readonly bottom_left: readonly [-1, 1];
10
+ readonly top_center: readonly [0, -1];
11
+ readonly center: readonly [0, 0];
12
+ readonly bottom_center: readonly [0, 1];
13
+ readonly top_right: readonly [1, -1];
14
+ readonly center_right: readonly [1, 0];
15
+ readonly bottom_right: readonly [1, 1];
9
16
  };
10
17
  export declare class Painter extends Frame {
11
18
  private screenWidth;
@@ -24,7 +31,7 @@ export declare class Painter extends Frame {
24
31
  registerImage(moniker: string, fileName: string): void;
25
32
  registerFont(moniker: string, fileName: string): void;
26
33
  setScreenSize(sw: number, sh: number): void;
27
- setCoAlignment(coAlignment: string): void;
34
+ setCoAlignment(coAlignment: TCoAlignment): void;
28
35
  protected layoutChanged(): void;
29
36
  display(scale?: number): Promise<void>;
30
37
  hide(): Promise<void>;
@@ -34,4 +41,3 @@ export declare class Painter extends Frame {
34
41
  private cleanupSurface;
35
42
  private positionConvertor;
36
43
  }
37
- export { Frame, TFrameOptions as FrameOptions, ResourceManager, CamOverlayDrawingOptions };
@@ -1,5 +1,5 @@
1
1
  import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
2
- import ResourceManager from './ResourceManager';
2
+ import { ResourceManager } from './ResourceManager';
3
3
  import { Frame } from './Frame';
4
4
  export const COORD = {
5
5
  top_left: [-1, -1],
@@ -82,6 +82,9 @@ export class Painter extends Frame {
82
82
  let lastCachedLayer;
83
83
  for (let i = 0; i < this.layers.length; i++) {
84
84
  const layer = this.layers[i];
85
+ if (layer === undefined) {
86
+ continue;
87
+ }
85
88
  if (layer.cairoCache !== undefined &&
86
89
  layer.surfaceCache !== undefined &&
87
90
  surface === undefined &&
@@ -115,7 +118,7 @@ export class Painter extends Frame {
115
118
  }
116
119
  for (let i = layerIdx; i < this.layers.length; i++) {
117
120
  const currentLayer = this.layers[i];
118
- if (currentLayer.surfaceCache !== undefined && currentLayer.cairoCache !== undefined) {
121
+ if (currentLayer?.surfaceCache !== undefined && currentLayer.cairoCache !== undefined) {
119
122
  await this.cleanupSurface(currentLayer.surfaceCache, currentLayer.cairoCache);
120
123
  currentLayer.surfaceCache = undefined;
121
124
  currentLayer.cairoCache = undefined;
@@ -160,4 +163,3 @@ export class Painter extends Frame {
160
163
  }
161
164
  }
162
165
  }
163
- export { Frame, ResourceManager };
@@ -1,5 +1,6 @@
1
- import { CamOverlayDrawingAPI, TUploadImageResponse, TCairoCreateResponse } from '../CamOverlayDrawingAPI';
2
- export default class ResourceManager {
1
+ import { CamOverlayDrawingAPI } from '../CamOverlayDrawingAPI';
2
+ import { TUploadImageResponse, TCairoCreateResponse } from '../types/CamOverlayDrawingAPI';
3
+ export declare class ResourceManager {
3
4
  private co;
4
5
  private imgFileNames;
5
6
  private fontFileNames;