@vandenberghinc/volt 1.1.26 → 1.1.28

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 (502) hide show
  1. package/backend/dist/cjs/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  2. package/backend/dist/cjs/{blacklist.js → backend/src/blacklist.js} +8 -5
  3. package/backend/dist/cjs/{cli.js → backend/src/cli.js} +29 -47
  4. package/backend/dist/cjs/backend/src/database/collection.d.ts +1543 -0
  5. package/backend/dist/cjs/backend/src/database/collection.js +3042 -0
  6. package/backend/dist/cjs/backend/src/database/database.d.ts +66 -0
  7. package/backend/dist/cjs/{database → backend/src/database}/database.js +48 -43
  8. package/backend/dist/cjs/backend/src/database/filters/filters.d.ts +6 -0
  9. package/backend/dist/cjs/backend/src/database/filters/filters.js +15 -0
  10. package/backend/dist/cjs/backend/src/database/filters/strict_filter.d.ts +223 -0
  11. package/backend/dist/cjs/backend/src/database/filters/strict_filter.js +15 -0
  12. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test.js +443 -0
  13. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test_v0.js +15 -0
  14. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  15. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.js +15 -0
  16. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  17. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.js +15 -0
  18. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  19. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.js +15 -0
  20. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  21. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.js +15 -0
  22. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  23. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.js +15 -0
  24. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  25. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.js +355 -0
  26. package/backend/dist/cjs/backend/src/database/flatten.d.ts +75 -0
  27. package/backend/dist/cjs/{logger.js → backend/src/database/flatten.js} +18 -7
  28. package/backend/dist/cjs/backend/src/database/flatten_test.js +175 -0
  29. package/backend/dist/cjs/backend/src/database/quota/quota.d.ts +461 -0
  30. package/backend/dist/cjs/backend/src/database/quota/quota.js +1014 -0
  31. package/backend/dist/cjs/backend/src/database/quota/quota_v1.d.ts +534 -0
  32. package/backend/dist/cjs/backend/src/database/quota/quota_v1.js +1087 -0
  33. package/backend/dist/cjs/backend/src/database/quota/safe_int.d.ts +293 -0
  34. package/backend/dist/cjs/backend/src/database/quota/safe_int.js +573 -0
  35. package/backend/dist/{esm → cjs/backend/src}/endpoint.d.ts +69 -46
  36. package/backend/dist/cjs/{endpoint.js → backend/src/endpoint.js} +87 -101
  37. package/backend/dist/cjs/backend/src/errors/index.d.ts +7 -0
  38. package/backend/dist/cjs/backend/src/errors/index.js +25 -0
  39. package/backend/dist/{esm/utils.d.ts → cjs/backend/src/errors/internal_external.d.ts} +14 -22
  40. package/backend/dist/cjs/backend/src/errors/internal_external.js +85 -0
  41. package/backend/dist/cjs/backend/src/errors/invalid_usage_error.d.ts +38 -0
  42. package/backend/dist/cjs/{mutex.js → backend/src/errors/invalid_usage_error.js} +20 -37
  43. package/backend/dist/cjs/backend/src/errors/system_error.d.ts +230 -0
  44. package/backend/dist/cjs/backend/src/errors/system_error.js +393 -0
  45. package/backend/dist/cjs/backend/src/events.d.ts +54 -0
  46. package/backend/dist/cjs/backend/src/events.js +15 -0
  47. package/backend/dist/cjs/{frontend.js → backend/src/frontend.js} +1 -1
  48. package/backend/dist/cjs/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  49. package/backend/dist/cjs/{image_endpoint.js → backend/src/image_endpoint.js} +3 -5
  50. package/backend/dist/cjs/backend/src/logger.d.ts +5 -0
  51. package/backend/dist/cjs/backend/src/logger.js +15 -0
  52. package/backend/dist/cjs/backend/src/meta.d.ts +64 -0
  53. package/backend/dist/cjs/{meta.js → backend/src/meta.js} +9 -12
  54. package/backend/dist/cjs/backend/src/payments/paddle.d.ts +326 -0
  55. package/backend/dist/cjs/{payments → backend/src/payments}/paddle.js +377 -327
  56. package/backend/dist/cjs/backend/src/plugins/browser.d.ts +1 -0
  57. package/backend/dist/cjs/backend/src/plugins/browser.js +15 -0
  58. package/backend/dist/cjs/backend/src/plugins/mail/mail.d.ts +248 -0
  59. package/backend/dist/cjs/backend/src/plugins/mail/mail.js +379 -0
  60. package/backend/dist/{esm → cjs/backend/src}/plugins/mail/ui.d.ts +23 -0
  61. package/backend/dist/cjs/backend/src/plugins/pdf.d.ts +1 -0
  62. package/backend/dist/cjs/backend/src/rate_limit.d.ts +145 -0
  63. package/backend/dist/cjs/backend/src/rate_limit.js +549 -0
  64. package/backend/dist/cjs/{route.d.ts → backend/src/route.d.ts} +3 -10
  65. package/backend/dist/cjs/{route.js → backend/src/route.js} +23 -21
  66. package/backend/dist/cjs/backend/src/server.d.ts +485 -0
  67. package/backend/dist/cjs/{server.js → backend/src/server.js} +688 -873
  68. package/backend/dist/cjs/backend/src/splash_screen.d.ts +80 -0
  69. package/backend/dist/cjs/{splash_screen.js → backend/src/splash_screen.js} +24 -3
  70. package/backend/dist/cjs/backend/src/status.d.ts +74 -0
  71. package/backend/dist/cjs/{status.js → backend/src/status.js} +64 -64
  72. package/backend/dist/cjs/backend/src/stream.d.ts +376 -0
  73. package/backend/dist/cjs/{stream.js → backend/src/stream.js} +299 -276
  74. package/backend/dist/cjs/backend/src/users.d.ts +807 -0
  75. package/backend/dist/cjs/backend/src/users.js +1971 -0
  76. package/backend/dist/cjs/backend/src/utils.d.ts +16 -0
  77. package/backend/dist/cjs/{utils.js → backend/src/utils.js} +14 -77
  78. package/backend/dist/{esm → cjs/backend/src}/view.d.ts +33 -11
  79. package/backend/dist/cjs/backend/src/view.js +508 -0
  80. package/backend/dist/{esm → cjs/backend/src}/volt.d.ts +10 -1
  81. package/backend/dist/cjs/{volt.js → backend/src/volt.js} +8 -5
  82. package/backend/dist/cjs/frontend/src/modules/request.d.ts +70 -0
  83. package/backend/dist/cjs/frontend/src/modules/request.js +99 -0
  84. package/backend/dist/esm/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  85. package/backend/dist/esm/{blacklist.js → backend/src/blacklist.js} +9 -6
  86. package/backend/dist/esm/{cli.js → backend/src/cli.js} +43 -60
  87. package/backend/dist/esm/backend/src/database/collection.d.ts +1543 -0
  88. package/backend/dist/esm/backend/src/database/collection.js +3510 -0
  89. package/backend/dist/esm/backend/src/database/database.d.ts +66 -0
  90. package/backend/dist/esm/{database → backend/src/database}/database.js +62 -103
  91. package/backend/dist/esm/backend/src/database/document.d.ts +1 -0
  92. package/backend/dist/esm/backend/src/database/document.js +558 -0
  93. package/backend/dist/esm/backend/src/database/filters/filters.d.ts +6 -0
  94. package/backend/dist/esm/backend/src/database/filters/filters.js +1 -0
  95. package/backend/dist/esm/backend/src/database/filters/strict_filter.d.ts +223 -0
  96. package/backend/dist/esm/backend/src/database/filters/strict_filter.js +3 -0
  97. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.d.ts +1 -0
  98. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.js +505 -0
  99. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.d.ts +1 -0
  100. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.js +712 -0
  101. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  102. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.js +5 -0
  103. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  104. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.js +44 -0
  105. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  106. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.js +5 -0
  107. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  108. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.js +1 -0
  109. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  110. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.js +5 -0
  111. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  112. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.js +405 -0
  113. package/backend/dist/esm/backend/src/database/flatten.d.ts +75 -0
  114. package/backend/dist/esm/backend/src/database/flatten.js +22 -0
  115. package/backend/dist/esm/backend/src/database/flatten_test.d.ts +1 -0
  116. package/backend/dist/esm/backend/src/database/flatten_test.js +174 -0
  117. package/backend/dist/esm/backend/src/database/quota/quota.d.ts +461 -0
  118. package/backend/dist/esm/backend/src/database/quota/quota.js +1118 -0
  119. package/backend/dist/esm/backend/src/database/quota/quota_v1.d.ts +534 -0
  120. package/backend/dist/esm/backend/src/database/quota/quota_v1.js +1242 -0
  121. package/backend/dist/esm/backend/src/database/quota/safe_int.d.ts +293 -0
  122. package/backend/dist/esm/backend/src/database/quota/safe_int.js +602 -0
  123. package/backend/dist/{cjs → esm/backend/src}/endpoint.d.ts +69 -46
  124. package/backend/dist/esm/{endpoint.js → backend/src/endpoint.js} +136 -127
  125. package/backend/dist/esm/backend/src/errors/index.d.ts +7 -0
  126. package/backend/dist/esm/backend/src/errors/index.js +7 -0
  127. package/backend/dist/{cjs/utils.d.ts → esm/backend/src/errors/internal_external.d.ts} +14 -22
  128. package/backend/dist/esm/backend/src/errors/internal_external.js +70 -0
  129. package/backend/dist/esm/backend/src/errors/invalid_usage_error.d.ts +38 -0
  130. package/backend/dist/esm/backend/src/errors/invalid_usage_error.js +30 -0
  131. package/backend/dist/esm/backend/src/errors/system_error.d.ts +230 -0
  132. package/backend/dist/esm/backend/src/errors/system_error.js +402 -0
  133. package/backend/dist/esm/backend/src/events.d.ts +54 -0
  134. package/backend/dist/esm/backend/src/events.js +5 -0
  135. package/backend/dist/esm/{frontend.js → backend/src/frontend.js} +1 -1
  136. package/backend/dist/esm/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  137. package/backend/dist/esm/{image_endpoint.js → backend/src/image_endpoint.js} +16 -20
  138. package/backend/dist/esm/backend/src/logger.d.ts +5 -0
  139. package/backend/dist/esm/backend/src/logger.js +8 -0
  140. package/backend/dist/esm/backend/src/meta.d.ts +64 -0
  141. package/backend/dist/esm/{meta.js → backend/src/meta.js} +15 -54
  142. package/backend/dist/esm/backend/src/payments/paddle.d.ts +326 -0
  143. package/backend/dist/esm/{payments → backend/src/payments}/paddle.js +417 -452
  144. package/backend/dist/esm/backend/src/plugins/browser.d.ts +1 -0
  145. package/backend/dist/esm/backend/src/plugins/browser.js +170 -0
  146. package/backend/dist/esm/backend/src/plugins/mail/mail.d.ts +248 -0
  147. package/backend/dist/esm/backend/src/plugins/mail/mail.js +389 -0
  148. package/backend/dist/{cjs → esm/backend/src}/plugins/mail/ui.d.ts +23 -0
  149. package/backend/dist/esm/{plugins → backend/src/plugins}/mail/ui.js +3 -6
  150. package/backend/dist/esm/backend/src/plugins/pdf.d.ts +1 -0
  151. package/backend/dist/esm/{plugins → backend/src/plugins}/pdf.js +3 -3
  152. package/backend/dist/esm/backend/src/rate_limit.d.ts +145 -0
  153. package/backend/dist/esm/backend/src/rate_limit.js +667 -0
  154. package/backend/dist/esm/{route.d.ts → backend/src/route.d.ts} +3 -10
  155. package/backend/dist/esm/{route.js → backend/src/route.js} +26 -21
  156. package/backend/dist/esm/backend/src/server.d.ts +485 -0
  157. package/backend/dist/esm/{server.js → backend/src/server.js} +891 -1441
  158. package/backend/dist/esm/backend/src/splash_screen.d.ts +80 -0
  159. package/backend/dist/esm/{splash_screen.js → backend/src/splash_screen.js} +42 -55
  160. package/backend/dist/esm/backend/src/status.d.ts +74 -0
  161. package/backend/dist/esm/backend/src/status.js +199 -0
  162. package/backend/dist/esm/backend/src/stream.d.ts +376 -0
  163. package/backend/dist/esm/{stream.js → backend/src/stream.js} +327 -292
  164. package/backend/dist/esm/backend/src/users.d.ts +809 -0
  165. package/backend/dist/esm/backend/src/users.js +2140 -0
  166. package/backend/dist/esm/backend/src/utils.d.ts +16 -0
  167. package/backend/dist/esm/{utils.js → backend/src/utils.js} +20 -81
  168. package/backend/dist/{cjs → esm/backend/src}/view.d.ts +33 -11
  169. package/backend/dist/esm/{view.js → backend/src/view.js} +266 -86
  170. package/backend/dist/{cjs → esm/backend/src}/volt.d.ts +10 -1
  171. package/backend/dist/esm/{volt.js → backend/src/volt.js} +7 -4
  172. package/backend/dist/esm/frontend/src/modules/request.d.ts +70 -0
  173. package/backend/dist/esm/frontend/src/modules/request.js +117 -0
  174. package/frontend/dist/backend/src/database/collection.d.ts +1543 -0
  175. package/frontend/dist/backend/src/database/collection.js +3510 -0
  176. package/frontend/dist/backend/src/database/database.d.ts +66 -0
  177. package/frontend/dist/backend/src/database/database.js +196 -0
  178. package/frontend/dist/backend/src/database/filters/filters.d.ts +6 -0
  179. package/frontend/dist/backend/src/database/filters/filters.js +1 -0
  180. package/frontend/dist/backend/src/database/filters/strict_filter.d.ts +223 -0
  181. package/frontend/dist/backend/src/database/filters/strict_filter.js +3 -0
  182. package/frontend/dist/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  183. package/frontend/dist/backend/src/database/filters/strict_update_filter.js +5 -0
  184. package/frontend/dist/backend/src/database/flatten.d.ts +75 -0
  185. package/frontend/dist/backend/src/database/flatten.js +22 -0
  186. package/frontend/dist/backend/src/endpoint.d.ts +204 -0
  187. package/frontend/dist/backend/src/endpoint.js +570 -0
  188. package/frontend/dist/backend/src/errors/index.d.ts +7 -0
  189. package/frontend/dist/backend/src/errors/index.js +7 -0
  190. package/frontend/dist/backend/src/errors/internal_external.d.ts +38 -0
  191. package/frontend/dist/backend/src/errors/internal_external.js +70 -0
  192. package/frontend/dist/backend/src/errors/invalid_usage_error.d.ts +38 -0
  193. package/frontend/dist/backend/src/errors/invalid_usage_error.js +30 -0
  194. package/frontend/dist/backend/src/errors/system_error.d.ts +230 -0
  195. package/frontend/dist/backend/src/errors/system_error.js +402 -0
  196. package/frontend/dist/backend/src/events.d.ts +54 -0
  197. package/frontend/dist/backend/src/events.js +5 -0
  198. package/frontend/dist/backend/src/frontend.d.ts +11 -0
  199. package/frontend/dist/backend/src/frontend.js +12 -0
  200. package/frontend/dist/backend/src/image_endpoint.d.ts +39 -0
  201. package/frontend/dist/backend/src/image_endpoint.js +202 -0
  202. package/frontend/dist/backend/src/meta.d.ts +64 -0
  203. package/frontend/dist/backend/src/meta.js +110 -0
  204. package/frontend/dist/backend/src/payments/paddle.d.ts +326 -0
  205. package/frontend/dist/backend/src/payments/paddle.js +2256 -0
  206. package/frontend/dist/backend/src/plugins/mail/mail.d.ts +248 -0
  207. package/frontend/dist/backend/src/plugins/mail/mail.js +389 -0
  208. package/{backend/dist/esm/plugins/mail.d.ts → frontend/dist/backend/src/plugins/mail/ui.d.ts} +23 -0
  209. package/{backend/dist/esm/plugins/mail.js → frontend/dist/backend/src/plugins/mail/ui.js} +3 -6
  210. package/frontend/dist/backend/src/rate_limit.d.ts +145 -0
  211. package/frontend/dist/backend/src/rate_limit.js +673 -0
  212. package/frontend/dist/backend/src/route.d.ts +35 -0
  213. package/frontend/dist/backend/src/route.js +212 -0
  214. package/frontend/dist/backend/src/server.d.ts +485 -0
  215. package/frontend/dist/backend/src/server.js +2670 -0
  216. package/frontend/dist/backend/src/splash_screen.d.ts +80 -0
  217. package/frontend/dist/backend/src/splash_screen.js +135 -0
  218. package/frontend/dist/backend/src/status.d.ts +74 -0
  219. package/frontend/dist/backend/src/status.js +199 -0
  220. package/frontend/dist/backend/src/stream.d.ts +376 -0
  221. package/frontend/dist/backend/src/stream.js +1007 -0
  222. package/frontend/dist/backend/src/users.d.ts +807 -0
  223. package/frontend/dist/backend/src/users.js +2118 -0
  224. package/frontend/dist/backend/src/utils.d.ts +16 -0
  225. package/frontend/dist/backend/src/utils.js +241 -0
  226. package/frontend/dist/backend/src/view.d.ts +162 -0
  227. package/frontend/dist/backend/src/view.js +720 -0
  228. package/frontend/dist/frontend/src/elements/base.d.ts +4414 -0
  229. package/frontend/dist/{elements → frontend/src/elements}/base.js +3624 -260
  230. package/frontend/dist/frontend/src/elements/module.d.ts +95 -0
  231. package/frontend/dist/{elements → frontend/src/elements}/module.js +53 -52
  232. package/frontend/dist/frontend/src/elements/types.d.ts +52 -0
  233. package/frontend/dist/frontend/src/elements/types.js +5 -0
  234. package/frontend/dist/frontend/src/modules/attachment.d.ts +126 -0
  235. package/frontend/dist/frontend/src/modules/attachment.js +306 -0
  236. package/frontend/dist/frontend/src/modules/auth.d.ts +44 -0
  237. package/frontend/dist/frontend/src/modules/auth.js +80 -0
  238. package/frontend/dist/{modules → frontend/src/modules}/color.js +2 -2
  239. package/frontend/dist/frontend/src/modules/compression.d.ts +39 -0
  240. package/frontend/dist/frontend/src/modules/compression.js +102 -0
  241. package/frontend/dist/frontend/src/modules/cookies.d.ts +44 -0
  242. package/frontend/dist/frontend/src/modules/cookies.js +143 -0
  243. package/frontend/dist/frontend/src/modules/events.d.ts +31 -0
  244. package/frontend/dist/frontend/src/modules/events.js +74 -0
  245. package/frontend/dist/frontend/src/modules/google.d.ts +23 -0
  246. package/frontend/dist/frontend/src/modules/google.js +52 -0
  247. package/frontend/dist/frontend/src/modules/meta.d.ts +14 -0
  248. package/frontend/dist/{modules → frontend/src/modules}/meta.js +9 -7
  249. package/frontend/dist/{modules → frontend/src/modules}/paddle.d.ts +37 -134
  250. package/frontend/dist/{modules → frontend/src/modules}/paddle.js +620 -568
  251. package/frontend/dist/frontend/src/modules/request.d.ts +70 -0
  252. package/frontend/dist/frontend/src/modules/request.js +117 -0
  253. package/frontend/dist/frontend/src/modules/settings.d.ts +3 -0
  254. package/frontend/dist/frontend/src/modules/settings.js +5 -0
  255. package/frontend/dist/frontend/src/modules/statics.d.ts +21 -0
  256. package/frontend/dist/{modules → frontend/src/modules}/statics.js +15 -18
  257. package/frontend/dist/frontend/src/modules/support.d.ts +30 -0
  258. package/frontend/dist/frontend/src/modules/support.js +53 -0
  259. package/frontend/dist/{modules → frontend/src/modules}/theme.d.ts +67 -0
  260. package/frontend/dist/{modules → frontend/src/modules}/theme.js +68 -38
  261. package/frontend/dist/frontend/src/modules/themes.d.ts +12 -0
  262. package/frontend/dist/frontend/src/modules/themes.js +22 -0
  263. package/frontend/dist/frontend/src/modules/user.d.ts +164 -0
  264. package/frontend/dist/frontend/src/modules/user.js +268 -0
  265. package/frontend/dist/frontend/src/modules/utils.d.ts +176 -0
  266. package/frontend/dist/frontend/src/modules/utils.js +569 -0
  267. package/frontend/dist/frontend/src/types/gradient.d.ts +29 -0
  268. package/frontend/dist/{types → frontend/src/types}/gradient.js +14 -18
  269. package/frontend/dist/frontend/src/ui/border_button.d.ts +94 -0
  270. package/frontend/dist/{ui → frontend/src/ui}/border_button.js +7 -13
  271. package/frontend/dist/frontend/src/ui/button.d.ts +28 -0
  272. package/frontend/dist/{ui → frontend/src/ui}/button.js +21 -12
  273. package/frontend/dist/frontend/src/ui/canvas.d.ts +138 -0
  274. package/frontend/dist/{ui → frontend/src/ui}/canvas.js +88 -55
  275. package/frontend/dist/frontend/src/ui/checkbox.d.ts +74 -0
  276. package/frontend/dist/{ui → frontend/src/ui}/checkbox.js +80 -41
  277. package/frontend/dist/{ui → frontend/src/ui}/code.d.ts +73 -6
  278. package/frontend/dist/{ui → frontend/src/ui}/code.js +55 -52
  279. package/frontend/dist/{ui → frontend/src/ui}/context_menu.d.ts +4 -0
  280. package/frontend/dist/{ui → frontend/src/ui}/context_menu.js +12 -17
  281. package/frontend/dist/{ui → frontend/src/ui}/css.d.ts +4 -0
  282. package/frontend/dist/{ui → frontend/src/ui}/css.js +3 -3
  283. package/frontend/dist/{ui → frontend/src/ui}/divider.d.ts +4 -0
  284. package/frontend/dist/{ui → frontend/src/ui}/divider.js +3 -3
  285. package/frontend/dist/{ui → frontend/src/ui}/dropdown.d.ts +57 -2
  286. package/frontend/dist/{ui → frontend/src/ui}/dropdown.js +87 -94
  287. package/frontend/dist/{ui → frontend/src/ui}/for_each.d.ts +4 -0
  288. package/frontend/dist/{ui → frontend/src/ui}/for_each.js +3 -3
  289. package/frontend/dist/{ui → frontend/src/ui}/form.d.ts +6 -2
  290. package/frontend/dist/{ui → frontend/src/ui}/form.js +10 -7
  291. package/frontend/dist/frontend/src/ui/frame_modes.d.ts +37 -0
  292. package/frontend/dist/{ui → frontend/src/ui}/frame_modes.js +16 -22
  293. package/frontend/dist/{ui → frontend/src/ui}/google_map.d.ts +4 -0
  294. package/frontend/dist/{ui → frontend/src/ui}/google_map.js +4 -4
  295. package/frontend/dist/{ui → frontend/src/ui}/gradient.d.ts +4 -0
  296. package/frontend/dist/{ui → frontend/src/ui}/gradient.js +3 -3
  297. package/frontend/dist/{ui → frontend/src/ui}/image.d.ts +4 -0
  298. package/frontend/dist/{ui → frontend/src/ui}/image.js +5 -5
  299. package/frontend/dist/frontend/src/ui/input.d.ts +392 -0
  300. package/frontend/dist/{ui → frontend/src/ui}/input.js +346 -360
  301. package/frontend/dist/{ui → frontend/src/ui}/link.d.ts +4 -0
  302. package/frontend/dist/{ui → frontend/src/ui}/link.js +3 -3
  303. package/frontend/dist/{ui → frontend/src/ui}/list.d.ts +4 -0
  304. package/frontend/dist/{ui → frontend/src/ui}/list.js +12 -6
  305. package/frontend/dist/frontend/src/ui/loader_button.d.ts +80 -0
  306. package/frontend/dist/{ui → frontend/src/ui}/loader_button.js +35 -47
  307. package/frontend/dist/frontend/src/ui/loaders.d.ts +57 -0
  308. package/frontend/dist/{ui → frontend/src/ui}/loaders.js +11 -11
  309. package/frontend/dist/{ui → frontend/src/ui}/popup.d.ts +11 -6
  310. package/frontend/dist/{ui → frontend/src/ui}/popup.js +32 -18
  311. package/frontend/dist/frontend/src/ui/pseudo.d.ts +44 -0
  312. package/frontend/dist/{ui → frontend/src/ui}/pseudo.js +84 -8
  313. package/frontend/dist/{ui → frontend/src/ui}/scroller.d.ts +14 -2
  314. package/frontend/dist/{ui → frontend/src/ui}/scroller.js +37 -43
  315. package/frontend/dist/{ui → frontend/src/ui}/slider.d.ts +5 -1
  316. package/frontend/dist/{ui → frontend/src/ui}/slider.js +4 -4
  317. package/frontend/dist/{ui → frontend/src/ui}/spacer.d.ts +4 -0
  318. package/frontend/dist/{ui → frontend/src/ui}/spacer.js +3 -3
  319. package/frontend/dist/{ui → frontend/src/ui}/span.d.ts +4 -0
  320. package/frontend/dist/{ui → frontend/src/ui}/span.js +3 -3
  321. package/frontend/dist/{ui → frontend/src/ui}/stack.d.ts +4 -0
  322. package/frontend/dist/{ui → frontend/src/ui}/stack.js +3 -9
  323. package/frontend/dist/frontend/src/ui/steps.d.ts +131 -0
  324. package/frontend/dist/{ui → frontend/src/ui}/steps.js +30 -45
  325. package/frontend/dist/{ui → frontend/src/ui}/style.d.ts +4 -0
  326. package/frontend/dist/{ui → frontend/src/ui}/style.js +3 -3
  327. package/frontend/dist/{ui → frontend/src/ui}/switch.d.ts +5 -1
  328. package/frontend/dist/{ui → frontend/src/ui}/switch.js +4 -4
  329. package/frontend/dist/{ui → frontend/src/ui}/table.d.ts +4 -0
  330. package/frontend/dist/{ui → frontend/src/ui}/table.js +6 -6
  331. package/frontend/dist/{ui → frontend/src/ui}/tabs.d.ts +45 -3
  332. package/frontend/dist/{ui → frontend/src/ui}/tabs.js +65 -40
  333. package/frontend/dist/{ui → frontend/src/ui}/text.d.ts +4 -0
  334. package/frontend/dist/{ui → frontend/src/ui}/text.js +3 -3
  335. package/frontend/dist/frontend/src/ui/title.d.ts +91 -0
  336. package/frontend/dist/frontend/src/ui/title.js +272 -0
  337. package/frontend/dist/{ui → frontend/src/ui}/view.d.ts +4 -0
  338. package/frontend/dist/{ui → frontend/src/ui}/view.js +3 -3
  339. package/frontend/dist/{volt.d.ts → frontend/src/volt.d.ts} +3 -0
  340. package/frontend/dist/{volt.js → frontend/src/volt.js} +4 -0
  341. package/frontend/tools/bundle_d_ts.js +71 -0
  342. package/frontend/tools/convert_to_jsdoc_input.txt +9452 -0
  343. package/frontend/tools/convert_to_jsdoc_output.txt +7626 -0
  344. package/frontend/tools/convert_to_jsdoc_tmp.js +345 -0
  345. package/package.json +11 -12
  346. package/backend/dist/cjs/database/collection.d.ts +0 -160
  347. package/backend/dist/cjs/database/collection.js +0 -842
  348. package/backend/dist/cjs/database/database.d.ts +0 -121
  349. package/backend/dist/cjs/database/document.d.ts +0 -131
  350. package/backend/dist/cjs/database/document.js +0 -224
  351. package/backend/dist/cjs/database.d.ts +0 -502
  352. package/backend/dist/cjs/database.js +0 -2248
  353. package/backend/dist/cjs/logger.d.ts +0 -3
  354. package/backend/dist/cjs/meta.d.ts +0 -50
  355. package/backend/dist/cjs/mutex.d.ts +0 -24
  356. package/backend/dist/cjs/payments/paddle.d.ts +0 -160
  357. package/backend/dist/cjs/plugins/browser.d.ts +0 -36
  358. package/backend/dist/cjs/plugins/browser.js +0 -198
  359. package/backend/dist/cjs/plugins/css.d.ts +0 -11
  360. package/backend/dist/cjs/plugins/css.js +0 -80
  361. package/backend/dist/cjs/plugins/mail.d.ts +0 -277
  362. package/backend/dist/cjs/plugins/mail.js +0 -1370
  363. package/backend/dist/cjs/plugins/ts/compiler.d.ts +0 -139
  364. package/backend/dist/cjs/plugins/ts/compiler.js +0 -750
  365. package/backend/dist/cjs/plugins/ts/preprocessing.d.ts +0 -14
  366. package/backend/dist/cjs/plugins/ts/preprocessing.js +0 -440
  367. package/backend/dist/cjs/rate_limit.d.ts +0 -63
  368. package/backend/dist/cjs/rate_limit.js +0 -348
  369. package/backend/dist/cjs/request.deprc.d.ts +0 -48
  370. package/backend/dist/cjs/request.deprc.js +0 -572
  371. package/backend/dist/cjs/response.deprc.d.ts +0 -55
  372. package/backend/dist/cjs/response.deprc.js +0 -275
  373. package/backend/dist/cjs/server.d.ts +0 -342
  374. package/backend/dist/cjs/splash_screen.d.ts +0 -35
  375. package/backend/dist/cjs/status.d.ts +0 -61
  376. package/backend/dist/cjs/stream.d.ts +0 -79
  377. package/backend/dist/cjs/users.d.ts +0 -111
  378. package/backend/dist/cjs/users.js +0 -1817
  379. package/backend/dist/cjs/view.js +0 -352
  380. package/backend/dist/cjs/vinc.dev.d.ts +0 -3
  381. package/backend/dist/cjs/vinc.dev.js +0 -7
  382. package/backend/dist/css/adyen.css +0 -92
  383. package/backend/dist/css/volt.css +0 -70
  384. package/backend/dist/esm/database/collection.d.ts +0 -160
  385. package/backend/dist/esm/database/collection.js +0 -1328
  386. package/backend/dist/esm/database/database.d.ts +0 -121
  387. package/backend/dist/esm/database/document.d.ts +0 -131
  388. package/backend/dist/esm/database/document.js +0 -247
  389. package/backend/dist/esm/database.d.ts +0 -502
  390. package/backend/dist/esm/database.js +0 -2423
  391. package/backend/dist/esm/file_watcher.js +0 -329
  392. package/backend/dist/esm/logger.d.ts +0 -3
  393. package/backend/dist/esm/logger.js +0 -11
  394. package/backend/dist/esm/meta.d.ts +0 -50
  395. package/backend/dist/esm/mutex.d.ts +0 -24
  396. package/backend/dist/esm/mutex.js +0 -48
  397. package/backend/dist/esm/payments/paddle.d.ts +0 -160
  398. package/backend/dist/esm/plugins/browser.d.ts +0 -36
  399. package/backend/dist/esm/plugins/browser.js +0 -176
  400. package/backend/dist/esm/plugins/css.d.ts +0 -11
  401. package/backend/dist/esm/plugins/css.js +0 -90
  402. package/backend/dist/esm/plugins/ts/compiler.d.ts +0 -139
  403. package/backend/dist/esm/plugins/ts/compiler.js +0 -1194
  404. package/backend/dist/esm/plugins/ts/preprocessing.d.ts +0 -14
  405. package/backend/dist/esm/plugins/ts/preprocessing.js +0 -726
  406. package/backend/dist/esm/rate_limit.d.ts +0 -63
  407. package/backend/dist/esm/rate_limit.js +0 -417
  408. package/backend/dist/esm/request.deprc.d.ts +0 -48
  409. package/backend/dist/esm/request.deprc.js +0 -572
  410. package/backend/dist/esm/response.deprc.d.ts +0 -55
  411. package/backend/dist/esm/response.deprc.js +0 -275
  412. package/backend/dist/esm/server.d.ts +0 -342
  413. package/backend/dist/esm/splash_screen.d.ts +0 -35
  414. package/backend/dist/esm/status.d.ts +0 -61
  415. package/backend/dist/esm/status.js +0 -197
  416. package/backend/dist/esm/stream.d.ts +0 -79
  417. package/backend/dist/esm/users.d.ts +0 -111
  418. package/backend/dist/esm/users.js +0 -1935
  419. package/backend/dist/esm/vinc.dev.d.ts +0 -3
  420. package/backend/dist/esm/vinc.dev.js +0 -7
  421. package/frontend/dist/elements/base.d.ts +0 -9889
  422. package/frontend/dist/elements/module.d.ts +0 -30
  423. package/frontend/dist/modules/array.d.ts +0 -94
  424. package/frontend/dist/modules/array.js +0 -634
  425. package/frontend/dist/modules/auth.d.ts +0 -46
  426. package/frontend/dist/modules/auth.js +0 -139
  427. package/frontend/dist/modules/colors.d.ts +0 -1
  428. package/frontend/dist/modules/colors.js +0 -417
  429. package/frontend/dist/modules/compression.d.ts +0 -6
  430. package/frontend/dist/modules/compression.js +0 -999
  431. package/frontend/dist/modules/cookies.d.ts +0 -18
  432. package/frontend/dist/modules/cookies.js +0 -167
  433. package/frontend/dist/modules/date.d.ts +0 -142
  434. package/frontend/dist/modules/date.js +0 -493
  435. package/frontend/dist/modules/events.d.ts +0 -8
  436. package/frontend/dist/modules/events.js +0 -91
  437. package/frontend/dist/modules/google.d.ts +0 -11
  438. package/frontend/dist/modules/google.js +0 -54
  439. package/frontend/dist/modules/meta.d.ts +0 -10
  440. package/frontend/dist/modules/mutex.d.ts +0 -7
  441. package/frontend/dist/modules/mutex.js +0 -51
  442. package/frontend/dist/modules/number.d.ts +0 -16
  443. package/frontend/dist/modules/number.js +0 -23
  444. package/frontend/dist/modules/object.d.ts +0 -52
  445. package/frontend/dist/modules/object.js +0 -383
  446. package/frontend/dist/modules/scheme.d.ts +0 -227
  447. package/frontend/dist/modules/scheme.js +0 -531
  448. package/frontend/dist/modules/settings.d.ts +0 -3
  449. package/frontend/dist/modules/settings.js +0 -4
  450. package/frontend/dist/modules/statics.d.ts +0 -5
  451. package/frontend/dist/modules/string.d.ts +0 -124
  452. package/frontend/dist/modules/string.js +0 -745
  453. package/frontend/dist/modules/support.d.ts +0 -19
  454. package/frontend/dist/modules/support.js +0 -103
  455. package/frontend/dist/modules/themes.d.ts +0 -8
  456. package/frontend/dist/modules/themes.js +0 -18
  457. package/frontend/dist/modules/user.d.ts +0 -59
  458. package/frontend/dist/modules/user.js +0 -280
  459. package/frontend/dist/modules/utils.d.ts +0 -87
  460. package/frontend/dist/modules/utils.js +0 -923
  461. package/frontend/dist/types/gradient.d.ts +0 -12
  462. package/frontend/dist/ui/border_button.d.ts +0 -152
  463. package/frontend/dist/ui/button.d.ts +0 -21
  464. package/frontend/dist/ui/canvas.d.ts +0 -56
  465. package/frontend/dist/ui/checkbox.d.ts +0 -52
  466. package/frontend/dist/ui/frame_modes.d.ts +0 -25
  467. package/frontend/dist/ui/input.d.ts +0 -241
  468. package/frontend/dist/ui/loader_button.d.ts +0 -93
  469. package/frontend/dist/ui/loaders.d.ts +0 -57
  470. package/frontend/dist/ui/pseudo.d.ts +0 -16
  471. package/frontend/dist/ui/steps.d.ts +0 -59
  472. package/frontend/dist/ui/title.d.ts +0 -21
  473. package/frontend/dist/ui/title.js +0 -121
  474. package/frontend/examples/dashboard/dashboard.ts +0 -776
  475. /package/backend/dist/cjs/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  476. /package/backend/dist/cjs/{file_watcher.d.ts → backend/src/database/document.d.ts} +0 -0
  477. /package/backend/dist/cjs/{file_watcher.js → backend/src/database/document.js} +0 -0
  478. /package/backend/dist/cjs/{plugins/pdf.d.ts → backend/src/database/filters/strict_filter_test.d.ts} +0 -0
  479. /package/backend/dist/{esm/file_watcher.d.ts → cjs/backend/src/database/filters/strict_filter_test_v0.d.ts} +0 -0
  480. /package/backend/dist/{esm/plugins/pdf.d.ts → cjs/backend/src/database/flatten_test.d.ts} +0 -0
  481. /package/backend/dist/cjs/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  482. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  483. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.js +0 -0
  484. /package/backend/dist/cjs/{plugins → backend/src/plugins}/mail/ui.js +0 -0
  485. /package/backend/dist/cjs/{plugins → backend/src/plugins}/pdf.js +0 -0
  486. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  487. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  488. /package/backend/dist/cjs/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  489. /package/backend/dist/cjs/{vinc.js → backend/src/vinc.js} +0 -0
  490. /package/backend/dist/esm/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  491. /package/backend/dist/esm/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  492. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  493. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.js +0 -0
  494. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  495. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  496. /package/backend/dist/esm/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  497. /package/backend/dist/esm/{vinc.js → backend/src/vinc.js} +0 -0
  498. /package/frontend/dist/{elements → frontend/src/elements}/register_element.d.ts +0 -0
  499. /package/frontend/dist/{elements → frontend/src/elements}/register_element.js +0 -0
  500. /package/frontend/dist/{modules → frontend/src/modules}/color.d.ts +0 -0
  501. /package/frontend/dist/{ui → frontend/src/ui}/ui.d.ts +0 -0
  502. /package/frontend/dist/{ui → frontend/src/ui}/ui.js +0 -0
