@frangoteam/fuxa-min 1.1.19

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 (414) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/_images/Pipes/P1.svg +39 -0
  4. package/_images/Tanks/Fl.svg +7 -0
  5. package/api/alarms/index.js +132 -0
  6. package/api/auth/index.js +71 -0
  7. package/api/command/index.js +187 -0
  8. package/api/daq/index.js +79 -0
  9. package/api/diagnose/index.js +163 -0
  10. package/api/index.js +181 -0
  11. package/api/jwt-helper.js +106 -0
  12. package/api/plugins/index.js +109 -0
  13. package/api/projects/index.js +229 -0
  14. package/api/resources/index.js +118 -0
  15. package/api/scripts/index.js +82 -0
  16. package/api/users/index.js +109 -0
  17. package/dist/3rdpartylicenses.txt +1477 -0
  18. package/dist/Quicksand-Bold.071154c292aef0b8.woff +0 -0
  19. package/dist/Quicksand-Bold.6383d6475ed5c40f.woff2 +0 -0
  20. package/dist/Quicksand-Bold.f07d467887f9cfab.ttf +0 -0
  21. package/dist/Quicksand-Medium.0982a651e8d4315f.woff +0 -0
  22. package/dist/Quicksand-Medium.9d2733fbfb9b1be8.ttf +0 -0
  23. package/dist/Quicksand-Medium.b09302365c586eb2.woff2 +0 -0
  24. package/dist/Quicksand-Regular.16adf9eecd267273.woff +0 -0
  25. package/dist/Quicksand-Regular.78819724f6aeff59.woff2 +0 -0
  26. package/dist/Quicksand-Regular.8829564f0e14bf76.ttf +0 -0
  27. package/dist/assets/fonts/icomoon.eot +0 -0
  28. package/dist/assets/fonts/icomoon.svg +19 -0
  29. package/dist/assets/fonts/icomoon.ttf +0 -0
  30. package/dist/assets/fonts/icomoon.woff +0 -0
  31. package/dist/assets/fonts/myicons.eot +0 -0
  32. package/dist/assets/fonts/myicons.svg +19 -0
  33. package/dist/assets/fonts/myicons.ttf +0 -0
  34. package/dist/assets/fonts/myicons.woff +0 -0
  35. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.ttf +0 -0
  36. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff +0 -0
  37. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff2 +0 -0
  38. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.ttf +0 -0
  39. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff +0 -0
  40. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff2 +0 -0
  41. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.ttf +0 -0
  42. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff +0 -0
  43. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff2 +0 -0
  44. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.svg +10486 -0
  45. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.ttf +0 -0
  46. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff +0 -0
  47. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff2 +0 -0
  48. package/dist/assets/fonts/roboto-light/roboto-light-webfont.svg +9998 -0
  49. package/dist/assets/fonts/roboto-light/roboto-light-webfont.ttf +0 -0
  50. package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff +0 -0
  51. package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff2 +0 -0
  52. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.svg +10487 -0
  53. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.ttf +0 -0
  54. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff +0 -0
  55. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff2 +0 -0
  56. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.svg +10004 -0
  57. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.ttf +0 -0
  58. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff +0 -0
  59. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff2 +0 -0
  60. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.svg +10012 -0
  61. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.ttf +0 -0
  62. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff +0 -0
  63. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff2 +0 -0
  64. package/dist/assets/i18n/de.json +1308 -0
  65. package/dist/assets/i18n/en.json +1438 -0
  66. package/dist/assets/i18n/es.json +777 -0
  67. package/dist/assets/i18n/fr.json +1129 -0
  68. package/dist/assets/i18n/ko.json +774 -0
  69. package/dist/assets/i18n/pt.json +657 -0
  70. package/dist/assets/i18n/ru.json +1228 -0
  71. package/dist/assets/i18n/tr.json +673 -0
  72. package/dist/assets/i18n/ua.json +614 -0
  73. package/dist/assets/i18n/zh-cn.json +1252 -0
  74. package/dist/assets/images/align-bottom.svg +88 -0
  75. package/dist/assets/images/align-center.svg +86 -0
  76. package/dist/assets/images/align-left.svg +86 -0
  77. package/dist/assets/images/align-middle.svg +88 -0
  78. package/dist/assets/images/align-right.svg +88 -0
  79. package/dist/assets/images/align-top.svg +88 -0
  80. package/dist/assets/images/bag.svg +115 -0
  81. package/dist/assets/images/button.svg +22 -0
  82. package/dist/assets/images/chart.svg +17 -0
  83. package/dist/assets/images/circle.svg +84 -0
  84. package/dist/assets/images/compressor-a.svg +2 -0
  85. package/dist/assets/images/editvalue.svg +14 -0
  86. package/dist/assets/images/ellipse.svg +84 -0
  87. package/dist/assets/images/flip-orizontal.svg +86 -0
  88. package/dist/assets/images/flip-vertical.svg +82 -0
  89. package/dist/assets/images/gauge-donut.png +0 -0
  90. package/dist/assets/images/gauge-mat.png +0 -0
  91. package/dist/assets/images/gauge-zone.png +0 -0
  92. package/dist/assets/images/graphbar.svg +18 -0
  93. package/dist/assets/images/group.svg +91 -0
  94. package/dist/assets/images/iframe.svg +54 -0
  95. package/dist/assets/images/image.svg +95 -0
  96. package/dist/assets/images/led-circle.svg +77 -0
  97. package/dist/assets/images/line.svg +86 -0
  98. package/dist/assets/images/linecap-butt.svg +77 -0
  99. package/dist/assets/images/linecap-round.svg +77 -0
  100. package/dist/assets/images/linecap-square.svg +82 -0
  101. package/dist/assets/images/linejoin-bevel.svg +77 -0
  102. package/dist/assets/images/linejoin-miter.svg +77 -0
  103. package/dist/assets/images/linejoin-round.svg +77 -0
  104. package/dist/assets/images/logo.svg +18 -0
  105. package/dist/assets/images/path.svg +100 -0
  106. package/dist/assets/images/pencil.svg +98 -0
  107. package/dist/assets/images/pipe.svg +15 -0
  108. package/dist/assets/images/progress-v.svg +79 -0
  109. package/dist/assets/images/rect.svg +84 -0
  110. package/dist/assets/images/select-pointer.svg +93 -0
  111. package/dist/assets/images/selectvalue.svg +14 -0
  112. package/dist/assets/images/semaphore.svg +19 -0
  113. package/dist/assets/images/slider.svg +17 -0
  114. package/dist/assets/images/switch.svg +15 -0
  115. package/dist/assets/images/table.svg +55 -0
  116. package/dist/assets/images/text.svg +294 -0
  117. package/dist/assets/images/to-bottom.svg +163 -0
  118. package/dist/assets/images/to-path.svg +94 -0
  119. package/dist/assets/images/to-top.svg +163 -0
  120. package/dist/assets/images/to_top.svg +88 -0
  121. package/dist/assets/images/todelete.svg +13 -0
  122. package/dist/assets/images/ungroup.svg +108 -0
  123. package/dist/assets/images/value.svg +81 -0
  124. package/dist/assets/images/valve-a.svg +2 -0
  125. package/dist/assets/images/webcam.svg +16 -0
  126. package/dist/assets/lib/ext-styles.css +28 -0
  127. package/dist/assets/lib/gauge/gauge.js +988 -0
  128. package/dist/assets/lib/gauge/gauge.min.js +1 -0
  129. package/dist/assets/lib/nouislider/nouislider.min.css +1 -0
  130. package/dist/assets/lib/nouislider/nouislider.min.js +1 -0
  131. package/dist/assets/lib/numeral/locales.min.js +7 -0
  132. package/dist/assets/lib/numeral/numeral.min.js +8 -0
  133. package/dist/assets/lib/pdfkit-table/index.js +967 -0
  134. package/dist/assets/lib/svg/raphael.min.js +1 -0
  135. package/dist/assets/lib/svg/svg.js +5573 -0
  136. package/dist/assets/lib/svg/svg.min.js +13 -0
  137. package/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js +1 -0
  138. package/dist/assets/lib/svgeditor/extensions/ext-html_button.min.css +1 -0
  139. package/dist/assets/lib/svgeditor/fuxa-editor.min.js +23 -0
  140. package/dist/assets/lib/svgeditor/jquery-plugin.min.css +2 -0
  141. package/dist/assets/lib/svgeditor/jquery-plugin.min.js +52 -0
  142. package/dist/assets/lib/svgeditor/jquery-ui-1.8.17.custom.min.js +54 -0
  143. package/dist/assets/lib/svgeditor/jquery.min.js +4 -0
  144. package/dist/assets/lib/svgeditor/shapes/ape-shapes.js +39 -0
  145. package/dist/assets/lib/svgeditor/shapes/img/agitator-disc.svg +17 -0
  146. package/dist/assets/lib/svgeditor/shapes/img/agitator-paddle.svg +16 -0
  147. package/dist/assets/lib/svgeditor/shapes/img/agitator-prop.svg +15 -0
  148. package/dist/assets/lib/svgeditor/shapes/img/agitator-turbo.svg +19 -0
  149. package/dist/assets/lib/svgeditor/shapes/img/anim-eli.svg +13 -0
  150. package/dist/assets/lib/svgeditor/shapes/img/anim-piston.svg +14 -0
  151. package/dist/assets/lib/svgeditor/shapes/img/centrifugal.svg +68 -0
  152. package/dist/assets/lib/svgeditor/shapes/img/centrifugal1.svg +67 -0
  153. package/dist/assets/lib/svgeditor/shapes/img/centrifuge1.svg +67 -0
  154. package/dist/assets/lib/svgeditor/shapes/img/centrifuge2.svg +16 -0
  155. package/dist/assets/lib/svgeditor/shapes/img/centrifuge3.svg +16 -0
  156. package/dist/assets/lib/svgeditor/shapes/img/centrifuge4.svg +16 -0
  157. package/dist/assets/lib/svgeditor/shapes/img/compair.svg +92 -0
  158. package/dist/assets/lib/svgeditor/shapes/img/compdiaph.svg +16 -0
  159. package/dist/assets/lib/svgeditor/shapes/img/compejector.svg +16 -0
  160. package/dist/assets/lib/svgeditor/shapes/img/compreci.svg +17 -0
  161. package/dist/assets/lib/svgeditor/shapes/img/compreci2.svg +68 -0
  162. package/dist/assets/lib/svgeditor/shapes/img/compressor-fan.svg +18 -0
  163. package/dist/assets/lib/svgeditor/shapes/img/compressor-piston.svg +16 -0
  164. package/dist/assets/lib/svgeditor/shapes/img/compressor-void.svg +16 -0
  165. package/dist/assets/lib/svgeditor/shapes/img/compring.svg +72 -0
  166. package/dist/assets/lib/svgeditor/shapes/img/compring2.svg +72 -0
  167. package/dist/assets/lib/svgeditor/shapes/img/comprotary.svg +16 -0
  168. package/dist/assets/lib/svgeditor/shapes/img/comprotary2.svg +18 -0
  169. package/dist/assets/lib/svgeditor/shapes/img/compscrew.svg +16 -0
  170. package/dist/assets/lib/svgeditor/shapes/img/compsilence.svg +20 -0
  171. package/dist/assets/lib/svgeditor/shapes/img/compturbo.svg +72 -0
  172. package/dist/assets/lib/svgeditor/shapes/img/crusher1.svg +16 -0
  173. package/dist/assets/lib/svgeditor/shapes/img/crusher2.svg +16 -0
  174. package/dist/assets/lib/svgeditor/shapes/img/crusher3.svg +16 -0
  175. package/dist/assets/lib/svgeditor/shapes/img/crusher4.svg +17 -0
  176. package/dist/assets/lib/svgeditor/shapes/img/crusher5.svg +18 -0
  177. package/dist/assets/lib/svgeditor/shapes/img/crusher6.svg +16 -0
  178. package/dist/assets/lib/svgeditor/shapes/img/crusher7.svg +21 -0
  179. package/dist/assets/lib/svgeditor/shapes/img/diaph.svg +16 -0
  180. package/dist/assets/lib/svgeditor/shapes/img/drier1.svg +63 -0
  181. package/dist/assets/lib/svgeditor/shapes/img/drier2.svg +17 -0
  182. package/dist/assets/lib/svgeditor/shapes/img/drier3.svg +23 -0
  183. package/dist/assets/lib/svgeditor/shapes/img/drier4.svg +18 -0
  184. package/dist/assets/lib/svgeditor/shapes/img/drier5.svg +16 -0
  185. package/dist/assets/lib/svgeditor/shapes/img/exchanger-filter.svg +16 -0
  186. package/dist/assets/lib/svgeditor/shapes/img/exchanger-heat.svg +16 -0
  187. package/dist/assets/lib/svgeditor/shapes/img/exchanger-tube.svg +16 -0
  188. package/dist/assets/lib/svgeditor/shapes/img/exchanger1.svg +67 -0
  189. package/dist/assets/lib/svgeditor/shapes/img/exchanger2.svg +16 -0
  190. package/dist/assets/lib/svgeditor/shapes/img/exchanger3.svg +15 -0
  191. package/dist/assets/lib/svgeditor/shapes/img/exchanger4.svg +15 -0
  192. package/dist/assets/lib/svgeditor/shapes/img/exchanger5.svg +16 -0
  193. package/dist/assets/lib/svgeditor/shapes/img/exchanger6.svg +71 -0
  194. package/dist/assets/lib/svgeditor/shapes/img/exchanger7.svg +16 -0
  195. package/dist/assets/lib/svgeditor/shapes/img/exchanger8.svg +16 -0
  196. package/dist/assets/lib/svgeditor/shapes/img/exchanger9.svg +16 -0
  197. package/dist/assets/lib/svgeditor/shapes/img/feeder.svg +17 -0
  198. package/dist/assets/lib/svgeditor/shapes/img/feeder2.svg +16 -0
  199. package/dist/assets/lib/svgeditor/shapes/img/feeder3.svg +63 -0
  200. package/dist/assets/lib/svgeditor/shapes/img/filter2.svg +68 -0
  201. package/dist/assets/lib/svgeditor/shapes/img/filter3.svg +17 -0
  202. package/dist/assets/lib/svgeditor/shapes/img/fitting1.svg +67 -0
  203. package/dist/assets/lib/svgeditor/shapes/img/fitting10.svg +16 -0
  204. package/dist/assets/lib/svgeditor/shapes/img/fitting11.svg +17 -0
  205. package/dist/assets/lib/svgeditor/shapes/img/fitting12.svg +16 -0
  206. package/dist/assets/lib/svgeditor/shapes/img/fitting13.svg +15 -0
  207. package/dist/assets/lib/svgeditor/shapes/img/fitting2.svg +15 -0
  208. package/dist/assets/lib/svgeditor/shapes/img/fitting3.svg +17 -0
  209. package/dist/assets/lib/svgeditor/shapes/img/fitting4.svg +16 -0
  210. package/dist/assets/lib/svgeditor/shapes/img/fitting5.svg +16 -0
  211. package/dist/assets/lib/svgeditor/shapes/img/fitting6.svg +16 -0
  212. package/dist/assets/lib/svgeditor/shapes/img/fitting7.svg +15 -0
  213. package/dist/assets/lib/svgeditor/shapes/img/fitting8.svg +15 -0
  214. package/dist/assets/lib/svgeditor/shapes/img/fitting9.svg +15 -0
  215. package/dist/assets/lib/svgeditor/shapes/img/misc1.svg +75 -0
  216. package/dist/assets/lib/svgeditor/shapes/img/misc2.svg +71 -0
  217. package/dist/assets/lib/svgeditor/shapes/img/misc3.svg +15 -0
  218. package/dist/assets/lib/svgeditor/shapes/img/misc4.svg +16 -0
  219. package/dist/assets/lib/svgeditor/shapes/img/misc5.svg +16 -0
  220. package/dist/assets/lib/svgeditor/shapes/img/misc6.svg +15 -0
  221. package/dist/assets/lib/svgeditor/shapes/img/misc7.svg +64 -0
  222. package/dist/assets/lib/svgeditor/shapes/img/misc8.svg +15 -0
  223. package/dist/assets/lib/svgeditor/shapes/img/motor-simb.svg +17 -0
  224. package/dist/assets/lib/svgeditor/shapes/img/nozzle.svg +15 -0
  225. package/dist/assets/lib/svgeditor/shapes/img/nozzle2.svg +15 -0
  226. package/dist/assets/lib/svgeditor/shapes/img/pipi1.svg +16 -0
  227. package/dist/assets/lib/svgeditor/shapes/img/pipi2.svg +17 -0
  228. package/dist/assets/lib/svgeditor/shapes/img/pipi3.svg +15 -0
  229. package/dist/assets/lib/svgeditor/shapes/img/pipi4.svg +15 -0
  230. package/dist/assets/lib/svgeditor/shapes/img/pipi5.svg +16 -0
  231. package/dist/assets/lib/svgeditor/shapes/img/pipi6.svg +15 -0
  232. package/dist/assets/lib/svgeditor/shapes/img/pipi7.svg +16 -0
  233. package/dist/assets/lib/svgeditor/shapes/img/pumpblower.svg +76 -0
  234. package/dist/assets/lib/svgeditor/shapes/img/pumpcentri1.svg +64 -0
  235. package/dist/assets/lib/svgeditor/shapes/img/pumpcentri2.svg +64 -0
  236. package/dist/assets/lib/svgeditor/shapes/img/pumpfeed.svg +64 -0
  237. package/dist/assets/lib/svgeditor/shapes/img/pumpgear.svg +18 -0
  238. package/dist/assets/lib/svgeditor/shapes/img/pumpgear2.svg +19 -0
  239. package/dist/assets/lib/svgeditor/shapes/img/pumphidra.svg +68 -0
  240. package/dist/assets/lib/svgeditor/shapes/img/pumphorizo.svg +68 -0
  241. package/dist/assets/lib/svgeditor/shapes/img/pumpjet.svg +68 -0
  242. package/dist/assets/lib/svgeditor/shapes/img/pumpperis.svg +20 -0
  243. package/dist/assets/lib/svgeditor/shapes/img/pumpscreew.svg +17 -0
  244. package/dist/assets/lib/svgeditor/shapes/img/pumpscreew2.svg +72 -0
  245. package/dist/assets/lib/svgeditor/shapes/img/pumpturbi.svg +64 -0
  246. package/dist/assets/lib/svgeditor/shapes/img/pumpvacuum.svg +72 -0
  247. package/dist/assets/lib/svgeditor/shapes/img/shape-arrow.svg +13 -0
  248. package/dist/assets/lib/svgeditor/shapes/img/shape-circle.svg +13 -0
  249. package/dist/assets/lib/svgeditor/shapes/img/shape-circleindi.svg +13 -0
  250. package/dist/assets/lib/svgeditor/shapes/img/shape-cloud.svg +63 -0
  251. package/dist/assets/lib/svgeditor/shapes/img/shape-cone.svg +71 -0
  252. package/dist/assets/lib/svgeditor/shapes/img/shape-corner.svg +15 -0
  253. package/dist/assets/lib/svgeditor/shapes/img/shape-cross.svg +15 -0
  254. package/dist/assets/lib/svgeditor/shapes/img/shape-cylinder.svg +71 -0
  255. package/dist/assets/lib/svgeditor/shapes/img/shape-delay.svg +13 -0
  256. package/dist/assets/lib/svgeditor/shapes/img/shape-diamond.svg +13 -0
  257. package/dist/assets/lib/svgeditor/shapes/img/shape-display.svg +15 -0
  258. package/dist/assets/lib/svgeditor/shapes/img/shape-docu.svg +15 -0
  259. package/dist/assets/lib/svgeditor/shapes/img/shape-doublearrow.svg +13 -0
  260. package/dist/assets/lib/svgeditor/shapes/img/shape-drop.svg +15 -0
  261. package/dist/assets/lib/svgeditor/shapes/img/shape-halfcircle.svg +13 -0
  262. package/dist/assets/lib/svgeditor/shapes/img/shape-heart.svg +15 -0
  263. package/dist/assets/lib/svgeditor/shapes/img/shape-looplimit.svg +13 -0
  264. package/dist/assets/lib/svgeditor/shapes/img/shape-maninput.svg +15 -0
  265. package/dist/assets/lib/svgeditor/shapes/img/shape-nosymbol.svg +15 -0
  266. package/dist/assets/lib/svgeditor/shapes/img/shape-octagon.svg +15 -0
  267. package/dist/assets/lib/svgeditor/shapes/img/shape-offpage.svg +13 -0
  268. package/dist/assets/lib/svgeditor/shapes/img/shape-or.svg +15 -0
  269. package/dist/assets/lib/svgeditor/shapes/img/shape-or2.svg +17 -0
  270. package/dist/assets/lib/svgeditor/shapes/img/shape-parallelogram.svg +15 -0
  271. package/dist/assets/lib/svgeditor/shapes/img/shape-pentagon.svg +15 -0
  272. package/dist/assets/lib/svgeditor/shapes/img/shape-poval.svg +15 -0
  273. package/dist/assets/lib/svgeditor/shapes/img/shape-prepara.svg +13 -0
  274. package/dist/assets/lib/svgeditor/shapes/img/shape-rectangle.svg +13 -0
  275. package/dist/assets/lib/svgeditor/shapes/img/shape-rectindi.svg +16 -0
  276. package/dist/assets/lib/svgeditor/shapes/img/shape-star4.svg +15 -0
  277. package/dist/assets/lib/svgeditor/shapes/img/shape-switch.svg +15 -0
  278. package/dist/assets/lib/svgeditor/shapes/img/shape-tape.svg +15 -0
  279. package/dist/assets/lib/svgeditor/shapes/img/shape-tee.svg +63 -0
  280. package/dist/assets/lib/svgeditor/shapes/img/shape-ticket.svg +13 -0
  281. package/dist/assets/lib/svgeditor/shapes/img/shape-trape.svg +13 -0
  282. package/dist/assets/lib/svgeditor/shapes/img/shape-triangle.svg +13 -0
  283. package/dist/assets/lib/svgeditor/shapes/img/shape-vor.svg +14 -0
  284. package/dist/assets/lib/svgeditor/shapes/img/tank1.svg +63 -0
  285. package/dist/assets/lib/svgeditor/shapes/img/tank2.svg +15 -0
  286. package/dist/assets/lib/svgeditor/shapes/img/tank3.svg +15 -0
  287. package/dist/assets/lib/svgeditor/shapes/img/tank4.svg +15 -0
  288. package/dist/assets/lib/svgeditor/shapes/img/tank5.svg +15 -0
  289. package/dist/assets/lib/svgeditor/shapes/img/tank6.svg +68 -0
  290. package/dist/assets/lib/svgeditor/shapes/img/tank7.svg +15 -0
  291. package/dist/assets/lib/svgeditor/shapes/img/tank8.svg +15 -0
  292. package/dist/assets/lib/svgeditor/shapes/img/tank9.svg +21 -0
  293. package/dist/assets/lib/svgeditor/shapes/img/valve-ax.svg +13 -0
  294. package/dist/assets/lib/svgeditor/shapes/img/valve-bx.svg +13 -0
  295. package/dist/assets/lib/svgeditor/shapes/img/valve-cx.svg +13 -0
  296. package/dist/assets/lib/svgeditor/shapes/img/webcam.svg +6 -0
  297. package/dist/assets/lib/svgeditor/shapes/my-shapes.js +178 -0
  298. package/dist/assets/lib/svgeditor/shapes/proc-comp-shapes.js +105 -0
  299. package/dist/assets/lib/svgeditor/shapes/proc-general-shapes.js +60 -0
  300. package/dist/assets/lib/svgeditor/shapes/proc-pumps-shapes.js +112 -0
  301. package/dist/assets/lib/svgeditor/shapes/proc-shapes.js +606 -0
  302. package/dist/assets/lib/svgeditor/shapes/shapes.js +30 -0
  303. package/dist/assets/lib/svgeditor/svg-editor.min.css +1 -0
  304. package/dist/assets/lib/uplot/placement.min.js +2 -0
  305. package/dist/assets/project.demo.fuxap +1 -0
  306. package/dist/favicon.ico +0 -0
  307. package/dist/icomoon.86abfb46e057ade8.eot +0 -0
  308. package/dist/icomoon.c1f8b59bad308d66.woff +0 -0
  309. package/dist/icomoon.ce427f75e21963af.ttf +0 -0
  310. package/dist/icomoon.dfb0a89feb346906.svg +19 -0
  311. package/dist/index.html +50 -0
  312. package/dist/logo.0e8e64e69250a450.svg +18 -0
  313. package/dist/main.a356f552d9838b9e.js +1 -0
  314. package/dist/material-icons-outlined.78a93b2079680a08.woff +0 -0
  315. package/dist/material-icons-outlined.f86cb7b0aa53f0fe.woff2 +0 -0
  316. package/dist/material-icons-round.92dc7ca2f4c591e7.woff +0 -0
  317. package/dist/material-icons-round.b10ec9db5b7fbc74.woff2 +0 -0
  318. package/dist/material-icons-sharp.3885863ee4746422.woff2 +0 -0
  319. package/dist/material-icons-sharp.a71cb2bf66c604de.woff +0 -0
  320. package/dist/material-icons-two-tone.588d63134de807a7.woff +0 -0
  321. package/dist/material-icons-two-tone.675bd578bd14533e.woff2 +0 -0
  322. package/dist/material-icons.4ad034d2c499d9b6.woff +0 -0
  323. package/dist/material-icons.59322316b3fd6063.woff2 +0 -0
  324. package/dist/polyfills.2696a6f9dc75535e.js +1 -0
  325. package/dist/roboto-bold-webfont.29ac6158e35aee95.woff +0 -0
  326. package/dist/roboto-bold-webfont.568ab1fa3f154a77.svg +10486 -0
  327. package/dist/roboto-bold-webfont.6bcfbdc216b3bc78.woff2 +0 -0
  328. package/dist/roboto-bold-webfont.7c22a4dfdee2ff33.ttf +0 -0
  329. package/dist/roboto-light-webfont.13492ec56771eeee.svg +9998 -0
  330. package/dist/roboto-light-webfont.61fa26c99b07ac83.woff2 +0 -0
  331. package/dist/roboto-light-webfont.95295ce84942d8ce.ttf +0 -0
  332. package/dist/roboto-light-webfont.ae19119a2889dfdf.woff +0 -0
  333. package/dist/roboto-medium-webfont.30344f0411888055.woff +0 -0
  334. package/dist/roboto-medium-webfont.57fb00cab0317d2d.woff2 +0 -0
  335. package/dist/roboto-medium-webfont.a40869e060a388c0.ttf +0 -0
  336. package/dist/roboto-medium-webfont.ea02241c29620c02.svg +10487 -0
  337. package/dist/roboto-regular-webfont.2b0501b72f5a94d5.ttf +0 -0
  338. package/dist/roboto-regular-webfont.2ce0ba9a06424965.svg +10004 -0
  339. package/dist/roboto-regular-webfont.ae47f6f1292d196f.woff2 +0 -0
  340. package/dist/roboto-regular-webfont.f58066a2d9061006.woff +0 -0
  341. package/dist/roboto-thin-webfont.0a64479870f676e8.ttf +0 -0
  342. package/dist/roboto-thin-webfont.0f7221f5c7e972ef.woff2 +0 -0
  343. package/dist/roboto-thin-webfont.51b221e22714b1fe.svg +10012 -0
  344. package/dist/roboto-thin-webfont.dac941649dd4eac0.woff +0 -0
  345. package/dist/runtime.8ef63094e52a66ba.js +1 -0
  346. package/dist/scripts.1c3385254ff4c93c.js +1 -0
  347. package/dist/styles.cf8e3cf50d039a5c.css +1 -0
  348. package/fuxa.js +39 -0
  349. package/main.js +381 -0
  350. package/package.json +68 -0
  351. package/paths.js +44 -0
  352. package/project.default.json +11 -0
  353. package/project.demo.fuxap +1 -0
  354. package/runtime/alarms/alarmstorage.js +205 -0
  355. package/runtime/alarms/index.js +678 -0
  356. package/runtime/devices/bacnet/index.js +730 -0
  357. package/runtime/devices/device-utils.js +95 -0
  358. package/runtime/devices/device.js +551 -0
  359. package/runtime/devices/ethernetip/index.js +381 -0
  360. package/runtime/devices/fuxaserver/index.js +310 -0
  361. package/runtime/devices/httprequest/index.js +495 -0
  362. package/runtime/devices/index.js +489 -0
  363. package/runtime/devices/modbus/datatypes.js +122 -0
  364. package/runtime/devices/modbus/index.js +730 -0
  365. package/runtime/devices/mqtt/index.js +618 -0
  366. package/runtime/devices/odbc/index.js +408 -0
  367. package/runtime/devices/opcua/index.js +817 -0
  368. package/runtime/devices/s7/datatypes.js +88 -0
  369. package/runtime/devices/s7/index.js +702 -0
  370. package/runtime/devices/template/index.js +141 -0
  371. package/runtime/events.js +33 -0
  372. package/runtime/index.js +559 -0
  373. package/runtime/jobs/cleaner.js +74 -0
  374. package/runtime/jobs/fonts/LICENSE.txt +202 -0
  375. package/runtime/jobs/fonts/Roboto-Black.ttf +0 -0
  376. package/runtime/jobs/fonts/Roboto-BlackItalic.ttf +0 -0
  377. package/runtime/jobs/fonts/Roboto-Bold.ttf +0 -0
  378. package/runtime/jobs/fonts/Roboto-BoldItalic.ttf +0 -0
  379. package/runtime/jobs/fonts/Roboto-Italic.ttf +0 -0
  380. package/runtime/jobs/fonts/Roboto-Light.ttf +0 -0
  381. package/runtime/jobs/fonts/Roboto-LightItalic.ttf +0 -0
  382. package/runtime/jobs/fonts/Roboto-Medium.ttf +0 -0
  383. package/runtime/jobs/fonts/Roboto-MediumItalic.ttf +0 -0
  384. package/runtime/jobs/fonts/Roboto-Regular.ttf +0 -0
  385. package/runtime/jobs/fonts/Roboto-Thin.ttf +0 -0
  386. package/runtime/jobs/fonts/Roboto-ThinItalic.ttf +0 -0
  387. package/runtime/jobs/helper/image-generator.js +82 -0
  388. package/runtime/jobs/index.js +214 -0
  389. package/runtime/jobs/report.js +353 -0
  390. package/runtime/logger.js +113 -0
  391. package/runtime/notificator/index.js +383 -0
  392. package/runtime/notificator/notifystorage.js +179 -0
  393. package/runtime/plugins/index.js +255 -0
  394. package/runtime/project/index.js +959 -0
  395. package/runtime/project/prjstorage.js +222 -0
  396. package/runtime/scripts/index.js +313 -0
  397. package/runtime/scripts/msm.js +146 -0
  398. package/runtime/storage/calculator.js +227 -0
  399. package/runtime/storage/daqstorage.js +188 -0
  400. package/runtime/storage/influxdb/index.js +240 -0
  401. package/runtime/storage/sqlite/currentstorage.js +144 -0
  402. package/runtime/storage/sqlite/index.js +695 -0
  403. package/runtime/storage/tdengine/index.js +106 -0
  404. package/runtime/users/index.js +123 -0
  405. package/runtime/users/usrstorage.js +201 -0
  406. package/runtime/utils.js +284 -0
  407. package/screenshot/feature-action-move.gif +0 -0
  408. package/screenshot/fuxa-ani.gif +0 -0
  409. package/screenshot/fuxa-device.gif +0 -0
  410. package/screenshot/fuxa-editor.png +0 -0
  411. package/screenshot/fuxa-hmi.gif +0 -0
  412. package/screenshot/fuxa-home.png +0 -0
  413. package/screenshot/fuxa-test.gif +0 -0
  414. package/settings.default.js +65 -0
