camstreamerlib 4.0.0-beta.2 → 4.0.0-beta.4

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 (162) hide show
  1. package/cjs/CamOverlayAPI.js +176 -0
  2. package/cjs/CamOverlayDrawingAPI.js +235 -0
  3. package/cjs/CamOverlayPainter/Frame.js +301 -0
  4. package/{CamOverlayPainter → cjs/CamOverlayPainter}/Painter.d.ts +14 -3
  5. package/cjs/CamOverlayPainter/Painter.js +171 -0
  6. package/cjs/CamOverlayPainter/ResourceManager.js +46 -0
  7. package/cjs/CamScripterAPI.js +70 -0
  8. package/cjs/CamScripterAPICameraEventsGenerator.js +162 -0
  9. package/cjs/CamStreamerAPI.js +65 -0
  10. package/{CamSwitcherAPI.d.ts → cjs/CamSwitcherAPI.d.ts} +3 -3
  11. package/cjs/CamSwitcherAPI.js +350 -0
  12. package/{CamSwitcherEvents.d.ts → cjs/CamSwitcherEvents.d.ts} +1 -1
  13. package/cjs/CamSwitcherEvents.js +67 -0
  14. package/cjs/CreatePackage.js +106 -0
  15. package/{VapixAPI.d.ts → cjs/VapixAPI.d.ts} +9 -9
  16. package/cjs/VapixAPI.js +462 -0
  17. package/cjs/VapixEvents.js +88 -0
  18. package/cjs/errors/errors.js +79 -0
  19. package/cjs/events/AxisCameraStationEvents.js +48 -0
  20. package/cjs/events/GenetecAgent.js +123 -0
  21. package/cjs/index.d.ts +11 -0
  22. package/cjs/index.js +31 -0
  23. package/cjs/internal/Digest.js +42 -0
  24. package/cjs/internal/ProxyClient.js +44 -0
  25. package/{internal → cjs/internal}/common.d.ts +0 -1
  26. package/cjs/internal/common.js +27 -0
  27. package/cjs/internal/constants.js +4 -0
  28. package/cjs/internal/transformers.js +32 -0
  29. package/cjs/internal/utils.js +46 -0
  30. package/cjs/internal/versionCompare.js +53 -0
  31. package/cjs/node/DefaultClient.js +54 -0
  32. package/cjs/node/HttpRequestSender.js +89 -0
  33. package/cjs/node/HttpServer.js +96 -0
  34. package/cjs/node/WsClient.js +149 -0
  35. package/cjs/node/WsEventClient.js +22 -0
  36. package/cjs/node/index.d.ts +2 -0
  37. package/cjs/node/index.js +7 -0
  38. package/cjs/types/CamOverlayAPI.js +47 -0
  39. package/cjs/types/CamScripterAPI.js +20 -0
  40. package/cjs/types/CamStreamerAPI.js +28 -0
  41. package/cjs/types/CamSwitcherAPI.js +137 -0
  42. package/cjs/types/CamSwitcherEvents.js +62 -0
  43. package/{types → cjs/types}/VapixAPI.d.ts +40 -61
  44. package/cjs/types/VapixAPI.js +130 -0
  45. package/cjs/types/common.js +14 -0
  46. package/cjs/web/DefaultClient.js +20 -0
  47. package/cjs/web/WsClient.js +62 -0
  48. package/cjs/web/index.d.ts +2 -0
  49. package/cjs/web/index.js +7 -0
  50. package/esm/CamOverlayAPI.d.ts +31 -0
  51. package/esm/CamOverlayDrawingAPI.d.ts +86 -0
  52. package/{CamOverlayDrawingAPI.js → esm/CamOverlayDrawingAPI.js} +6 -3
  53. package/esm/CamOverlayPainter/Frame.d.ts +96 -0
  54. package/esm/CamOverlayPainter/Painter.d.ts +48 -0
  55. package/{CamOverlayPainter → esm/CamOverlayPainter}/Painter.js +4 -1
  56. package/esm/CamOverlayPainter/ResourceManager.d.ts +14 -0
  57. package/{CamOverlayPainter → esm/CamOverlayPainter}/ResourceManager.js +6 -10
  58. package/esm/CamScripterAPI.d.ts +19 -0
  59. package/esm/CamScripterAPICameraEventsGenerator.d.ts +74 -0
  60. package/{CamScripterAPICameraEventsGenerator.js → esm/CamScripterAPICameraEventsGenerator.js} +6 -3
  61. package/esm/CamStreamerAPI.d.ts +16 -0
  62. package/esm/CamSwitcherAPI.d.ts +48 -0
  63. package/{CamSwitcherAPI.js → esm/CamSwitcherAPI.js} +19 -23
  64. package/esm/CamSwitcherEvents.d.ts +18 -0
  65. package/{CamSwitcherEvents.js → esm/CamSwitcherEvents.js} +1 -1
  66. package/esm/CreatePackage.d.ts +1 -0
  67. package/esm/VapixAPI.d.ts +66 -0
  68. package/{VapixAPI.js → esm/VapixAPI.js} +20 -16
  69. package/esm/VapixEvents.d.ts +43 -0
  70. package/{VapixEvents.js → esm/VapixEvents.js} +3 -3
  71. package/esm/errors/errors.d.ts +34 -0
  72. package/esm/events/AxisCameraStationEvents.d.ts +9 -0
  73. package/esm/events/GenetecAgent.d.ts +174 -0
  74. package/esm/index.d.ts +11 -0
  75. package/esm/index.js +11 -0
  76. package/esm/internal/Digest.d.ts +4 -0
  77. package/{internal → esm/internal}/Digest.js +6 -6
  78. package/esm/internal/ProxyClient.d.ts +11 -0
  79. package/esm/internal/common.d.ts +39 -0
  80. package/{internal → esm/internal}/common.js +0 -3
  81. package/esm/internal/constants.d.ts +1 -0
  82. package/esm/internal/transformers.d.ts +5 -0
  83. package/esm/internal/utils.d.ts +11 -0
  84. package/esm/internal/versionCompare.d.ts +6 -0
  85. package/esm/node/DefaultClient.d.ts +15 -0
  86. package/{node → esm/node}/DefaultClient.js +1 -1
  87. package/esm/node/HttpRequestSender.d.ts +28 -0
  88. package/esm/node/HttpServer.d.ts +21 -0
  89. package/{node → esm/node}/HttpServer.js +1 -1
  90. package/esm/node/WsClient.d.ts +39 -0
  91. package/esm/node/WsEventClient.d.ts +13 -0
  92. package/esm/node/index.d.ts +2 -0
  93. package/esm/node/index.js +2 -0
  94. package/esm/types/CamOverlayAPI.d.ts +188 -0
  95. package/esm/types/CamScripterAPI.d.ts +67 -0
  96. package/esm/types/CamStreamerAPI.d.ts +139 -0
  97. package/esm/types/CamSwitcherAPI.d.ts +814 -0
  98. package/esm/types/CamSwitcherEvents.d.ts +491 -0
  99. package/esm/types/VapixAPI.d.ts +1683 -0
  100. package/{types → esm/types}/VapixAPI.js +10 -12
  101. package/esm/types/common.d.ts +37 -0
  102. package/esm/web/DefaultClient.d.ts +6 -0
  103. package/esm/web/WsClient.d.ts +13 -0
  104. package/esm/web/index.d.ts +2 -0
  105. package/esm/web/index.js +2 -0
  106. package/package.json +6 -5
  107. package/README.md +0 -97
  108. /package/{CamOverlayAPI.d.ts → cjs/CamOverlayAPI.d.ts} +0 -0
  109. /package/{CamOverlayDrawingAPI.d.ts → cjs/CamOverlayDrawingAPI.d.ts} +0 -0
  110. /package/{CamOverlayPainter → cjs/CamOverlayPainter}/Frame.d.ts +0 -0
  111. /package/{CamOverlayPainter → cjs/CamOverlayPainter}/ResourceManager.d.ts +0 -0
  112. /package/{CamScripterAPI.d.ts → cjs/CamScripterAPI.d.ts} +0 -0
  113. /package/{CamScripterAPICameraEventsGenerator.d.ts → cjs/CamScripterAPICameraEventsGenerator.d.ts} +0 -0
  114. /package/{CamStreamerAPI.d.ts → cjs/CamStreamerAPI.d.ts} +0 -0
  115. /package/{CreatePackage.d.ts → cjs/CreatePackage.d.ts} +0 -0
  116. /package/{VapixEvents.d.ts → cjs/VapixEvents.d.ts} +0 -0
  117. /package/{errors → cjs/errors}/errors.d.ts +0 -0
  118. /package/{events → cjs/events}/AxisCameraStationEvents.d.ts +0 -0
  119. /package/{events → cjs/events}/GenetecAgent.d.ts +0 -0
  120. /package/{internal → cjs/internal}/Digest.d.ts +0 -0
  121. /package/{internal → cjs/internal}/ProxyClient.d.ts +0 -0
  122. /package/{internal → cjs/internal}/constants.d.ts +0 -0
  123. /package/{internal → cjs/internal}/transformers.d.ts +0 -0
  124. /package/{internal → cjs/internal}/utils.d.ts +0 -0
  125. /package/{internal → cjs/internal}/versionCompare.d.ts +0 -0
  126. /package/{node → cjs/node}/DefaultClient.d.ts +0 -0
  127. /package/{node → cjs/node}/HttpRequestSender.d.ts +0 -0
  128. /package/{node → cjs/node}/HttpServer.d.ts +0 -0
  129. /package/{node → cjs/node}/WsClient.d.ts +0 -0
  130. /package/{node → cjs/node}/WsEventClient.d.ts +0 -0
  131. /package/{types → cjs/types}/CamOverlayAPI.d.ts +0 -0
  132. /package/{types → cjs/types}/CamScripterAPI.d.ts +0 -0
  133. /package/{types → cjs/types}/CamStreamerAPI.d.ts +0 -0
  134. /package/{types → cjs/types}/CamSwitcherAPI.d.ts +0 -0
  135. /package/{types/CamswitcherEvents.d.ts → cjs/types/CamSwitcherEvents.d.ts} +0 -0
  136. /package/{types → cjs/types}/common.d.ts +0 -0
  137. /package/{web → cjs/web}/DefaultClient.d.ts +0 -0
  138. /package/{web → cjs/web}/WsClient.d.ts +0 -0
  139. /package/{CamOverlayAPI.js → esm/CamOverlayAPI.js} +0 -0
  140. /package/{CamOverlayPainter → esm/CamOverlayPainter}/Frame.js +0 -0
  141. /package/{CamScripterAPI.js → esm/CamScripterAPI.js} +0 -0
  142. /package/{CamStreamerAPI.js → esm/CamStreamerAPI.js} +0 -0
  143. /package/{CreatePackage.js → esm/CreatePackage.js} +0 -0
  144. /package/{errors → esm/errors}/errors.js +0 -0
  145. /package/{events → esm/events}/AxisCameraStationEvents.js +0 -0
  146. /package/{events → esm/events}/GenetecAgent.js +0 -0
  147. /package/{internal → esm/internal}/ProxyClient.js +0 -0
  148. /package/{internal → esm/internal}/constants.js +0 -0
  149. /package/{internal → esm/internal}/transformers.js +0 -0
  150. /package/{internal → esm/internal}/utils.js +0 -0
  151. /package/{internal → esm/internal}/versionCompare.js +0 -0
  152. /package/{node → esm/node}/HttpRequestSender.js +0 -0
  153. /package/{node → esm/node}/WsClient.js +0 -0
  154. /package/{node → esm/node}/WsEventClient.js +0 -0
  155. /package/{types → esm/types}/CamOverlayAPI.js +0 -0
  156. /package/{types → esm/types}/CamScripterAPI.js +0 -0
  157. /package/{types → esm/types}/CamStreamerAPI.js +0 -0
  158. /package/{types → esm/types}/CamSwitcherAPI.js +0 -0
  159. /package/{types/CamswitcherEvents.js → esm/types/CamSwitcherEvents.js} +0 -0
  160. /package/{types → esm/types}/common.js +0 -0
  161. /package/{web → esm/web}/DefaultClient.js +0 -0
  162. /package/{web → esm/web}/WsClient.js +0 -0
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Frame = void 0;
4
+ const events_1 = require("events");
5
+ class Frame extends events_1.EventEmitter {
6
+ enabled;
7
+ posX;
8
+ posY;
9
+ width;
10
+ height;
11
+ text = '';
12
+ fontColor;
13
+ fontName;
14
+ font;
15
+ align = 'A_LEFT';
16
+ textType = 'TFM_OVERFLOW';
17
+ bgColor;
18
+ bgImageName;
19
+ bgImage;
20
+ bgType;
21
+ borderRadius;
22
+ borderWidth;
23
+ borderColor;
24
+ customDraw;
25
+ layer;
26
+ children = new Array();
27
+ constructor(opt) {
28
+ super();
29
+ this.enabled = opt.enabled ?? true;
30
+ this.posX = opt.x;
31
+ this.posY = opt.y;
32
+ this.width = opt.width;
33
+ this.height = opt.height;
34
+ this.setText(opt.text ?? '', 'A_LEFT');
35
+ this.fontColor = opt.fontColor ?? [1.0, 1.0, 1.0];
36
+ this.fontName = opt.font;
37
+ this.bgColor = opt.bgColor;
38
+ this.bgImageName = opt.bgImage;
39
+ this.bgType = opt.bgType;
40
+ this.borderRadius = opt.borderRadius ?? 0;
41
+ this.borderWidth = opt.borderWidth ?? 0;
42
+ this.borderColor = opt.borderColor ?? [1, 1, 1, 1];
43
+ this.customDraw = opt.customDraw;
44
+ this.layer = opt.layer ?? 0;
45
+ }
46
+ enable() {
47
+ this.enabled = true;
48
+ }
49
+ disable() {
50
+ this.enabled = false;
51
+ }
52
+ setFramePosition(x, y) {
53
+ this.posX = x;
54
+ this.posY = y;
55
+ }
56
+ setFrameSize(width, height) {
57
+ this.width = width;
58
+ this.height = height;
59
+ }
60
+ setText(text, align, textType = 'TFM_OVERFLOW', fontColor) {
61
+ this.text = text;
62
+ this.align = align;
63
+ this.textType = textType;
64
+ if (fontColor) {
65
+ this.fontColor = fontColor;
66
+ }
67
+ }
68
+ setFontColor(fontColor) {
69
+ this.fontColor = fontColor;
70
+ }
71
+ setFont(fontName) {
72
+ this.fontName = fontName;
73
+ this.font = undefined;
74
+ }
75
+ setFontData(fontData) {
76
+ this.fontName = undefined;
77
+ this.font = fontData;
78
+ }
79
+ setBgColor(color) {
80
+ this.bgColor = color;
81
+ }
82
+ setBgImage(imageName, type = 'fit') {
83
+ this.bgImageName = imageName;
84
+ this.bgImage = undefined;
85
+ this.bgType = type;
86
+ }
87
+ setBgImageData(imageData, type = 'fit') {
88
+ this.bgImageName = undefined;
89
+ this.bgImage = imageData;
90
+ this.bgType = type;
91
+ }
92
+ setBgType(type) {
93
+ this.bgType = type;
94
+ }
95
+ setBorderRadius(radius) {
96
+ this.borderRadius = radius;
97
+ }
98
+ setBorderWidth(width) {
99
+ this.borderWidth = width;
100
+ }
101
+ setBorderColor(color) {
102
+ this.borderColor = color;
103
+ }
104
+ setCustomDraw(customDraw) {
105
+ this.customDraw = customDraw;
106
+ }
107
+ resetFont() {
108
+ this.font = undefined;
109
+ }
110
+ resetBgColor() {
111
+ this.bgColor = undefined;
112
+ }
113
+ resetBgImage() {
114
+ this.bgImage = undefined;
115
+ this.bgType = undefined;
116
+ }
117
+ resetCustomDraw() {
118
+ this.customDraw = undefined;
119
+ }
120
+ clear() {
121
+ this.text = '';
122
+ this.align = 'A_LEFT';
123
+ this.textType = 'TFM_OVERFLOW';
124
+ this.fontColor = [1.0, 1.0, 1.0];
125
+ this.font = undefined;
126
+ this.bgColor = undefined;
127
+ this.bgImage = undefined;
128
+ this.bgType = undefined;
129
+ this.customDraw = undefined;
130
+ }
131
+ insert(...frames) {
132
+ this.children.push(...frames);
133
+ for (const frame of frames) {
134
+ frame.on('layoutChanged', () => this.layoutChanged());
135
+ }
136
+ this.layoutChanged();
137
+ }
138
+ getLayers() {
139
+ const uniqueLayers = new Set();
140
+ uniqueLayers.add(this.layer);
141
+ for (const child of this.children) {
142
+ for (const layer of child.getLayers()) {
143
+ uniqueLayers.add(layer);
144
+ }
145
+ }
146
+ return uniqueLayers;
147
+ }
148
+ layoutChanged() {
149
+ this.emit('layoutChanged');
150
+ }
151
+ async displayImage(cod, resourceManager, cairo, ppX, ppY, scale, layer) {
152
+ if (this.enabled) {
153
+ const posX = ppX + this.posX;
154
+ const posY = ppY + this.posY;
155
+ await this.prepareResources(resourceManager);
156
+ await cod.cairo('cairo_save', cairo);
157
+ await this.clipDrawing(cod, cairo, scale, posX, posY);
158
+ if (this.layer === layer) {
159
+ await this.displayOwnImage(cod, cairo, posX, posY, scale);
160
+ }
161
+ for (const child of this.children) {
162
+ await child.displayImage(cod, resourceManager, cairo, posX, posY, scale, layer);
163
+ }
164
+ await cod.cairo('cairo_restore', cairo);
165
+ }
166
+ }
167
+ async prepareResources(resourceManager) {
168
+ if (this.bgImageName !== undefined) {
169
+ this.bgImage = await resourceManager.image(this.bgImageName);
170
+ }
171
+ if (this.fontName !== undefined) {
172
+ this.font = await resourceManager.font(this.fontName);
173
+ }
174
+ }
175
+ async displayOwnImage(cod, cairo, ppX, ppY, scale) {
176
+ if (!this.enabled) {
177
+ return;
178
+ }
179
+ const promises = new Array();
180
+ if (this.font !== undefined) {
181
+ promises.push(cod.cairo('cairo_set_font_face', cairo, this.font.var));
182
+ }
183
+ else {
184
+ promises.push(cod.cairo('cairo_set_font_face', cairo, 'NULL'));
185
+ }
186
+ if (this.bgColor !== undefined) {
187
+ promises.push(this.drawFrame(cod, cairo, scale, ppX, ppY));
188
+ }
189
+ if (this.bgImage !== undefined) {
190
+ promises.push(this.drawImage(cod, cairo, scale, ppX, ppY));
191
+ }
192
+ if (this.borderWidth > 0) {
193
+ promises.push(this.drawBorder(cod, cairo, scale, ppX, ppY));
194
+ }
195
+ if (this.text) {
196
+ promises.push(this.drawText(cod, cairo, scale, ppX, ppY));
197
+ }
198
+ if (this.customDraw) {
199
+ promises.push(cod.cairo('cairo_identity_matrix', cairo));
200
+ promises.push(cod.cairo('cairo_translate', cairo, scale * ppX, scale * ppY));
201
+ promises.push(cod.cairo('cairo_scale', cairo, scale, scale));
202
+ promises.push(this.customDraw(cod, cairo, { width: this.width, height: this.height }));
203
+ }
204
+ await Promise.all(promises);
205
+ }
206
+ async clipDrawing(cod, cairo, scale, ppX, ppY) {
207
+ if (this.borderRadius === 0) {
208
+ return;
209
+ }
210
+ await Promise.all([
211
+ this.drawRectPath(cod, cairo, scale, ppX, ppY, this.borderRadius),
212
+ cod.cairo('cairo_clip', cairo),
213
+ ]);
214
+ }
215
+ async drawFrame(cod, cairo, scale, ppX, ppY) {
216
+ if (this.bgColor) {
217
+ const promises = [
218
+ cod.cairo('cairo_identity_matrix', cairo),
219
+ cod.cairo('cairo_translate', cairo, scale * ppX, scale * ppY),
220
+ cod.cairo('cairo_scale', cairo, scale, scale),
221
+ cod.cairo('cairo_set_source_rgba', cairo, this.bgColor[0], this.bgColor[1], this.bgColor[2], this.bgColor[3]),
222
+ cod.cairo('cairo_rectangle', cairo, 0, 0, this.width, this.height),
223
+ cod.cairo('cairo_fill', cairo),
224
+ cod.cairo('cairo_stroke', cairo),
225
+ ];
226
+ await Promise.all(promises);
227
+ }
228
+ else {
229
+ throw new Error('Color of the frame is undefined.');
230
+ }
231
+ }
232
+ async drawImage(cod, cairo, scale, ppX, ppY) {
233
+ if (this.bgImage === undefined) {
234
+ return;
235
+ }
236
+ const bgImage = this.bgImage.var;
237
+ const bgWidth = this.bgImage.width;
238
+ const bgHeight = this.bgImage.height;
239
+ const promises = new Array();
240
+ promises.push(cod.cairo('cairo_identity_matrix', cairo));
241
+ promises.push(cod.cairo('cairo_translate', cairo, scale * ppX, scale * ppY));
242
+ if (this.bgType === 'fill') {
243
+ const sx = (scale * this.width) / bgWidth;
244
+ const sy = (scale * this.height) / bgHeight;
245
+ promises.push(cod.cairo('cairo_scale', cairo, sx, sy));
246
+ }
247
+ else if (this.bgType === 'fit') {
248
+ const sx = this.width / bgWidth;
249
+ const sy = this.height / bgHeight;
250
+ const scaleRatio = scale * Math.min(sx, sy);
251
+ promises.push(cod.cairo('cairo_scale', cairo, scaleRatio, scaleRatio));
252
+ }
253
+ else {
254
+ promises.push(cod.cairo('cairo_scale', cairo, scale, scale));
255
+ }
256
+ promises.push(cod.cairo('cairo_set_source_surface', cairo, bgImage, 0, 0));
257
+ promises.push(cod.cairo('cairo_paint', cairo));
258
+ await Promise.all(promises);
259
+ }
260
+ async drawText(cod, cairo, scale, ppX, ppY) {
261
+ const promises = [
262
+ cod.cairo('cairo_identity_matrix', cairo),
263
+ cod.cairo('cairo_set_source_rgb', cairo, this.fontColor[0], this.fontColor[1], this.fontColor[2]),
264
+ cod.writeText(cairo, '' + this.text, Math.floor(scale * ppX), Math.floor(scale * ppY), Math.floor(scale * this.width), Math.floor(scale * this.height), this.align, this.textType),
265
+ ];
266
+ await Promise.all(promises);
267
+ }
268
+ async drawBorder(cod, cairo, scale, ppX, ppY) {
269
+ await Promise.all([
270
+ this.drawRectPath(cod, cairo, scale, ppX, ppY, this.borderRadius),
271
+ cod.cairo('cairo_set_source_rgba', cairo, this.borderColor[0], this.borderColor[1], this.borderColor[2], this.borderColor[3]),
272
+ cod.cairo('cairo_set_line_width', cairo, this.borderWidth),
273
+ cod.cairo('cairo_stroke', cairo),
274
+ ]);
275
+ }
276
+ async drawRectPath(cod, cairo, scale, ppX, ppY, radius) {
277
+ if (radius === 0) {
278
+ return await Promise.all([
279
+ cod.cairo('cairo_identity_matrix', cairo),
280
+ cod.cairo('cairo_translate', cairo, scale * ppX, scale * ppY),
281
+ cod.cairo('cairo_scale', cairo, scale, scale),
282
+ cod.cairo('cairo_rectangle', cairo, 0, 0, this.width, this.height),
283
+ ]);
284
+ }
285
+ else {
286
+ const degrees = Math.PI / 180;
287
+ return await Promise.all([
288
+ cod.cairo('cairo_identity_matrix', cairo),
289
+ cod.cairo('cairo_translate', cairo, scale * ppX, scale * ppY),
290
+ cod.cairo('cairo_scale', cairo, scale, scale),
291
+ cod.cairo('cairo_new_sub_path', cairo),
292
+ cod.cairo('cairo_arc', cairo, this.width - radius, radius, radius, -90 * degrees, 0 * degrees),
293
+ cod.cairo('cairo_arc', cairo, this.width - radius, this.height - radius, radius, 0 * degrees, 90 * degrees),
294
+ cod.cairo('cairo_arc', cairo, radius, this.height - radius, radius, 90 * degrees, 180 * degrees),
295
+ cod.cairo('cairo_arc', cairo, radius, radius, radius, 180 * degrees, 270 * degrees),
296
+ cod.cairo('cairo_close_path', cairo),
297
+ ]);
298
+ }
299
+ }
300
+ }
301
+ exports.Frame = Frame;
@@ -1,11 +1,22 @@
1
1
  import { CamOverlayDrawingAPI, CamOverlayDrawingOptions } from '../CamOverlayDrawingAPI';