@@ -0,0 +1,673 @@
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
+ */
5
+ import * as vlib from "@vandenberghinc/vlib";
6
+ // ---------------------------------------------------------
7
+ // Rate limit groups.
8
+ /**
9
+ * The rate limit groups for the endpoint.
10
+ *
11
+ * A group can either be registered through this class or by defining the rate limit group on an endpoint using `Endpoint.rate_limit`.
12
+ *
13
+ * This class will be accessable under `Server` attribute `rate_limits`.
14
+ * @nav Backend/Rate Limit
15
+ * @docs
16
+ */
17
+ export var RateLimits;
18
+ (function (RateLimits) {
19
+ RateLimits.groups = new Map([
20
+ /** The `global` rate settings. */
21
+ ["global", { group: "global", interval: 60, limit: 1000 }],
22
+ ]);
23
+ /**
24
+ * Add a rate limit group.
25
+ * @param group The rate limit group.
26
+ * @param limit The maximum requests per rate limit interval, defaults to 50.
27
+ * @param interval The rate limit interval in seconds, defaults to 60.
28
+ * @docs
29
+ */
30
+ function add({
31
+ /** The rate limit group name. */
32
+ group = null,
33
+ /** The maximum requests per rate limit interval. */
34
+ limit = null,
35
+ /** The rate limit interval in seconds. */
36
+ interval = null, }) {
37
+ const settings = RateLimits.groups.has(group)
38
+ ? RateLimits.groups.get(group)
39
+ : { group: "", limit: 0, interval: 0 };
40
+ settings.group = group;
41
+ if (limit) {
42
+ settings.limit = limit;
43
+ }
44
+ else if (!settings.limit) {
45
+ settings.limit = 50;
46
+ }
47
+ if (interval) {
48
+ settings.interval = interval;
49
+ }
50
+ else if (!settings.interval) {
51
+ settings.interval = 60;
52
+ }
53
+ RateLimits.groups.set(group, settings);
54
+ return settings;
55
+ }
56
+ RateLimits.add = add;
57
+ /**
58
+ * Normalize an IPv4 or IPv6 address into a unique, canonical string suitable for rate limiting keys.
59
+ *
60
+ * Behavior:
61
+ * - Trims surrounding whitespace.
62
+ * - If bracketed (`[addr]` or `[addr]:port`), removes brackets (and any trailing port).
63
+ * - Removes IPv6 zone/scope IDs (`%...`), e.g. `fe80::1%eth0` → `fe80::1`.
64
+ * - IPv4: returns dotted-decimal without leading zeros (e.g. `001.002.003.004` → `1.2.3.4`).
65
+ * - IPv6: emits RFC 5952 canonical form (lowercase hex, no leading zeros, single longest `::`).
66
+ * - IPv4-mapped IPv6 (`::ffff:0:0/96`) is normalized to plain IPv4 (e.g. `::ffff:203.0.113.7` → `203.0.113.7`).
67
+ *
68
+ * Notes:
69
+ * - This function expects a host/address string (not a full URL). It tolerates `[v6]:port`
70
+ * but intentionally does **not** accept non-bracketed `ipv4:port`.
71
+ *
72
+ * @param ip The input IPv4/IPv6 address.
73
+ * @returns Canonical address string.
74
+ * @throws {Error} If the input is not a valid IPv4 or IPv6 address.
75
+ */
76
+ function normalize_ip(ip) {
77
+ let s = strip_brackets_zone_and_port(ip);
78
+ // Fast path: dotted-decimal IPv4.
79
+ const v4 = try_parse_ipv4_bytes(s);
80
+ if (v4) {
81
+ return ipv4_bytes_to_string(v4);
82
+ }
83
+ // IPv6 (supports embedded IPv4 tail).
84
+ const hextets = parse_ipv6_to_hextets(s);
85
+ // Collapse IPv4-mapped IPv6 to plain IPv4.
86
+ if (is_ipv4_mapped(hextets)) {
87
+ const b0 = (hextets[6] >>> 8) & 0xff;
88
+ const b1 = hextets[6] & 0xff;
89
+ const b2 = (hextets[7] >>> 8) & 0xff;
90
+ const b3 = hextets[7] & 0xff;
91
+ return `${b0}.${b1}.${b2}.${b3}`;
92
+ }
93
+ return ipv6_hextets_to_rfc5952(hextets);
94
+ }
95
+ RateLimits.normalize_ip = normalize_ip;
96
+ /**
97
+ * Trim, remove surrounding brackets for IPv6, drop any `:port` after a closing bracket,
98
+ * and strip a zone/scope ID starting at `%`.
99
+ *
100
+ * Non-bracketed `ipv4:port` is intentionally NOT supported to avoid ambiguity.
101
+ *
102
+ * @param input Raw input string.
103
+ * @returns Address-only string.
104
+ * @throws Error when a starting `[` lacks a matching `]`.
105
+ */
106
+ function strip_brackets_zone_and_port(input) {
107
+ let s = input.trim();
108
+ if (s.startsWith('[')) {
109
+ const rb = s.indexOf(']');
110
+ if (rb === -1)
111
+ throw new Error('invalid ip: unmatched closing bracket');
112
+ s = s.slice(1, rb); // ignore anything after the closing bracket (like :port)
113
+ }
114
+ const pct = s.indexOf('%');
115
+ if (pct !== -1)
116
+ s = s.slice(0, pct);
117
+ return s;
118
+ }
119
+ /**
120
+ * Attempt to parse dotted-decimal IPv4 into 4 bytes via a single linear scan.
121
+ *
122
+ * Accepts leading zeros but interprets strictly as decimal (no octal/hex legacy forms).
123
+ *
124
+ * @param s Candidate IPv4 string.
125
+ * @returns Four bytes or null if not valid dotted-decimal.
126
+ */
127
+ function try_parse_ipv4_bytes(s) {
128
+ let a = 0, b = 0, c = 0, d = 0;
129
+ let val = 0, dots = 0, digits = 0;
130
+ for (let i = 0; i < s.length; i++) {
131
+ const ch = s.charCodeAt(i);
132
+ if (ch === 46 /* '.' */) {
133
+ if (digits === 0)
134
+ return null; // empty octet
135
+ if (dots === 0)
136
+ a = val;
137
+ else if (dots === 1)
138
+ b = val;
139
+ else if (dots === 2)
140
+ c = val;
141
+ else
142
+ return null; // too many dots
143
+ dots++;
144
+ val = 0;
145
+ digits = 0;
146
+ }
147
+ else if (ch >= 48 && ch <= 57) {
148
+ val = val * 10 + (ch - 48);
149
+ if (val > 255)
150
+ return null;
151
+ digits++;
152
+ }
153
+ else {
154
+ return null;
155
+ }
156
+ }
157
+ if (dots !== 3 || digits === 0)
158
+ return null;
159
+ d = val;
160
+ return [a, b, c, d];
161
+ }
162
+ /**
163
+ * Convert 4 IPv4 bytes to dotted-decimal.
164
+ *
165
+ * @param bytes Four IPv4 bytes.
166
+ * @returns Dotted-decimal string.
167
+ */
168
+ function ipv4_bytes_to_string(bytes) {
169
+ return `${bytes[0]}.${bytes[1]}.${bytes[2]}.${bytes[3]}`;
170
+ }
171
+ /**
172
+ * Parse an IPv6 string (optionally with a dotted-decimal IPv4 tail) into eight 16-bit hextets.
173
+ *
174
+ * Rules:
175
+ * - At most one `::` zero-run compression.
176
+ * - Each hex hextet: 1–4 hex chars (case-insensitive).
177
+ * - An embedded IPv4 tail must be the final token on its side and contributes two hextets.
178
+ *
179
+ * @param s Candidate IPv6 string (no brackets, no zone).
180
+ * @returns Eight hextets.
181
+ * @throws Error on invalid IPv6.
182
+ */
183
+ function parse_ipv6_to_hextets(s) {
184
+ const dbl = s.indexOf('::');
185
+ const has_double = dbl !== -1;
186
+ if (has_double && s.indexOf('::', dbl + 2) !== -1) {
187
+ throw new Error('invalid ipv6: multiple ::');
188
+ }
189
+ const left_end = has_double ? dbl : s.length;
190
+ const right_start = has_double ? dbl + 2 : s.length;
191
+ const left = parse_ipv6_side_range(s, 0, left_end);
192
+ const right = has_double ? parse_ipv6_side_range(s, right_start, s.length) : [];
193
+ let zeros = 0;
194
+ if (has_double) {
195
+ zeros = 8 - (left.length + right.length);
196
+ if (zeros < 1)
197
+ throw new Error('invalid ipv6: bad :: compression');
198
+ }
199
+ else {
200
+ if (left.length !== 8)
201
+ throw new Error('invalid ipv6: must have 8 hextets without ::');
202
+ }
203
+ const out = new Array(8);
204
+ let k = 0;
205
+ for (let i = 0; i < left.length; i++)
206
+ out[k++] = left[i];
207
+ for (let i = 0; i < zeros; i++)
208
+ out[k++] = 0;
209
+ for (let i = 0; i < right.length; i++)
210
+ out[k++] = right[i];
211
+ return [
212
+ out[0], out[1], out[2], out[3],
213
+ out[4], out[5], out[6], out[7]
214
+ ];
215
+ }
216
+ /**
217
+ * Parse one side of an IPv6 address delimited by `:` using index ranges,
218
+ * with optional trailing embedded IPv4 token (counts as two hextets).
219
+ *
220
+ * @param s Full input string.
221
+ * @param start Start index (inclusive).
222
+ * @param end End index (exclusive).
223
+ * @returns Array of hextets from this side.
224
+ * @throws Error on invalid tokens/order.
225
+ */
226
+ function parse_ipv6_side_range(s, start, end) {
227
+ if (start === end)
228
+ return [];
229
+ const out = [];
230
+ let i = start;
231
+ while (i < end) {
232
+ const token_start = i;
233
+ // find next ':' or end
234
+ while (i < end && s.charCodeAt(i) !== 58 /* ':' */)
235
+ i++;
236
+ const token_end = i;
237
+ if (token_end === token_start)
238
+ throw new Error('invalid ipv6: empty hextet');
239
+ // detect embedded IPv4 by scanning token for '.'
240
+ let has_dot = false;
241
+ for (let p = token_start; p < token_end; p++) {
242
+ if (s.charCodeAt(p) === 46 /* '.' */) {
243
+ has_dot = true;
244
+ break;
245
+ }
246
+ }
247
+ if (has_dot) {
248
+ if (i !== end)
249
+ throw new Error('invalid ipv6: embedded ipv4 must be last token');
250
+ const bytes = try_parse_ipv4_bytes(s.slice(token_start, token_end));
251
+ if (!bytes)
252
+ throw new Error('invalid ipv6: bad embedded ipv4');
253
+ out.push(((bytes[0] << 8) | bytes[1]) & 0xffff);
254
+ out.push(((bytes[2] << 8) | bytes[3]) & 0xffff);
255
+ }
256
+ else {
257
+ out.push(parse_hextet_token(s, token_start, token_end));
258
+ }
259
+ if (++i > end)
260
+ break; // skip ':' and continue
261
+ if (out.length > 8)
262
+ throw new Error('invalid ipv6: too many hextets');
263
+ }
264
+ return out;
265
+ }
266
+ /**
267
+ * Parse a hex hextet (1–4 chars) from a substring into a 16-bit number.
268
+ *
269
+ * @param s Source string.
270
+ * @param start Start index (inclusive).
271
+ * @param end End index (exclusive).
272
+ * @returns A number from 0 to 65535.
273
+ * @throws Error if invalid length or characters.
274
+ */
275
+ function parse_hextet_token(s, start, end) {
276
+ const len = end - start;
277
+ if (len < 1 || len > 4)
278
+ throw new Error('invalid ipv6: hextet size');
279
+ let val = 0;
280
+ for (let i = 0; i < len; i++) {
281
+ const c = s.charCodeAt(start + i);
282
+ let nibble;
283
+ if (c >= 48 && c <= 57)
284
+ nibble = c - 48; // 0-9
285
+ else if (c >= 97 && c <= 102)
286
+ nibble = 10 + (c - 97); // a-f
287
+ else if (c >= 65 && c <= 70)
288
+ nibble = 10 + (c - 65); // A-F
289
+ else
290
+ throw new Error('invalid ipv6: non-hex character');
291
+ val = (val << 4) | nibble;
292
+ }
293
+ return val & 0xffff;
294
+ }
295
+ /**
296
+ * Check if an IPv6 address is IPv4-mapped (::ffff:0:0/96).
297
+ *
298
+ * @param h Eight hextets.
299
+ * @returns True if IPv4-mapped.
300
+ */
301
+ function is_ipv4_mapped(h) {
302
+ return h[0] === 0 && h[1] === 0 && h[2] === 0 && h[3] === 0 && h[4] === 0 && h[5] === 0xffff;
303
+ }
304
+ /**
305
+ * Render eight IPv6 hextets using RFC 5952 canonical form:
306
+ * - lowercase hex
307
+ * - no leading zeros
308
+ * - compress the longest run of ≥2 consecutive zero hextets with "::"
309
+ * (first run wins on ties)
310
+ *
311
+ * @param h Eight hextets.
312
+ * @returns Canonical IPv6 string.
313
+ */
314
+ function ipv6_hextets_to_rfc5952(h) {
315
+ // find longest zero-run
316
+ let best_start = -1, best_len = 0;
317
+ for (let i = 0; i < 8;) {
318
+ if (h[i] !== 0) {
319
+ i++;
320
+ continue;
321
+ }
322
+ const start = i;
323
+ while (i < 8 && h[i] === 0)
324
+ i++;
325
+ const len = i - start;
326
+ if (len >= 2 && len > best_len) {
327
+ best_start = start;
328
+ best_len = len;
329
+ }
330
+ }
331
+ // build string without extra allocations
332
+ let out = '';
333
+ for (let i = 0; i < 8; i++) {
334
+ if (best_len && i === best_start) {
335
+ // insert the '::'
336
+ if (i === 0)
337
+ out += '::';
338
+ else
339
+ out += ':::';
340
+ i += best_len - 1; // skip compressed zeros
341
+ continue;
342
+ }
343
+ if (i > 0 && !(best_len && i === best_start + best_len))
344
+ out += ':';
345
+ out += h[i].toString(16); // lowercase, no leading zeros
346
+ }
347
+ // special: all zeros compressed
348
+ if (out === '')
349
+ return '::';
350
+ // fix potential ':::' at beginning (from i===0 case)
351
+ if (out.startsWith(':::'))
352
+ out = out.slice(1);
353
+ return out;
354
+ }
355
+ })(RateLimits || (RateLimits = {}));
356
+ /**
357
+ * The rate limit websocket class (server).
358
+ * Rate limiting is handled automatically when the endpoints has it enabled.
359
+ *
360
+ * @nav Backend/Rate Limit
361
+ */
362
+ export class RateLimitServer {
363
+ // Static attributes.
364
+ static default_port = 51234;
365
+ // Instance attributes
366
+ ip;
367
+ port;
368
+ https_config;
369
+ server;
370
+ limits;
371
+ ws;
372
+ clear_caches_interval;
373
+ constructor({ port = RateLimitServer.default_port, ip, https, _server, }) {
374
+ // Checks.
375
+ vlib.schema.validate(arguments[0], {
376
+ unknown: false,
377
+ throw: true,
378
+ schema: {
379
+ port: { type: "number", default: RateLimitServer.default_port },
380
+ ip: { type: "string", required: false },
381
+ https: { type: "any", required: false },
382
+ _server: "object",
383
+ }
384
+ });
385
+ // Arguments.
386
+ this.ip = ip;
387
+ this.port = port;
388
+ this.https_config = https;
389
+ this.server = _server;
390
+ // Attributes.
391
+ this.limits = new Map();
392
+ }
393
+ /** Assert the server is running. */
394
+ assert_connected() {
395
+ if (!this.ws) {
396
+ throw new Error("The rate limit server is not running.");
397
+ }
398
+ }
399
+ // Start.
400
+ async start() {
401
+ // Ensure the rate limit api key is defined.
402
+ if (!this.server.rate_limit_api_key) {
403
+ throw new Error("Rate limit API key is not defined.");
404
+ }
405
+ // Initialize server.
406
+ this.ws = new vlib.websocket.Server({
407
+ ip: this.ip,
408
+ port: this.port,
409
+ https: this.https_config,
410
+ api_keys: [this.server.rate_limit_api_key],
411
+ rate_limit: {
412
+ limit: 100,
413
+ interval: 60,
414
+ },
415
+ });
416
+ // Listen event.
417
+ this.ws.on_event("listen", (address) => {
418
+ this.server.log(0, `Running on ${address}.`);
419
+ });
420
+ // Error event.
421
+ this.ws.on_event('error', (stream, e) => {
422
+ this.server.log.error(e);
423
+ });
424
+ // Create limit command.
425
+ this.ws.on("limit", async (stream, id, data) => {
426
+ this.assert_connected();
427
+ try {
428
+ this.ws.respond({
429
+ stream,
430
+ id,
431
+ data: { response: await this.limit(data.ip, data.groups) }
432
+ });
433
+ }
434
+ catch (e) {
435
+ this.server.log.error(e);
436
+ this.ws.respond({ stream, id, data: { error: e.message } });
437
+ }
438
+ });
439
+ // Create command: reset & reset_all.
440
+ this.ws.on("reset", async (stream, id, data) => {
441
+ this.assert_connected();
442
+ try {
443
+ await this.reset(data.group);
444
+ this.ws.respond({ stream, id, data: { error: undefined } });
445
+ }
446
+ catch (e) {
447
+ this.server.log.error(e);
448
+ this.ws.respond({ stream, id, data: { error: e.message } });
449
+ }
450
+ });
451
+ this.ws.on("reset_all", async (stream, id) => {
452
+ this.assert_connected();
453
+ try {
454
+ await this.reset_all();
455
+ this.ws.respond({ stream, id, data: { error: undefined } });
456
+ }
457
+ catch (e) {
458
+ this.server.log.error(e);
459
+ this.ws.respond({ stream, id, data: { error: e.message } });
460
+ }
461
+ });
462
+ // Start.
463
+ await this.ws.start();
464
+ // Clear caches once every 1h.
465
+ this.clear_caches_interval = setInterval(() => {
466
+ const remove_after = Date.now() + (3600 * 1000);
467
+ for (const [group, map] of this.limits.entries()) {
468
+ for (const [ip, data] of map.entries()) {
469
+ if (remove_after > data.expiration) {
470
+ map.delete(ip);
471
+ }
472
+ }
473
+ }
474
+ }, 3600 * 1000);
475
+ }
476
+ // Stop.
477
+ async stop() {
478
+ this.server.log("Stopping the rate limit server.");
479
+ if (this.clear_caches_interval) {
480
+ clearInterval(this.clear_caches_interval);
481
+ }
482
+ if (this.ws) {
483
+ await this.ws.stop();
484
+ this.ws = undefined;
485
+ }
486
+ }
487
+ // Returns null when rate limit is approved, and returns the unix timestamp (as str) of reset when rate limit has been exceeded.
488
+ async limit(ip, groups = [{ group: null, limit: null, interval: null }]) {
489
+ return groups.iterate((rate_limit) => {
490
+ for (let attempts = 2; attempts >= 0; --attempts) {
491
+ try {
492
+ // Get endpoint limits.
493
+ let limits;
494
+ if (this.limits.has(rate_limit.group)) {
495
+ limits = this.limits.get(rate_limit.group);
496
+ }
497
+ else {
498
+ limits = new Map();
499
+ this.limits.set(rate_limit.group, limits);
500
+ }
501
+ // Limit.
502
+ const now = Date.now();
503
+ if (limits.has(ip)) {
504
+ let data = limits.get(ip);
505
+ if (now >= data.expiration) {
506
+ data = {
507
+ count: 0,
508
+ expiration: now + rate_limit.interval * 1000,
509
+ };
510
+ }
511
+ ++data.count;
512
+ if (data.count > rate_limit.limit) {
513
+ return data.expiration;
514
+ }
515
+ limits.set(ip, data);
516
+ }
517
+ else {
518
+ limits.set(ip, {
519
+ count: 1,
520
+ expiration: now + rate_limit.interval * 1000,
521
+ });
522
+ }
523
+ break;
524
+ }
525
+ catch (e) {
526
+ if (attempts === 0) {
527
+ throw e;
528
+ }
529
+ }
530
+ }
531
+ }) ?? null;
532
+ }
533
+ // Reset a group limit.
534
+ async reset(group) {
535
+ for (const [key, group_limits] of this.limits.entries()) {
536
+ if (key === group) {
537
+ for (const cache of group_limits.values()) {
538
+ cache.count = 0;
539
+ }
540
+ }
541
+ }
542
+ }
543
+ // Reset all rate limit groups.
544
+ async reset_all() {
545
+ for (const group_limits of this.limits.values()) {
546
+ for (const cache of group_limits.values()) {
547
+ cache.count = 0;
548
+ }
549
+ }
550
+ }
551
+ }
552
+ /**
553
+ * The secondary rate limit class (client).
554
+ *
555
+ * Rate limiting is handled automatically when the endpoints has it enabled.
556
+ *
557
+ * @nav Backend/Rate Limit
558
+ */
559
+ export class RateLimitClient {
560
+ ip;
561
+ port;
562
+ https;
563
+ url;
564
+ server;
565
+ ws;
566
+ constructor({ ip, port = RateLimitServer.default_port, https = false, url, _server, }) {
567
+ // Checks.
568
+ vlib.schema.validate(arguments[0], {
569
+ unknown: false,
570
+ throw: true,
571
+ schema: {
572
+ ip: { type: "string", default: null },
573
+ port: { type: "number", default: RateLimitServer.default_port },
574
+ https: { type: "object", default: null },
575
+ url: { type: "string", default: null },
576
+ _server: "object",
577
+ }
578
+ });
579
+ // Arguments.
580
+ this.ip = ip ? ip : "localhost";
581
+ this.port = port;
582
+ this.https = https;
583
+ this.url = url;
584
+ this.server = _server;
585
+ }
586
+ /** Assert the client is started & connected. */
587
+ assert_connected() {
588
+ if (!this.ws) {
589
+ throw new Error("The rate limit client is not started.");
590
+ }
591
+ }
592
+ // Start.
593
+ async start() {
594
+ // Ensure the rate limit api key is defined.
595
+ if (!this.server.rate_limit_api_key) {
596
+ throw new Error("Rate limit API key is not defined.");
597
+ }
598
+ // Initialize server.
599
+ this.ws = new vlib.websocket.Client({
600
+ url: this.url ? this.url : `${this.https ? "wss" : "ws"}://${this.ip}:${this.port}`,
601
+ api_key: this.server.rate_limit_api_key,
602
+ reconnect: {
603
+ interval: 10,
604
+ max_interval: 30000,
605
+ },
606
+ ping: true,
607
+ });
608
+ // Error event.
609
+ this.ws.on_event('error', (e) => {
610
+ this.server.log.error(e);
611
+ });
612
+ // Reconnect event.
613
+ this.ws.on_event('reconnect', (e) => {
614
+ this.server.log('Attempting to reconnect with the server.');
615
+ });
616
+ // Close event.
617
+ this.ws.on_event('close', () => {
618
+ this.server.log('Websocket closed after exhausting all reconnect attempts.');
619
+ process.exit(1); // stop the thread.
620
+ });
621
+ // Connect.
622
+ await this.ws.connect();
623
+ }
624
+ // Stop.
625
+ async stop() {
626
+ this.server.log("Stopping the rate limit client.");
627
+ if (this.ws) {
628
+ await this.ws.disconnect();
629
+ this.ws = undefined;
630
+ }
631
+ }
632
+ // Limit function.
633
+ // Returns null when rate limit is approved, and returns the unix timestamp (as str) of reset when rate limit has been exceeded.
634
+ async limit(ip, groups = [{ group: null, limit: null, interval: null }]) {
635
+ this.assert_connected();
636
+ const { data } = await this.ws.request({
637
+ command: "limit",
638
+ timeout: 10000,
639
+ data: { ip, groups }
640
+ });
641
+ if (data.error) {
642
+ throw new Error(data.error);
643
+ }
644
+ return data.response;
645
+ }
646
+ // Reset a group limit.
647
+ async reset(group) {
648
+ this.assert_connected();
649
+ const { data } = await this.ws.request({
650
+ command: "reset",
651
+ timeout: 10000,
652
+ data: { group }
653
+ });
654
+ if (data.error) {
655
+ throw new Error(data.error);
656
+ }
657
+ }
658
+ // Reset all rate limit groups.
659
+ async reset_all() {
660
+ this.assert_connected();
661
+ const { data } = await this.ws.request({
662
+ command: "reset_all",
663
+ timeout: 10000,
664
+ data: {},
665
+ });
666
+ if (data.error) {
667
+ throw new Error(data.error);
668
+ }
669
+ }
670
+ }
671
+ // ---------------------------------------------------------
672
+ // Exports.
673
+ export default RateLimits;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * A Route encapsulates an HTTP method and an endpoint pattern (string, colon-style, or RegExp),
3
+ * and provides a `.match()` method which returns true/false and populates `.params` on success.
4
+ */
5
+ export declare class Route {
6
+ readonly method: string;
7
+ readonly endpoint: string | RegExp;
8
+ readonly endpoint_str: string;
9
+ readonly id: string;
10
+ readonly is_regex: boolean;
11
+ readonly params: {
12
+ name: string;
13
+ required: boolean;
14
+ }[];
15
+ private matcher?;
16
+ /**
17
+ *
18
+ * @param method HTTP method (e.g. "GET", "post", etc.)
19
+ * @param endpoint The endpoint parameter supports the following input type.
20
+ * - A regex to match against the request URL, or a string with colon-style path parameters.
21
+ * - A string supporting colon-style path parameters (e.g. "/user/:id"), and simple `*` and `**` wildcards.
22
+ * Ensure the wildcards are encapsulated by / or at the start of end of the string.
23
+ */
24
+ constructor(method: string, endpoint: string | RegExp);
25
+ /**
26
+ * Tests this route against another Route (e.g. a “request” Route).
27
+ * @returns `false` when not matched, and a `params` object when matched.
28
+ */
29
+ match(other: Route): false | Record<string, any>;
30
+ private _create_route_matcher;
31
+ private static _stringify_endpoint_regex;
32
+ /** Clean an endpoint url. */
33
+ static clean_endpoint(endpoint: RegExp): RegExp;
34
+ static clean_endpoint(endpoint: string): string;
35
+ }