divhunt 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +86 -0
- package/addons/core/clients/LICENSE.txt +40 -0
- package/addons/core/clients/README.md +123 -0
- package/addons/core/clients/back/grpc/addon.js +25 -0
- package/addons/core/clients/back/grpc/item/catch/add.js +8 -0
- package/addons/core/clients/back/grpc/item/functions/connect.js +73 -0
- package/addons/core/clients/back/grpc/item/functions/resolve.js +41 -0
- package/addons/core/clients/back/grpc/item/functions/stream.js +103 -0
- package/addons/core/clients/back/grpc/load.js +11 -0
- package/addons/core/clients/back/grpc/service.proto +20 -0
- package/addons/core/clients/back/http/addon.js +21 -0
- package/addons/core/clients/back/http/item/catch/add.js +18 -0
- package/addons/core/clients/back/http/item/functions/gRPC/create.js +192 -0
- package/addons/core/clients/back/http/item/functions/gRPC/execute.js +15 -0
- package/addons/core/clients/back/http/item/functions/http/create.js +143 -0
- package/addons/core/clients/back/http/item/functions/http/delete.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/get.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/post.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/put.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/request.js +15 -0
- package/addons/core/clients/back/http/load.js +17 -0
- package/addons/core/commands/LICENSE.txt +40 -0
- package/addons/core/commands/README.md +294 -0
- package/addons/core/commands/back/addon.js +31 -0
- package/addons/core/commands/back/functions/find.js +54 -0
- package/addons/core/commands/back/functions/grpc/client.js +155 -0
- package/addons/core/commands/back/functions/grpc/server.js +71 -0
- package/addons/core/commands/back/functions/http/server.js +91 -0
- package/addons/core/commands/back/item/functions/run.js +82 -0
- package/addons/core/commands/back/items/many.js +76 -0
- package/addons/core/commands/back/items/one.js +78 -0
- package/addons/core/commands/back/items/run.js +51 -0
- package/addons/core/commands/back/load.js +20 -0
- package/addons/core/commands/front/#register/addon.js +11 -0
- package/addons/core/commands/front/functions/find.js +24 -0
- package/addons/core/commands/front/item/functions/run.js +98 -0
- package/addons/core/commands/front/items/elements/table/table.css +18 -0
- package/addons/core/commands/front/items/elements/table/table.js +254 -0
- package/addons/core/database/README.md +276 -0
- package/addons/core/database/back/addon.js +14 -0
- package/addons/core/database/back/events/addon.add.js +18 -0
- package/addons/core/database/back/events/middleware/addon.items.find.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.create.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.delete.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.update.js +24 -0
- package/addons/core/database/back/functions/create.js +6 -0
- package/addons/core/database/back/functions/delete.js +6 -0
- package/addons/core/database/back/functions/find/builder.js +160 -0
- package/addons/core/database/back/functions/find/count.js +12 -0
- package/addons/core/database/back/functions/find/filter.js +37 -0
- package/addons/core/database/back/functions/find/filters.js +7 -0
- package/addons/core/database/back/functions/find/many.js +93 -0
- package/addons/core/database/back/functions/find/methods.js +235 -0
- package/addons/core/database/back/functions/find/plain.js +25 -0
- package/addons/core/database/back/functions/find/validation.js +214 -0
- package/addons/core/database/back/functions/find.js +25 -0
- package/addons/core/database/back/functions/update.js +6 -0
- package/addons/core/database/back/item/catch/add.js +25 -0
- package/addons/core/database/back/item/functions/create.js +93 -0
- package/addons/core/database/back/item/functions/delete.js +25 -0
- package/addons/core/database/back/item/functions/find.js +19 -0
- package/addons/core/database/back/item/functions/save.js +15 -0
- package/addons/core/database/back/item/functions/transaction.js +17 -0
- package/addons/core/database/back/item/functions/update.js +76 -0
- package/addons/core/database/back/items/commands/expose.js +321 -0
- package/addons/core/database/back/load.js +68 -0
- package/addons/core/database/front/#register/addon.js +4 -0
- package/addons/core/database/front/events/addon.add.js +13 -0
- package/addons/core/database/front/functions/find.js +142 -0
- package/addons/core/queue/README.md +216 -0
- package/addons/core/queue/back/addon.js +21 -0
- package/addons/core/queue/back/functions/calculate/art.js +12 -0
- package/addons/core/queue/back/functions/calculate/rps.js +22 -0
- package/addons/core/queue/back/item/catch/add.js +6 -0
- package/addons/core/queue/back/item/catch/remove.js +6 -0
- package/addons/core/queue/back/item/functions/add.js +15 -0
- package/addons/core/queue/back/item/functions/start.js +135 -0
- package/addons/core/queue/back/load.js +12 -0
- package/addons/core/queue/index.js +66 -0
- package/addons/core/queue/package.json +13 -0
- package/addons/core/servers/README.md +85 -0
- package/addons/core/servers/back/grpc/addon.js +23 -0
- package/addons/core/servers/back/grpc/item/catch/add.js +6 -0
- package/addons/core/servers/back/grpc/item/functions/resolve.js +41 -0
- package/addons/core/servers/back/grpc/item/functions/start.js +65 -0
- package/addons/core/servers/back/grpc/item/functions/stream.js +68 -0
- package/addons/core/servers/back/grpc/load.js +9 -0
- package/addons/core/servers/back/grpc/service.proto +20 -0
- package/addons/core/servers/back/http/addon.js +15 -0
- package/addons/core/servers/back/http/functions/extract/data.js +232 -0
- package/addons/core/servers/back/http/item/catch/add.js +6 -0
- package/addons/core/servers/back/http/item/functions/start.js +135 -0
- package/addons/core/servers/back/http/load.js +8 -0
- package/addons/float/modals/front/css/modals.css +26 -0
- package/addons/float/modals/front/js/#register/addon.js +10 -0
- package/addons/float/modals/front/js/item/catch/add.js +48 -0
- package/addons/float/modals/front/js/item/catch/remove.js +9 -0
- package/addons/float/overlays/front/css/overlays.css +29 -0
- package/addons/float/overlays/front/js/#register/addon.js +17 -0
- package/addons/float/overlays/front/js/events/click.js +27 -0
- package/addons/float/overlays/front/js/events/escape.js +18 -0
- package/addons/float/overlays/front/js/functions/flip.js +74 -0
- package/addons/float/overlays/front/js/functions/index.js +17 -0
- package/addons/float/overlays/front/js/functions/position.js +63 -0
- package/addons/float/overlays/front/js/item/catch/add.js +121 -0
- package/addons/float/overlays/front/js/item/catch/remove.js +16 -0
- package/addons/float/popups/css/popups.css +4 -0
- package/addons/float/popups/js/#register/addon.js +18 -0
- package/addons/float/popups/js/item/catch/add.js +7 -0
- package/addons/float/popups/js/item/catch/remove.js +7 -0
- package/addons/float/popups/js/item/catch/set.js +73 -0
- package/addons/float/popups/js/items/directives/popup.js +54 -0
- package/addons/float/toasts/#register/addon.js +17 -0
- package/addons/float/toasts/item/catch/add.js +7 -0
- package/addons/float/toasts/item/catch/remove.js +7 -0
- package/addons/float/toasts/item/catch/set.js +86 -0
- package/addons/float/toasts/items/elements/toast/toast.css +84 -0
- package/addons/float/toasts/items/elements/toast/toast.js +61 -0
- package/addons/float/tooltips/#register/addon.js +15 -0
- package/addons/float/tooltips/item/catch/add.js +7 -0
- package/addons/float/tooltips/item/catch/remove.js +26 -0
- package/addons/float/tooltips/item/catch/set.js +65 -0
- package/addons/float/tooltips/items/directives/tooltip.js +74 -0
- package/addons/float/tooltips/items/elements/tooltip.css +64 -0
- package/addons/float/tooltips/items/elements/tooltip.js +42 -0
- package/addons/modules/actions/front/addon.js +19 -0
- package/addons/modules/actions/front/functions/run.js +230 -0
- package/addons/modules/actions/front/load.js +5 -0
- package/addons/modules/bugs/front/addon.js +16 -0
- package/addons/modules/bugs/front/functions/clear.js +14 -0
- package/addons/modules/bugs/front/functions/push.js +15 -0
- package/addons/modules/bugs/front/functions/resolve.js +13 -0
- package/addons/modules/bugs/front/item/catch/add.js +9 -0
- package/addons/modules/bugs/front/load.js +9 -0
- package/addons/modules/events/front/addon.js +11 -0
- package/addons/modules/events/front/functions/clear.js +9 -0
- package/addons/modules/events/front/functions/emit.js +60 -0
- package/addons/modules/events/front/functions/off.js +23 -0
- package/addons/modules/events/front/functions/on.js +40 -0
- package/addons/modules/events/front/functions/once.js +6 -0
- package/addons/modules/events/front/load.js +9 -0
- package/addons/modules/schedules/back/addon.js +26 -0
- package/addons/modules/schedules/back/functions/disable.js +17 -0
- package/addons/modules/schedules/back/functions/enable.js +17 -0
- package/addons/modules/schedules/back/functions/next.js +142 -0
- package/addons/modules/schedules/back/functions/start.js +126 -0
- package/addons/modules/schedules/back/functions/stop.js +38 -0
- package/addons/modules/schedules/back/functions/trigger.js +134 -0
- package/addons/modules/schedules/back/items/create.js +82 -0
- package/addons/modules/schedules/back/items/delete.js +38 -0
- package/addons/modules/schedules/back/items/many.js +90 -0
- package/addons/modules/schedules/back/items/one.js +48 -0
- package/addons/modules/schedules/back/items/update.js +115 -0
- package/addons/modules/schedules/back/load.js +16 -0
- package/addons/modules/schedules/front/addon.js +23 -0
- package/addons/modules/schedules/front/functions/disable.js +17 -0
- package/addons/modules/schedules/front/functions/enable.js +17 -0
- package/addons/modules/schedules/front/functions/next.js +142 -0
- package/addons/modules/schedules/front/functions/start.js +126 -0
- package/addons/modules/schedules/front/functions/stop.js +38 -0
- package/addons/modules/schedules/front/functions/trigger.js +161 -0
- package/addons/modules/schedules/front/load.js +10 -0
- package/addons/modules/shortcuts/front/#register/addon.js +22 -0
- package/addons/modules/shortcuts/front/functions/context.js +13 -0
- package/addons/modules/shortcuts/front/functions/disable.js +15 -0
- package/addons/modules/shortcuts/front/functions/enable.js +15 -0
- package/addons/modules/shortcuts/front/functions/register.js +170 -0
- package/addons/modules/shortcuts/front/functions/trigger.js +140 -0
- package/addons/modules/shortcuts/front/functions/unregister.js +19 -0
- package/addons/modules/shortcuts/front/load.js +12 -0
- package/addons/modules/sources/back/addon.js +23 -0
- package/addons/modules/sources/back/functions/run.js +252 -0
- package/addons/modules/sources/back/items/create.js +74 -0
- package/addons/modules/sources/back/items/delete.js +36 -0
- package/addons/modules/sources/back/items/many.js +80 -0
- package/addons/modules/sources/back/items/one.js +46 -0
- package/addons/modules/sources/back/items/run.js +28 -0
- package/addons/modules/sources/back/items/update.js +110 -0
- package/addons/modules/sources/back/load.js +12 -0
- package/addons/modules/sources/front/addon.js +20 -0
- package/addons/modules/sources/front/functions/run.js +279 -0
- package/addons/modules/sources/front/load.js +5 -0
- package/addons/modules/variables/addon.js +12 -0
- package/addons/modules/variables/functions/filter.js +24 -0
- package/addons/modules/variables/functions/process.js +52 -0
- package/addons/modules/variables/item/catch/add.js +13 -0
- package/addons/modules/variables/load.js +8 -0
- package/addons/render/assets/back/README.md +1 -0
- package/addons/render/assets/back/addon.js +15 -0
- package/addons/render/assets/back/functions/css.js +32 -0
- package/addons/render/assets/back/functions/js.js +32 -0
- package/addons/render/assets/back/functions/scan/directories.js +38 -0
- package/addons/render/assets/back/functions/scan/files.js +58 -0
- package/addons/render/assets/back/functions/utils/read.js +26 -0
- package/addons/render/assets/back/functions/utils/transform.js +34 -0
- package/addons/render/assets/back/items/commands/css.js +20 -0
- package/addons/render/assets/back/items/commands/js.js +19 -0
- package/addons/render/assets/back/items/html/css.js +18 -0
- package/addons/render/assets/back/items/html/js.js +18 -0
- package/addons/render/assets/back/load.js +23 -0
- package/addons/render/directives/front/js/#register/addon.js +32 -0
- package/addons/render/directives/front/js/functions/process/attributes.js +47 -0
- package/addons/render/directives/front/js/functions/process/data.js +74 -0
- package/addons/render/directives/front/js/functions/process/match.js +43 -0
- package/addons/render/directives/front/js/functions/process.js +57 -0
- package/addons/render/directives/front/js/items/100-if.js +24 -0
- package/addons/render/directives/front/js/items/1000-render.js +36 -0
- package/addons/render/directives/front/js/items/110-show.js +25 -0
- package/addons/render/directives/front/js/items/160-slot.js +32 -0
- package/addons/render/directives/front/js/items/200-for.js +79 -0
- package/addons/render/directives/front/js/items/500-blur.js +46 -0
- package/addons/render/directives/front/js/items/500-change.js +53 -0
- package/addons/render/directives/front/js/items/500-click-outside.js +50 -0
- package/addons/render/directives/front/js/items/500-click.js +52 -0
- package/addons/render/directives/front/js/items/500-double-click.js +52 -0
- package/addons/render/directives/front/js/items/500-focus.js +46 -0
- package/addons/render/directives/front/js/items/500-input.js +46 -0
- package/addons/render/directives/front/js/items/500-keydown.js +53 -0
- package/addons/render/directives/front/js/items/500-keyup.js +53 -0
- package/addons/render/directives/front/js/items/500-mouse-enter.js +61 -0
- package/addons/render/directives/front/js/items/500-mouse-leave.js +61 -0
- package/addons/render/directives/front/js/items/500-mouse-move.js +45 -0
- package/addons/render/directives/front/js/items/500-scroll.js +45 -0
- package/addons/render/directives/front/js/items/500-submit.js +52 -0
- package/addons/render/directives/front/js/items/650-fetch.js +189 -0
- package/addons/render/directives/front/js/items/660-form.js +291 -0
- package/addons/render/directives/front/js/items/700-text.js +50 -0
- package/addons/render/directives/front/js/items/750-html.js +44 -0
- package/addons/render/elements/front/#register/addon.js +12 -0
- package/addons/render/elements/front/item/catch/add.js +9 -0
- package/addons/render/elements/front/items/directives/element.js +76 -0
- package/addons/render/elements/front/items/self/base/menu/menu.js +96 -0
- package/addons/render/elements/front/items/self/base/menu/styles/base.css +116 -0
- package/addons/render/elements/front/items/self/base/menu/styles/sizes.css +27 -0
- package/addons/render/elements/front/items/self/base/menu/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/base/tag/tag.css +199 -0
- package/addons/render/elements/front/items/self/base/tag/tag.js +37 -0
- package/addons/render/elements/front/items/self/cards/basic/basic.js +89 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/base.css +66 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/sizes.css +32 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/cards/list/list.js +108 -0
- package/addons/render/elements/front/items/self/cards/list/styles/base.css +96 -0
- package/addons/render/elements/front/items/self/cards/list/styles/sizes.css +32 -0
- package/addons/render/elements/front/items/self/cards/list/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/cards/media/media.js +116 -0
- package/addons/render/elements/front/items/self/cards/media/styles/base.css +126 -0
- package/addons/render/elements/front/items/self/cards/media/styles/sizes.css +49 -0
- package/addons/render/elements/front/items/self/cards/media/styles/variants.css +74 -0
- package/addons/render/elements/front/items/self/cards/profile/profile.js +95 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/base.css +142 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/sizes.css +43 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/variants.css +131 -0
- package/addons/render/elements/front/items/self/cards/stat/stat.js +117 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/base.css +97 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/sizes.css +49 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/variants.css +124 -0
- package/addons/render/elements/front/items/self/content/html/html.css +93 -0
- package/addons/render/elements/front/items/self/content/html/html.js +40 -0
- package/addons/render/elements/front/items/self/content/markdown/markdown.css +200 -0
- package/addons/render/elements/front/items/self/content/markdown/markdown.js +120 -0
- package/addons/render/elements/front/items/self/data/comments/comments.css +253 -0
- package/addons/render/elements/front/items/self/data/comments/comments.js +134 -0
- package/addons/render/elements/front/items/self/data/files/files.css +116 -0
- package/addons/render/elements/front/items/self/data/files/files.js +85 -0
- package/addons/render/elements/front/items/self/data/folders/folders.css +104 -0
- package/addons/render/elements/front/items/self/data/folders/folders.js +73 -0
- package/addons/render/elements/front/items/self/data/inbox/inbox.css +225 -0
- package/addons/render/elements/front/items/self/data/inbox/inbox.js +111 -0
- package/addons/render/elements/front/items/self/data/logs/logs.css +133 -0
- package/addons/render/elements/front/items/self/data/logs/logs.js +65 -0
- package/addons/render/elements/front/items/self/data/plans/plans.css +231 -0
- package/addons/render/elements/front/items/self/data/plans/plans.js +104 -0
- package/addons/render/elements/front/items/self/data/properties/properties.css +108 -0
- package/addons/render/elements/front/items/self/data/properties/properties.js +156 -0
- package/addons/render/elements/front/items/self/data/table/table.css +153 -0
- package/addons/render/elements/front/items/self/data/table/table.js +106 -0
- package/addons/render/elements/front/items/self/data/timeline/timeline.css +127 -0
- package/addons/render/elements/front/items/self/data/timeline/timeline.js +57 -0
- package/addons/render/elements/front/items/self/feedback/alert/alert.css +258 -0
- package/addons/render/elements/front/items/self/feedback/alert/alert.js +67 -0
- package/addons/render/elements/front/items/self/feedback/confirm/confirm.css +229 -0
- package/addons/render/elements/front/items/self/feedback/confirm/confirm.js +81 -0
- package/addons/render/elements/front/items/self/feedback/loader/loader.css +203 -0
- package/addons/render/elements/front/items/self/feedback/loader/loader.js +25 -0
- package/addons/render/elements/front/items/self/feedback/progress/progress.css +136 -0
- package/addons/render/elements/front/items/self/feedback/progress/progress.js +40 -0
- package/addons/render/elements/front/items/self/form/button/button.js +105 -0
- package/addons/render/elements/front/items/self/form/button/styles/base.css +176 -0
- package/addons/render/elements/front/items/self/form/button/styles/sizes.css +78 -0
- package/addons/render/elements/front/items/self/form/button/styles/variants.css +421 -0
- package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +57 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/base.css +52 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/sizes.css +39 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/variants.css +121 -0
- package/addons/render/elements/front/items/self/form/field/field.css +96 -0
- package/addons/render/elements/front/items/self/form/field/field.js +39 -0
- package/addons/render/elements/front/items/self/form/input/input.css +111 -0
- package/addons/render/elements/front/items/self/form/input/input.js +78 -0
- package/addons/render/elements/front/items/self/form/input/styles/base.css +26 -0
- package/addons/render/elements/front/items/self/form/input/styles/sizes.css +15 -0
- package/addons/render/elements/front/items/self/form/input/styles/variants.css +98 -0
- package/addons/render/elements/front/items/self/form/radio/radio.js +57 -0
- package/addons/render/elements/front/items/self/form/radio/styles/base.css +48 -0
- package/addons/render/elements/front/items/self/form/radio/styles/sizes.css +36 -0
- package/addons/render/elements/front/items/self/form/radio/styles/variants.css +121 -0
- package/addons/render/elements/front/items/self/form/rating/rating.css +95 -0
- package/addons/render/elements/front/items/self/form/rating/rating.js +88 -0
- package/addons/render/elements/front/items/self/form/section/section.css +107 -0
- package/addons/render/elements/front/items/self/form/section/section.js +39 -0
- package/addons/render/elements/front/items/self/form/slider/slider.css +244 -0
- package/addons/render/elements/front/items/self/form/slider/slider.js +69 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.css +117 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.js +69 -0
- package/addons/render/elements/front/items/self/layout/empty/empty.css +154 -0
- package/addons/render/elements/front/items/self/layout/empty/empty.js +43 -0
- package/addons/render/elements/front/items/self/layout/heading/heading.css +117 -0
- package/addons/render/elements/front/items/self/layout/heading/heading.js +47 -0
- package/addons/render/elements/front/items/self/layout/hero/hero.js +88 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/base.css +81 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/sizes.css +24 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/variants.css +98 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/_class/addon.js +9 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/functions/get.js +22 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.css +13 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.js +51 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/_class/addon.js +11 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/functions/columns.js +11 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/functions/get.js +34 -0
- package/addons/render/elements/front/items/self/navigation/footer/footer.css +283 -0
- package/addons/render/elements/front/items/self/navigation/footer/footer.js +139 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/_class/addon.js +13 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/active.js +7 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/get.js +31 -0
- package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +140 -0
- package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +118 -0
- package/addons/render/elements/front/items/self/navigation/pagination/pagination.css +160 -0
- package/addons/render/elements/front/items/self/navigation/pagination/pagination.js +131 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/_class/addon.js +12 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/active.js +7 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/get.js +35 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/groups.js +10 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +278 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +85 -0
- package/addons/render/elements/front/items/self/navigation/stepper/stepper.css +202 -0
- package/addons/render/elements/front/items/self/navigation/stepper/stepper.js +82 -0
- package/addons/render/elements/front/items/self/navigation/tabs/addon.js +32 -0
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +239 -0
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +76 -0
- package/addons/render/elements/front/items/self/preview/html/html.css +377 -0
- package/addons/render/elements/front/items/self/preview/html/html.js +107 -0
- package/addons/render/html/addon.js +13 -0
- package/addons/render/html/functions/render.js +85 -0
- package/addons/render/html/item/functions/render.js +66 -0
- package/addons/render/html/items/assets/favicon.js +12 -0
- package/addons/render/html/items/fonts/outfit.js +12 -0
- package/addons/render/html/items/fonts/preconnect.js +24 -0
- package/addons/render/html/items/meta/charset.js +11 -0
- package/addons/render/html/items/meta/description.js +12 -0
- package/addons/render/html/items/meta/title.js +9 -0
- package/addons/render/html/items/meta/viewport.js +12 -0
- package/addons/render/html/items/seo/robots.js +12 -0
- package/addons/render/html/items/seo/theme-color.js +12 -0
- package/addons/render/html/load.js +26 -0
- package/addons/render/items/js/#register/addon.js +14 -0
- package/addons/render/items/js/functions/count.js +9 -0
- package/addons/render/items/js/functions/get.js +34 -0
- package/addons/render/items/js/functions/groups.js +16 -0
- package/addons/render/items/js/functions/render.js +44 -0
- package/addons/render/items/js/item/catch/add.js +18 -0
- package/addons/render/pages/front/css/page.css +17 -0
- package/addons/render/pages/front/js/#register/addon.js +29 -0
- package/addons/render/pages/front/js/events/click.js +27 -0
- package/addons/render/pages/front/js/events/load.js +25 -0
- package/addons/render/pages/front/js/functions/change.js +119 -0
- package/addons/render/pages/front/js/functions/match.js +34 -0
- package/addons/render/pages/front/js/functions/open.js +19 -0
- package/addons/render/pages/front/js/item/catch/add.js +24 -0
- package/addons/render/pages/front/js/item/catch/remove.js +17 -0
- package/addons/render/pages/front/js/item/functions/enter.js +45 -0
- package/addons/render/pages/front/js/item/functions/leave.js +27 -0
- package/addons/render/pages/front/js/item/functions/render.js +33 -0
- package/addons/render/pages/front/js/items/commands/change.js +41 -0
- package/addons/render/pages/front/js/items/shortcuts/home.js +9 -0
- package/addons/render/pages/front/js/items/shortcuts/login.js +9 -0
- package/addons/render/tags/addon.js +11 -0
- package/addons/render/tags/functions/groups.js +13 -0
- package/addons/render/tags/functions/validate.js +51 -0
- package/addons/render/tags/items/block.js +131 -0
- package/addons/render/tags/items/form.js +112 -0
- package/addons/render/tags/items/media.js +64 -0
- package/addons/render/tags/items/meta.js +28 -0
- package/addons/render/tags/items/semantic.js +114 -0
- package/addons/render/tags/items/table.js +92 -0
- package/addons/render/tags/items/text-inline.js +215 -0
- package/addons/render/tags/load.js +16 -0
- package/addons/render/transforms/front/js/#register/addon.js +11 -0
- package/addons/render/transforms/front/js/functions/load/assets.js +49 -0
- package/addons/render/transforms/front/js/items/directives/transform.js +40 -0
- package/addons/render/transforms/front/js/items/self/accordion.js +174 -0
- package/addons/render/transforms/front/js/items/self/chart/area.js +156 -0
- package/addons/render/transforms/front/js/items/self/chart/bar.js +140 -0
- package/addons/render/transforms/front/js/items/self/chart/bubble.js +169 -0
- package/addons/render/transforms/front/js/items/self/chart/doughnut.js +127 -0
- package/addons/render/transforms/front/js/items/self/chart/line.js +152 -0
- package/addons/render/transforms/front/js/items/self/chart/pie.js +125 -0
- package/addons/render/transforms/front/js/items/self/chart/radar.js +157 -0
- package/addons/render/transforms/front/js/items/self/chart/scatter.js +152 -0
- package/addons/render/transforms/front/js/items/self/codeflask.js +99 -0
- package/addons/render/transforms/front/js/items/self/codemirror.js +231 -0
- package/addons/render/transforms/front/js/items/self/comparison.js +142 -0
- package/addons/render/transforms/front/js/items/self/heatmap.js +494 -0
- package/addons/render/transforms/front/js/items/self/interact.js +277 -0
- package/addons/render/transforms/front/js/items/self/particles.js +329 -0
- package/addons/render/transforms/front/js/items/self/sparkline.js +240 -0
- package/addons/render/transforms/front/js/items/self/swiper.js +143 -0
- package/addons/render/transforms/front/js/items/self/tabs.js +460 -0
- package/addons/render/transforms/front/js/items/self/typed.js +173 -0
- package/docs/addons.md +281 -0
- package/docs/architecture.md +190 -0
- package/docs/commands.md +308 -0
- package/docs/database.md +171 -0
- package/docs/frontend.md +379 -0
- package/docs/servers.md +133 -0
- package/lib/LICENSE.txt +40 -0
- package/lib/README.md +132 -0
- package/lib/browser.js +26 -0
- package/lib/events.js +108 -0
- package/lib/load.js +39 -0
- package/lib/src/classes/addon/class.js +86 -0
- package/lib/src/classes/addon/classes/item/class.js +27 -0
- package/lib/src/classes/addon/classes/item/mixins/crud.js +30 -0
- package/lib/src/classes/addon/classes/item/mixins/functions.js +11 -0
- package/lib/src/classes/addon/classes/item/mixins/get.js +78 -0
- package/lib/src/classes/addon/classes/item/mixins/remove.js +11 -0
- package/lib/src/classes/addon/classes/item/mixins/set.js +69 -0
- package/lib/src/classes/addon/classes/item/mixins/store.js +58 -0
- package/lib/src/classes/addon/classes/render/class.js +117 -0
- package/lib/src/classes/addon/classes/render/mixins/compile.js +91 -0
- package/lib/src/classes/addon/classes/render/mixins/dom.js +18 -0
- package/lib/src/classes/addon/classes/render/mixins/events.js +152 -0
- package/lib/src/classes/addon/classes/render/mixins/get.js +56 -0
- package/lib/src/classes/addon/classes/render/mixins/methods.js +191 -0
- package/lib/src/classes/addon/classes/render/mixins/process.js +88 -0
- package/lib/src/classes/addon/classes/render/mixins/set.js +36 -0
- package/lib/src/classes/addon/mixins/fields.js +85 -0
- package/lib/src/classes/addon/mixins/find.js +14 -0
- package/lib/src/classes/addon/mixins/functions.js +131 -0
- package/lib/src/classes/addon/mixins/get.js +11 -0
- package/lib/src/classes/addon/mixins/items.js +176 -0
- package/lib/src/classes/addon/mixins/remove.js +12 -0
- package/lib/src/classes/addon/mixins/render.js +57 -0
- package/lib/src/classes/addon/mixins/store.js +52 -0
- package/lib/src/classes/addon/mixins/table.js +37 -0
- package/lib/src/divhunt.js +84 -0
- package/lib/src/mixins/addons.js +150 -0
- package/lib/src/mixins/binaries.js +89 -0
- package/lib/src/mixins/data.js +312 -0
- package/lib/src/mixins/dependencies.js +99 -0
- package/lib/src/mixins/dom.js +167 -0
- package/lib/src/mixins/emitter.js +77 -0
- package/lib/src/mixins/function.js +82 -0
- package/lib/src/mixins/generate.js +73 -0
- package/lib/src/mixins/helper.js +317 -0
- package/lib/src/mixins/logger.js +75 -0
- package/lib/src/mixins/middleware.js +52 -0
- package/lib/src/mixins/overrides.js +37 -0
- package/lib/src/mixins/request.js +28 -0
- package/lib/src/mixins/route.js +191 -0
- package/lib/src/mixins/string.js +196 -0
- package/lib/src/mixins/validate.js +78 -0
- package/package.json +70 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Dejan Tomic
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Divhunt Framework
|
|
2
|
+
|
|
3
|
+
Full-stack isomorphic JavaScript framework built from scratch. No React, no Express, no Vue — original architecture from zero.
|
|
4
|
+
|
|
5
|
+
One universal abstraction — the **addon** — powers databases, servers, commands, pages, directives, queues, and more. Define an addon with fields, and you get: data validation, event system, middleware chains, CRUD with PostgreSQL, automatic API exposure, frontend reactivity, and DOM manipulation — all from a single definition.
|
|
6
|
+
|
|
7
|
+
Built by [Dejan Tomic](https://github.com/tomic-d). Powers multiple production applications including a cloud SaaS platform serving thousands of users, a travel agency website with 27 addons and 50+ frontend components, a distributed function execution gateway, and a multi-tenant CMS.
|
|
8
|
+
|
|
9
|
+
## Quick Look
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import divhunt from '#framework/load.js';
|
|
13
|
+
import database from '#database/load.js';
|
|
14
|
+
import commands from '#commands/load.js';
|
|
15
|
+
|
|
16
|
+
// Define an addon — typed, persistent, full CRUD
|
|
17
|
+
const users = divhunt.Addon('users', (addon) => {
|
|
18
|
+
addon.Table('users');
|
|
19
|
+
addon.Field('id', ['string']);
|
|
20
|
+
addon.Field('name', ['string', null, true]);
|
|
21
|
+
addon.Field('email', ['string', null, true]);
|
|
22
|
+
addon.Field('created_at', ['string']);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Connect database — all addons with Table() persist automatically
|
|
26
|
+
database.Item({
|
|
27
|
+
id: 'primary',
|
|
28
|
+
hostname: process.env.DB_HOSTNAME,
|
|
29
|
+
username: process.env.DB_USERNAME,
|
|
30
|
+
database: process.env.DB_DATABASE,
|
|
31
|
+
password: process.env.DB_PASSWORD
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Start HTTP server
|
|
35
|
+
commands.Fn('http.server', 3000, {
|
|
36
|
+
onStart: () => console.log('Server started on port 3000')
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Define an API endpoint with typed input/output
|
|
40
|
+
divhunt.AddonReady('commands', (commands) => {
|
|
41
|
+
commands.Item({
|
|
42
|
+
id: 'users:get:many',
|
|
43
|
+
method: 'GET',
|
|
44
|
+
endpoint: '/api/users',
|
|
45
|
+
exposed: true,
|
|
46
|
+
callback: async function(properties, resolve) {
|
|
47
|
+
const items = await users.Find()
|
|
48
|
+
.sort('created_at', 'desc')
|
|
49
|
+
.page(properties.page || 1)
|
|
50
|
+
.limit(properties.limit || 20)
|
|
51
|
+
.many();
|
|
52
|
+
|
|
53
|
+
resolve({
|
|
54
|
+
users: items.map(u => u.Get(['id', 'name', 'email', 'created_at']))
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Documentation
|
|
62
|
+
|
|
63
|
+
| Topic | What's covered |
|
|
64
|
+
|---|---|
|
|
65
|
+
| [Addons](docs/addons.md) | Addon definition, fields, functions, lifecycle events, preloading |
|
|
66
|
+
| [Database](docs/database.md) | Connection, fluent ORM, query builder, 17+ operators, joins |
|
|
67
|
+
| [Commands](docs/commands.md) | API endpoints, typed input/output, CRUD patterns, dynamic registration |
|
|
68
|
+
| [Servers](docs/servers.md) | HTTP setup, gRPC streaming, binary transport, Store API |
|
|
69
|
+
| [Frontend](docs/frontend.md) | Pages, components, directives, asset bundling, reactivity |
|
|
70
|
+
| [Architecture](docs/architecture.md) | File structure, design decisions, mixin composition |
|
|
71
|
+
|
|
72
|
+
## Install
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npm install divhunt
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Requires Node.js >= 18.
|
|
79
|
+
|
|
80
|
+
## Origin
|
|
81
|
+
|
|
82
|
+
Originally built as the core of [Divhunt](https://divhunt.com), a cloud SaaS platform. The framework (v1) powered the entire platform — backend and frontend — serving thousands of users for 4+ years. This is v2: rebuilt with Proxy-based reactivity, improved addon architecture, gRPC transport, and a complete render system.
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Copyright © 2025 Divhunt GmbH
|
|
2
|
+
|
|
3
|
+
This License governs use of the Divhunt framework (the "Software"). By accessing or using the Software, you agree to be bound by the terms of this License.
|
|
4
|
+
|
|
5
|
+
1. GRANT OF LICENSE
|
|
6
|
+
You are granted a limited, non-exclusive, non-transferable, non-sublicensable license to use the Software solely for:
|
|
7
|
+
- personal projects;
|
|
8
|
+
- internal business purposes;
|
|
9
|
+
- client work, provided the client is not reselling or redistributing the Software.
|
|
10
|
+
|
|
11
|
+
2. ATTRIBUTION AND BRANDING
|
|
12
|
+
a. All uses of the Software must retain visible attribution to “Divhunt”.
|
|
13
|
+
b. You must not remove, obscure, alter, or suppress any branding, notices, or credits related to Divhunt.
|
|
14
|
+
c. Any public project using the Software must clearly state that it uses the “Divhunt Framework”.
|
|
15
|
+
|
|
16
|
+
3. PROHIBITED USES
|
|
17
|
+
The following are strictly prohibited:
|
|
18
|
+
a. Rebranding, renaming, or representing the Software as your own work;
|
|
19
|
+
b. Creating derivative frameworks or similar software tools based on the Software with the intent of distribution;
|
|
20
|
+
c. Redistributing, sublicensing, or selling the Software or any modified version thereof;
|
|
21
|
+
d. Using the Software in any commercial product, service, or offering without explicit, written permission from Divhunt GmbH.
|
|
22
|
+
|
|
23
|
+
4. MODIFICATIONS
|
|
24
|
+
You may modify the Software for personal or internal use only. Modified versions may not be:
|
|
25
|
+
- redistributed;
|
|
26
|
+
- rebranded or marketed as original work;
|
|
27
|
+
- offered as a service or product.
|
|
28
|
+
|
|
29
|
+
5. ENFORCEMENT AND TERMINATION
|
|
30
|
+
Any violation of this License will result in the immediate termination of all rights granted herein. Divhunt GmbH reserves the right to pursue legal remedies including but not limited to damages, injunctions, and recovery of profits obtained through unauthorized use.
|
|
31
|
+
|
|
32
|
+
6. NO WARRANTY
|
|
33
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL JOVANAT GMBH BE LIABLE FOR ANY DAMAGES ARISING FROM THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
34
|
+
|
|
35
|
+
7. GOVERNING LAW
|
|
36
|
+
This License shall be governed by and construed in accordance with the laws of Switzerland. All disputes shall be subject to the exclusive jurisdiction of the courts of Zug, Switzerland.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
For commercial licensing or other questions, please contact: **dejan@divhunt.com**
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
## Built with the Divhunt Framework – non-commercial use only. For commercial use, contact dejan@divhunt.com.
|
|
2
|
+
|
|
3
|
+
# Clients Addon
|
|
4
|
+
|
|
5
|
+
HTTP and gRPC client connectivity for Divhunt applications.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **HTTP Client**: REST API communication with timeout, retries, and middleware
|
|
10
|
+
- **gRPC Client**: High-performance streaming and unary calls
|
|
11
|
+
- **Event Callbacks**: Connection, request, response, and error handling
|
|
12
|
+
- **Auto-retry**: Configurable timeout and connection management
|
|
13
|
+
|
|
14
|
+
## HTTP Client
|
|
15
|
+
|
|
16
|
+
```javascript
|
|
17
|
+
import clients from '#clients/load.js';
|
|
18
|
+
|
|
19
|
+
clients.Item({
|
|
20
|
+
id: 'api',
|
|
21
|
+
type: 'http',
|
|
22
|
+
host: 'localhost',
|
|
23
|
+
port: 3000,
|
|
24
|
+
timeout: 15,
|
|
25
|
+
onConnect: (client) => console.log('HTTP client connected'),
|
|
26
|
+
onError: (error) => console.error('HTTP error:', error)
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Usage
|
|
30
|
+
const api = clients.Item('api');
|
|
31
|
+
const result = await api.Fn('http.get', '/users', {page: 1});
|
|
32
|
+
await api.Fn('http.post', '/users', {name: 'John'});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## gRPC Client
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
import clientsGRPC from '#clients/grpc/load.js';
|
|
39
|
+
|
|
40
|
+
clientsGRPC.Item({
|
|
41
|
+
id: 'service',
|
|
42
|
+
host: 'localhost',
|
|
43
|
+
port: 50000,
|
|
44
|
+
timeout: 15,
|
|
45
|
+
metadata: {authorization: 'Bearer token'},
|
|
46
|
+
onConnect: (client) => console.log('gRPC client connected'),
|
|
47
|
+
onStreamData: (stream, payload) => console.log('Received:', payload)
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Streaming
|
|
51
|
+
const service = clientsGRPC.Item('service');
|
|
52
|
+
const stream = await service.Fn('stream');
|
|
53
|
+
const response = await stream.request('users', 'findAll', {limit: 10});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Commands Integration
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
import commands from '#commands/load.js';
|
|
60
|
+
import clients from '#clients/load.js';
|
|
61
|
+
|
|
62
|
+
commands.Item({
|
|
63
|
+
id: 'proxy:users',
|
|
64
|
+
method: 'GET',
|
|
65
|
+
endpoint: '/api/users',
|
|
66
|
+
callback: async function(properties, resolve)
|
|
67
|
+
{
|
|
68
|
+
const api = clients.Item('api');
|
|
69
|
+
const result = await api.Fn('http.get', '/users', properties);
|
|
70
|
+
|
|
71
|
+
resolve(result.data, result.message, result.code);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
commands.Item({
|
|
76
|
+
id: 'grpc:analytics',
|
|
77
|
+
method: 'POST',
|
|
78
|
+
endpoint: '/analytics/process',
|
|
79
|
+
callback: async function(properties, resolve)
|
|
80
|
+
{
|
|
81
|
+
const service = clientsGRPC.Item('analytics');
|
|
82
|
+
const stream = await service.Fn('stream');
|
|
83
|
+
const result = await stream.request('analytics', 'process', properties);
|
|
84
|
+
|
|
85
|
+
resolve(result.data);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Error Handling
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
clients.Item({
|
|
94
|
+
id: 'resilient-api',
|
|
95
|
+
type: 'http',
|
|
96
|
+
host: 'api.example.com',
|
|
97
|
+
port: 443,
|
|
98
|
+
onError: (error, context) =>
|
|
99
|
+
{
|
|
100
|
+
console.error(`Request failed: ${error}`);
|
|
101
|
+
// Implement retry logic, fallback, or alerting
|
|
102
|
+
},
|
|
103
|
+
onComplete: (result, context) =>
|
|
104
|
+
{
|
|
105
|
+
console.log(`Request completed in ${result.duration}ms`);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Events
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
divhunt.EmitOn('clients.http.request.before', (http) =>
|
|
114
|
+
{
|
|
115
|
+
http.data.timestamp = Date.now();
|
|
116
|
+
http.headers = {'X-Client-Version': '1.0.0'};
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
divhunt.EmitOn('clients.grpc.connect', (client) =>
|
|
120
|
+
{
|
|
121
|
+
console.log('gRPC client ready for requests');
|
|
122
|
+
});
|
|
123
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import divhunt from '#framework/load.js';
|
|
4
|
+
|
|
5
|
+
const clientsGRPC = divhunt.Addon('clients.grpc', (addon) =>
|
|
6
|
+
{
|
|
7
|
+
addon.Field('id', ['string|number']);
|
|
8
|
+
addon.Field('instance', ['object']);
|
|
9
|
+
addon.Field('host', ['string', 'localhost']);
|
|
10
|
+
addon.Field('port', ['number', 50000]);
|
|
11
|
+
addon.Field('timeout', ['number', 5]);
|
|
12
|
+
addon.Field('metadata', ['object', {}]);
|
|
13
|
+
|
|
14
|
+
addon.Field('onError', ['function']);
|
|
15
|
+
addon.Field('onConnect', ['function']);
|
|
16
|
+
|
|
17
|
+
addon.Field('onStream', ['function']);
|
|
18
|
+
addon.Field('onStreamError', ['function']);
|
|
19
|
+
addon.Field('onStreamEnd', ['function']);
|
|
20
|
+
addon.Field('onStreamData', ['function']);
|
|
21
|
+
addon.Field('onStreamRequest', ['function']);
|
|
22
|
+
addon.Field('onStreamRespond', ['function']);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export default clientsGRPC;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import { fileURLToPath } from 'url'
|
|
4
|
+
import { dirname, join } from 'path'
|
|
5
|
+
|
|
6
|
+
import clientsGRPC from '#clients/grpc/addon.js';
|
|
7
|
+
|
|
8
|
+
clientsGRPC.Fn('item.connect', async function(item)
|
|
9
|
+
{
|
|
10
|
+
if(item.Get('instance'))
|
|
11
|
+
{
|
|
12
|
+
return item.Get('instance');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try
|
|
16
|
+
{
|
|
17
|
+
const grpcModule = await import('@grpc/grpc-js');
|
|
18
|
+
const protoLoaderModule = await import('@grpc/proto-loader');
|
|
19
|
+
|
|
20
|
+
const grpc = grpcModule.default || grpcModule;
|
|
21
|
+
const protoLoader = protoLoaderModule.default || protoLoaderModule;
|
|
22
|
+
|
|
23
|
+
const protoPath = join(dirname(fileURLToPath(import.meta.url)), '/../../service.proto');
|
|
24
|
+
|
|
25
|
+
const definition = protoLoader.loadSync(protoPath,
|
|
26
|
+
{
|
|
27
|
+
keepCase: true,
|
|
28
|
+
longs: String,
|
|
29
|
+
enums: String,
|
|
30
|
+
defaults: true,
|
|
31
|
+
oneofs: true
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const universalPackage = grpc.loadPackageDefinition(definition).universal;
|
|
35
|
+
|
|
36
|
+
const client = new universalPackage.UniversalService(`${item.Get('host')}:${item.Get('port')}`, grpc.credentials.createSsl(), {
|
|
37
|
+
'grpc.max_send_message_length': 1024 * 1024 * 100,
|
|
38
|
+
'grpc.max_receive_message_length': 1024 * 1024 * 100,
|
|
39
|
+
'grpc.keepalive_time_ms': 30000,
|
|
40
|
+
'grpc.keepalive_timeout_ms': 10000,
|
|
41
|
+
'grpc.keepalive_permit_without_calls': 1
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
item.Set('instance', client);
|
|
45
|
+
|
|
46
|
+
await new Promise((resolve, reject) =>
|
|
47
|
+
{
|
|
48
|
+
client.waitForReady(new Date(Date.now() + item.Get('timeout') * 1000), (error) =>
|
|
49
|
+
{
|
|
50
|
+
if(error)
|
|
51
|
+
{
|
|
52
|
+
reject(error);
|
|
53
|
+
}
|
|
54
|
+
else
|
|
55
|
+
{
|
|
56
|
+
resolve();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
item.Get('onConnect') && item.Get('onConnect').call(item, client);
|
|
63
|
+
|
|
64
|
+
return client;
|
|
65
|
+
}
|
|
66
|
+
catch(error)
|
|
67
|
+
{
|
|
68
|
+
item.Get('instance')?.close();
|
|
69
|
+
item.Set('instance', null);
|
|
70
|
+
|
|
71
|
+
item.Get('onError') && item.Get('onError').call(item, error.message);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import clientsGRPC from '#clients/grpc/addon.js';
|
|
4
|
+
|
|
5
|
+
const promises = {};
|
|
6
|
+
|
|
7
|
+
clientsGRPC.Fn('item.resolve', function(item, id, payload = null, onChunk = null)
|
|
8
|
+
{
|
|
9
|
+
if(payload === null)
|
|
10
|
+
{
|
|
11
|
+
const timeout = setTimeout(() =>
|
|
12
|
+
{
|
|
13
|
+
promises[id].resolve({data: null, message: 'Request timed out after 60 seconds. No response received.', code: 500, id, time: 60000});
|
|
14
|
+
delete(promises[id]);
|
|
15
|
+
}, 60000);
|
|
16
|
+
|
|
17
|
+
return new Promise((resolve) =>
|
|
18
|
+
{
|
|
19
|
+
promises[id] = { resolve, timeout, onChunk, time: performance.now() };
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if(!promises[id])
|
|
24
|
+
{
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if(promises[id].onChunk && !payload.end)
|
|
29
|
+
{
|
|
30
|
+
promises[id].onChunk(payload);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if(payload.end)
|
|
34
|
+
{
|
|
35
|
+
payload.time = (performance.now() - promises[id].time).toFixed(2);
|
|
36
|
+
promises[id].resolve(payload);
|
|
37
|
+
clearTimeout(promises[id].timeout);
|
|
38
|
+
|
|
39
|
+
delete promises[id];
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import clientsGRPC from '#clients/grpc/addon.js';
|
|
4
|
+
import divhunt from '#framework/load.js';
|
|
5
|
+
|
|
6
|
+
clientsGRPC.Fn('item.stream', async function(item)
|
|
7
|
+
{
|
|
8
|
+
const client = item.Get('instance');
|
|
9
|
+
|
|
10
|
+
if(!client)
|
|
11
|
+
{
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try
|
|
16
|
+
{
|
|
17
|
+
const grpcModule = await import('@grpc/grpc-js');
|
|
18
|
+
const grpc = grpcModule.default || grpcModule;
|
|
19
|
+
|
|
20
|
+
const metadata = new grpc.Metadata();
|
|
21
|
+
|
|
22
|
+
Object.entries(item.Get('metadata')).forEach(([key, value]) =>
|
|
23
|
+
{
|
|
24
|
+
metadata.add(key, value);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const stream = client.Stream(metadata);
|
|
28
|
+
|
|
29
|
+
stream.request = function(name, data, onChunk = null, id = null)
|
|
30
|
+
{
|
|
31
|
+
id = id || divhunt.GenerateUID();
|
|
32
|
+
|
|
33
|
+
const extracted = divhunt.BinariesExtract(data);
|
|
34
|
+
|
|
35
|
+
stream.write({
|
|
36
|
+
data: JSON.stringify({type: 'request', name, data: extracted.data, id}),
|
|
37
|
+
binaries: extracted.binaries
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
item.Get('onStreamRequest') && item.Get('onStreamRequest').call(item, stream, {type: 'request', name, data, binaries: extracted.binaries, id});
|
|
41
|
+
|
|
42
|
+
return item.Fn('resolve', id, null, onChunk);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
stream.respond = function(data, message, code, end = true, id = null)
|
|
46
|
+
{
|
|
47
|
+
id = id || divhunt.GenerateUID();
|
|
48
|
+
|
|
49
|
+
const extracted = divhunt.BinariesExtract(data);
|
|
50
|
+
|
|
51
|
+
stream.write({
|
|
52
|
+
data: JSON.stringify({type: 'respond', data: extracted.data, message, code, id, end}),
|
|
53
|
+
binaries: extracted.binaries
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
item.Get('onStreamRespond') && item.Get('onStreamRespond').call(item, stream, {type: 'respond', data, binaries: extracted.binaries, message, code, id, end});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
item.Get('onStream') && item.Get('onStream').call(item, stream);
|
|
60
|
+
|
|
61
|
+
stream.on('data', (response) =>
|
|
62
|
+
{
|
|
63
|
+
const payload = JSON.parse(response.data);
|
|
64
|
+
|
|
65
|
+
if(payload.data && response.binaries)
|
|
66
|
+
{
|
|
67
|
+
payload.data = divhunt.BinariesInject(payload.data, response.binaries);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if(payload.type === 'respond')
|
|
71
|
+
{
|
|
72
|
+
item.Fn('resolve', payload.id, payload);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
item.Get('onStreamData') && item.Get('onStreamData').call(item, stream, payload);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
stream.on('error', (error) =>
|
|
79
|
+
{
|
|
80
|
+
item.Get('onStreamError') && item.Get('onStreamError').call(item, stream, error.message);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
stream.on('end', () =>
|
|
84
|
+
{
|
|
85
|
+
item.Get('onStreamEnd') && item.Get('onStreamEnd').call(item, stream);
|
|
86
|
+
|
|
87
|
+
item.Get('instance').close();
|
|
88
|
+
item.Set('instance', null);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return stream;
|
|
92
|
+
}
|
|
93
|
+
catch(error)
|
|
94
|
+
{
|
|
95
|
+
if(item.Get('instance'))
|
|
96
|
+
{
|
|
97
|
+
item.Get('instance').close();
|
|
98
|
+
item.Set('instance', null);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
item.Get('onError') && item.Get('onError').call(item, error.message);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import clientsGRPC from '#clients/grpc/addon.js';
|
|
4
|
+
|
|
5
|
+
import '#clients/grpc/item/catch/add.js';
|
|
6
|
+
|
|
7
|
+
import '#clients/grpc/item/functions/connect.js';
|
|
8
|
+
import '#clients/grpc/item/functions/stream.js';
|
|
9
|
+
import '#clients/grpc/item/functions/resolve.js';
|
|
10
|
+
|
|
11
|
+
export default clientsGRPC;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
syntax = "proto3";
|
|
2
|
+
|
|
3
|
+
package universal;
|
|
4
|
+
|
|
5
|
+
service UniversalService
|
|
6
|
+
{
|
|
7
|
+
rpc Stream (stream Request) returns (stream Response);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
message Request
|
|
11
|
+
{
|
|
12
|
+
string data = 1;
|
|
13
|
+
map<string, bytes> binaries = 2;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
message Response
|
|
17
|
+
{
|
|
18
|
+
string data = 1;
|
|
19
|
+
map<string, bytes> binaries = 2;
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import divhunt from '#framework/load.js';
|
|
4
|
+
|
|
5
|
+
const clients = divhunt.Addon('clients', (addon) =>
|
|
6
|
+
{
|
|
7
|
+
addon.Field('id', ['string']);
|
|
8
|
+
addon.Field('instance', ['object']);
|
|
9
|
+
addon.Field('type', ['string', 'http']);
|
|
10
|
+
addon.Field('host', ['string', 'localhost']);
|
|
11
|
+
addon.Field('port', ['number', 3000]);
|
|
12
|
+
addon.Field('timeout', ['number', 15]);
|
|
13
|
+
|
|
14
|
+
addon.Field('onConnect', ['function']);
|
|
15
|
+
addon.Field('onRequest', ['function']);
|
|
16
|
+
addon.Field('onResponse', ['function']);
|
|
17
|
+
addon.Field('onError', ['function']);
|
|
18
|
+
addon.Field('onComplete', ['function']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export default clients;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
import clients from '#clients/addon.js';
|
|
4
|
+
|
|
5
|
+
clients.ItemOn('add', function(item)
|
|
6
|
+
{
|
|
7
|
+
switch(item.Get('type').toLowerCase())
|
|
8
|
+
{
|
|
9
|
+
case 'http':
|
|
10
|
+
item.Fn('http.create');
|
|
11
|
+
break;
|
|
12
|
+
case 'grpc':
|
|
13
|
+
item.Fn('gRPC.create');
|
|
14
|
+
break;
|
|
15
|
+
default:
|
|
16
|
+
item.Get('onError') && item.Get('onError')('Client type does not exist.');
|
|
17
|
+
}
|
|
18
|
+
});
|