2
2
  import ResourceManager from './ResourceManager';
3
3
  import { Frame, TFrameOptions } from './Frame';
4
- export declare const COORD: Record<string, [number, number]>;
4
+ export declare const COORD: {
5
+ readonly top_left: readonly [-1, -1];
6
+ readonly center_left: readonly [-1, 0];
7
+ readonly bottom_left: readonly [-1, 1];
8
+ readonly top_center: readonly [0, -1];
9
+ readonly center: readonly [0, 0];
10
+ readonly bottom_center: readonly [0, 1];
11
+ readonly top_right: readonly [1, -1];
12
+ readonly center_right: readonly [1, 0];
13
+ readonly bottom_right: readonly [1, 1];
14
+ };
15
+ type TCoAlignment = keyof typeof COORD;
5
16
  export type TPainterOptions = TFrameOptions & {
6
17
  screenWidth: number;
7
18
  screenHeight: number;
8
- coAlignment: string;
19
+ coAlignment: TCoAlignment;
9
20
  };
10
21
  export declare class Painter extends Frame {
11
22
  private screenWidth;
@@ -24,7 +35,7 @@ export declare class Painter extends Frame {
24
35
  registerImage(moniker: string, fileName: string): void;
25
36
  registerFont(moniker: string, fileName: string): void;
26
37
  setScreenSize(sw: number, sh: number): void;
27
- setCoAlignment(coAlignment: string): void;
38
+ setCoAlignment(coAlignment: TCoAlignment): void;
28
39
  protected layoutChanged(): void;
29
40
  display(scale?: number): Promise<void>;
30
41
  hide(): Promise<void>;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceManager = exports.Frame = exports.Painter = exports.COORD = void 0;
4
+ const CamOverlayDrawingAPI_1 = require("../CamOverlayDrawingAPI");
5
+ const ResourceManager_1 = require("./ResourceManager");
6
+ exports.ResourceManager = ResourceManager_1.default;
7
+ const Frame_1 = require("./Frame");
8
+ Object.defineProperty(exports, "Frame", { enumerable: true, get: function () { return Frame_1.Frame; } });
9
+ exports.COORD = {
10
+ top_left: [-1, -1],
11
+ center_left: [-1, 0],
12
+ bottom_left: [-1, 1],
13
+ top_center: [0, -1],
14
+ center: [0, 0],
15
+ bottom_center: [0, 1],
16
+ top_right: [1, -1],
17
+ center_right: [1, 0],
18
+ bottom_right: [1, 1],
19
+ };
20
+ class Painter extends Frame_1.Frame {
21
+ screenWidth;
22
+ screenHeight;
23
+ coAlignment;
24
+ cod;
25
+ rm;
26
+ refreshLayers = true;
27
+ layers = [];
28
+ constructor(opt, coopt) {
29
+ super(opt);
30
+ this.coAlignment = exports.COORD[opt.coAlignment];
31
+ this.screenWidth = opt.screenWidth;
32
+ this.screenHeight = opt.screenHeight;
33
+ this.cod = new CamOverlayDrawingAPI_1.CamOverlayDrawingAPI(coopt);
34
+ this.rm = new ResourceManager_1.default(this.cod);
35
+ }
36
+ get camOverlayDrawingAPI() {
37
+ return this.cod;
38
+ }
39
+ get resourceManager() {
40
+ return this.rm;
41
+ }
42
+ connect() {
43
+ this.cod.on('open', () => {
44
+ this.rm.clear();
45
+ this.layers = [];
46
+ this.refreshLayers = true;
47
+ this.emit('open');
48
+ });
49
+ this.cod.on('close', () => {
50
+ this.emit('close');
51
+ });
52
+ this.cod.on('error', (err) => {
53
+ console.error('Painter:', err);
54
+ });
55
+ this.cod.connect();
56
+ }
57
+ disconnect() {
58
+ this.cod.disconnect();
59
+ }
60
+ isConnected() {
61
+ return this.cod.isConnected();
62
+ }
63
+ registerImage(moniker, fileName) {
64
+ this.rm.registerImage(moniker, fileName);
65
+ }
66
+ registerFont(moniker, fileName) {
67
+ this.rm.registerFont(moniker, fileName);
68
+ }
69
+ setScreenSize(sw, sh) {
70
+ this.screenWidth = sw;
71
+ this.screenHeight = sh;
72
+ }
73
+ setCoAlignment(coAlignment) {
74
+ this.coAlignment = exports.COORD[coAlignment];
75
+ }
76
+ layoutChanged() {
77
+ this.refreshLayers = true;
78
+ }
79
+ async display(scale = 1.0) {
80
+ if (this.enabled) {
81
+ if (this.refreshLayers) {
82
+ this.refreshLayers = false;
83
+ await this.prepareLayers();
84
+ }
85
+ let cairo;
86
+ let surface;
87
+ let lastCachedLayer;
88
+ for (let i = 0; i < this.layers.length; i++) {
89
+ const layer = this.layers[i];
90
+ if (layer === undefined) {
91
+ continue;
92
+ }
93
+ if (layer.cairoCache !== undefined &&
94
+ layer.surfaceCache !== undefined &&
95
+ surface === undefined &&
96
+ cairo === undefined) {
97
+ lastCachedLayer = layer;
98
+ continue;
99
+ }
100
+ if (surface === undefined || cairo === undefined) {
101
+ [surface, cairo] = await this.prepareSurface(scale, lastCachedLayer?.surfaceCache, lastCachedLayer?.cairoCache);
102
+ }
103
+ await this.displayImage(this.cod, this.rm, cairo, -this.posX, -this.posY, scale, layer.layer);
104
+ if (i < this.layers.length - 1) {
105
+ const [surfaceToCache, cairoToCache] = await this.prepareSurface(scale, surface, cairo);
106
+ layer.surfaceCache = surfaceToCache;
107
+ layer.cairoCache = cairoToCache;
108
+ }
109
+ }
110
+ if (surface !== undefined && cairo !== undefined) {
111
+ await this.cod.showCairoImage(surface, this.positionConvertor(this.coAlignment[0], this.screenWidth, this.posX, scale * this.width), this.positionConvertor(this.coAlignment[1], this.screenHeight, this.posY, scale * this.height));
112
+ await this.cleanupSurface(surface, cairo);
113
+ }
114
+ }
115
+ }
116
+ async hide() {
117
+ await this.cod.removeImage();
118
+ }
119
+ async invalidateLayer(layer) {
120
+ const layerIdx = this.layers.findIndex((l) => l.layer === layer);
121
+ if (layerIdx === -1) {
122
+ return;
123
+ }
124
+ for (let i = layerIdx; i < this.layers.length; i++) {
125
+ const currentLayer = this.layers[i];
126
+ if (currentLayer?.surfaceCache !== undefined && currentLayer.cairoCache !== undefined) {
127
+ await this.cleanupSurface(currentLayer.surfaceCache, currentLayer.cairoCache);
128
+ currentLayer.surfaceCache = undefined;
129
+ currentLayer.cairoCache = undefined;
130
+ }
131
+ }
132
+ }
133
+ async prepareLayers() {
134
+ for (const layer of this.layers) {
135
+ if (layer.surfaceCache !== undefined && layer.cairoCache !== undefined) {
136
+ await this.cleanupSurface(layer.surfaceCache, layer.cairoCache);
137
+ }
138
+ }
139
+ const uniqueLayers = this.getLayers();
140
+ const sortedLayers = Array.from(uniqueLayers).sort((a, b) => a - b);
141
+ this.layers = sortedLayers.map((layer) => {
142
+ return { layer };
143
+ });
144
+ }
145
+ async prepareSurface(scale, cachedSurface, cachedCairo) {
146
+ const surface = (await this.cod.cairo('cairo_image_surface_create', 'CAIRO_FORMAT_ARGB32', Math.floor(this.width * scale), Math.floor(this.height * scale)));
147
+ const cairo = (await this.cod.cairo('cairo_create', surface.var));
148
+ if (cachedSurface !== undefined && cachedCairo !== undefined) {
149
+ await this.cod.cairo('cairo_set_source_surface', cairo.var, cachedSurface, 0, 0);
150
+ await this.cod.cairo('cairo_paint', cairo.var);
151
+ }
152
+ return [surface.var, cairo.var];
153
+ }
154
+ async cleanupSurface(surface, cairo) {
155
+ await this.cod.cairo('cairo_surface_destroy', surface);
156
+ await this.cod.cairo('cairo_destroy', cairo);
157
+ }
158
+ positionConvertor(alignment, screenSize, position, graphicsSize) {
159
+ switch (alignment) {
160
+ case -1:
161
+ return alignment + (2.0 * position) / screenSize;
162
+ case 0:
163
+ return alignment - (2.0 * (position + graphicsSize / 2)) / screenSize;
164
+ case 1:
165
+ return alignment - (2.0 * (position + graphicsSize)) / screenSize;
166
+ default:
167
+ throw new Error('Invalid graphics alignment.');
168
+ }
169
+ }
170
+ }
171
+ exports.Painter = Painter;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs = require("fs/promises");
4
+ class ResourceManager {
5
+ co;
6
+ imgFileNames = {};
7
+ fontFileNames = {};
8
+ images = {};
9
+ fonts = {};
10
+ constructor(co) {
11
+ this.co = co;
12
+ }
13
+ registerImage(moniker, fileName) {
14
+ this.imgFileNames[moniker] = process.env.INSTALL_PATH + '/images/' + fileName;
15
+ }
16
+ registerFont(moniker, fileName) {
17
+ this.fontFileNames[moniker] = process.env.INSTALL_PATH + '/fonts/' + fileName;
18
+ }
19
+ async image(moniker) {
20
+ if (this.images[moniker] !== undefined) {
21
+ return this.images[moniker];
22
+ }
23
+ if (this.imgFileNames[moniker] !== undefined) {
24
+ const imgData = await fs.readFile(this.imgFileNames[moniker]);
25
+ this.images[moniker] = await this.co.uploadImageData(imgData);
26
+ return this.images[moniker];
27
+ }
28
+ throw new Error('Error! Unknown image requested!');
29
+ }
30
+ async font(moniker) {
31
+ if (this.fonts[moniker] !== undefined) {
32
+ return this.fonts[moniker];
33
+ }
34
+ if (this.fontFileNames[moniker] !== undefined) {
35
+ const fontData = await fs.readFile(this.fontFileNames[moniker]);
36
+ this.fonts[moniker] = await this.co.uploadFontData(fontData);
37
+ return this.fonts[moniker];
38
+ }
39
+ throw new Error('Error! Unknown font requested!');
40
+ }
41
+ clear() {
42
+ this.images = {};
43
+ this.fonts = {};
44
+ }
45
+ }
46
+ exports.default = ResourceManager;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CamOverlayAPI = void 0;
4
+ const common_1 = require("./internal/common");
5
+ const DefaultClient_1 = require("./node/DefaultClient");
6
+ const CamScripterAPI_1 = require("./types/CamScripterAPI");
7
+ const common_2 = require("./types/common");
8
+ class CamOverlayAPI {
9
+ client;
10
+ constructor(options = {}) {
11
+ if ((0, common_1.isClient)(options)) {
12
+ this.client = options;
13
+ }
14
+ else {
15
+ this.client = new DefaultClient_1.DefaultClient(options);
16
+ }
17
+ }
18
+ async checkCameraTime() {
19
+ return (await this.get('/local/camscripter/camera_time.cgi')).state;
20
+ }
21
+ async getStorageInfo() {
22
+ const data = await this.get(`/local/camscripter/package/get_storage.cgi`);
23
+ return CamScripterAPI_1.storageSchema.parse(data);
24
+ }
25
+ async getNetworkCameraList() {
26
+ const response = await this.get('/local/camscripter/network_camera_list.cgi');
27
+ return common_2.networkCameraListSchema.parse(response.camera_list);
28
+ }
29
+ async getPackageList() {
30
+ const data = await this.get('/local/camscripter/package/list.cgi');
31
+ return CamScripterAPI_1.packageInfoListSchema.parse(data);
32
+ }
33
+ async installPackages(formData, storage) {
34
+ await this.post(`/local/camscripter/package/install.cgi?storage=${storage}`, formData);
35
+ }
36
+ async uninstallPackage(packageId) {
37
+ await this.get(`/local/camscripter/package/remove.cgi?package_name=${packageId}`);
38
+ }
39
+ async importSettings(packageId, formData) {
40
+ await this.post(`/local/camscripter/package/data.cgi?action=IMPORT&package_name=${packageId}`, formData);
41
+ }
42
+ async exportSettings(packageId, formData) {
43
+ await this.post(`/local/camscripter/package/data.cgi?action=EXPORT&package_name=${packageId}`, formData);
44
+ }
45
+ async getNodejsStatus() {
46
+ return (await this.get('/local/camscripter/diagnostics.cgi')).node_state;
47
+ }
48
+ async installNodejs(storage) {
49
+ await this.get(`/local/camscripter/node_update.cgi?storage=${storage}`);
50
+ }
51
+ async get(path, params) {
52
+ const res = await this.client.get(path, params);
53
+ if (res.ok) {
54
+ return await res.json();
55
+ }
56
+ else {
57
+ throw new Error(await (0, common_1.responseStringify)(res));
58
+ }
59
+ }
60
+ async post(path, data, params) {
61
+ const res = await this.client.post(path, data, params);
62
+ if (res.ok) {
63
+ return await res.json();
64
+ }
65
+ else {
66
+ throw new Error(await (0, common_1.responseStringify)(res));
67
+ }
68
+ }
69
+ }
70
+ exports.CamOverlayAPI = CamOverlayAPI;