divhunt 2.0.0

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 (473) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/addons/core/clients/LICENSE.txt +40 -0
  4. package/addons/core/clients/README.md +123 -0
  5. package/addons/core/clients/back/grpc/addon.js +25 -0
  6. package/addons/core/clients/back/grpc/item/catch/add.js +8 -0
  7. package/addons/core/clients/back/grpc/item/functions/connect.js +73 -0
  8. package/addons/core/clients/back/grpc/item/functions/resolve.js +41 -0
  9. package/addons/core/clients/back/grpc/item/functions/stream.js +103 -0
  10. package/addons/core/clients/back/grpc/load.js +11 -0
  11. package/addons/core/clients/back/grpc/service.proto +20 -0
  12. package/addons/core/clients/back/http/addon.js +21 -0
  13. package/addons/core/clients/back/http/item/catch/add.js +18 -0
  14. package/addons/core/clients/back/http/item/functions/gRPC/create.js +192 -0
  15. package/addons/core/clients/back/http/item/functions/gRPC/execute.js +15 -0
  16. package/addons/core/clients/back/http/item/functions/http/create.js +143 -0
  17. package/addons/core/clients/back/http/item/functions/http/delete.js +8 -0
  18. package/addons/core/clients/back/http/item/functions/http/get.js +8 -0
  19. package/addons/core/clients/back/http/item/functions/http/post.js +8 -0
  20. package/addons/core/clients/back/http/item/functions/http/put.js +8 -0
  21. package/addons/core/clients/back/http/item/functions/http/request.js +15 -0
  22. package/addons/core/clients/back/http/load.js +17 -0
  23. package/addons/core/commands/LICENSE.txt +40 -0
  24. package/addons/core/commands/README.md +294 -0
  25. package/addons/core/commands/back/addon.js +31 -0
  26. package/addons/core/commands/back/functions/find.js +54 -0
  27. package/addons/core/commands/back/functions/grpc/client.js +155 -0
  28. package/addons/core/commands/back/functions/grpc/server.js +71 -0
  29. package/addons/core/commands/back/functions/http/server.js +91 -0
  30. package/addons/core/commands/back/item/functions/run.js +82 -0
  31. package/addons/core/commands/back/items/many.js +76 -0
  32. package/addons/core/commands/back/items/one.js +78 -0
  33. package/addons/core/commands/back/items/run.js +51 -0
  34. package/addons/core/commands/back/load.js +20 -0
  35. package/addons/core/commands/front/#register/addon.js +11 -0
  36. package/addons/core/commands/front/functions/find.js +24 -0
  37. package/addons/core/commands/front/item/functions/run.js +98 -0
  38. package/addons/core/commands/front/items/elements/table/table.css +18 -0
  39. package/addons/core/commands/front/items/elements/table/table.js +254 -0
  40. package/addons/core/database/README.md +276 -0
  41. package/addons/core/database/back/addon.js +14 -0
  42. package/addons/core/database/back/events/addon.add.js +18 -0
  43. package/addons/core/database/back/events/middleware/addon.items.find.js +24 -0
  44. package/addons/core/database/back/events/middleware/item.crud.create.js +24 -0
  45. package/addons/core/database/back/events/middleware/item.crud.delete.js +24 -0
  46. package/addons/core/database/back/events/middleware/item.crud.update.js +24 -0
  47. package/addons/core/database/back/functions/create.js +6 -0
  48. package/addons/core/database/back/functions/delete.js +6 -0
  49. package/addons/core/database/back/functions/find/builder.js +160 -0
  50. package/addons/core/database/back/functions/find/count.js +12 -0
  51. package/addons/core/database/back/functions/find/filter.js +37 -0
  52. package/addons/core/database/back/functions/find/filters.js +7 -0
  53. package/addons/core/database/back/functions/find/many.js +93 -0
  54. package/addons/core/database/back/functions/find/methods.js +235 -0
  55. package/addons/core/database/back/functions/find/plain.js +25 -0
  56. package/addons/core/database/back/functions/find/validation.js +214 -0
  57. package/addons/core/database/back/functions/find.js +25 -0
  58. package/addons/core/database/back/functions/update.js +6 -0
  59. package/addons/core/database/back/item/catch/add.js +25 -0
  60. package/addons/core/database/back/item/functions/create.js +93 -0
  61. package/addons/core/database/back/item/functions/delete.js +25 -0
  62. package/addons/core/database/back/item/functions/find.js +19 -0
  63. package/addons/core/database/back/item/functions/save.js +15 -0
  64. package/addons/core/database/back/item/functions/transaction.js +17 -0
  65. package/addons/core/database/back/item/functions/update.js +76 -0
  66. package/addons/core/database/back/items/commands/expose.js +321 -0
  67. package/addons/core/database/back/load.js +68 -0
  68. package/addons/core/database/front/#register/addon.js +4 -0
  69. package/addons/core/database/front/events/addon.add.js +13 -0
  70. package/addons/core/database/front/functions/find.js +142 -0
  71. package/addons/core/queue/README.md +216 -0
  72. package/addons/core/queue/back/addon.js +21 -0
  73. package/addons/core/queue/back/functions/calculate/art.js +12 -0
  74. package/addons/core/queue/back/functions/calculate/rps.js +22 -0
  75. package/addons/core/queue/back/item/catch/add.js +6 -0
  76. package/addons/core/queue/back/item/catch/remove.js +6 -0
  77. package/addons/core/queue/back/item/functions/add.js +15 -0
  78. package/addons/core/queue/back/item/functions/start.js +135 -0
  79. package/addons/core/queue/back/load.js +12 -0
  80. package/addons/core/queue/index.js +66 -0
  81. package/addons/core/queue/package.json +13 -0
  82. package/addons/core/servers/README.md +85 -0
  83. package/addons/core/servers/back/grpc/addon.js +23 -0
  84. package/addons/core/servers/back/grpc/item/catch/add.js +6 -0
  85. package/addons/core/servers/back/grpc/item/functions/resolve.js +41 -0
  86. package/addons/core/servers/back/grpc/item/functions/start.js +65 -0
  87. package/addons/core/servers/back/grpc/item/functions/stream.js +68 -0
  88. package/addons/core/servers/back/grpc/load.js +9 -0
  89. package/addons/core/servers/back/grpc/service.proto +20 -0
  90. package/addons/core/servers/back/http/addon.js +15 -0
  91. package/addons/core/servers/back/http/functions/extract/data.js +232 -0
  92. package/addons/core/servers/back/http/item/catch/add.js +6 -0
  93. package/addons/core/servers/back/http/item/functions/start.js +135 -0
  94. package/addons/core/servers/back/http/load.js +8 -0
  95. package/addons/float/modals/front/css/modals.css +26 -0
  96. package/addons/float/modals/front/js/#register/addon.js +10 -0
  97. package/addons/float/modals/front/js/item/catch/add.js +48 -0
  98. package/addons/float/modals/front/js/item/catch/remove.js +9 -0
  99. package/addons/float/overlays/front/css/overlays.css +29 -0
  100. package/addons/float/overlays/front/js/#register/addon.js +17 -0
  101. package/addons/float/overlays/front/js/events/click.js +27 -0
  102. package/addons/float/overlays/front/js/events/escape.js +18 -0
  103. package/addons/float/overlays/front/js/functions/flip.js +74 -0
  104. package/addons/float/overlays/front/js/functions/index.js +17 -0
  105. package/addons/float/overlays/front/js/functions/position.js +63 -0
  106. package/addons/float/overlays/front/js/item/catch/add.js +121 -0
  107. package/addons/float/overlays/front/js/item/catch/remove.js +16 -0
  108. package/addons/float/popups/css/popups.css +4 -0
  109. package/addons/float/popups/js/#register/addon.js +18 -0
  110. package/addons/float/popups/js/item/catch/add.js +7 -0
  111. package/addons/float/popups/js/item/catch/remove.js +7 -0
  112. package/addons/float/popups/js/item/catch/set.js +73 -0
  113. package/addons/float/popups/js/items/directives/popup.js +54 -0
  114. package/addons/float/toasts/#register/addon.js +17 -0
  115. package/addons/float/toasts/item/catch/add.js +7 -0
  116. package/addons/float/toasts/item/catch/remove.js +7 -0
  117. package/addons/float/toasts/item/catch/set.js +86 -0
  118. package/addons/float/toasts/items/elements/toast/toast.css +84 -0
  119. package/addons/float/toasts/items/elements/toast/toast.js +61 -0
  120. package/addons/float/tooltips/#register/addon.js +15 -0
  121. package/addons/float/tooltips/item/catch/add.js +7 -0
  122. package/addons/float/tooltips/item/catch/remove.js +26 -0
  123. package/addons/float/tooltips/item/catch/set.js +65 -0
  124. package/addons/float/tooltips/items/directives/tooltip.js +74 -0
  125. package/addons/float/tooltips/items/elements/tooltip.css +64 -0
  126. package/addons/float/tooltips/items/elements/tooltip.js +42 -0
  127. package/addons/modules/actions/front/addon.js +19 -0
  128. package/addons/modules/actions/front/functions/run.js +230 -0
  129. package/addons/modules/actions/front/load.js +5 -0
  130. package/addons/modules/bugs/front/addon.js +16 -0
  131. package/addons/modules/bugs/front/functions/clear.js +14 -0
  132. package/addons/modules/bugs/front/functions/push.js +15 -0
  133. package/addons/modules/bugs/front/functions/resolve.js +13 -0
  134. package/addons/modules/bugs/front/item/catch/add.js +9 -0
  135. package/addons/modules/bugs/front/load.js +9 -0
  136. package/addons/modules/events/front/addon.js +11 -0
  137. package/addons/modules/events/front/functions/clear.js +9 -0
  138. package/addons/modules/events/front/functions/emit.js +60 -0
  139. package/addons/modules/events/front/functions/off.js +23 -0
  140. package/addons/modules/events/front/functions/on.js +40 -0
  141. package/addons/modules/events/front/functions/once.js +6 -0
  142. package/addons/modules/events/front/load.js +9 -0
  143. package/addons/modules/schedules/back/addon.js +26 -0
  144. package/addons/modules/schedules/back/functions/disable.js +17 -0
  145. package/addons/modules/schedules/back/functions/enable.js +17 -0
  146. package/addons/modules/schedules/back/functions/next.js +142 -0
  147. package/addons/modules/schedules/back/functions/start.js +126 -0
  148. package/addons/modules/schedules/back/functions/stop.js +38 -0
  149. package/addons/modules/schedules/back/functions/trigger.js +134 -0
  150. package/addons/modules/schedules/back/items/create.js +82 -0
  151. package/addons/modules/schedules/back/items/delete.js +38 -0
  152. package/addons/modules/schedules/back/items/many.js +90 -0
  153. package/addons/modules/schedules/back/items/one.js +48 -0
  154. package/addons/modules/schedules/back/items/update.js +115 -0
  155. package/addons/modules/schedules/back/load.js +16 -0
  156. package/addons/modules/schedules/front/addon.js +23 -0
  157. package/addons/modules/schedules/front/functions/disable.js +17 -0
  158. package/addons/modules/schedules/front/functions/enable.js +17 -0
  159. package/addons/modules/schedules/front/functions/next.js +142 -0
  160. package/addons/modules/schedules/front/functions/start.js +126 -0
  161. package/addons/modules/schedules/front/functions/stop.js +38 -0
  162. package/addons/modules/schedules/front/functions/trigger.js +161 -0
  163. package/addons/modules/schedules/front/load.js +10 -0
  164. package/addons/modules/shortcuts/front/#register/addon.js +22 -0
  165. package/addons/modules/shortcuts/front/functions/context.js +13 -0
  166. package/addons/modules/shortcuts/front/functions/disable.js +15 -0
  167. package/addons/modules/shortcuts/front/functions/enable.js +15 -0
  168. package/addons/modules/shortcuts/front/functions/register.js +170 -0
  169. package/addons/modules/shortcuts/front/functions/trigger.js +140 -0
  170. package/addons/modules/shortcuts/front/functions/unregister.js +19 -0
  171. package/addons/modules/shortcuts/front/load.js +12 -0
  172. package/addons/modules/sources/back/addon.js +23 -0
  173. package/addons/modules/sources/back/functions/run.js +252 -0
  174. package/addons/modules/sources/back/items/create.js +74 -0
  175. package/addons/modules/sources/back/items/delete.js +36 -0
  176. package/addons/modules/sources/back/items/many.js +80 -0
  177. package/addons/modules/sources/back/items/one.js +46 -0
  178. package/addons/modules/sources/back/items/run.js +28 -0
  179. package/addons/modules/sources/back/items/update.js +110 -0
  180. package/addons/modules/sources/back/load.js +12 -0
  181. package/addons/modules/sources/front/addon.js +20 -0
  182. package/addons/modules/sources/front/functions/run.js +279 -0
  183. package/addons/modules/sources/front/load.js +5 -0
  184. package/addons/modules/variables/addon.js +12 -0
  185. package/addons/modules/variables/functions/filter.js +24 -0
  186. package/addons/modules/variables/functions/process.js +52 -0
  187. package/addons/modules/variables/item/catch/add.js +13 -0
  188. package/addons/modules/variables/load.js +8 -0
  189. package/addons/render/assets/back/README.md +1 -0
  190. package/addons/render/assets/back/addon.js +15 -0
  191. package/addons/render/assets/back/functions/css.js +32 -0
  192. package/addons/render/assets/back/functions/js.js +32 -0
  193. package/addons/render/assets/back/functions/scan/directories.js +38 -0
  194. package/addons/render/assets/back/functions/scan/files.js +58 -0
  195. package/addons/render/assets/back/functions/utils/read.js +26 -0
  196. package/addons/render/assets/back/functions/utils/transform.js +34 -0
  197. package/addons/render/assets/back/items/commands/css.js +20 -0
  198. package/addons/render/assets/back/items/commands/js.js +19 -0
  199. package/addons/render/assets/back/items/html/css.js +18 -0
  200. package/addons/render/assets/back/items/html/js.js +18 -0
  201. package/addons/render/assets/back/load.js +23 -0
  202. package/addons/render/directives/front/js/#register/addon.js +32 -0
  203. package/addons/render/directives/front/js/functions/process/attributes.js +47 -0
  204. package/addons/render/directives/front/js/functions/process/data.js +74 -0
  205. package/addons/render/directives/front/js/functions/process/match.js +43 -0
  206. package/addons/render/directives/front/js/functions/process.js +57 -0
  207. package/addons/render/directives/front/js/items/100-if.js +24 -0
  208. package/addons/render/directives/front/js/items/1000-render.js +36 -0
  209. package/addons/render/directives/front/js/items/110-show.js +25 -0
  210. package/addons/render/directives/front/js/items/160-slot.js +32 -0
  211. package/addons/render/directives/front/js/items/200-for.js +79 -0
  212. package/addons/render/directives/front/js/items/500-blur.js +46 -0
  213. package/addons/render/directives/front/js/items/500-change.js +53 -0
  214. package/addons/render/directives/front/js/items/500-click-outside.js +50 -0
  215. package/addons/render/directives/front/js/items/500-click.js +52 -0
  216. package/addons/render/directives/front/js/items/500-double-click.js +52 -0
  217. package/addons/render/directives/front/js/items/500-focus.js +46 -0
  218. package/addons/render/directives/front/js/items/500-input.js +46 -0
  219. package/addons/render/directives/front/js/items/500-keydown.js +53 -0
  220. package/addons/render/directives/front/js/items/500-keyup.js +53 -0
  221. package/addons/render/directives/front/js/items/500-mouse-enter.js +61 -0
  222. package/addons/render/directives/front/js/items/500-mouse-leave.js +61 -0
  223. package/addons/render/directives/front/js/items/500-mouse-move.js +45 -0
  224. package/addons/render/directives/front/js/items/500-scroll.js +45 -0
  225. package/addons/render/directives/front/js/items/500-submit.js +52 -0
  226. package/addons/render/directives/front/js/items/650-fetch.js +189 -0
  227. package/addons/render/directives/front/js/items/660-form.js +291 -0
  228. package/addons/render/directives/front/js/items/700-text.js +50 -0
  229. package/addons/render/directives/front/js/items/750-html.js +44 -0
  230. package/addons/render/elements/front/#register/addon.js +12 -0
  231. package/addons/render/elements/front/item/catch/add.js +9 -0
  232. package/addons/render/elements/front/items/directives/element.js +76 -0
  233. package/addons/render/elements/front/items/self/base/menu/menu.js +96 -0
  234. package/addons/render/elements/front/items/self/base/menu/styles/base.css +116 -0
  235. package/addons/render/elements/front/items/self/base/menu/styles/sizes.css +27 -0
  236. package/addons/render/elements/front/items/self/base/menu/styles/variants.css +99 -0
  237. package/addons/render/elements/front/items/self/base/tag/tag.css +199 -0
  238. package/addons/render/elements/front/items/self/base/tag/tag.js +37 -0
  239. package/addons/render/elements/front/items/self/cards/basic/basic.js +89 -0
  240. package/addons/render/elements/front/items/self/cards/basic/styles/base.css +66 -0
  241. package/addons/render/elements/front/items/self/cards/basic/styles/sizes.css +32 -0
  242. package/addons/render/elements/front/items/self/cards/basic/styles/variants.css +99 -0
  243. package/addons/render/elements/front/items/self/cards/list/list.js +108 -0
  244. package/addons/render/elements/front/items/self/cards/list/styles/base.css +96 -0
  245. package/addons/render/elements/front/items/self/cards/list/styles/sizes.css +32 -0
  246. package/addons/render/elements/front/items/self/cards/list/styles/variants.css +99 -0
  247. package/addons/render/elements/front/items/self/cards/media/media.js +116 -0
  248. package/addons/render/elements/front/items/self/cards/media/styles/base.css +126 -0
  249. package/addons/render/elements/front/items/self/cards/media/styles/sizes.css +49 -0
  250. package/addons/render/elements/front/items/self/cards/media/styles/variants.css +74 -0
  251. package/addons/render/elements/front/items/self/cards/profile/profile.js +95 -0
  252. package/addons/render/elements/front/items/self/cards/profile/styles/base.css +142 -0
  253. package/addons/render/elements/front/items/self/cards/profile/styles/sizes.css +43 -0
  254. package/addons/render/elements/front/items/self/cards/profile/styles/variants.css +131 -0
  255. package/addons/render/elements/front/items/self/cards/stat/stat.js +117 -0
  256. package/addons/render/elements/front/items/self/cards/stat/styles/base.css +97 -0
  257. package/addons/render/elements/front/items/self/cards/stat/styles/sizes.css +49 -0
  258. package/addons/render/elements/front/items/self/cards/stat/styles/variants.css +124 -0
  259. package/addons/render/elements/front/items/self/content/html/html.css +93 -0
  260. package/addons/render/elements/front/items/self/content/html/html.js +40 -0
  261. package/addons/render/elements/front/items/self/content/markdown/markdown.css +200 -0
  262. package/addons/render/elements/front/items/self/content/markdown/markdown.js +120 -0
  263. package/addons/render/elements/front/items/self/data/comments/comments.css +253 -0
  264. package/addons/render/elements/front/items/self/data/comments/comments.js +134 -0
  265. package/addons/render/elements/front/items/self/data/files/files.css +116 -0
  266. package/addons/render/elements/front/items/self/data/files/files.js +85 -0
  267. package/addons/render/elements/front/items/self/data/folders/folders.css +104 -0
  268. package/addons/render/elements/front/items/self/data/folders/folders.js +73 -0
  269. package/addons/render/elements/front/items/self/data/inbox/inbox.css +225 -0
  270. package/addons/render/elements/front/items/self/data/inbox/inbox.js +111 -0
  271. package/addons/render/elements/front/items/self/data/logs/logs.css +133 -0
  272. package/addons/render/elements/front/items/self/data/logs/logs.js +65 -0
  273. package/addons/render/elements/front/items/self/data/plans/plans.css +231 -0
  274. package/addons/render/elements/front/items/self/data/plans/plans.js +104 -0
  275. package/addons/render/elements/front/items/self/data/properties/properties.css +108 -0
  276. package/addons/render/elements/front/items/self/data/properties/properties.js +156 -0
  277. package/addons/render/elements/front/items/self/data/table/table.css +153 -0
  278. package/addons/render/elements/front/items/self/data/table/table.js +106 -0
  279. package/addons/render/elements/front/items/self/data/timeline/timeline.css +127 -0
  280. package/addons/render/elements/front/items/self/data/timeline/timeline.js +57 -0
  281. package/addons/render/elements/front/items/self/feedback/alert/alert.css +258 -0
  282. package/addons/render/elements/front/items/self/feedback/alert/alert.js +67 -0
  283. package/addons/render/elements/front/items/self/feedback/confirm/confirm.css +229 -0
  284. package/addons/render/elements/front/items/self/feedback/confirm/confirm.js +81 -0
  285. package/addons/render/elements/front/items/self/feedback/loader/loader.css +203 -0
  286. package/addons/render/elements/front/items/self/feedback/loader/loader.js +25 -0
  287. package/addons/render/elements/front/items/self/feedback/progress/progress.css +136 -0
  288. package/addons/render/elements/front/items/self/feedback/progress/progress.js +40 -0
  289. package/addons/render/elements/front/items/self/form/button/button.js +105 -0
  290. package/addons/render/elements/front/items/self/form/button/styles/base.css +176 -0
  291. package/addons/render/elements/front/items/self/form/button/styles/sizes.css +78 -0
  292. package/addons/render/elements/front/items/self/form/button/styles/variants.css +421 -0
  293. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +57 -0
  294. package/addons/render/elements/front/items/self/form/checkbox/styles/base.css +52 -0
  295. package/addons/render/elements/front/items/self/form/checkbox/styles/sizes.css +39 -0
  296. package/addons/render/elements/front/items/self/form/checkbox/styles/variants.css +121 -0
  297. package/addons/render/elements/front/items/self/form/field/field.css +96 -0
  298. package/addons/render/elements/front/items/self/form/field/field.js +39 -0
  299. package/addons/render/elements/front/items/self/form/input/input.css +111 -0
  300. package/addons/render/elements/front/items/self/form/input/input.js +78 -0
  301. package/addons/render/elements/front/items/self/form/input/styles/base.css +26 -0
  302. package/addons/render/elements/front/items/self/form/input/styles/sizes.css +15 -0
  303. package/addons/render/elements/front/items/self/form/input/styles/variants.css +98 -0
  304. package/addons/render/elements/front/items/self/form/radio/radio.js +57 -0
  305. package/addons/render/elements/front/items/self/form/radio/styles/base.css +48 -0
  306. package/addons/render/elements/front/items/self/form/radio/styles/sizes.css +36 -0
  307. package/addons/render/elements/front/items/self/form/radio/styles/variants.css +121 -0
  308. package/addons/render/elements/front/items/self/form/rating/rating.css +95 -0
  309. package/addons/render/elements/front/items/self/form/rating/rating.js +88 -0
  310. package/addons/render/elements/front/items/self/form/section/section.css +107 -0
  311. package/addons/render/elements/front/items/self/form/section/section.js +39 -0
  312. package/addons/render/elements/front/items/self/form/slider/slider.css +244 -0
  313. package/addons/render/elements/front/items/self/form/slider/slider.js +69 -0
  314. package/addons/render/elements/front/items/self/form/textarea/textarea.css +117 -0
  315. package/addons/render/elements/front/items/self/form/textarea/textarea.js +69 -0
  316. package/addons/render/elements/front/items/self/layout/empty/empty.css +154 -0
  317. package/addons/render/elements/front/items/self/layout/empty/empty.js +43 -0
  318. package/addons/render/elements/front/items/self/layout/heading/heading.css +117 -0
  319. package/addons/render/elements/front/items/self/layout/heading/heading.js +47 -0
  320. package/addons/render/elements/front/items/self/layout/hero/hero.js +88 -0
  321. package/addons/render/elements/front/items/self/layout/hero/styles/base.css +81 -0
  322. package/addons/render/elements/front/items/self/layout/hero/styles/sizes.css +24 -0
  323. package/addons/render/elements/front/items/self/layout/hero/styles/variants.css +98 -0
  324. package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/_class/addon.js +9 -0
  325. package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/functions/get.js +22 -0
  326. package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.css +13 -0
  327. package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.js +51 -0
  328. package/addons/render/elements/front/items/self/navigation/footer/addon/_class/addon.js +11 -0
  329. package/addons/render/elements/front/items/self/navigation/footer/addon/functions/columns.js +11 -0
  330. package/addons/render/elements/front/items/self/navigation/footer/addon/functions/get.js +34 -0
  331. package/addons/render/elements/front/items/self/navigation/footer/footer.css +283 -0
  332. package/addons/render/elements/front/items/self/navigation/footer/footer.js +139 -0
  333. package/addons/render/elements/front/items/self/navigation/navbar/addon/_class/addon.js +13 -0
  334. package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/active.js +7 -0
  335. package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/get.js +31 -0
  336. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +140 -0
  337. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +118 -0
  338. package/addons/render/elements/front/items/self/navigation/pagination/pagination.css +160 -0
  339. package/addons/render/elements/front/items/self/navigation/pagination/pagination.js +131 -0
  340. package/addons/render/elements/front/items/self/navigation/sidebar/addon/_class/addon.js +12 -0
  341. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/active.js +7 -0
  342. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/get.js +35 -0
  343. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/groups.js +10 -0
  344. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +278 -0
  345. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +85 -0
  346. package/addons/render/elements/front/items/self/navigation/stepper/stepper.css +202 -0
  347. package/addons/render/elements/front/items/self/navigation/stepper/stepper.js +82 -0
  348. package/addons/render/elements/front/items/self/navigation/tabs/addon.js +32 -0
  349. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +239 -0
  350. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +76 -0
  351. package/addons/render/elements/front/items/self/preview/html/html.css +377 -0
  352. package/addons/render/elements/front/items/self/preview/html/html.js +107 -0
  353. package/addons/render/html/addon.js +13 -0
  354. package/addons/render/html/functions/render.js +85 -0
  355. package/addons/render/html/item/functions/render.js +66 -0
  356. package/addons/render/html/items/assets/favicon.js +12 -0
  357. package/addons/render/html/items/fonts/outfit.js +12 -0
  358. package/addons/render/html/items/fonts/preconnect.js +24 -0
  359. package/addons/render/html/items/meta/charset.js +11 -0
  360. package/addons/render/html/items/meta/description.js +12 -0
  361. package/addons/render/html/items/meta/title.js +9 -0
  362. package/addons/render/html/items/meta/viewport.js +12 -0
  363. package/addons/render/html/items/seo/robots.js +12 -0
  364. package/addons/render/html/items/seo/theme-color.js +12 -0
  365. package/addons/render/html/load.js +26 -0
  366. package/addons/render/items/js/#register/addon.js +14 -0
  367. package/addons/render/items/js/functions/count.js +9 -0
  368. package/addons/render/items/js/functions/get.js +34 -0
  369. package/addons/render/items/js/functions/groups.js +16 -0
  370. package/addons/render/items/js/functions/render.js +44 -0
  371. package/addons/render/items/js/item/catch/add.js +18 -0
  372. package/addons/render/pages/front/css/page.css +17 -0
  373. package/addons/render/pages/front/js/#register/addon.js +29 -0
  374. package/addons/render/pages/front/js/events/click.js +27 -0
  375. package/addons/render/pages/front/js/events/load.js +25 -0
  376. package/addons/render/pages/front/js/functions/change.js +119 -0
  377. package/addons/render/pages/front/js/functions/match.js +34 -0
  378. package/addons/render/pages/front/js/functions/open.js +19 -0
  379. package/addons/render/pages/front/js/item/catch/add.js +24 -0
  380. package/addons/render/pages/front/js/item/catch/remove.js +17 -0
  381. package/addons/render/pages/front/js/item/functions/enter.js +45 -0
  382. package/addons/render/pages/front/js/item/functions/leave.js +27 -0
  383. package/addons/render/pages/front/js/item/functions/render.js +33 -0
  384. package/addons/render/pages/front/js/items/commands/change.js +41 -0
  385. package/addons/render/pages/front/js/items/shortcuts/home.js +9 -0
  386. package/addons/render/pages/front/js/items/shortcuts/login.js +9 -0
  387. package/addons/render/tags/addon.js +11 -0
  388. package/addons/render/tags/functions/groups.js +13 -0
  389. package/addons/render/tags/functions/validate.js +51 -0
  390. package/addons/render/tags/items/block.js +131 -0
  391. package/addons/render/tags/items/form.js +112 -0
  392. package/addons/render/tags/items/media.js +64 -0
  393. package/addons/render/tags/items/meta.js +28 -0
  394. package/addons/render/tags/items/semantic.js +114 -0
  395. package/addons/render/tags/items/table.js +92 -0
  396. package/addons/render/tags/items/text-inline.js +215 -0
  397. package/addons/render/tags/load.js +16 -0
  398. package/addons/render/transforms/front/js/#register/addon.js +11 -0
  399. package/addons/render/transforms/front/js/functions/load/assets.js +49 -0
  400. package/addons/render/transforms/front/js/items/directives/transform.js +40 -0
  401. package/addons/render/transforms/front/js/items/self/accordion.js +174 -0
  402. package/addons/render/transforms/front/js/items/self/chart/area.js +156 -0
  403. package/addons/render/transforms/front/js/items/self/chart/bar.js +140 -0
  404. package/addons/render/transforms/front/js/items/self/chart/bubble.js +169 -0
  405. package/addons/render/transforms/front/js/items/self/chart/doughnut.js +127 -0
  406. package/addons/render/transforms/front/js/items/self/chart/line.js +152 -0
  407. package/addons/render/transforms/front/js/items/self/chart/pie.js +125 -0
  408. package/addons/render/transforms/front/js/items/self/chart/radar.js +157 -0
  409. package/addons/render/transforms/front/js/items/self/chart/scatter.js +152 -0
  410. package/addons/render/transforms/front/js/items/self/codeflask.js +99 -0
  411. package/addons/render/transforms/front/js/items/self/codemirror.js +231 -0
  412. package/addons/render/transforms/front/js/items/self/comparison.js +142 -0
  413. package/addons/render/transforms/front/js/items/self/heatmap.js +494 -0
  414. package/addons/render/transforms/front/js/items/self/interact.js +277 -0
  415. package/addons/render/transforms/front/js/items/self/particles.js +329 -0
  416. package/addons/render/transforms/front/js/items/self/sparkline.js +240 -0
  417. package/addons/render/transforms/front/js/items/self/swiper.js +143 -0
  418. package/addons/render/transforms/front/js/items/self/tabs.js +460 -0
  419. package/addons/render/transforms/front/js/items/self/typed.js +173 -0
  420. package/docs/addons.md +281 -0
  421. package/docs/architecture.md +190 -0
  422. package/docs/commands.md +308 -0
  423. package/docs/database.md +171 -0
  424. package/docs/frontend.md +379 -0
  425. package/docs/servers.md +133 -0
  426. package/lib/LICENSE.txt +40 -0
  427. package/lib/README.md +132 -0
  428. package/lib/browser.js +26 -0
  429. package/lib/events.js +108 -0
  430. package/lib/load.js +39 -0
  431. package/lib/src/classes/addon/class.js +86 -0
  432. package/lib/src/classes/addon/classes/item/class.js +27 -0
  433. package/lib/src/classes/addon/classes/item/mixins/crud.js +30 -0
  434. package/lib/src/classes/addon/classes/item/mixins/functions.js +11 -0
  435. package/lib/src/classes/addon/classes/item/mixins/get.js +78 -0
  436. package/lib/src/classes/addon/classes/item/mixins/remove.js +11 -0
  437. package/lib/src/classes/addon/classes/item/mixins/set.js +69 -0
  438. package/lib/src/classes/addon/classes/item/mixins/store.js +58 -0
  439. package/lib/src/classes/addon/classes/render/class.js +117 -0
  440. package/lib/src/classes/addon/classes/render/mixins/compile.js +91 -0
  441. package/lib/src/classes/addon/classes/render/mixins/dom.js +18 -0
  442. package/lib/src/classes/addon/classes/render/mixins/events.js +152 -0
  443. package/lib/src/classes/addon/classes/render/mixins/get.js +56 -0
  444. package/lib/src/classes/addon/classes/render/mixins/methods.js +191 -0
  445. package/lib/src/classes/addon/classes/render/mixins/process.js +88 -0
  446. package/lib/src/classes/addon/classes/render/mixins/set.js +36 -0
  447. package/lib/src/classes/addon/mixins/fields.js +85 -0
  448. package/lib/src/classes/addon/mixins/find.js +14 -0
  449. package/lib/src/classes/addon/mixins/functions.js +131 -0
  450. package/lib/src/classes/addon/mixins/get.js +11 -0
  451. package/lib/src/classes/addon/mixins/items.js +176 -0
  452. package/lib/src/classes/addon/mixins/remove.js +12 -0
  453. package/lib/src/classes/addon/mixins/render.js +57 -0
  454. package/lib/src/classes/addon/mixins/store.js +52 -0
  455. package/lib/src/classes/addon/mixins/table.js +37 -0
  456. package/lib/src/divhunt.js +84 -0
  457. package/lib/src/mixins/addons.js +150 -0
  458. package/lib/src/mixins/binaries.js +89 -0
  459. package/lib/src/mixins/data.js +312 -0
  460. package/lib/src/mixins/dependencies.js +99 -0
  461. package/lib/src/mixins/dom.js +167 -0
  462. package/lib/src/mixins/emitter.js +77 -0
  463. package/lib/src/mixins/function.js +82 -0
  464. package/lib/src/mixins/generate.js +73 -0
  465. package/lib/src/mixins/helper.js +317 -0
  466. package/lib/src/mixins/logger.js +75 -0
  467. package/lib/src/mixins/middleware.js +52 -0
  468. package/lib/src/mixins/overrides.js +37 -0
  469. package/lib/src/mixins/request.js +28 -0
  470. package/lib/src/mixins/route.js +191 -0
  471. package/lib/src/mixins/string.js +196 -0
  472. package/lib/src/mixins/validate.js +78 -0
  473. package/package.json +70 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Dejan Tomic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # Divhunt Framework
