gina 0.6.12 → 0.6.13
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/CHANGELOG.md +1 -1
- package/README.md +24 -17
- package/ROADMAP.md +3 -2
- package/framework/v0.6.13/VERSION +1 -0
- package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/js/gina.js +8 -0
- package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +165 -165
- package/framework/v0.6.13/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.13/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.12 → v0.6.13}/core/config.js +26 -0
- package/framework/v0.6.13/core/connectors/redis/index.js +62 -0
- package/framework/v0.6.13/core/connectors/redis/lib/kv-store.js +394 -0
- package/framework/v0.6.13/core/connectors/sqlite/lib/kv-store.js +316 -0
- package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.js +202 -0
- package/framework/{v0.6.12 → v0.6.13}/core/gna.js +85 -0
- package/framework/{v0.6.12 → v0.6.13}/core/model/entity.js +13 -5
- package/framework/{v0.6.12 → v0.6.13}/core/router.js +147 -56
- package/framework/{v0.6.12 → v0.6.13}/core/server.js +61 -0
- package/framework/{v0.6.12 → v0.6.13}/lib/cmd/service/help.txt +8 -2
- package/framework/{v0.6.12 → v0.6.13}/lib/cmd/service/start.js +1 -1
- package/framework/{v0.6.12 → v0.6.13}/lib/index.js +18 -0
- package/framework/v0.6.13/lib/kv/package.json +7 -0
- package/framework/v0.6.13/lib/kv/src/main.js +862 -0
- package/framework/v0.6.13/lib/kv-store.js +112 -0
- package/framework/v0.6.13/lib/rate-limit/package.json +6 -0
- package/framework/v0.6.13/lib/rate-limit/src/main.js +399 -0
- package/framework/{v0.6.12 → v0.6.13}/lib/routing/src/main.js +8 -0
- package/framework/{v0.6.12 → v0.6.13}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +13 -3
- package/package.json +3 -3
- package/schema/routing.json +30 -0
- package/schema/settings.json +101 -0
- package/types/index.d.ts +9 -0
- package/framework/v0.6.12/VERSION +0 -1
- package/framework/v0.6.12/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.12/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/v0.6.12/core/connectors/redis/index.js +0 -36
- /package/framework/{v0.6.12 → v0.6.13}/AUTHORS +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/LICENSE +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/couchbase/lib/storage-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/content.encoding +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/dev/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/locales/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/mime.types +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/model/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/server.express.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/server.isaac.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/status.codes +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/console.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/context.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/path.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/task.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/helpers/text.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/async/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/storage/gc.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/storage/stats.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/storage/verify.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/config.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/job/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/job-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/maintenance/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/maintenance/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/math/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/model.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/proc.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/push/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/push/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/session-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/shell.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/state.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/local-cas.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/local-stream.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/local.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/meta-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/s3.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage/src/util.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/storage-store.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/url/README.md +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/url/index.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/validator.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.12 → v0.6.13}/lib/ws-session/src/main.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the gina package.
|
|
3
|
+
* Copyright (c) 2009-2026 Rhinostone <contact@gina.io>
|
|
4
|
+
*
|
|
5
|
+
* For the full copyright and license information, please view the LICENSE
|
|
6
|
+
* file that was distributed with this source code.
|
|
7
|
+
*/
|
|
8
|
+
var fs = require('fs');
|
|
9
|
+
var helpers = require('./../helpers');
|
|
10
|
+
var console = require('./logger');
|
|
11
|
+
/**
|
|
12
|
+
* @module lib/kv-store
|
|
13
|
+
* @description Thin factory that loads the connector-specific KV namespace
|
|
14
|
+
* store from `<connectorsPath>/<connector>/lib/kv-store.js` and returns a
|
|
15
|
+
* ready backend for `lib/kv` — the `lib/job-store` / `lib/audit-store` /
|
|
16
|
+
* `lib/render-cache-store` / `lib/storage-store` sibling for the KV
|
|
17
|
+
* primitive (#KV1).
|
|
18
|
+
*
|
|
19
|
+
* The returned object must implement the `KvStoreContract` typedef declared
|
|
20
|
+
* in `lib/kv` (promise-returning, opaque STRING values — the facade owns JSON
|
|
21
|
+
* serialization) including the atomicity each verb owes: `setnx` is
|
|
22
|
+
* set-if-absent, `consume` is read-AND-delete in one operation, `compareDel`
|
|
23
|
+
* deletes only on strict equality with the stored string, and `incrby` is an
|
|
24
|
+
* atomic integer add that must reject on a non-integer stored value.
|
|
25
|
+
* Per-namespace key-prefixing is the implementation's duty — the namespace
|
|
26
|
+
* name is passed so two namespaces may share one connectors.json entry
|
|
27
|
+
* without colliding.
|
|
28
|
+
*
|
|
29
|
+
* Do not call this directly — declare the backend in `config/connectors.json`,
|
|
30
|
+
* point `settings.json`'s `kv.namespaces.<name>.store` at that entry name, and
|
|
31
|
+
* let `gna.js` wire it at boot (before the first request; namespace
|
|
32
|
+
* installation is once-only).
|
|
33
|
+
*
|
|
34
|
+
* NOTE: two connectors ship an implementation —
|
|
35
|
+
* `redis` (`core/connectors/redis/lib/kv-store.js`, shared across HOSTS) and
|
|
36
|
+
* `sqlite` (`core/connectors/sqlite/lib/kv-store.js`, zero-dependency and
|
|
37
|
+
* durable, shared across PROCESSES on one host). The rest remain demand-gated
|
|
38
|
+
* (the `lib/audit-store` shipping order), and naming one of them as a
|
|
39
|
+
* namespace's `store` refuses the boot with a clear message. The in-memory
|
|
40
|
+
* backend (no `store` key) stays the zero-config path, and is
|
|
41
|
+
* single-process: two bundles — or two replicas — needing one shared
|
|
42
|
+
* namespace want a connector-backed store, which is exactly this seam.
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Resolve `connName` against the bundle's `connectors.json` and build the
|
|
46
|
+
* connector-specific KV namespace store.
|
|
47
|
+
*
|
|
48
|
+
* @class KvStore
|
|
49
|
+
* @constructor
|
|
50
|
+
*
|
|
51
|
+
* @param {string} connName - `connectors.json` entry name (referenced by
|
|
52
|
+
* `settings.json`'s `kv.namespaces.<name>.store`).
|
|
53
|
+
* The entry's `.connector` field selects the
|
|
54
|
+
* implementation (a connector without a
|
|
55
|
+
* `lib/kv-store.js` is rejected).
|
|
56
|
+
* @param {string} namespaceName - KV namespace this store will back. Passed
|
|
57
|
+
* through to the implementation, which uses it
|
|
58
|
+
* to PREFIX its keys.
|
|
59
|
+
* @returns {object} - A `KvStoreContract` instance (see `lib/kv`).
|
|
60
|
+
* @throws {Error} - When the entry is missing, has no `connector`
|
|
61
|
+
* field, or the connector has no kv-store
|
|
62
|
+
* implementation. `gna.js` treats a throw as
|
|
63
|
+
* fatal — an explicitly configured store must
|
|
64
|
+
* build, never degrade silently to the
|
|
65
|
+
* in-memory backend, which would put the data
|
|
66
|
+
* somewhere the operator did not ask for.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // settings.json: { "kv": { "namespaces": { "tokens": { "store": "kvRedis" } } } }
|
|
70
|
+
* // connectors.json: { "kvRedis": { "connector": "redis", "host": "127.0.0.1",
|
|
71
|
+
* // "port": 6379 } }
|
|
72
|
+
* var store = new KvStore('kvRedis', 'tokens'); // done by gna.js at boot
|
|
73
|
+
*/
|
|
74
|
+
function KvStore(connName, namespaceName) {
|
|
75
|
+
|
|
76
|
+
if (typeof connName !== 'string' || connName.length === 0) {
|
|
77
|
+
throw new Error('[KvStore] a connectors.json entry name is required (got: ' + JSON.stringify(connName) + ')');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
var ctx = getContext()
|
|
81
|
+
, bundle = ctx.bundle
|
|
82
|
+
, env = ctx.env
|
|
83
|
+
, conf = getConfig()[bundle][env]
|
|
84
|
+
// Same resolution as lib/session-store / lib/job-store / lib/audit-store /
|
|
85
|
+
// lib/storage-store (#B10 fix): conf.connectorsPath is never populated by
|
|
86
|
+
// config.js — use GINA_FRAMEWORK_DIR directly.
|
|
87
|
+
, connectorsPath = GINA_FRAMEWORK_DIR + '/core/connectors'
|
|
88
|
+
, connConf = null
|
|
89
|
+
, connector = null
|
|
90
|
+
;
|
|
91
|
+
try {
|
|
92
|
+
connConf = conf.content.connectors[connName];
|
|
93
|
+
connector = connConf.connector;
|
|
94
|
+
} catch (err) {
|
|
95
|
+
throw new Error('[KvStore] could not resolve `' + connName + '`: check your bundle configuration @config/connectors.json\n' + err.stack);
|
|
96
|
+
}
|
|
97
|
+
if (!connector) {
|
|
98
|
+
throw new Error('[KvStore] connectors.json entry `' + connName + '` has no `connector` field');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
var filename = _(connectorsPath + '/' + connector + '/lib/kv-store.js', true);
|
|
102
|
+
|
|
103
|
+
if ( !fs.existsSync(filename) ) {
|
|
104
|
+
throw new Error('[KvStore] connector `' + connector + '` has no kv-store implementation (`' + filename + '` is missing)');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
var store = require(filename)(connConf, bundle, namespaceName);
|
|
108
|
+
console.debug('[kv-store] loaded connector=' + connector + ' bundle=' + bundle + ' namespace=' + namespaceName + ' (entry: ' + connName + ')');
|
|
109
|
+
return store;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
module.exports = KvStore;
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #MS6 — identified-caller quota enforcement at the router band.
|
|
3
|
+
*
|
|
4
|
+
* QUOTA semantics, deliberately NOT flood control: the gate runs AFTER
|
|
5
|
+
* `authzGate.authorizeRequest` (the call that resolves the principal — it is
|
|
6
|
+
* the only writer of `req.machineCaller`, and session identity is its own
|
|
7
|
+
* predicate) and BEFORE the DTO pipe (a throttled caller must not receive a
|
|
8
|
+
* 422 field map — the same disclosure ordering that puts authz's 401 before
|
|
9
|
+
* the 422). Anonymous flood control stays where it already lives: the edge
|
|
10
|
+
* proxy in front of the bundle, and the #H9 HTTP/2 rapid-reset guard. A
|
|
11
|
+
* request with NO resolvable principal is therefore SKIPPED, never bucketed:
|
|
12
|
+
* keying unidentified callers by IP is dishonest behind a proxy (every
|
|
13
|
+
* `socket.remoteAddress` is the proxy's — one bucket for the whole internet,
|
|
14
|
+
* see lib/maintenance's `evaluateBypass` rationale), and the proxied
|
|
15
|
+
* classification itself has a defeat on record, so an IP fallback would hand
|
|
16
|
+
* an attacker an ESCAPE from limiting by spoofing the classification.
|
|
17
|
+
*
|
|
18
|
+
* Counters are fixed windows over the #KV1 primitive: `incr(key, 1, {ttl})`
|
|
19
|
+
* — the TTL applies on CREATE only (every backend enforces this server-side:
|
|
20
|
+
* redis via an EXISTS-guarded Lua script, sqlite inside BEGIN IMMEDIATE, the
|
|
21
|
+
* in-memory map by keeping the existing expiry), so the first hit of a window
|
|
22
|
+
* opens it and the expiry closes it with no read-modify-write race. Choosing
|
|
23
|
+
* the namespace's BACKEND is choosing the quota's SCOPE: an in-memory
|
|
24
|
+
* namespace counts PER PROCESS (each replica grants the full quota again);
|
|
25
|
+
* replica-shared quotas need a redis- or sqlite-backed namespace. The boot
|
|
26
|
+
* resolver warns about exactly this.
|
|
27
|
+
*
|
|
28
|
+
* Failure policy is the NAMESPACE's `failMode`, not a second knob here:
|
|
29
|
+
* - `open` → a backend error degrades `incr` to `null` inside the facade
|
|
30
|
+
* (which warns) and the gate ALLOWS without headers. The
|
|
31
|
+
* explicit `count === null` check is load-bearing: `null <= N`
|
|
32
|
+
* is `true` by coercion, so an unguarded compare would allow
|
|
33
|
+
* WITH wrong header arithmetic instead of honestly declining
|
|
34
|
+
* to report.
|
|
35
|
+
* - `closed` → the rejection reaches the gate's own handler, which answers
|
|
36
|
+
* **503** + `Retry-After` (the caller is NOT over quota; the
|
|
37
|
+
* service cannot account — the #MS5 open-circuit shape), never
|
|
38
|
+
* a hang: this handler IS the promise's ownership.
|
|
39
|
+
* Give the limiter its OWN namespace so its `failMode` is unambiguously the
|
|
40
|
+
* limiter's outage policy. For a redis-backed namespace, set
|
|
41
|
+
* `enableOfflineQueue: false` + a `commandTimeout` on the connectors entry
|
|
42
|
+
* (the render-cache L2 fail-fast trio) — with ioredis defaults an outage
|
|
43
|
+
* QUEUES every gated request instead of erroring, so neither mode ever fires
|
|
44
|
+
* and requests hang until reconnect. The resolver warns when the trio is
|
|
45
|
+
* missing.
|
|
46
|
+
*
|
|
47
|
+
* Response surface (draft-ietf-httpapi-ratelimit-headers-11, structured
|
|
48
|
+
* fields): `RateLimit-Policy: "<policy>";q=<limit>;w=<windowSec>` and
|
|
49
|
+
* `RateLimit: "<policy>";r=<remaining>` on ALLOWED limited requests;
|
|
50
|
+
* a denial adds `;t=<secondsToReset>` and `Retry-After` (RFC 9110 — the
|
|
51
|
+
* field a client MUST prefer when both are present). `t` is deliberately
|
|
52
|
+
* omitted on the allow path: reporting it honestly would cost a second kv
|
|
53
|
+
* round-trip per allowed request, and the parameter is OPTIONAL in the
|
|
54
|
+
* draft; the deny path pays that one extra `ttl()` read instead, where it
|
|
55
|
+
* prices in the reset the caller actually needs.
|
|
56
|
+
*
|
|
57
|
+
* Per-route `rateLimit` (routing.json, TOP-LEVEL on the route — the #CSRF2
|
|
58
|
+
* trap): `false` exempts the route; `{ limit, window }` REPLACES the default
|
|
59
|
+
* policy for that route — its requests count in their OWN bucket
|
|
60
|
+
* (`<principal>:<rule>`), not against the global one. Partial objects
|
|
61
|
+
* inherit the missing key from the default (the route-`cache` inheritance
|
|
62
|
+
* shape). Shapes are linted at BOOT by the resolver (the DTO boot-registrar
|
|
63
|
+
* doctrine: a typo surfaces at deploy, not at first request).
|
|
64
|
+
*
|
|
65
|
+
* @module gina/lib/rate-limit
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
var crypto = require('crypto');
|
|
69
|
+
// #COMPLY2 — audit auto-events for quota denials, the authz-gate import shape
|
|
70
|
+
// (one-way: lib/audit never requires this module; emitAuthzDenied is contained
|
|
71
|
+
// and can never affect the denial itself).
|
|
72
|
+
var audit = require('../../audit/src/main');
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Serialize a Structured Field String (RFC 8941 §3.3.3): DQUOTE-wrapped with
|
|
76
|
+
* `\` and `"` backslash-escaped. Policy identifiers are expected to be ASCII
|
|
77
|
+
* (routing rule names are); non-ASCII would be outside the sf-string grammar
|
|
78
|
+
* and is not validated here.
|
|
79
|
+
*
|
|
80
|
+
* @param {string} s - Raw string.
|
|
81
|
+
* @returns {string} The serialized sf-string, quotes included.
|
|
82
|
+
*/
|
|
83
|
+
function sfString(s) {
|
|
84
|
+
return '"' + String(s).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Build a `RateLimit-Policy` member (draft-11): `"<name>";q=<quota>;w=<windowSec>`.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} name - Policy identifier (sf-string-serialized).
|
|
91
|
+
* @param {number} quota - Quota units per window (`q`, REQUIRED by the draft).
|
|
92
|
+
* @param {number} windowSec - Window length in seconds (`w`).
|
|
93
|
+
* @returns {string} The header field value.
|
|
94
|
+
*/
|
|
95
|
+
function buildPolicyItem(name, quota, windowSec) {
|
|
96
|
+
return sfString(name) + ';q=' + quota + ';w=' + windowSec;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Build a `RateLimit` member (draft-11): `"<name>";r=<remaining>[;t=<sec>]`.
|
|
101
|
+
* `t` (seconds until the window resets) is included on denials only — see the
|
|
102
|
+
* module header for why the allow path omits it.
|
|
103
|
+
*
|
|
104
|
+
* @param {string} name - Policy identifier (must match a `RateLimit-Policy` member).
|
|
105
|
+
* @param {number} remaining - Remaining quota (`r`, REQUIRED by the draft; never negative).
|
|
106
|
+
* @param {number} [resetSec] - Seconds until the window resets (`t`).
|
|
107
|
+
* @returns {string} The header field value.
|
|
108
|
+
*/
|
|
109
|
+
function buildRateLimitItem(name, remaining, resetSec) {
|
|
110
|
+
var item = sfString(name) + ';r=' + remaining;
|
|
111
|
+
if ( typeof(resetSec) != 'undefined' ) {
|
|
112
|
+
item += ';t=' + resetSec;
|
|
113
|
+
}
|
|
114
|
+
return item;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Derive the quota key for this request's principal, or `null` when no
|
|
119
|
+
* principal is resolvable (the request is then SKIPPED, never bucketed).
|
|
120
|
+
*
|
|
121
|
+
* Precedence mirrors `authorizeRequest` exactly — the SESSION user when
|
|
122
|
+
* authenticated (session wins; the machine identity is never consulted for a
|
|
123
|
+
* signed-in caller), else the #MS3 machine caller:
|
|
124
|
+
* - session: `'u:' + String(session.user[conf.keyField])`. The field is
|
|
125
|
+
* operator-NAMED (`server.rateLimit.keyField`) because `session.user` is
|
|
126
|
+
* app-owned shape — a guessed default chain would mis-key silently. A
|
|
127
|
+
* user record where the named field is absent/empty is UNIDENTIFIED.
|
|
128
|
+
* - machine: `'m:' + machineCaller.name` (shape framework-forced by the
|
|
129
|
+
* authz gate: `{ name, roles, machine: true }`).
|
|
130
|
+
* Values longer than 180 chars are sha256-hexed so the final key (class
|
|
131
|
+
* prefix + optional `:<rule>` suffix) always fits the kv 512-char key cap.
|
|
132
|
+
*
|
|
133
|
+
* @param {object} req - The request (post-`authorizeRequest`).
|
|
134
|
+
* @param {object} conf - The resolved conf (`keyField`).
|
|
135
|
+
* @returns {?string} `'<class>:<value>'`, or `null` (skip).
|
|
136
|
+
*/
|
|
137
|
+
function deriveKey(req, conf) {
|
|
138
|
+
var cls = null, raw = null;
|
|
139
|
+
if ( req && req.session && typeof(req.session) == 'object' && req.session.user ) {
|
|
140
|
+
var u = req.session.user;
|
|
141
|
+
var v = ( u && typeof(u) == 'object' ) ? u[conf.keyField] : undefined;
|
|
142
|
+
if ( typeof(v) != 'undefined' && v !== null && String(v) !== '' ) {
|
|
143
|
+
cls = 'u';
|
|
144
|
+
raw = String(v);
|
|
145
|
+
}
|
|
146
|
+
} else if ( req && req.machineCaller && req.machineCaller.machine === true && req.machineCaller.name ) {
|
|
147
|
+
cls = 'm';
|
|
148
|
+
raw = String(req.machineCaller.name);
|
|
149
|
+
}
|
|
150
|
+
if ( !cls ) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if ( raw.length > 180 ) {
|
|
154
|
+
raw = crypto.createHash('sha256').update(raw).digest('hex');
|
|
155
|
+
}
|
|
156
|
+
return cls + ':' + raw;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Best-effort response-header write — the deny status itself is the contract
|
|
161
|
+
* (the authz `WWW-Authenticate` mould: guarded on `headersSent` + `setHeader`
|
|
162
|
+
* presence, try/caught so a bare test stub can never turn a verdict into a
|
|
163
|
+
* throw).
|
|
164
|
+
*
|
|
165
|
+
* @inner
|
|
166
|
+
* @param {object} res - The response.
|
|
167
|
+
* @param {object} headers - Field-name → field-value map.
|
|
168
|
+
* @returns {undefined}
|
|
169
|
+
*/
|
|
170
|
+
function _setHeaders(res, headers) {
|
|
171
|
+
try {
|
|
172
|
+
if ( res && !res.headersSent && typeof(res.setHeader) == 'function' ) {
|
|
173
|
+
for (var h in headers) {
|
|
174
|
+
res.setHeader(h, headers[h]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} catch (err) {
|
|
178
|
+
// best-effort — the status itself is the contract
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Resolve `server.rateLimit` once at engine start (the #MS5 resolver shape,
|
|
184
|
+
* stamped on the engine instance so the policy survives dev-mode hot reloads
|
|
185
|
+
* and dies on restart).
|
|
186
|
+
*
|
|
187
|
+
* Doctrine, verbatim from the #MS5 resolver: structurally invalid values on
|
|
188
|
+
* an ENABLED block are a boot refusal (throw), NOT a warn-and-disable —
|
|
189
|
+
* silently running without the protection the operator asked for is the
|
|
190
|
+
* fail-open shape the storage/kv boot bands refuse. Dormant (`{enabled:false}`)
|
|
191
|
+
* unless `enabled` is strictly `true`.
|
|
192
|
+
*
|
|
193
|
+
* Warn-tier findings (never refusals — enforcement works when the backend is
|
|
194
|
+
* up; these govern outage latency and quota scope, the #CE1 discriminator):
|
|
195
|
+
* a memory-backed namespace (per-process quotas), a redis-backed namespace
|
|
196
|
+
* missing the fail-fast trio, unrecognized keys.
|
|
197
|
+
*
|
|
198
|
+
* @param {object} serverConf - The bundle's runtime `server` block (post-fold).
|
|
199
|
+
* @param {object} deps - Injected dependencies.
|
|
200
|
+
* @param {object} deps.kv - The kv facade (`lib.kv`) — namespace existence check.
|
|
201
|
+
* @param {object} [deps.kvSettings] - `settings.kv` (backend-honesty warns).
|
|
202
|
+
* @param {object} [deps.connectors] - `connectors.json` content (redis-tuning warn).
|
|
203
|
+
* @param {object} [deps.routing] - The bundle's routing table (per-route override lint).
|
|
204
|
+
* @param {function(string)} [deps.warn] - Warn sink (default `console.warn`).
|
|
205
|
+
* @returns {object} `{enabled:false}` or `{enabled:true, namespace, keyField, limit, windowMs, ns}`.
|
|
206
|
+
* @throws {Error} On any structurally invalid value in an enabled block, an
|
|
207
|
+
* undeclared namespace, or a malformed per-route override.
|
|
208
|
+
*/
|
|
209
|
+
function resolveConf(serverConf, deps) {
|
|
210
|
+
var block = serverConf && serverConf.rateLimit;
|
|
211
|
+
if ( !block || block.enabled !== true ) {
|
|
212
|
+
return { enabled: false };
|
|
213
|
+
}
|
|
214
|
+
deps = deps || {};
|
|
215
|
+
var _warn = ( typeof(deps.warn) == 'function' ) ? deps.warn : function(m){ console.warn('[rate-limit] ' + m); };
|
|
216
|
+
|
|
217
|
+
if ( typeof(block.namespace) != 'string' || block.namespace === '' ) {
|
|
218
|
+
throw new Error('[SERVER][#MS6] `server.rateLimit.namespace` must name a declared kv namespace — got `' + block.namespace + '`');
|
|
219
|
+
}
|
|
220
|
+
if ( typeof(block.keyField) != 'string' || block.keyField === '' ) {
|
|
221
|
+
throw new Error('[SERVER][#MS6] `server.rateLimit.keyField` is required — name the `session.user` property that identifies a caller (machine callers key on their registered name automatically)');
|
|
222
|
+
}
|
|
223
|
+
var limit = block.limit;
|
|
224
|
+
if ( typeof(limit) != 'number' || limit !== ~~limit || limit < 1 ) {
|
|
225
|
+
throw new Error('[SERVER][#MS6] `server.rateLimit.limit` must be an integer >= 1 — got `' + limit + '`');
|
|
226
|
+
}
|
|
227
|
+
var windowMs = parseTimeout(block.window);
|
|
228
|
+
if ( typeof(windowMs) != 'number' || windowMs < 1 ) {
|
|
229
|
+
throw new Error('[SERVER][#MS6] `server.rateLimit.window` must be a positive duration (e.g. "1m", "30s", 60000) — got `' + block.window + '`');
|
|
230
|
+
}
|
|
231
|
+
var KNOWN = { enabled: 1, namespace: 1, keyField: 1, limit: 1, window: 1 };
|
|
232
|
+
for (var k in block) {
|
|
233
|
+
if ( !KNOWN[k] ) {
|
|
234
|
+
// the kv-namespace precedent: a silently-dropped key is a policy
|
|
235
|
+
// the operator believes is set
|
|
236
|
+
_warn('`server.rateLimit.' + k + '` is not a recognized key — it was ignored');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if ( !deps.kv || typeof(deps.kv.get) != 'function' ) {
|
|
241
|
+
throw new Error('[SERVER][#MS6] rate limiting needs the kv primitive — no kv facade reached the resolver');
|
|
242
|
+
}
|
|
243
|
+
var ns;
|
|
244
|
+
try {
|
|
245
|
+
ns = deps.kv.get(block.namespace);
|
|
246
|
+
} catch (kvErr) {
|
|
247
|
+
// the kv `default`-naming-undeclared precedent: refuse, never degrade
|
|
248
|
+
// silently to a backend the operator did not ask for
|
|
249
|
+
throw new Error('[SERVER][#MS6] `server.rateLimit.namespace` = `' + block.namespace + '` is not usable: ' + (kvErr.message || kvErr));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
var nsConf = deps.kvSettings && deps.kvSettings.namespaces && deps.kvSettings.namespaces[block.namespace];
|
|
253
|
+
var storeName = nsConf && nsConf.store;
|
|
254
|
+
if ( !storeName ) {
|
|
255
|
+
_warn('namespace `' + block.namespace + '` is MEMORY-backed: quotas count PER PROCESS — every replica grants the full quota again. Replica-shared quotas need a redis- or sqlite-backed namespace');
|
|
256
|
+
} else {
|
|
257
|
+
var connEntry = deps.connectors && deps.connectors[storeName];
|
|
258
|
+
if ( connEntry && connEntry.connector === 'redis'
|
|
259
|
+
&& ( connEntry.enableOfflineQueue !== false || typeof(connEntry.commandTimeout) == 'undefined' ) ) {
|
|
260
|
+
_warn('redis-backed namespace `' + block.namespace + '`: set `enableOfflineQueue: false` and a `commandTimeout` on connectors.json entry `' + storeName + '` — with ioredis defaults an outage QUEUES every gated request (neither failMode ever fires) instead of degrading. The render-cache L2 ships this exact fail-fast trio');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if ( deps.routing && typeof(deps.routing) == 'object' ) {
|
|
265
|
+
for (var rule in deps.routing) {
|
|
266
|
+
var rl = deps.routing[rule] && deps.routing[rule].rateLimit;
|
|
267
|
+
if ( typeof(rl) == 'undefined' || rl === false ) { continue; }
|
|
268
|
+
if ( !rl || typeof(rl) != 'object' || Array.isArray(rl) ) {
|
|
269
|
+
throw new Error('[SERVER][#MS6] route `' + rule + '`: `rateLimit` must be `false` (exempt) or an object — got `' + JSON.stringify(rl) + '`');
|
|
270
|
+
}
|
|
271
|
+
if ( typeof(rl.limit) != 'undefined' && ( typeof(rl.limit) != 'number' || rl.limit !== ~~rl.limit || rl.limit < 1 ) ) {
|
|
272
|
+
throw new Error('[SERVER][#MS6] route `' + rule + '`: `rateLimit.limit` must be an integer >= 1 — got `' + rl.limit + '`');
|
|
273
|
+
}
|
|
274
|
+
if ( typeof(rl.window) != 'undefined' ) {
|
|
275
|
+
var _w = parseTimeout(rl.window);
|
|
276
|
+
if ( typeof(_w) != 'number' || _w < 1 ) {
|
|
277
|
+
throw new Error('[SERVER][#MS6] route `' + rule + '`: `rateLimit.window` must be a positive duration — got `' + rl.window + '`');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (var rk in rl) {
|
|
281
|
+
if ( rk !== 'limit' && rk !== 'window' ) {
|
|
282
|
+
_warn('route `' + rule + '`: `rateLimit.' + rk + '` is not a recognized key — it was ignored');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return { enabled: true, namespace: block.namespace, keyField: block.keyField, limit: limit, windowMs: windowMs, ns: ns };
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Gate one request. Called by `core/router.js` at BOTH dispatch sites, after
|
|
293
|
+
* `authorizeRequest` returned true and only when the resolved conf is armed.
|
|
294
|
+
*
|
|
295
|
+
* Returns `null` — synchronously, NO promise minted — when the gate does not
|
|
296
|
+
* apply: the route is exempt (`rateLimit: false`) or no principal resolved.
|
|
297
|
+
* The router then continues on today's exact synchronous band.
|
|
298
|
+
*
|
|
299
|
+
* Otherwise returns a promise settling `true` (proceed — the router runs the
|
|
300
|
+
* DTO pipe → hooks → action continuation) or `false` (this gate has ANSWERED
|
|
301
|
+
* the request: 429 over quota, or 503 when a fail-closed namespace erred).
|
|
302
|
+
* Every terminal is owned inside this function — an unowned rejection in the
|
|
303
|
+
* dispatch spine is a hung request with no visible log line (the daemon
|
|
304
|
+
* spawner filters child stderr), which is the exact shape being designed
|
|
305
|
+
* against.
|
|
306
|
+
*
|
|
307
|
+
* @param {object} request - The request (post-`authorizeRequest`).
|
|
308
|
+
* @param {object} response - The response.
|
|
309
|
+
* @param {object} controller - The per-request controller (its `throwError` writes the denial).
|
|
310
|
+
* @param {object} conf - The instance-stamped resolved conf (`resolveConf` output, enabled).
|
|
311
|
+
* @returns {?Promise<boolean>} `null` (inapplicable — continue sync), or the verdict promise.
|
|
312
|
+
*/
|
|
313
|
+
function gate(request, response, controller, conf) {
|
|
314
|
+
var routeRl = ( request && request.routing ) ? request.routing.rateLimit : undefined;
|
|
315
|
+
if ( routeRl === false ) {
|
|
316
|
+
return null; // exempt route — sync fall-through
|
|
317
|
+
}
|
|
318
|
+
var key = deriveKey(request, conf);
|
|
319
|
+
if ( key === null ) {
|
|
320
|
+
return null; // unidentified caller — the edge proxy + #H9 own that class
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
var limit = conf.limit;
|
|
324
|
+
var windowMs = conf.windowMs;
|
|
325
|
+
var policyName = 'default';
|
|
326
|
+
if ( routeRl && typeof(routeRl) == 'object' ) {
|
|
327
|
+
// REPLACE semantics: an overridden route's requests count ONLY in its
|
|
328
|
+
// own bucket. Partial objects inherit the missing key (the route-cache
|
|
329
|
+
// inheritance shape). Shapes were linted at boot, so parse cannot fail
|
|
330
|
+
// here — the fallback is belt.
|
|
331
|
+
if ( typeof(routeRl.limit) != 'undefined' ) { limit = routeRl.limit; }
|
|
332
|
+
if ( typeof(routeRl.window) != 'undefined' ) { windowMs = parseTimeout(routeRl.window) || windowMs; }
|
|
333
|
+
policyName = ( request.routing && request.routing.rule ) ? String(request.routing.rule) : 'route';
|
|
334
|
+
key += ':' + policyName;
|
|
335
|
+
}
|
|
336
|
+
var windowSec = Math.max(1, Math.round(windowMs / 1000));
|
|
337
|
+
var policyItem = buildPolicyItem(policyName, limit, windowSec);
|
|
338
|
+
|
|
339
|
+
return conf.ns.incr(key, 1, { ttl: windowMs }).then(function onCount(count) {
|
|
340
|
+
if ( count === null ) {
|
|
341
|
+
// failMode:'open' degraded — there is no reading. `null <= limit`
|
|
342
|
+
// is TRUE by coercion, so an unguarded compare would allow WITH
|
|
343
|
+
// wrong header arithmetic; this allows WITHOUT headers and lets
|
|
344
|
+
// the facade's own per-operation degrade warn stand.
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
if ( count <= limit ) {
|
|
348
|
+
_setHeaders(response, {
|
|
349
|
+
'RateLimit' : buildRateLimitItem(policyName, limit - count),
|
|
350
|
+
'RateLimit-Policy' : policyItem
|
|
351
|
+
});
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
// Deny. One extra kv read on the THROTTLED path only, for the honest
|
|
355
|
+
// reset time; under either failMode a failed ttl() degrades to the
|
|
356
|
+
// full window rather than blocking the verdict.
|
|
357
|
+
return conf.ns.ttl(key).then(
|
|
358
|
+
function (ms) { return ms; },
|
|
359
|
+
function () { return null; }
|
|
360
|
+
).then(function onTtl(ms) {
|
|
361
|
+
var tSec = ( typeof(ms) == 'number' && ms > 0 ) ? Math.ceil(ms / 1000) : windowSec;
|
|
362
|
+
_setHeaders(response, {
|
|
363
|
+
'Retry-After' : String(tSec),
|
|
364
|
+
'RateLimit' : buildRateLimitItem(policyName, 0, tSec),
|
|
365
|
+
'RateLimit-Policy' : policyItem
|
|
366
|
+
});
|
|
367
|
+
audit.emitAuthzDenied(request, '429'); // #COMPLY2 auto-event — contained, never affects the denial
|
|
368
|
+
controller.throwError({
|
|
369
|
+
status : 429,
|
|
370
|
+
error : 'Too many requests'
|
|
371
|
+
});
|
|
372
|
+
return false;
|
|
373
|
+
});
|
|
374
|
+
}, function onStoreError(err) {
|
|
375
|
+
// failMode:'closed' — the namespace rejected. The caller is NOT over
|
|
376
|
+
// quota and must not be told it is: 503 + Retry-After (the #MS5
|
|
377
|
+
// open-circuit shape). This handler IS the promise's ownership — the
|
|
378
|
+
// alternative is a silent hang.
|
|
379
|
+
_setHeaders(response, { 'Retry-After': String(windowSec) });
|
|
380
|
+
try {
|
|
381
|
+
console.warn('[rate-limit] namespace `' + conf.namespace + '` unavailable (failMode=closed): ' + (err && err.message || err));
|
|
382
|
+
} catch (e) {}
|
|
383
|
+
audit.emitAuthzDenied(request, '503-rate-limit'); // #COMPLY2 auto-event — contained
|
|
384
|
+
controller.throwError({
|
|
385
|
+
status : 503,
|
|
386
|
+
error : 'Service temporarily unavailable'
|
|
387
|
+
});
|
|
388
|
+
return false;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
module.exports = {
|
|
393
|
+
resolveConf : resolveConf,
|
|
394
|
+
gate : gate,
|
|
395
|
+
deriveKey : deriveKey,
|
|
396
|
+
sfString : sfString,
|
|
397
|
+
buildPolicyItem : buildPolicyItem,
|
|
398
|
+
buildRateLimitItem : buildRateLimitItem
|
|
399
|
+
};
|
|
@@ -237,6 +237,14 @@ function Routing() {
|
|
|
237
237
|
if ( typeof(routeObject.negotiate) != 'undefined' ) {
|
|
238
238
|
params.negotiate = routeObject.negotiate;
|
|
239
239
|
}
|
|
240
|
+
// #MS6 — propagate the per-route rate-limit override/exempt to
|
|
241
|
+
// req.routing.rateLimit (top-level, NOT req.routing.param.* — the
|
|
242
|
+
// #CSRF2 trap). typeof-guarded so `false` (exempt) survives the copy;
|
|
243
|
+
// assigned only when declared, so a routing.json that never mentions
|
|
244
|
+
// `rateLimit` produces a byte-identical params object.
|
|
245
|
+
if ( typeof(routeObject.rateLimit) != 'undefined' ) {
|
|
246
|
+
params.rateLimit = routeObject.rateLimit;
|
|
247
|
+
}
|
|
240
248
|
|
|
241
249
|
// isRoute
|
|
242
250
|
return self.compareUrls(params, routeObject.url, req);
|
package/gna.js
CHANGED
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
'use strict';
|
|
16
16
|
|
|
17
17
|
// Framework core — the main gna module (lifecycle hooks, lib, etc.)
|
|
18
|
-
var _gna = require('./framework/v0.6.
|
|
18
|
+
var _gna = require('./framework/v0.6.13/core/gna');
|
|
19
19
|
|
|
20
20
|
// SuperController and EntitySuper — loaded from their source modules
|
|
21
|
-
var SuperController = require('./framework/v0.6.
|
|
22
|
-
var EntitySuper = require('./framework/v0.6.
|
|
21
|
+
var SuperController = require('./framework/v0.6.13/core/controller');
|
|
22
|
+
var EntitySuper = require('./framework/v0.6.13/core/model/entity');
|
|
23
23
|
|
|
24
24
|
// uuid — from the lib registry
|
|
25
|
-
var uuid = require('./framework/v0.6.
|
|
25
|
+
var uuid = require('./framework/v0.6.13/lib/uuid');
|
|
26
26
|
|
|
27
27
|
module.exports = {
|
|
28
28
|
|