@@ -0,0 +1,695 @@
1
+ /**
2
+ * Module to manage the DAQ node with sqlite (a DaqNode per Device)
3
+ * There are 2 database:
4
+ * 1 to map all Tags/Nodes with map-id, Tag/Node-id, name and type.
5
+ * 2 to save the Tags/Nodes values with timestamp, map-id and value.
6
+ * The values have a Timestamp resolution of Seconds
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ var sqlite3 = require('sqlite3').verbose();
14
+
15
+ const db_daqdata_prefix = 'daq-data_';
16
+ const db_daqmap_prefix = 'daq-map_';
17
+ const db_daqtoken = 3600000; // 1 hour
18
+ const archive_folder = 'archive';
19
+
20
+ function DaqNode(_settings, _log, _id, _currentStorate) {
21
+
22
+ var settings = _settings; // Application settings
23
+ var logger = _log; // Application logger
24
+ var id = _id; // Device id
25
+ const currentStorage = _currentStorate // Database to set the last value (current)
26
+ var initready = false; // Initilized flag
27
+ var mapworking = false; // Data mapping working flag
28
+ var dataworking = false; // Save data working flag
29
+ var db_daqmap; // Database of mapped data
30
+ var db_daqdata; // Database of data
31
+ var daqTagsMap = {}; // Mapped db Tags/Nodes
32
+ var daqNextToken = new Date().getTime();// Interval to split Database data
33
+
34
+ daqNextToken += (settings.daqTokenizer) ? db_daqtoken * settings.daqTokenizer : db_daqtoken * 24;
35
+ if (settings.daqTokenizer === 0) {
36
+ daqNextToken = 0;
37
+ } else {
38
+ // check database pending
39
+ var pendsfile = path.join(settings.dbDir, db_daqdata_prefix + id + '_');
40
+ var pendsfiles = fs.readdirSync(settings.dbDir);
41
+ for (var i in pendsfiles) {
42
+ var filePath = path.join(settings.dbDir, pendsfiles[i]);
43
+ if (filePath.indexOf(pendsfile) === 0) {
44
+ _checkToArchiveDBfile(filePath);
45
+ }
46
+ }
47
+ }
48
+ // define file database
49
+ var suffix = (daqNextToken) ? _getDateTimeSuffix(new Date()) : '';
50
+ var db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
51
+ var db_daqmap_file = path.join(settings.dbDir, db_daqmap_prefix + id + '.db');
52
+
53
+ var db_daqmap_exists = require('fs').existsSync(db_daqmap_file);
54
+ var db_daqdata_exists = require('fs').existsSync(db_daqdata_file);
55
+ if (!db_daqmap_exists && db_daqdata_exists) {
56
+ // reset daq db
57
+ _resetDB(db_daqdata_file);
58
+ }
59
+
60
+ // bind database daqdata
61
+ _bindDaqData(db_daqdata_file).then(result => {
62
+ logger.info(`daqstorage.connected-to-data '${db_daqdata_file}' database`, true);
63
+ db_daqdata = result;
64
+ }).catch(function (err) {
65
+ if (err) {
66
+ logger.error(`daqstorage.connected-to-data failed! '${id}' ${err}`);
67
+ }
68
+ });
69
+
70
+ // bind database daqmap
71
+ _bindDaqMap(db_daqmap_file).then(result => {
72
+ logger.info(`daqstorage.connected-to-map '${db_daqmap_file}' database`, true);
73
+ db_daqmap = result;
74
+ _loadMap().then(result => {
75
+ logger.info(`daqstorage.load-map successful! '${id}'`, true);
76
+ initready = true;
77
+ }).catch(function (err) {
78
+ if (err) {
79
+ logger.error(`daqstorage.load-map failed! '${id}' ${err}`);
80
+ }
81
+ });
82
+ }).catch(function (err) {
83
+ if (err) {
84
+ logger.error(`daqstorage.bind-map failed! '${id}' ${err}`);
85
+ }
86
+ });
87
+
88
+ /**
89
+ * Close data and map database
90
+ */
91
+ this.close = function () {
92
+ if (db_daqmap) {
93
+ db_daqmap.close();
94
+ }
95
+ if (db_daqdata) {
96
+ db_daqdata.close();
97
+ }
98
+ logger.info(`daqstorage.closed successful! '${id}'`, true);
99
+ }
100
+
101
+ /**
102
+ * Set function callback to get Tag/Node property and return function reference to set value
103
+ */
104
+ this.setCall = function (fncgetprop) {
105
+ fncGetTagProp = fncgetprop;
106
+ return this.addDaqValues;
107
+ }
108
+ var fncGetTagProp = null;
109
+
110
+ /**
111
+ * Add Daq value of Tag/Node
112
+ * Check if the Tag/Node is mapped otherwise first add the value to data db then check if the db is to split and to archive
113
+ */
114
+ this.addDaqValue = function (tagid, tagvalue) {
115
+ if (initready) {
116
+ if (!daqTagsMap[tagid]) {
117
+ // tags is not mapped
118
+ var prop = fncGetTagProp(tagid);
119
+ if (prop && _checkMapWorking(true)) {
120
+ _insertTagToMap(prop.id, prop.name, prop.type).then(function (result) {
121
+ _getTagMap(prop.id, prop.name, prop.type).then(function (result) {
122
+ _addTagMap(result.mapid, prop.id, prop.name);
123
+ }).catch(function (err) {
124
+ logger.error(`daqstorage.add-daq-value _getTagMap failed! '${id}' ${err}`);
125
+ });
126
+ _checkMapWorking(false);
127
+ }).catch(function (err) {
128
+ _checkMapWorking(false);
129
+ logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${err}`);
130
+ });
131
+ }
132
+ } else {
133
+ if (_checkDataWorking(true)) {
134
+ // check if db_daqdata are bindet
135
+ if (db_daqdata) {
136
+ _insertTagValue(daqTagsMap[tagid].mapid, tagvalue).then(function (lastts) {
137
+ // check db tokenizer after inserted
138
+ if (daqNextToken && daqNextToken < lastts) {
139
+ // close data DB, open and bind the new db, rename and move the closed db
140
+ db_daqdata.close(function () {
141
+ var suffix = _getDateTimeSuffix(new Date());
142
+ var oldfile = db_daqdata_file;
143
+ db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
144
+ db_daqdata = null;
145
+ _bindDaqData(db_daqdata_file).then(result => {
146
+ logger.info(`daqstorage.add-daq-value _bindDaqData '${id}' database`, true);
147
+ daqNextToken += (settings.daqTimeToken) ? db_daqtoken * settings.daqTimeToken : db_daqtoken;
148
+ db_daqdata = result;
149
+ _archiveDBfile(oldfile, lastts);
150
+ _checkDataWorking(false);
151
+ }).catch(function (err) {
152
+ _checkDataWorking(false);
153
+ logger.error(`daqstorage.add-daq-value _bindDaqData failed! '${id}' ${err}`);
154
+ });
155
+ });
156
+ } else {
157
+ _checkDataWorking(false);
158
+ }
159
+ }).catch(function (err) {
160
+ _checkDataWorking(false);
161
+ });
162
+ } else {
163
+ // some things was wrong by tokenize...try to bind the db_daqdata
164
+ _bindDaqData(db_daqdata_file).then(result => {
165
+ logger.info(`daqstorage.add-daq-value _bindDaqData '${db_daqmap_file}' database`, true);
166
+ db_daqdata = result;
167
+ _checkDataWorking(false);
168
+ }).catch(function (err) {
169
+ _checkDataWorking(false);
170
+ logger.error(`daqstorage.add-daq-value _bindDaqData failed! '${id}' ${err}`);
171
+ });
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Add Daq value of Tag/Node
180
+ * Check if the Tag/Node is mapped otherwise first add the value to data db then check if the db is to split and to archive
181
+ */
182
+ this.addDaqValues = function (tags, deviceName, deviceId) {
183
+ if (initready) {
184
+ if (db_daqdata) {
185
+ var addMapfnc = [];
186
+ var addDaqfnc = [];
187
+ var dataToRestore = [];
188
+ // prepare functions
189
+ for (var tagid in tags) {
190
+ const tag = tags[tagid];
191
+ if (!tag.daq) {
192
+ continue;
193
+ }
194
+ if (tag.daq.restored) {
195
+ dataToRestore.push({id: tag.id, deviceId: deviceId, value: tag.value});
196
+ }
197
+ if (!tag.daq.enabled) {
198
+ continue;
199
+ }
200
+
201
+ if (!daqTagsMap[tagid]) {
202
+ var prop = fncGetTagProp(tagid);
203
+ if (prop) {
204
+ addMapfnc.push(_insertTagToMap(prop.id, prop.name, prop.type));
205
+ }
206
+ } else {
207
+ addDaqfnc.push(_insertTagValue(daqTagsMap[tagid].mapid, tag.value));
208
+ }
209
+ }
210
+ // check function to insert in map
211
+ if (addMapfnc.length > 0) {
212
+ Promise.all(addMapfnc).then(result => {
213
+ logger.info(`daqstorage.add-daq-values _insertTagToMap '${id}' ${result}`, true);
214
+ for (var idx = 0; idx < result.length; idx++) {
215
+ _getTagMap(result[idx]).then(function (result) {
216
+ _addTagMap(result.mapid, result.id, result.name);
217
+ }).catch(function (err) {
218
+ logger.error(`daqstorage.add-daq-value _getTagMap failed! '${id}' ${err}`);
219
+ });
220
+ }
221
+ }, reason => {
222
+ if (reason && reason.stack) {
223
+ logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${reason.stack}`);
224
+ } else {
225
+ logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${reason}`);
226
+ }
227
+ _checkDataWorking(false);
228
+ });
229
+ }
230
+ // check function to add daq data
231
+ if (addDaqfnc.length > 0) {
232
+ if (_checkDataWorking(true)) {
233
+ Promise.all(addDaqfnc).then(result => {
234
+ // check db tokenizer after inserted
235
+ var lastts = 0 || result[0];
236
+ if (daqNextToken && daqNextToken < lastts) {
237
+ // close data DB, open and bind the new db, rename and move the closed db
238
+ db_daqdata.close(function () {
239
+ var suffix = _getDateTimeSuffix(new Date());
240
+ var oldfile = db_daqdata_file;
241
+ db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
242
+ db_daqdata = null;
243
+ _bindDaqData(db_daqdata_file).then(result => {
244
+ logger.info(`daqstorage.add-daq-values '${db_daqmap_file}' database`, true);
245
+ daqNextToken += (settings.daqTimeToken) ? db_daqtoken * settings.daqTimeToken : db_daqtoken;
246
+ db_daqdata = result;
247
+ _archiveDBfile(oldfile, lastts);
248
+ _checkDataWorking(false);
249
+ }).catch(function (err) {
250
+ _checkDataWorking(false);
251
+ logger.error(`daqstorage.add-daq-values _bindDaqData failed! '${id}' ${err}`);
252
+ });
253
+ });
254
+ } else {
255
+ _checkDataWorking(false);
256
+ }
257
+ }, reason => {
258
+ if (reason && reason.stack) {
259
+ logger.error(`daqstorage.add-daq-values addDaqfnc failed! '${id}' ${reason.stack}`);
260
+ } else {
261
+ logger.error(`daqstorage.add-daq-values addDaqfnc failed! '${id}' ${reason}`);
262
+ }
263
+ _checkDataWorking(false);
264
+ });
265
+ }
266
+ }
267
+ if (dataToRestore.length && currentStorage) {
268
+ currentStorage.setValues(dataToRestore);
269
+ }
270
+ } else {
271
+ // some things was wrong by tokenize...try to bind the db_daqdata
272
+ _bindDaqData(db_daqdata_file).then(result => {
273
+ logger.info(`daqstorage.add-daq-values '${db_daqmap_file}' database`, true);
274
+ db_daqdata = result;
275
+ _checkDataWorking(false);
276
+ }).catch(function (err) {
277
+ _checkDataWorking(false);
278
+ logger.error(`daqstorage.add-daq-values _bindDaqData failed! '${id}' ${err}`);
279
+ });
280
+ }
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Return Tags/Nodes map list
286
+ */
287
+ this.getDaqMap = function () {
288
+ return daqTagsMap;
289
+ }
290
+
291
+ /**
292
+ * Return array of timeserie <timestamp, value>
293
+ */
294
+ this.getDaqValue = function (tagid, fromts, tots) {
295
+ return new Promise(function (resolve, reject) {
296
+ if (daqTagsMap[tagid]) {
297
+ var result = [];
298
+ // search in current db
299
+ _getTagValues(db_daqdata, daqTagsMap[tagid].mapid, fromts, tots).then(function (rows) {
300
+ // search in archive
301
+ var archivefiles = _getArchiveFiles(id, fromts, tots);
302
+ var dbfncs = [];
303
+ archivefiles.forEach(file => {
304
+ dbfncs.push(_bindAndGetTagValues(file, daqTagsMap[tagid].mapid, fromts, tots));
305
+ });
306
+ Promise.all(dbfncs).then(values => {
307
+ for (var i = 0; i < values.length; i++) {
308
+ result = result.concat(values[i]);
309
+ }
310
+ result = result.concat(rows);
311
+ resolve(result);
312
+ }, reason => {
313
+ if (reason.stack) {
314
+ logger.error(`daqstorage.get-daq-value failed! '${id}' ${reason.stack}`);
315
+ } else {
316
+ logger.error(`daqstorage.get-daq-value failed! '${id}' ${reason}`);
317
+ }
318
+ reject(reason);
319
+ });
320
+ }).catch(function (err) {
321
+ logger.error(`daqstorage.get-daq-value _getTagValues failed! '${id}' ${err}`);
322
+ reject(err);
323
+ });
324
+ } else {
325
+ reject('tag id ' + tagid + ' not found!');
326
+ }
327
+ });
328
+ }
329
+
330
+ /**
331
+ * Used to manage the async add Tag/Node in map db (that not overloading)
332
+ * @param {*} check
333
+ */
334
+ var _checkMapWorking = function (check) {
335
+ if (check && mapworking) {
336
+ logger.warn(`daqstorage.mapping-overload! '${id}'`);
337
+ return false;
338
+ }
339
+ mapworking = check;
340
+ return true;
341
+ }
342
+
343
+ /**
344
+ * Used to manage the async add Tag/Node in data db (that not overloading)
345
+ * @param {*} check
346
+ */
347
+ var _checkDataWorking = function (check) {
348
+ if (check && dataworking) {
349
+ logger.warn(`daqstorage.data-overload! '${id}'`);
350
+ return false;
351
+ }
352
+ dataworking = check;
353
+ return true;
354
+ }
355
+
356
+ /**
357
+ * Bind the map database by create the table if not exist
358
+ * @param {*} dbfile
359
+ */
360
+ function _bindDaqMap(dbfile) {
361
+ return new Promise(function (resolve, reject) {
362
+ try {
363
+ var db = new sqlite3.Database(dbfile, function (err) {
364
+ if (err) {
365
+ logger.error(`daqstorage.bind-daq-map error! '${id}' ${err}`);
366
+ reject();
367
+ }
368
+ logger.info(`daqstorage.bind-daq-map '${dbfile}' database`, true);
369
+ });
370
+ db.serialize(function () {
371
+ db.run("CREATE TABLE if not exists data (mapid INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT, name TEXT, type TEXT)", function (err) {
372
+ if (err) {
373
+ logger.error(`daqstorage.bind-daq-map-to-create-table error! '${id}' ${err}`);
374
+ reject();
375
+ } else {
376
+ resolve(db);
377
+ }
378
+ });
379
+ });
380
+ } catch (err) {
381
+ reject(err);
382
+ }
383
+ });
384
+ }
385
+
386
+ /**
387
+ * Bind the data database by create the table if not exist
388
+ * @param {*} dbfile
389
+ */
390
+ function _bindDaqData(dbfile) {
391
+ return new Promise(function (resolve, reject) {
392
+ try {
393
+ var db = new sqlite3.Database(dbfile, function (err) {
394
+ if (err) {
395
+ logger.error(`daqstorage.bind-daq-data error! '${id}' ${err}`);
396
+ reject();
397
+ }
398
+ logger.info(`daqstorage.bind-daq-data '${dbfile}' database`, true);
399
+ });
400
+ db.serialize(function () {
401
+ db.run("CREATE TABLE if not exists data (dt INTEGER, id INTEGER, value TEXT)", function (err) {
402
+ if (err) {
403
+ logger.error(`daqstorage.bind-daq-data-to-create-table error! '${id}' ${err}`);
404
+ reject();
405
+ } else {
406
+ resolve(db);
407
+ }
408
+ });
409
+ });
410
+ } catch (err) {
411
+ reject(err);
412
+ }
413
+ });
414
+ }
415
+
416
+ /**
417
+ * Move the db file to archive folder.
418
+ * Open the db take the last data and rename the file with the start and last data time
419
+ * @param {*} dbfile
420
+ */
421
+ function _checkToArchiveDBfile(dbfile) {
422
+ if (dbfile.indexOf('-journal') !== -1) {
423
+ // delete pending db journal
424
+ try {
425
+ fs.unlinkSync(dbfile);
426
+ logger.info(`daqstorage.check-to-archive-db-file '${dbfile}' pending db journal deleted!`, true);
427
+ } catch (e) {
428
+ console.error(e);
429
+ }
430
+ } else {
431
+ _bindDaqData(dbfile).then(result => {
432
+ logger.info(`daqstorage.check-to-archive-db-file '${dbfile}'`, true);
433
+ _getLastTagValue(result).then(lastrow => {
434
+ result.close(function () {
435
+ // rename and move to archive
436
+ if (lastrow) {
437
+ var filearchived = _archiveDBfile(dbfile, lastrow.dt);
438
+ logger.info(`daqstorage.check-to-archive-db-file '${filearchived}'`, true);
439
+ } else {
440
+ // delete void db
441
+ try {
442
+ fs.unlinkSync(dbfile);
443
+ logger.info(`daqstorage.check-to-archive-db-file '${dbfile}' database deleted!`, true);
444
+ } catch (e) {
445
+ console.error(e);
446
+ }
447
+ }
448
+ });
449
+ }).catch(function (err) {
450
+ logger.error(`daqstorage.check-to-archive-db-file error! '${id}' ${err}`);
451
+ });
452
+ }).catch(function (err) {
453
+ logger.error(`daqstorage.check-to-archive-db-file error! '${id}' ${err}`);
454
+ });
455
+ }
456
+ }
457
+
458
+ function _getArchiveFiles(id, fromts, tots) {
459
+ const archive = path.resolve(settings.dbDir, archive_folder);
460
+ var result = [];
461
+ if (fs.existsSync(archive)) {
462
+ fs.readdirSync(archive).forEach(file => {
463
+ const fromTo = _suffixToTimestamp(file);
464
+ if (file.indexOf(`_${id}_`) > 0 && fromTo && fromTo.from <= tots && fromTo.to >= fromts) {
465
+ result.push(path.join(archive, file));
466
+ }
467
+ });
468
+ result.sort();
469
+ }
470
+ return result;
471
+ }
472
+
473
+ function _archiveDBfile(dbfile, ts) {
474
+ var suffix = _getDateTimeSuffix(new Date(ts));
475
+ var archive = path.resolve(settings.dbDir, archive_folder);
476
+ if (!fs.existsSync(archive)) {
477
+ fs.mkdirSync(archive);
478
+ }
479
+ var dbfilenew = path.join(archive, path.basename(dbfile, path.extname(dbfile))) + '_' + suffix + path.extname(dbfile);
480
+ try {
481
+ fs.renameSync(dbfile, dbfilenew);
482
+ } catch (err) {
483
+ console.error(err);
484
+ }
485
+ return dbfilenew;
486
+ }
487
+
488
+ function _getDateTimeSuffix(dt) {
489
+ var yyyy = dt.getFullYear();
490
+ var mm = dt.getMonth() + 1;
491
+ var dd = dt.getDate();
492
+ if (dd < 10) {
493
+ dd = '0' + dd;
494
+ }
495
+ if (mm < 10) {
496
+ mm = '0' + mm;
497
+ }
498
+ var HH = dt.getHours();
499
+ var MM = dt.getMinutes();
500
+ var SS = dt.getSeconds();
501
+ if (HH < 10) {
502
+ HH = '0' + HH;
503
+ }
504
+ if (MM < 10) {
505
+ MM = '0' + MM;
506
+ }
507
+ if (SS < 10) {
508
+ SS = '0' + SS;
509
+ }
510
+ return '' + yyyy + mm + dd + HH + MM + SS;
511
+ }
512
+
513
+ function _resetDB(file) {
514
+ try {
515
+ fs.unlinkSync(file);
516
+ logger.info(`daqstorage._resetDB '${file}' file of database deleted!`, true);
517
+ } catch (err) {
518
+ console.error(err);
519
+ }
520
+ }
521
+
522
+ function _loadMap() {
523
+ daqTagsMap = {};
524
+ return new Promise(function (resolve, reject) {
525
+ db_daqmap.all("SELECT mapid, id, name, type FROM data", function (err, rows) {
526
+ if (err) {
527
+ reject(err);
528
+ }
529
+ else if (rows) {
530
+ for (var idx = 0; idx < rows.length; idx++) {
531
+ var row = rows[idx];
532
+ _addTagMap(row.mapid, row.id, row.name);
533
+ // cfg.push({ id: row.mapid, name: row.name, interval_range: row.interval_range, interval: row.interval, sample_range: row.sample_range, samples: row.samples, enabled: row.enabled, divisor: row.divisor, value: null });
534
+
535
+ }
536
+ }
537
+ resolve(true);
538
+ });
539
+ });
540
+ }
541
+
542
+ function _getTagMap(id) {
543
+ return new Promise(function (resolve, reject) {
544
+ var sql = "SELECT mapid, id, name, type FROM data WHERE id = ?";
545
+ db_daqmap.get(sql, [id], function (err, row) {
546
+ if (err) {
547
+ reject(err);
548
+ } else {
549
+ resolve(row);
550
+ }
551
+ });
552
+ });
553
+ }
554
+
555
+ function _insertTagToMap(tagid, name, type) {
556
+ return new Promise(function (resolve, reject) {
557
+ var sqlRequest = "INSERT INTO data (id, name, type) ";
558
+ db_daqmap.run(sqlRequest + "VALUES('" + tagid + "','" + name + "','" + type + "'); SELECT last_insert_rowid() FROM data", function (err) {
559
+ if (err !== null) {
560
+ reject(err);
561
+ } else {
562
+ resolve(tagid);
563
+ }
564
+ });
565
+ });
566
+ }
567
+
568
+ function _getLastTagValue(db) {
569
+ return new Promise(function (resolve, reject) {
570
+ var sql = "SELECT dt FROM data ORDER BY dt DESC LIMIT 1";
571
+ db.get(sql, [], function (err, row) {
572
+ if (err) {
573
+ console.error(err);
574
+ reject(err);
575
+ } else {
576
+ resolve(row);
577
+ }
578
+ });
579
+ });
580
+ }
581
+
582
+ function _bindAndGetTagValues(dbfile, id, fromts, tots) {
583
+ return new Promise(function (resolve, reject) {
584
+ _bindDaqData(dbfile).then(result => {
585
+ _getTagValues(result, id, fromts, tots).then(rows => {
586
+ result.close();
587
+ resolve(rows);
588
+ }).catch(function (err) {
589
+ reject(err);
590
+ });
591
+ }).catch(function (err) {
592
+ reject(err);
593
+ });
594
+ });
595
+ }
596
+
597
+ function _getTagValues(db, id, fromts, tots) {
598
+ return new Promise(function (resolve, reject) {
599
+ const booleanMapping = { "true": true, "false": false };
600
+ var sql = "SELECT dt, value FROM data WHERE id = ? AND dt BETWEEN ? and ? ORDER BY dt ASC";
601
+ db.all(sql, [id, fromts, tots], function (err, rows) {
602
+ if (err) {
603
+ console.error(err);
604
+ reject(err);
605
+ } else {
606
+ for (var i = 0; i < rows.length; i++) {
607
+ rows[i].value = booleanMapping[rows[i].value] !== undefined ? booleanMapping[rows[i].value] : rows[i].value;
608
+ }
609
+ resolve(rows);
610
+ }
611
+ });
612
+ });
613
+ }
614
+
615
+ function _insertTagValue(mapid, value) {
616
+ return new Promise(function (resolve, reject) {
617
+ var ts = new Date().getTime();
618
+ var sqlRequest = "INSERT INTO data (dt, id, value) ";
619
+ db_daqdata.run(sqlRequest + "VALUES('" + ts + "','" + mapid + "','" + value + "')", function (err) {
620
+ if (err !== null) {
621
+ reject();
622
+ }
623
+ else {
624
+ resolve(ts);
625
+ }
626
+ });
627
+ });
628
+ }
629
+
630
+ function _addTagMap(mapid, id, name) {
631
+ if (daqTagsMap[id]) {
632
+ return false;
633
+ }
634
+ daqTagsMap[id] = { mapid: mapid, name: name };
635
+ return true;
636
+ }
637
+
638
+ return true;
639
+ }
640
+
641
+ /**
642
+ * Check and remove old data
643
+ */
644
+ function checkRetention(dtlimit, dbDir, callbackRemoved, callbackError) {
645
+ var archiveDir = path.resolve(dbDir, archive_folder);
646
+ if (fs.existsSync(archiveDir)) {
647
+ var files = fs.readdirSync(archiveDir);
648
+ files.forEach(file => {
649
+ const fromTo = _suffixToTimestamp(file);
650
+ if (fromTo && fromTo.from < dtlimit.getTime()) {
651
+ try {
652
+ fs.unlink(path.join(archiveDir, file), (err) => {
653
+ if (err && callbackError) {
654
+ callbackError(`daqstorage.checkRetention remove file ${file} failed! ${err}`);
655
+ }
656
+ });
657
+ if (callbackRemoved) {
658
+ callbackRemoved(file);
659
+ }
660
+ } catch (error) {
661
+ console.error(error);
662
+ }
663
+ }
664
+ });
665
+ }
666
+ }
667
+
668
+ function _suffixToTimestamp(file) {
669
+ function _parseSuffix(dtText) {
670
+ if (dtText.length >= 14) {
671
+ var yyyy = parseInt(dtText.substring(0, 4));
672
+ var mm = parseInt(dtText.substring(4, 6)) - 1;
673
+ var dd = parseInt(dtText.substring(6, 8));
674
+ var HH = parseInt(dtText.substring(8, 10));
675
+ var MM = parseInt(dtText.substring(10, 12));
676
+ var SS = parseInt(dtText.substring(12, 14));
677
+ return new Date(yyyy, mm, dd, HH, MM, SS).getTime();
678
+ }
679
+ return null;
680
+ }
681
+ var ranges = file.split('_');
682
+ if (ranges.length >= 3) {
683
+ return { from: _parseSuffix(ranges[ranges.length - 2]),
684
+ to: _parseSuffix(ranges[ranges.length - 1])
685
+ };
686
+ }
687
+ return null;
688
+ }
689
+
690
+ module.exports = {
691
+ create: function (data, logger, id, currentStorate) {
692
+ return new DaqNode(data, logger, id, currentStorate);
693
+ },
694
+ checkRetention: checkRetention
695
+ };