@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.
- package/backend/dist/cjs/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
- package/backend/dist/cjs/{blacklist.js → backend/src/blacklist.js} +8 -5
- package/backend/dist/cjs/{cli.js → backend/src/cli.js} +29 -47
- package/backend/dist/cjs/backend/src/database/collection.d.ts +1543 -0
- package/backend/dist/cjs/backend/src/database/collection.js +3042 -0
- package/backend/dist/cjs/backend/src/database/database.d.ts +66 -0
- package/backend/dist/cjs/{database → backend/src/database}/database.js +48 -43
- package/backend/dist/cjs/backend/src/database/filters/filters.d.ts +6 -0
- package/backend/dist/cjs/backend/src/database/filters/filters.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter.d.ts +223 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_test.js +443 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_test_v0.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.d.ts +165 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.js +15 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
- package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.js +355 -0
- package/backend/dist/cjs/backend/src/database/flatten.d.ts +75 -0
- package/backend/dist/cjs/{logger.js → backend/src/database/flatten.js} +18 -7
- package/backend/dist/cjs/backend/src/database/flatten_test.js +175 -0
- package/backend/dist/cjs/backend/src/database/quota/quota.d.ts +461 -0
- package/backend/dist/cjs/backend/src/database/quota/quota.js +1014 -0
- package/backend/dist/cjs/backend/src/database/quota/quota_v1.d.ts +534 -0
- package/backend/dist/cjs/backend/src/database/quota/quota_v1.js +1087 -0
- package/backend/dist/cjs/backend/src/database/quota/safe_int.d.ts +293 -0
- package/backend/dist/cjs/backend/src/database/quota/safe_int.js +573 -0
- package/backend/dist/{esm → cjs/backend/src}/endpoint.d.ts +69 -46
- package/backend/dist/cjs/{endpoint.js → backend/src/endpoint.js} +87 -101
- package/backend/dist/cjs/backend/src/errors/index.d.ts +7 -0
- package/backend/dist/cjs/backend/src/errors/index.js +25 -0
- package/backend/dist/{esm/utils.d.ts → cjs/backend/src/errors/internal_external.d.ts} +14 -22
- package/backend/dist/cjs/backend/src/errors/internal_external.js +85 -0
- package/backend/dist/cjs/backend/src/errors/invalid_usage_error.d.ts +38 -0
- package/backend/dist/cjs/{mutex.js → backend/src/errors/invalid_usage_error.js} +20 -37
- package/backend/dist/cjs/backend/src/errors/system_error.d.ts +230 -0
- package/backend/dist/cjs/backend/src/errors/system_error.js +393 -0
- package/backend/dist/cjs/backend/src/events.d.ts +54 -0
- package/backend/dist/cjs/backend/src/events.js +15 -0
- package/backend/dist/cjs/{frontend.js → backend/src/frontend.js} +1 -1
- package/backend/dist/cjs/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
- package/backend/dist/cjs/{image_endpoint.js → backend/src/image_endpoint.js} +3 -5
- package/backend/dist/cjs/backend/src/logger.d.ts +5 -0
- package/backend/dist/cjs/backend/src/logger.js +15 -0
- package/backend/dist/cjs/backend/src/meta.d.ts +64 -0
- package/backend/dist/cjs/{meta.js → backend/src/meta.js} +9 -12
- package/backend/dist/cjs/backend/src/payments/paddle.d.ts +326 -0
- package/backend/dist/cjs/{payments → backend/src/payments}/paddle.js +377 -327
- package/backend/dist/cjs/backend/src/plugins/browser.d.ts +1 -0
- package/backend/dist/cjs/backend/src/plugins/browser.js +15 -0
- package/backend/dist/cjs/backend/src/plugins/mail/mail.d.ts +248 -0
- package/backend/dist/cjs/backend/src/plugins/mail/mail.js +379 -0
- package/backend/dist/{esm → cjs/backend/src}/plugins/mail/ui.d.ts +23 -0
- package/backend/dist/cjs/backend/src/plugins/pdf.d.ts +1 -0
- package/backend/dist/cjs/backend/src/rate_limit.d.ts +145 -0
- package/backend/dist/cjs/backend/src/rate_limit.js +549 -0
- package/backend/dist/cjs/{route.d.ts → backend/src/route.d.ts} +3 -10
- package/backend/dist/cjs/{route.js → backend/src/route.js} +23 -21
- package/backend/dist/cjs/backend/src/server.d.ts +485 -0
- package/backend/dist/cjs/{server.js → backend/src/server.js} +688 -873
- package/backend/dist/cjs/backend/src/splash_screen.d.ts +80 -0
- package/backend/dist/cjs/{splash_screen.js → backend/src/splash_screen.js} +24 -3
- package/backend/dist/cjs/backend/src/status.d.ts +74 -0
- package/backend/dist/cjs/{status.js → backend/src/status.js} +64 -64
- package/backend/dist/cjs/backend/src/stream.d.ts +376 -0
- package/backend/dist/cjs/{stream.js → backend/src/stream.js} +299 -276
- package/backend/dist/cjs/backend/src/users.d.ts +807 -0
- package/backend/dist/cjs/backend/src/users.js +1971 -0
- package/backend/dist/cjs/backend/src/utils.d.ts +16 -0
- package/backend/dist/cjs/{utils.js → backend/src/utils.js} +14 -77
- package/backend/dist/{esm → cjs/backend/src}/view.d.ts +33 -11
- package/backend/dist/cjs/backend/src/view.js +508 -0
- package/backend/dist/{esm → cjs/backend/src}/volt.d.ts +10 -1
- package/backend/dist/cjs/{volt.js → backend/src/volt.js} +8 -5
- package/backend/dist/cjs/frontend/src/modules/request.d.ts +70 -0
- package/backend/dist/cjs/frontend/src/modules/request.js +99 -0
- package/backend/dist/esm/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
- package/backend/dist/esm/{blacklist.js → backend/src/blacklist.js} +9 -6
- package/backend/dist/esm/{cli.js → backend/src/cli.js} +43 -60
- package/backend/dist/esm/backend/src/database/collection.d.ts +1543 -0
- package/backend/dist/esm/backend/src/database/collection.js +3510 -0
- package/backend/dist/esm/backend/src/database/database.d.ts +66 -0
- package/backend/dist/esm/{database → backend/src/database}/database.js +62 -103
- package/backend/dist/esm/backend/src/database/document.d.ts +1 -0
- package/backend/dist/esm/backend/src/database/document.js +558 -0
- package/backend/dist/esm/backend/src/database/filters/filters.d.ts +6 -0
- package/backend/dist/esm/backend/src/database/filters/filters.js +1 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter.d.ts +223 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter.js +3 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_test.d.ts +1 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_test.js +505 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.d.ts +1 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.js +712 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.js +5 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.js +44 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.js +5 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
- package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.js +1 -0
- package/backend/dist/esm/backend/src/database/filters/strict_update_filter.d.ts +165 -0
- package/backend/dist/esm/backend/src/database/filters/strict_update_filter.js +5 -0
- package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
- package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.js +405 -0
- package/backend/dist/esm/backend/src/database/flatten.d.ts +75 -0
- package/backend/dist/esm/backend/src/database/flatten.js +22 -0
- package/backend/dist/esm/backend/src/database/flatten_test.d.ts +1 -0
- package/backend/dist/esm/backend/src/database/flatten_test.js +174 -0
- package/backend/dist/esm/backend/src/database/quota/quota.d.ts +461 -0
- package/backend/dist/esm/backend/src/database/quota/quota.js +1118 -0
- package/backend/dist/esm/backend/src/database/quota/quota_v1.d.ts +534 -0
- package/backend/dist/esm/backend/src/database/quota/quota_v1.js +1242 -0
- package/backend/dist/esm/backend/src/database/quota/safe_int.d.ts +293 -0
- package/backend/dist/esm/backend/src/database/quota/safe_int.js +602 -0
- package/backend/dist/{cjs → esm/backend/src}/endpoint.d.ts +69 -46
- package/backend/dist/esm/{endpoint.js → backend/src/endpoint.js} +136 -127
- package/backend/dist/esm/backend/src/errors/index.d.ts +7 -0
- package/backend/dist/esm/backend/src/errors/index.js +7 -0
- package/backend/dist/{cjs/utils.d.ts → esm/backend/src/errors/internal_external.d.ts} +14 -22
- package/backend/dist/esm/backend/src/errors/internal_external.js +70 -0
- package/backend/dist/esm/backend/src/errors/invalid_usage_error.d.ts +38 -0
- package/backend/dist/esm/backend/src/errors/invalid_usage_error.js +30 -0
- package/backend/dist/esm/backend/src/errors/system_error.d.ts +230 -0
- package/backend/dist/esm/backend/src/errors/system_error.js +402 -0
- package/backend/dist/esm/backend/src/events.d.ts +54 -0
- package/backend/dist/esm/backend/src/events.js +5 -0
- package/backend/dist/esm/{frontend.js → backend/src/frontend.js} +1 -1
- package/backend/dist/esm/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
- package/backend/dist/esm/{image_endpoint.js → backend/src/image_endpoint.js} +16 -20
- package/backend/dist/esm/backend/src/logger.d.ts +5 -0
- package/backend/dist/esm/backend/src/logger.js +8 -0
- package/backend/dist/esm/backend/src/meta.d.ts +64 -0
- package/backend/dist/esm/{meta.js → backend/src/meta.js} +15 -54
- package/backend/dist/esm/backend/src/payments/paddle.d.ts +326 -0
- package/backend/dist/esm/{payments → backend/src/payments}/paddle.js +417 -452
- package/backend/dist/esm/backend/src/plugins/browser.d.ts +1 -0
- package/backend/dist/esm/backend/src/plugins/browser.js +170 -0
- package/backend/dist/esm/backend/src/plugins/mail/mail.d.ts +248 -0
- package/backend/dist/esm/backend/src/plugins/mail/mail.js +389 -0
- package/backend/dist/{cjs → esm/backend/src}/plugins/mail/ui.d.ts +23 -0
- package/backend/dist/esm/{plugins → backend/src/plugins}/mail/ui.js +3 -6
- package/backend/dist/esm/backend/src/plugins/pdf.d.ts +1 -0
- package/backend/dist/esm/{plugins → backend/src/plugins}/pdf.js +3 -3
- package/backend/dist/esm/backend/src/rate_limit.d.ts +145 -0
- package/backend/dist/esm/backend/src/rate_limit.js +667 -0
- package/backend/dist/esm/{route.d.ts → backend/src/route.d.ts} +3 -10
- package/backend/dist/esm/{route.js → backend/src/route.js} +26 -21
- package/backend/dist/esm/backend/src/server.d.ts +485 -0
- package/backend/dist/esm/{server.js → backend/src/server.js} +891 -1441
- package/backend/dist/esm/backend/src/splash_screen.d.ts +80 -0
- package/backend/dist/esm/{splash_screen.js → backend/src/splash_screen.js} +42 -55
- package/backend/dist/esm/backend/src/status.d.ts +74 -0
- package/backend/dist/esm/backend/src/status.js +199 -0
- package/backend/dist/esm/backend/src/stream.d.ts +376 -0
- package/backend/dist/esm/{stream.js → backend/src/stream.js} +327 -292
- package/backend/dist/esm/backend/src/users.d.ts +809 -0
- package/backend/dist/esm/backend/src/users.js +2140 -0
- package/backend/dist/esm/backend/src/utils.d.ts +16 -0
- package/backend/dist/esm/{utils.js → backend/src/utils.js} +20 -81
- package/backend/dist/{cjs → esm/backend/src}/view.d.ts +33 -11
- package/backend/dist/esm/{view.js → backend/src/view.js} +266 -86
- package/backend/dist/{cjs → esm/backend/src}/volt.d.ts +10 -1
- package/backend/dist/esm/{volt.js → backend/src/volt.js} +7 -4
- package/backend/dist/esm/frontend/src/modules/request.d.ts +70 -0
- package/backend/dist/esm/frontend/src/modules/request.js +117 -0
- package/frontend/dist/backend/src/database/collection.d.ts +1543 -0
- package/frontend/dist/backend/src/database/collection.js +3510 -0
- package/frontend/dist/backend/src/database/database.d.ts +66 -0
- package/frontend/dist/backend/src/database/database.js +196 -0
- package/frontend/dist/backend/src/database/filters/filters.d.ts +6 -0
- package/frontend/dist/backend/src/database/filters/filters.js +1 -0
- package/frontend/dist/backend/src/database/filters/strict_filter.d.ts +223 -0
- package/frontend/dist/backend/src/database/filters/strict_filter.js +3 -0
- package/frontend/dist/backend/src/database/filters/strict_update_filter.d.ts +165 -0
- package/frontend/dist/backend/src/database/filters/strict_update_filter.js +5 -0
- package/frontend/dist/backend/src/database/flatten.d.ts +75 -0
- package/frontend/dist/backend/src/database/flatten.js +22 -0
- package/frontend/dist/backend/src/endpoint.d.ts +204 -0
- package/frontend/dist/backend/src/endpoint.js +570 -0
- package/frontend/dist/backend/src/errors/index.d.ts +7 -0
- package/frontend/dist/backend/src/errors/index.js +7 -0
- package/frontend/dist/backend/src/errors/internal_external.d.ts +38 -0
- package/frontend/dist/backend/src/errors/internal_external.js +70 -0
- package/frontend/dist/backend/src/errors/invalid_usage_error.d.ts +38 -0
- package/frontend/dist/backend/src/errors/invalid_usage_error.js +30 -0
- package/frontend/dist/backend/src/errors/system_error.d.ts +230 -0
- package/frontend/dist/backend/src/errors/system_error.js +402 -0
- package/frontend/dist/backend/src/events.d.ts +54 -0
- package/frontend/dist/backend/src/events.js +5 -0
- package/frontend/dist/backend/src/frontend.d.ts +11 -0
- package/frontend/dist/backend/src/frontend.js +12 -0
- package/frontend/dist/backend/src/image_endpoint.d.ts +39 -0
- package/frontend/dist/backend/src/image_endpoint.js +202 -0
- package/frontend/dist/backend/src/meta.d.ts +64 -0
- package/frontend/dist/backend/src/meta.js +110 -0
- package/frontend/dist/backend/src/payments/paddle.d.ts +326 -0
- package/frontend/dist/backend/src/payments/paddle.js +2256 -0
- package/frontend/dist/backend/src/plugins/mail/mail.d.ts +248 -0
- package/frontend/dist/backend/src/plugins/mail/mail.js +389 -0
- package/{backend/dist/esm/plugins/mail.d.ts → frontend/dist/backend/src/plugins/mail/ui.d.ts} +23 -0
- package/{backend/dist/esm/plugins/mail.js → frontend/dist/backend/src/plugins/mail/ui.js} +3 -6
- package/frontend/dist/backend/src/rate_limit.d.ts +145 -0
- package/frontend/dist/backend/src/rate_limit.js +673 -0
- package/frontend/dist/backend/src/route.d.ts +35 -0
- package/frontend/dist/backend/src/route.js +212 -0
- package/frontend/dist/backend/src/server.d.ts +485 -0
- package/frontend/dist/backend/src/server.js +2670 -0
- package/frontend/dist/backend/src/splash_screen.d.ts +80 -0
- package/frontend/dist/backend/src/splash_screen.js +135 -0
- package/frontend/dist/backend/src/status.d.ts +74 -0
- package/frontend/dist/backend/src/status.js +199 -0
- package/frontend/dist/backend/src/stream.d.ts +376 -0
- package/frontend/dist/backend/src/stream.js +1007 -0
- package/frontend/dist/backend/src/users.d.ts +807 -0
- package/frontend/dist/backend/src/users.js +2118 -0
- package/frontend/dist/backend/src/utils.d.ts +16 -0
- package/frontend/dist/backend/src/utils.js +241 -0
- package/frontend/dist/backend/src/view.d.ts +162 -0
- package/frontend/dist/backend/src/view.js +720 -0
- package/frontend/dist/frontend/src/elements/base.d.ts +4414 -0
- package/frontend/dist/{elements → frontend/src/elements}/base.js +3624 -260
- package/frontend/dist/frontend/src/elements/module.d.ts +95 -0
- package/frontend/dist/{elements → frontend/src/elements}/module.js +53 -52
- package/frontend/dist/frontend/src/elements/types.d.ts +52 -0
- package/frontend/dist/frontend/src/elements/types.js +5 -0
- package/frontend/dist/frontend/src/modules/attachment.d.ts +126 -0
- package/frontend/dist/frontend/src/modules/attachment.js +306 -0
- package/frontend/dist/frontend/src/modules/auth.d.ts +44 -0
- package/frontend/dist/frontend/src/modules/auth.js +80 -0
- package/frontend/dist/{modules → frontend/src/modules}/color.js +2 -2
- package/frontend/dist/frontend/src/modules/compression.d.ts +39 -0
- package/frontend/dist/frontend/src/modules/compression.js +102 -0
- package/frontend/dist/frontend/src/modules/cookies.d.ts +44 -0
- package/frontend/dist/frontend/src/modules/cookies.js +143 -0
- package/frontend/dist/frontend/src/modules/events.d.ts +31 -0
- package/frontend/dist/frontend/src/modules/events.js +74 -0
- package/frontend/dist/frontend/src/modules/google.d.ts +23 -0
- package/frontend/dist/frontend/src/modules/google.js +52 -0
- package/frontend/dist/frontend/src/modules/meta.d.ts +14 -0
- package/frontend/dist/{modules → frontend/src/modules}/meta.js +9 -7
- package/frontend/dist/{modules → frontend/src/modules}/paddle.d.ts +37 -134
- package/frontend/dist/{modules → frontend/src/modules}/paddle.js +620 -568
- package/frontend/dist/frontend/src/modules/request.d.ts +70 -0
- package/frontend/dist/frontend/src/modules/request.js +117 -0
- package/frontend/dist/frontend/src/modules/settings.d.ts +3 -0
- package/frontend/dist/frontend/src/modules/settings.js +5 -0
- package/frontend/dist/frontend/src/modules/statics.d.ts +21 -0
- package/frontend/dist/{modules → frontend/src/modules}/statics.js +15 -18
- package/frontend/dist/frontend/src/modules/support.d.ts +30 -0
- package/frontend/dist/frontend/src/modules/support.js +53 -0
- package/frontend/dist/{modules → frontend/src/modules}/theme.d.ts +67 -0
- package/frontend/dist/{modules → frontend/src/modules}/theme.js +68 -38
- package/frontend/dist/frontend/src/modules/themes.d.ts +12 -0
- package/frontend/dist/frontend/src/modules/themes.js +22 -0
- package/frontend/dist/frontend/src/modules/user.d.ts +164 -0
- package/frontend/dist/frontend/src/modules/user.js +268 -0
- package/frontend/dist/frontend/src/modules/utils.d.ts +176 -0
- package/frontend/dist/frontend/src/modules/utils.js +569 -0
- package/frontend/dist/frontend/src/types/gradient.d.ts +29 -0
- package/frontend/dist/{types → frontend/src/types}/gradient.js +14 -18
- package/frontend/dist/frontend/src/ui/border_button.d.ts +94 -0
- package/frontend/dist/{ui → frontend/src/ui}/border_button.js +7 -13
- package/frontend/dist/frontend/src/ui/button.d.ts +28 -0
- package/frontend/dist/{ui → frontend/src/ui}/button.js +21 -12
- package/frontend/dist/frontend/src/ui/canvas.d.ts +138 -0
- package/frontend/dist/{ui → frontend/src/ui}/canvas.js +88 -55
- package/frontend/dist/frontend/src/ui/checkbox.d.ts +74 -0
- package/frontend/dist/{ui → frontend/src/ui}/checkbox.js +80 -41
- package/frontend/dist/{ui → frontend/src/ui}/code.d.ts +73 -6
- package/frontend/dist/{ui → frontend/src/ui}/code.js +55 -52
- package/frontend/dist/{ui → frontend/src/ui}/context_menu.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/context_menu.js +12 -17
- package/frontend/dist/{ui → frontend/src/ui}/css.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/css.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/divider.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/divider.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/dropdown.d.ts +57 -2
- package/frontend/dist/{ui → frontend/src/ui}/dropdown.js +87 -94
- package/frontend/dist/{ui → frontend/src/ui}/for_each.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/for_each.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/form.d.ts +6 -2
- package/frontend/dist/{ui → frontend/src/ui}/form.js +10 -7
- package/frontend/dist/frontend/src/ui/frame_modes.d.ts +37 -0
- package/frontend/dist/{ui → frontend/src/ui}/frame_modes.js +16 -22
- package/frontend/dist/{ui → frontend/src/ui}/google_map.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/google_map.js +4 -4
- package/frontend/dist/{ui → frontend/src/ui}/gradient.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/gradient.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/image.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/image.js +5 -5
- package/frontend/dist/frontend/src/ui/input.d.ts +392 -0
- package/frontend/dist/{ui → frontend/src/ui}/input.js +346 -360
- package/frontend/dist/{ui → frontend/src/ui}/link.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/link.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/list.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/list.js +12 -6
- package/frontend/dist/frontend/src/ui/loader_button.d.ts +80 -0
- package/frontend/dist/{ui → frontend/src/ui}/loader_button.js +35 -47
- package/frontend/dist/frontend/src/ui/loaders.d.ts +57 -0
- package/frontend/dist/{ui → frontend/src/ui}/loaders.js +11 -11
- package/frontend/dist/{ui → frontend/src/ui}/popup.d.ts +11 -6
- package/frontend/dist/{ui → frontend/src/ui}/popup.js +32 -18
- package/frontend/dist/frontend/src/ui/pseudo.d.ts +44 -0
- package/frontend/dist/{ui → frontend/src/ui}/pseudo.js +84 -8
- package/frontend/dist/{ui → frontend/src/ui}/scroller.d.ts +14 -2
- package/frontend/dist/{ui → frontend/src/ui}/scroller.js +37 -43
- package/frontend/dist/{ui → frontend/src/ui}/slider.d.ts +5 -1
- package/frontend/dist/{ui → frontend/src/ui}/slider.js +4 -4
- package/frontend/dist/{ui → frontend/src/ui}/spacer.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/spacer.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/span.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/span.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/stack.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/stack.js +3 -9
- package/frontend/dist/frontend/src/ui/steps.d.ts +131 -0
- package/frontend/dist/{ui → frontend/src/ui}/steps.js +30 -45
- package/frontend/dist/{ui → frontend/src/ui}/style.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/style.js +3 -3
- package/frontend/dist/{ui → frontend/src/ui}/switch.d.ts +5 -1
- package/frontend/dist/{ui → frontend/src/ui}/switch.js +4 -4
- package/frontend/dist/{ui → frontend/src/ui}/table.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/table.js +6 -6
- package/frontend/dist/{ui → frontend/src/ui}/tabs.d.ts +45 -3
- package/frontend/dist/{ui → frontend/src/ui}/tabs.js +65 -40
- package/frontend/dist/{ui → frontend/src/ui}/text.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/text.js +3 -3
- package/frontend/dist/frontend/src/ui/title.d.ts +91 -0
- package/frontend/dist/frontend/src/ui/title.js +272 -0
- package/frontend/dist/{ui → frontend/src/ui}/view.d.ts +4 -0
- package/frontend/dist/{ui → frontend/src/ui}/view.js +3 -3
- package/frontend/dist/{volt.d.ts → frontend/src/volt.d.ts} +3 -0
- package/frontend/dist/{volt.js → frontend/src/volt.js} +4 -0
- package/frontend/tools/bundle_d_ts.js +71 -0
- package/frontend/tools/convert_to_jsdoc_input.txt +9452 -0
- package/frontend/tools/convert_to_jsdoc_output.txt +7626 -0
- package/frontend/tools/convert_to_jsdoc_tmp.js +345 -0
- package/package.json +11 -12
- package/backend/dist/cjs/database/collection.d.ts +0 -160
- package/backend/dist/cjs/database/collection.js +0 -842
- package/backend/dist/cjs/database/database.d.ts +0 -121
- package/backend/dist/cjs/database/document.d.ts +0 -131
- package/backend/dist/cjs/database/document.js +0 -224
- package/backend/dist/cjs/database.d.ts +0 -502
- package/backend/dist/cjs/database.js +0 -2248
- package/backend/dist/cjs/logger.d.ts +0 -3
- package/backend/dist/cjs/meta.d.ts +0 -50
- package/backend/dist/cjs/mutex.d.ts +0 -24
- package/backend/dist/cjs/payments/paddle.d.ts +0 -160
- package/backend/dist/cjs/plugins/browser.d.ts +0 -36
- package/backend/dist/cjs/plugins/browser.js +0 -198
- package/backend/dist/cjs/plugins/css.d.ts +0 -11
- package/backend/dist/cjs/plugins/css.js +0 -80
- package/backend/dist/cjs/plugins/mail.d.ts +0 -277
- package/backend/dist/cjs/plugins/mail.js +0 -1370
- package/backend/dist/cjs/plugins/ts/compiler.d.ts +0 -139
- package/backend/dist/cjs/plugins/ts/compiler.js +0 -750
- package/backend/dist/cjs/plugins/ts/preprocessing.d.ts +0 -14
- package/backend/dist/cjs/plugins/ts/preprocessing.js +0 -440
- package/backend/dist/cjs/rate_limit.d.ts +0 -63
- package/backend/dist/cjs/rate_limit.js +0 -348
- package/backend/dist/cjs/request.deprc.d.ts +0 -48
- package/backend/dist/cjs/request.deprc.js +0 -572
- package/backend/dist/cjs/response.deprc.d.ts +0 -55
- package/backend/dist/cjs/response.deprc.js +0 -275
- package/backend/dist/cjs/server.d.ts +0 -342
- package/backend/dist/cjs/splash_screen.d.ts +0 -35
- package/backend/dist/cjs/status.d.ts +0 -61
- package/backend/dist/cjs/stream.d.ts +0 -79
- package/backend/dist/cjs/users.d.ts +0 -111
- package/backend/dist/cjs/users.js +0 -1817
- package/backend/dist/cjs/view.js +0 -352
- package/backend/dist/cjs/vinc.dev.d.ts +0 -3
- package/backend/dist/cjs/vinc.dev.js +0 -7
- package/backend/dist/css/adyen.css +0 -92
- package/backend/dist/css/volt.css +0 -70
- package/backend/dist/esm/database/collection.d.ts +0 -160
- package/backend/dist/esm/database/collection.js +0 -1328
- package/backend/dist/esm/database/database.d.ts +0 -121
- package/backend/dist/esm/database/document.d.ts +0 -131
- package/backend/dist/esm/database/document.js +0 -247
- package/backend/dist/esm/database.d.ts +0 -502
- package/backend/dist/esm/database.js +0 -2423
- package/backend/dist/esm/file_watcher.js +0 -329
- package/backend/dist/esm/logger.d.ts +0 -3
- package/backend/dist/esm/logger.js +0 -11
- package/backend/dist/esm/meta.d.ts +0 -50
- package/backend/dist/esm/mutex.d.ts +0 -24
- package/backend/dist/esm/mutex.js +0 -48
- package/backend/dist/esm/payments/paddle.d.ts +0 -160
- package/backend/dist/esm/plugins/browser.d.ts +0 -36
- package/backend/dist/esm/plugins/browser.js +0 -176
- package/backend/dist/esm/plugins/css.d.ts +0 -11
- package/backend/dist/esm/plugins/css.js +0 -90
- package/backend/dist/esm/plugins/ts/compiler.d.ts +0 -139
- package/backend/dist/esm/plugins/ts/compiler.js +0 -1194
- package/backend/dist/esm/plugins/ts/preprocessing.d.ts +0 -14
- package/backend/dist/esm/plugins/ts/preprocessing.js +0 -726
- package/backend/dist/esm/rate_limit.d.ts +0 -63
- package/backend/dist/esm/rate_limit.js +0 -417
- package/backend/dist/esm/request.deprc.d.ts +0 -48
- package/backend/dist/esm/request.deprc.js +0 -572
- package/backend/dist/esm/response.deprc.d.ts +0 -55
- package/backend/dist/esm/response.deprc.js +0 -275
- package/backend/dist/esm/server.d.ts +0 -342
- package/backend/dist/esm/splash_screen.d.ts +0 -35
- package/backend/dist/esm/status.d.ts +0 -61
- package/backend/dist/esm/status.js +0 -197
- package/backend/dist/esm/stream.d.ts +0 -79
- package/backend/dist/esm/users.d.ts +0 -111
- package/backend/dist/esm/users.js +0 -1935
- package/backend/dist/esm/vinc.dev.d.ts +0 -3
- package/backend/dist/esm/vinc.dev.js +0 -7
- package/frontend/dist/elements/base.d.ts +0 -9889
- package/frontend/dist/elements/module.d.ts +0 -30
- package/frontend/dist/modules/array.d.ts +0 -94
- package/frontend/dist/modules/array.js +0 -634
- package/frontend/dist/modules/auth.d.ts +0 -46
- package/frontend/dist/modules/auth.js +0 -139
- package/frontend/dist/modules/colors.d.ts +0 -1
- package/frontend/dist/modules/colors.js +0 -417
- package/frontend/dist/modules/compression.d.ts +0 -6
- package/frontend/dist/modules/compression.js +0 -999
- package/frontend/dist/modules/cookies.d.ts +0 -18
- package/frontend/dist/modules/cookies.js +0 -167
- package/frontend/dist/modules/date.d.ts +0 -142
- package/frontend/dist/modules/date.js +0 -493
- package/frontend/dist/modules/events.d.ts +0 -8
- package/frontend/dist/modules/events.js +0 -91
- package/frontend/dist/modules/google.d.ts +0 -11
- package/frontend/dist/modules/google.js +0 -54
- package/frontend/dist/modules/meta.d.ts +0 -10
- package/frontend/dist/modules/mutex.d.ts +0 -7
- package/frontend/dist/modules/mutex.js +0 -51
- package/frontend/dist/modules/number.d.ts +0 -16
- package/frontend/dist/modules/number.js +0 -23
- package/frontend/dist/modules/object.d.ts +0 -52
- package/frontend/dist/modules/object.js +0 -383
- package/frontend/dist/modules/scheme.d.ts +0 -227
- package/frontend/dist/modules/scheme.js +0 -531
- package/frontend/dist/modules/settings.d.ts +0 -3
- package/frontend/dist/modules/settings.js +0 -4
- package/frontend/dist/modules/statics.d.ts +0 -5
- package/frontend/dist/modules/string.d.ts +0 -124
- package/frontend/dist/modules/string.js +0 -745
- package/frontend/dist/modules/support.d.ts +0 -19
- package/frontend/dist/modules/support.js +0 -103
- package/frontend/dist/modules/themes.d.ts +0 -8
- package/frontend/dist/modules/themes.js +0 -18
- package/frontend/dist/modules/user.d.ts +0 -59
- package/frontend/dist/modules/user.js +0 -280
- package/frontend/dist/modules/utils.d.ts +0 -87
- package/frontend/dist/modules/utils.js +0 -923
- package/frontend/dist/types/gradient.d.ts +0 -12
- package/frontend/dist/ui/border_button.d.ts +0 -152
- package/frontend/dist/ui/button.d.ts +0 -21
- package/frontend/dist/ui/canvas.d.ts +0 -56
- package/frontend/dist/ui/checkbox.d.ts +0 -52
- package/frontend/dist/ui/frame_modes.d.ts +0 -25
- package/frontend/dist/ui/input.d.ts +0 -241
- package/frontend/dist/ui/loader_button.d.ts +0 -93
- package/frontend/dist/ui/loaders.d.ts +0 -57
- package/frontend/dist/ui/pseudo.d.ts +0 -16
- package/frontend/dist/ui/steps.d.ts +0 -59
- package/frontend/dist/ui/title.d.ts +0 -21
- package/frontend/dist/ui/title.js +0 -121
- package/frontend/examples/dashboard/dashboard.ts +0 -776
- /package/backend/dist/cjs/{cli.d.ts → backend/src/cli.d.ts} +0 -0
- /package/backend/dist/cjs/{file_watcher.d.ts → backend/src/database/document.d.ts} +0 -0
- /package/backend/dist/cjs/{file_watcher.js → backend/src/database/document.js} +0 -0
- /package/backend/dist/cjs/{plugins/pdf.d.ts → backend/src/database/filters/strict_filter_test.d.ts} +0 -0
- /package/backend/dist/{esm/file_watcher.d.ts → cjs/backend/src/database/filters/strict_filter_test_v0.d.ts} +0 -0
- /package/backend/dist/{esm/plugins/pdf.d.ts → cjs/backend/src/database/flatten_test.d.ts} +0 -0
- /package/backend/dist/cjs/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.d.ts +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.js +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/mail/ui.js +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/pdf.js +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
- /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
- /package/backend/dist/cjs/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
- /package/backend/dist/cjs/{vinc.js → backend/src/vinc.js} +0 -0
- /package/backend/dist/esm/{cli.d.ts → backend/src/cli.d.ts} +0 -0
- /package/backend/dist/esm/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
- /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.d.ts +0 -0
- /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.js +0 -0
- /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
- /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
- /package/backend/dist/esm/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
- /package/backend/dist/esm/{vinc.js → backend/src/vinc.js} +0 -0
- /package/frontend/dist/{elements → frontend/src/elements}/register_element.d.ts +0 -0
- /package/frontend/dist/{elements → frontend/src/elements}/register_element.js +0 -0
- /package/frontend/dist/{modules → frontend/src/modules}/color.d.ts +0 -0
- /package/frontend/dist/{ui → frontend/src/ui}/ui.d.ts +0 -0
- /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
|
+
}
|