2
+
3
+ Full-stack isomorphic JavaScript framework built from scratch. No React, no Express, no Vue — original architecture from zero.
4
+
5
+ One universal abstraction — the **addon** — powers databases, servers, commands, pages, directives, queues, and more. Define an addon with fields, and you get: data validation, event system, middleware chains, CRUD with PostgreSQL, automatic API exposure, frontend reactivity, and DOM manipulation — all from a single definition.
6
+
7
+ Built by [Dejan Tomic](https://github.com/tomic-d). Powers multiple production applications including a cloud SaaS platform serving thousands of users, a travel agency website with 27 addons and 50+ frontend components, a distributed function execution gateway, and a multi-tenant CMS.
8
+
9
+ ## Quick Look
10
+
11
+ ```js
12
+ import divhunt from '#framework/load.js';
13
+ import database from '#database/load.js';
14
+ import commands from '#commands/load.js';
15
+
16
+ // Define an addon — typed, persistent, full CRUD
17
+ const users = divhunt.Addon('users', (addon) => {
18
+ addon.Table('users');
19
+ addon.Field('id', ['string']);
20
+ addon.Field('name', ['string', null, true]);
21
+ addon.Field('email', ['string', null, true]);
22
+ addon.Field('created_at', ['string']);
23
+ });
24
+
25
+ // Connect database — all addons with Table() persist automatically
26
+ database.Item({
27
+ id: 'primary',
28
+ hostname: process.env.DB_HOSTNAME,
29
+ username: process.env.DB_USERNAME,
30
+ database: process.env.DB_DATABASE,
31
+ password: process.env.DB_PASSWORD
32
+ });
33
+
34
+ // Start HTTP server
35
+ commands.Fn('http.server', 3000, {
36
+ onStart: () => console.log('Server started on port 3000')
37
+ });
38
+
39
+ // Define an API endpoint with typed input/output
40
+ divhunt.AddonReady('commands', (commands) => {
41
+ commands.Item({
42
+ id: 'users:get:many',
43
+ method: 'GET',
44
+ endpoint: '/api/users',
45
+ exposed: true,
46
+ callback: async function(properties, resolve) {
47
+ const items = await users.Find()
48
+ .sort('created_at', 'desc')
49
+ .page(properties.page || 1)
50
+ .limit(properties.limit || 20)
51
+ .many();
52
+
53
+ resolve({
54
+ users: items.map(u => u.Get(['id', 'name', 'email', 'created_at']))
55
+ });
56
+ }
57
+ });
58
+ });
59
+ ```
60
+
61
+ ## Documentation
62
+
63
+ | Topic | What's covered |
64
+ |---|---|
65
+ | [Addons](docs/addons.md) | Addon definition, fields, functions, lifecycle events, preloading |
66
+ | [Database](docs/database.md) | Connection, fluent ORM, query builder, 17+ operators, joins |
67
+ | [Commands](docs/commands.md) | API endpoints, typed input/output, CRUD patterns, dynamic registration |
68
+ | [Servers](docs/servers.md) | HTTP setup, gRPC streaming, binary transport, Store API |
69
+ | [Frontend](docs/frontend.md) | Pages, components, directives, asset bundling, reactivity |
70
+ | [Architecture](docs/architecture.md) | File structure, design decisions, mixin composition |
71
+
72
+ ## Install
73
+
74
+ ```bash
75
+ npm install divhunt
76
+ ```
77
+
78
+ Requires Node.js >= 18.
79
+
80
+ ## Origin
81
+
82
+ Originally built as the core of [Divhunt](https://divhunt.com), a cloud SaaS platform. The framework (v1) powered the entire platform — backend and frontend — serving thousands of users for 4+ years. This is v2: rebuilt with Proxy-based reactivity, improved addon architecture, gRPC transport, and a complete render system.
83
+
84
+ ## License
85
+
86
+ [MIT](LICENSE)
@@ -0,0 +1,40 @@
1
+ Copyright © 2025 Divhunt GmbH
2
+
3
+ This License governs use of the Divhunt framework (the "Software"). By accessing or using the Software, you agree to be bound by the terms of this License.
4
+
5
+ 1. GRANT OF LICENSE
6
+ You are granted a limited, non-exclusive, non-transferable, non-sublicensable license to use the Software solely for:
7
+ - personal projects;
8
+ - internal business purposes;
9
+ - client work, provided the client is not reselling or redistributing the Software.
10
+
11
+ 2. ATTRIBUTION AND BRANDING
12
+ a. All uses of the Software must retain visible attribution to “Divhunt”.
13
+ b. You must not remove, obscure, alter, or suppress any branding, notices, or credits related to Divhunt.
14
+ c. Any public project using the Software must clearly state that it uses the “Divhunt Framework”.
15
+
16
+ 3. PROHIBITED USES
17
+ The following are strictly prohibited:
18
+ a. Rebranding, renaming, or representing the Software as your own work;
19
+ b. Creating derivative frameworks or similar software tools based on the Software with the intent of distribution;
20
+ c. Redistributing, sublicensing, or selling the Software or any modified version thereof;
21
+ d. Using the Software in any commercial product, service, or offering without explicit, written permission from Divhunt GmbH.
22
+
23
+ 4. MODIFICATIONS
24
+ You may modify the Software for personal or internal use only. Modified versions may not be:
25
+ - redistributed;
26
+ - rebranded or marketed as original work;
27
+ - offered as a service or product.
28
+
29
+ 5. ENFORCEMENT AND TERMINATION
30
+ Any violation of this License will result in the immediate termination of all rights granted herein. Divhunt GmbH reserves the right to pursue legal remedies including but not limited to damages, injunctions, and recovery of profits obtained through unauthorized use.
31
+
32
+ 6. NO WARRANTY
33
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL JOVANAT GMBH BE LIABLE FOR ANY DAMAGES ARISING FROM THE USE OR INABILITY TO USE THE SOFTWARE.
34
+
35
+ 7. GOVERNING LAW
36
+ This License shall be governed by and construed in accordance with the laws of Switzerland. All disputes shall be subject to the exclusive jurisdiction of the courts of Zug, Switzerland.
37
+
38
+ ---
39
+
40
+ For commercial licensing or other questions, please contact: **dejan@divhunt.com**
@@ -0,0 +1,123 @@
1
+ ## Built with the Divhunt Framework – non-commercial use only. For commercial use, contact dejan@divhunt.com.
2
+
3
+ # Clients Addon
4
+
5
+ HTTP and gRPC client connectivity for Divhunt applications.
6
+
7
+ ## Features
8
+
9
+ - **HTTP Client**: REST API communication with timeout, retries, and middleware
10
+ - **gRPC Client**: High-performance streaming and unary calls
11
+ - **Event Callbacks**: Connection, request, response, and error handling
12
+ - **Auto-retry**: Configurable timeout and connection management
13
+
14
+ ## HTTP Client
15
+
16
+ ```javascript
17
+ import clients from '#clients/load.js';
18
+
19
+ clients.Item({
20
+ id: 'api',
21
+ type: 'http',
22
+ host: 'localhost',
23
+ port: 3000,
24
+ timeout: 15,
25
+ onConnect: (client) => console.log('HTTP client connected'),
26
+ onError: (error) => console.error('HTTP error:', error)
27
+ });
28
+
29
+ // Usage
30
+ const api = clients.Item('api');
31
+ const result = await api.Fn('http.get', '/users', {page: 1});
32
+ await api.Fn('http.post', '/users', {name: 'John'});
33
+ ```
34
+
35
+ ## gRPC Client
36
+
37
+ ```javascript
38
+ import clientsGRPC from '#clients/grpc/load.js';
39
+
40
+ clientsGRPC.Item({
41
+ id: 'service',
42
+ host: 'localhost',
43
+ port: 50000,
44
+ timeout: 15,
45
+ metadata: {authorization: 'Bearer token'},
46
+ onConnect: (client) => console.log('gRPC client connected'),
47
+ onStreamData: (stream, payload) => console.log('Received:', payload)
48
+ });
49
+
50
+ // Streaming
51
+ const service = clientsGRPC.Item('service');
52
+ const stream = await service.Fn('stream');
53
+ const response = await stream.request('users', 'findAll', {limit: 10});
54
+ ```
55
+
56
+ ## Commands Integration
57
+
58
+ ```javascript
59
+ import commands from '#commands/load.js';
60
+ import clients from '#clients/load.js';
61
+
62
+ commands.Item({
63
+ id: 'proxy:users',
64
+ method: 'GET',
65
+ endpoint: '/api/users',
66
+ callback: async function(properties, resolve)
67
+ {
68
+ const api = clients.Item('api');
69
+ const result = await api.Fn('http.get', '/users', properties);
70
+
71
+ resolve(result.data, result.message, result.code);
72
+ }
73
+ });
74
+
75
+ commands.Item({
76
+ id: 'grpc:analytics',
77
+ method: 'POST',
78
+ endpoint: '/analytics/process',
79
+ callback: async function(properties, resolve)
80
+ {
81
+ const service = clientsGRPC.Item('analytics');
82
+ const stream = await service.Fn('stream');
83
+ const result = await stream.request('analytics', 'process', properties);
84
+
85
+ resolve(result.data);
86
+ }
87
+ });
88
+ ```
89
+
90
+ ## Error Handling
91
+
92
+ ```javascript
93
+ clients.Item({
94
+ id: 'resilient-api',
95
+ type: 'http',
96
+ host: 'api.example.com',
97
+ port: 443,
98
+ onError: (error, context) =>
99
+ {
100
+ console.error(`Request failed: ${error}`);
101
+ // Implement retry logic, fallback, or alerting
102
+ },
103
+ onComplete: (result, context) =>
104
+ {
105
+ console.log(`Request completed in ${result.duration}ms`);
106
+ }
107
+ });
108
+ ```
109
+
110
+ ## Events
111
+
112
+ ```javascript
113
+ divhunt.EmitOn('clients.http.request.before', (http) =>
114
+ {
115
+ http.data.timestamp = Date.now();
116
+ http.headers = {'X-Client-Version': '1.0.0'};
117
+ });
118
+
119
+ divhunt.EmitOn('clients.grpc.connect', (client) =>
120
+ {
121
+ console.log('gRPC client ready for requests');
122
+ });
123
+ ```
@@ -0,0 +1,25 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import divhunt from '#framework/load.js';
4
+
5
+ const clientsGRPC = divhunt.Addon('clients.grpc', (addon) =>
6
+ {
7
+ addon.Field('id', ['string|number']);
8
+ addon.Field('instance', ['object']);
9
+ addon.Field('host', ['string', 'localhost']);
10
+ addon.Field('port', ['number', 50000]);
11
+ addon.Field('timeout', ['number', 5]);
12
+ addon.Field('metadata', ['object', {}]);
13
+
14
+ addon.Field('onError', ['function']);
15
+ addon.Field('onConnect', ['function']);
16
+
17
+ addon.Field('onStream', ['function']);
18
+ addon.Field('onStreamError', ['function']);
19
+ addon.Field('onStreamEnd', ['function']);
20
+ addon.Field('onStreamData', ['function']);
21
+ addon.Field('onStreamRequest', ['function']);
22
+ addon.Field('onStreamRespond', ['function']);
23
+ });
24
+
25
+ export default clientsGRPC;
@@ -0,0 +1,8 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import clientsGRPC from '#clients/grpc/addon.js';
4
+
5
+ clientsGRPC.ItemOn('add', function(item)
6
+ {
7
+ item.Fn('connect');
8
+ });
@@ -0,0 +1,73 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import { fileURLToPath } from 'url'
4
+ import { dirname, join } from 'path'
5
+
6
+ import clientsGRPC from '#clients/grpc/addon.js';
7
+
8
+ clientsGRPC.Fn('item.connect', async function(item)
9
+ {
10
+ if(item.Get('instance'))
11
+ {
12
+ return item.Get('instance');
13
+ }
14
+
15
+ try
16
+ {
17
+ const grpcModule = await import('@grpc/grpc-js');
18
+ const protoLoaderModule = await import('@grpc/proto-loader');
19
+
20
+ const grpc = grpcModule.default || grpcModule;
21
+ const protoLoader = protoLoaderModule.default || protoLoaderModule;
22
+
23
+ const protoPath = join(dirname(fileURLToPath(import.meta.url)), '/../../service.proto');
24
+
25
+ const definition = protoLoader.loadSync(protoPath,
26
+ {
27
+ keepCase: true,
28
+ longs: String,
29
+ enums: String,
30
+ defaults: true,
31
+ oneofs: true
32
+ });
33
+
34
+ const universalPackage = grpc.loadPackageDefinition(definition).universal;
35
+
36
+ const client = new universalPackage.UniversalService(`${item.Get('host')}:${item.Get('port')}`, grpc.credentials.createSsl(), {
37
+ 'grpc.max_send_message_length': 1024 * 1024 * 100,
38
+ 'grpc.max_receive_message_length': 1024 * 1024 * 100,
39
+ 'grpc.keepalive_time_ms': 30000,
40
+ 'grpc.keepalive_timeout_ms': 10000,
41
+ 'grpc.keepalive_permit_without_calls': 1
42
+ });
43
+
44
+ item.Set('instance', client);
45
+
46
+ await new Promise((resolve, reject) =>
47
+ {
48
+ client.waitForReady(new Date(Date.now() + item.Get('timeout') * 1000), (error) =>
49
+ {
50
+ if(error)
51
+ {
52
+ reject(error);
53
+ }
54
+ else
55
+ {
56
+ resolve();
57
+ }
58
+ });
59
+ });
60
+
61
+
62
+ item.Get('onConnect') && item.Get('onConnect').call(item, client);
63
+
64
+ return client;
65
+ }
66
+ catch(error)
67
+ {
68
+ item.Get('instance')?.close();
69
+ item.Set('instance', null);
70
+
71
+ item.Get('onError') && item.Get('onError').call(item, error.message);
72
+ }
73
+ });
@@ -0,0 +1,41 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import clientsGRPC from '#clients/grpc/addon.js';
4
+
5
+ const promises = {};
6
+
7
+ clientsGRPC.Fn('item.resolve', function(item, id, payload = null, onChunk = null)
8
+ {
9
+ if(payload === null)
10
+ {
11
+ const timeout = setTimeout(() =>
12
+ {
13
+ promises[id].resolve({data: null, message: 'Request timed out after 60 seconds. No response received.', code: 500, id, time: 60000});
14
+ delete(promises[id]);
15
+ }, 60000);
16
+
17
+ return new Promise((resolve) =>
18
+ {
19
+ promises[id] = { resolve, timeout, onChunk, time: performance.now() };
20
+ });
21
+ }
22
+
23
+ if(!promises[id])
24
+ {
25
+ return;
26
+ }
27
+
28
+ if(promises[id].onChunk && !payload.end)
29
+ {
30
+ promises[id].onChunk(payload);
31
+ }
32
+
33
+ if(payload.end)
34
+ {
35
+ payload.time = (performance.now() - promises[id].time).toFixed(2);
36
+ promises[id].resolve(payload);
37
+ clearTimeout(promises[id].timeout);
38
+
39
+ delete promises[id];
40
+ }
41
+ });
@@ -0,0 +1,103 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import clientsGRPC from '#clients/grpc/addon.js';
4
+ import divhunt from '#framework/load.js';
5
+
6
+ clientsGRPC.Fn('item.stream', async function(item)
7
+ {
8
+ const client = item.Get('instance');
9
+
10
+ if(!client)
11
+ {
12
+ return;
13
+ }
14
+
15
+ try
16
+ {
17
+ const grpcModule = await import('@grpc/grpc-js');
18
+ const grpc = grpcModule.default || grpcModule;
19
+
20
+ const metadata = new grpc.Metadata();
21
+
22
+ Object.entries(item.Get('metadata')).forEach(([key, value]) =>
23
+ {
24
+ metadata.add(key, value);
25
+ });
26
+
27
+ const stream = client.Stream(metadata);
28
+
29
+ stream.request = function(name, data, onChunk = null, id = null)
30
+ {
31
+ id = id || divhunt.GenerateUID();
32
+
33
+ const extracted = divhunt.BinariesExtract(data);
34
+
35
+ stream.write({
36
+ data: JSON.stringify({type: 'request', name, data: extracted.data, id}),
37
+ binaries: extracted.binaries
38
+ });
39
+
40
+ item.Get('onStreamRequest') && item.Get('onStreamRequest').call(item, stream, {type: 'request', name, data, binaries: extracted.binaries, id});
41
+
42
+ return item.Fn('resolve', id, null, onChunk);
43
+ };
44
+
45
+ stream.respond = function(data, message, code, end = true, id = null)
46
+ {
47
+ id = id || divhunt.GenerateUID();
48
+
49
+ const extracted = divhunt.BinariesExtract(data);
50
+
51
+ stream.write({
52
+ data: JSON.stringify({type: 'respond', data: extracted.data, message, code, id, end}),
53
+ binaries: extracted.binaries
54
+ });
55
+
56
+ item.Get('onStreamRespond') && item.Get('onStreamRespond').call(item, stream, {type: 'respond', data, binaries: extracted.binaries, message, code, id, end});
57
+ };
58
+
59
+ item.Get('onStream') && item.Get('onStream').call(item, stream);
60
+
61
+ stream.on('data', (response) =>
62
+ {
63
+ const payload = JSON.parse(response.data);
64
+
65
+ if(payload.data && response.binaries)
66
+ {
67
+ payload.data = divhunt.BinariesInject(payload.data, response.binaries);
68
+ }
69
+
70
+ if(payload.type === 'respond')
71
+ {
72
+ item.Fn('resolve', payload.id, payload);
73
+ }
74
+
75
+ item.Get('onStreamData') && item.Get('onStreamData').call(item, stream, payload);
76
+ });
77
+
78
+ stream.on('error', (error) =>
79
+ {
80
+ item.Get('onStreamError') && item.Get('onStreamError').call(item, stream, error.message);
81
+ });
82
+
83
+ stream.on('end', () =>
84
+ {
85
+ item.Get('onStreamEnd') && item.Get('onStreamEnd').call(item, stream);
86
+
87
+ item.Get('instance').close();
88
+ item.Set('instance', null);
89
+ });
90
+
91
+ return stream;
92
+ }
93
+ catch(error)
94
+ {
95
+ if(item.Get('instance'))
96
+ {
97
+ item.Get('instance').close();
98
+ item.Set('instance', null);
99
+ }
100
+
101
+ item.Get('onError') && item.Get('onError').call(item, error.message);
102
+ }
103
+ });
@@ -0,0 +1,11 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import clientsGRPC from '#clients/grpc/addon.js';
4
+
5
+ import '#clients/grpc/item/catch/add.js';
6
+
7
+ import '#clients/grpc/item/functions/connect.js';
8
+ import '#clients/grpc/item/functions/stream.js';
9
+ import '#clients/grpc/item/functions/resolve.js';
10
+
11
+ export default clientsGRPC;
@@ -0,0 +1,20 @@
1
+ syntax = "proto3";
2
+
3
+ package universal;
4
+
5
+ service UniversalService
6
+ {
7
+ rpc Stream (stream Request) returns (stream Response);
8
+ }
9
+
10
+ message Request
11
+ {
12
+ string data = 1;
13
+ map<string, bytes> binaries = 2;
14
+ }
15
+
16
+ message Response
17
+ {
18
+ string data = 1;
19
+ map<string, bytes> binaries = 2;
20
+ }
@@ -0,0 +1,21 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import divhunt from '#framework/load.js';
4
+
5
+ const clients = divhunt.Addon('clients', (addon) =>
6
+ {
7
+ addon.Field('id', ['string']);
8
+ addon.Field('instance', ['object']);
9
+ addon.Field('type', ['string', 'http']);
10
+ addon.Field('host', ['string', 'localhost']);
11
+ addon.Field('port', ['number', 3000]);
12
+ addon.Field('timeout', ['number', 15]);
13
+
14
+ addon.Field('onConnect', ['function']);
15
+ addon.Field('onRequest', ['function']);
16
+ addon.Field('onResponse', ['function']);
17
+ addon.Field('onError', ['function']);
18
+ addon.Field('onComplete', ['function']);
19
+ });
20
+
21
+ export default clients;
@@ -0,0 +1,18 @@
1
+ // © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
2
+
3
+ import clients from '#clients/addon.js';
4
+
5
+ clients.ItemOn('add', function(item)
6
+ {
7
+ switch(item.Get('type').toLowerCase())
8
+ {
9
+ case 'http':
10
+ item.Fn('http.create');
11
+ break;
12
+ case 'grpc':
13
+ item.Fn('gRPC.create');
14
+ break;
15
+ default:
16
+ item.Get('onError') && item.Get('onError')('Client type does not exist.');
17
+ }
18
+ });