gina 0.6.30 → 0.6.31
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 +11 -0
- package/README.md +23 -28
- package/ROADMAP.md +5 -4
- package/framework/v0.6.31/VERSION +1 -0
- package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.js +31 -1
- package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +2 -2
- package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.30 → v0.6.31}/core/config.js +100 -6
- package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/index.js +1 -1
- package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.v3.js +99 -2
- package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.v4.js +99 -2
- package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.js +119 -8
- package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +1 -1
- package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +1 -1
- package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/src/form-validator.js +31 -1
- package/framework/{v0.6.30 → v0.6.31}/core/server.isaac.js +15 -0
- package/framework/{v0.6.30 → v0.6.31}/core/server.js +79 -18
- package/framework/{v0.6.30 → v0.6.31}/helpers/context.js +10 -0
- package/framework/{v0.6.30 → v0.6.31}/lib/index.js +7 -0
- package/framework/{v0.6.30 → v0.6.31}/lib/job/src/main.js +157 -31
- package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/src/main.js +9 -1
- package/framework/v0.6.31/lib/priority/package.json +18 -0
- package/framework/v0.6.31/lib/priority/src/main.js +499 -0
- package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/src/main.js +9 -1
- package/framework/{v0.6.30 → v0.6.31}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +7 -5
- package/package.json +4 -4
- package/schema/connectors.json +5 -0
- package/types/index.d.ts +63 -2
- package/framework/v0.6.30/VERSION +0 -1
- package/framework/v0.6.30/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.30/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/AUTHORS +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/LICENSE +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/storage-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/kv-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/settle-once.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/kv-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/content.encoding +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-xml.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/inline-script.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/dev/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/gna.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/locales/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/mime.types +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/model/entity.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/model/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/router.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/server.express.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/status.codes +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/console.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/path.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/task.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/helpers/text.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/async/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/gc.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/stats.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/verify.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/conf-view/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/conf-view/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/config.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/idempotency/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/idempotency/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/job/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/job-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/kv/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/kv/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/kv-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/redact.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/maintenance/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/maintenance/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/math/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/message-validator/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/message-validator/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/model.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/money/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/money/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/multipart/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/multipart/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/proc.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/push/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/push/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/rate-limit/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/rate-limit/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/exec.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/declaration.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/sources.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/security-headers-emitter/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/security-headers-emitter/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/session-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/shell.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/sri/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/sri/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/state.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local-cas.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local-stream.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/meta-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/s3.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/util.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/storage-store.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/url/README.md +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/url/index.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/validator.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.30 → v0.6.31}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,17 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|
|
6
6
|
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## 0.6.31 - 2026-09-14
|
|
10
|
+
### Added
|
|
11
|
+
* RFC 9218 request priorities (#H12): `req.priority` is parsed on both engines from the `Priority` header — urgency 0–7 (default 3) and the incremental flag, with out-of-range, wrong-type or malformed values ignored exactly as the RFC requires — `self.query()` and `self.forward()` propagate a present inbound priority to the target bundle (a caller-set `headers.priority` wins, `priority: false` suppresses, an explicit `priority` option is sent normalized), `self.setPriority()` emits the response header, and `self.startJob(fn, { urgency })` orders the async-job queue: the worker always starts the lowest-urgency queued job first, FIFO within a class, a retried attempt keeps its urgency, and the value is never inherited from the request — an action passes it explicitly. The header is advisory and client-supplied: the framework carries the signal, it never reorders response writes.
|
|
12
|
+
### Fixed
|
|
13
|
+
* Refreshed two external references that had gone dead. The X-Permitted-Cross-Domain-Policies plugin cited an Adobe specification URL that now redirects to a generic documentation portal instead of serving the document; the plugin README and the module JSDoc both carried it, and both now name the current, live Adobe copy of the same specification. The Couchbase connector cited an N1QL architecture page that returns 404 with no migration redirect; it now points at the Query Service page that Couchbase itself redirects that path to. Documentation only; no runtime or API change.
|
|
14
|
+
* A couchbase connector that cannot reach its cluster at boot now fails loudly instead of hanging. Consumers wait on a one-shot `ready` event, and every failure path in `connect()` only re-armed a retry without ever emitting it, so the all-or-nothing ready gate in the model layer never closed, the bundle never signalled that it had started, and `bundle:start` terminated it after roughly 64 seconds with no terminal error logged anywhere. `init()` now arms its own readiness deadline and emits the failure itself, so the existing abort path (log plus exit 1) runs first. Tunable per `connectors.json` entry with `readyTimeout` (milliseconds, default 50000); a value at or above the bundle-start budget cannot take effect, since the CLI terminates the bundle first. Separately, a single failed connect attempt now reports once rather than twice: the SDK settles both its callback and its awaited promise, which armed two competing retry chains and escalated the backoff at twice the intended rate; and a rejection that never calls back no longer throws before arming any retry. Applies to both the SDK v3 and v4 connectors (#B541).
|
|
15
|
+
* A bundle whose release tree carries no `config/` directory no longer moves every other bundle's configuration root. The source-tree fallback that recovers such a bundle wrote that one bundle's own directory into the process-wide `bundles` path — the registry every other writer and reader treats as the container of ALL bundles — and reassigned the shared loop variable the same loop hands to every bundle walked after it. In a non-dev environment a later, perfectly healthy bundle therefore loaded its SOURCE config instead of its release config without a word, or died on a spliced path: the container was derived by stripping the manifest KEY from a path built from the source DIRECTORY NAME, with an unanchored and unescaped regular expression, so it produced a wrong path whenever the two differ, whenever the project path repeats the bundle name earlier (`/demo` inside `/demo-x`), or whenever the name carries a regular-expression metacharacter. The fallback is now scoped to the bundle it recovers, and the container comes from the parent directory rather than a text substitution. Separately, the three config-directory failures that abort a boot named neither the bundle nor the environment, sending up a raw ENOENT whose only clue was a path the operator had never written down; all three now refuse in the same shape as the routing.json refusal, and the last-chance one reports both the release link and the source tree it tried, in that order. And a `getInstance()` call that reaches a Config whose initialisation aborted now reports the retained reason instead of merging the global context wholesale — which on a worker returned the Config constructor itself and surfaced as an opaque `TypeError: Cannot set properties of undefined (setting 'parent')` that named neither the bundle nor the file and repeated forever (#B542).
|
|
16
|
+
### Security
|
|
17
|
+
* A queued async job now runs inside a detached copy of the request context that created it. The worker pumps its queue from the settle chain of the job that just finished, so under load a job created by one request ran inside the per-request context of whichever request's job had freed the worker slot — measured on a single-worker bundle: a job created by request B executed seeing request A's context, response objects included. Everything that reads that context then attributed the job to the wrong request: an absolute URL the job built through `getRoute().toUrl()` used the other request's proxy context and host; a failure the job raised through the global `getConfig()` / `getLib()` helpers was handled as that other request's — written to its response, or handed to its middleware chain once the response had gone out; and a JSON log line the job wrote carried the other request's id. `create()` now captures the creating request's identity and proxy context — never its `req`, `res` or `next` — and the whole lifecycle of the job (its record transitions, the deferred function, a retry it arms, its completion webhook) runs inside that copy; a job created outside any request runs with no request context at all, even when the worker that starts it was freed by a request's job. `throwError` treats a detached context as authoritative: with no live response to answer, a failing job is logged (fatal) or the error is thrown to the job (non-fatal), never written to any client. The per-request context has existed since `0.4.5`, where the misattribution reached JSON log lines only; the URL-host reader arrived in `0.6.28` and the response reader in `0.6.30`. Nothing about the job record changes, so durable stores serialise exactly what they did. Pickup: a bundle restart; this change's own bytes do not reach the client bundle. (#B543)
|
|
18
|
+
* A request carrying a top-level field named `count` no longer crashes the bundle. gina installs a `count()` helper on `Object.prototype`, and the framework reached it as `<container>.count()` on containers whose keys the CLIENT chooses: the parsed request body, the query bag, route params, uploaded files, data handed to `self.query()`, a routing rule's validator data, and whatever a template pipes through `| length`. An own property of that name shadows the helper, so the framework called a string. On the body branches, which parse inside a try, that surfaced as a 500; on the query branches, which do not, it reached the process as an uncaughtException and the bundle EXITED — unauthenticated, one request, on any URL including one matching no route, because the body parse runs before routing resolves. A route param of that name left the request hanging open instead of answering. Every published version is affected. The framework now reaches the helper through a form no own property can shadow, via a small `ownCount()` on each affected module; it is the same function body, so every other receiver shape counts exactly as before, and `null` and `undefined` still throw exactly as the shorthand did — the empty-object seeding in the body-parse branches depends on that. Nested fields (`{"outer":{"count":1}}`) and near-misses (`counter`) were never affected, and are unchanged. Application code calling `x.count()` is untouched: the helper stays on `Object.prototype`. Counts over framework-built objects (response headers, the routing table, config) deliberately keep the shorthand. Pickup: a bundle restart AND a re-bake (#B546).
|
|
19
|
+
|
|
9
20
|
## 0.6.30 - 2026-09-10
|
|
10
21
|
### Added
|
|
11
22
|
* Log rotation for the logger's opt-in `file` container, on by default at 10MB with 5 files kept — deliberately the same shape as the kubelet's own `containerLogMaxSize` / `containerLogMaxFiles`. Configure it under `rotate` in `~/.gina/user/extensions/logger/file/config.json`, where the container is already enabled: `enabled` (default true), `when` (`"daily"` or null), `size` (default `"10MB"`), `count` (default 5) and `maxAge` (e.g. `"30d"`, off by default). The live file is renamed and reopened rather than copied and truncated, so no line is lost while rotating, and the sink holds one append stream per group over a synchronously opened descriptor — which is what lets a burst of lines logged in a single tick rotate correctly, since a stream that opens asynchronously has no file to rename yet. A size or age without an explicit unit is refused rather than guessed — `"10"` is never read as bytes — and any invalid value disables rotation with a message naming the key, the value and the consequence, reported through the log flows so it reaches stdout and `gina tail`, while logging itself continues. Each log group is written to its own file, `<logdir>/<bundle>@<project>.log`. Two bounds are worth knowing: bytes still queued when a process exits can be lost, because flushing is asynchronous and making every write synchronous would let a full disk block the request loop; and a file that stops draining past a 4MB buffer drops lines with one warning per outage, the same posture the MQ transport already takes.
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architectur
|
|
|
15
15
|
|
|
16
16
|
| Feature | Detail |
|
|
17
17
|
| --- | --- |
|
|
18
|
-
| HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback, 103 Early Hints, CVE-hardened |
|
|
18
|
+
| HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback, 103 Early Hints, RFC 9218 request priorities, CVE-hardened |
|
|
19
19
|
| Multi-bundle | One project, N independent bundles with shared config and project layer |
|
|
20
20
|
| Scope isolation | `local` / `beta` / `production` — per-request and per-record |
|
|
21
21
|
| MVC routing | `routing.json` — declare routes in config, not code; O(m) radix trie lookup |
|
|
@@ -66,37 +66,32 @@ open https://localhost:3100
|
|
|
66
66
|
|
|
67
67
|
> **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
|
|
68
68
|
|
|
69
|
-
## What's in 0.6.
|
|
69
|
+
## What's in 0.6.31
|
|
70
70
|
|
|
71
|
-
> **Restart your bundles *and* rebuild them.**
|
|
72
|
-
>
|
|
73
|
-
> `gina bundle:restart` alone leaves
|
|
74
|
-
> consuming bundle, then restart.
|
|
71
|
+
> **Restart your bundles *and* rebuild them.** The validator's shared rule
|
|
72
|
+
> engine ships in the browser bundle and one of this release's security fixes
|
|
73
|
+
> touches it, so `gina.min.js` changed and `gina bundle:restart` alone leaves
|
|
74
|
+
> the old client running. Rebuild each consuming bundle, then restart.
|
|
75
75
|
|
|
76
|
-
> **No settings reset.** `0.6.
|
|
76
|
+
> **No settings reset.** `0.6.31` is a patch — the `shortVersion` stays `0.6`,
|
|
77
77
|
> so your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
|
|
78
78
|
|
|
79
|
-
**The
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- **Security — a
|
|
90
|
-
- **Security — a
|
|
91
|
-
- **
|
|
92
|
-
- **
|
|
93
|
-
- **
|
|
94
|
-
- **Fixed —
|
|
95
|
-
- **Fixed — a framework error is answered to the request that raised it (#B534).** The response came from a process-wide slot the router fills on every routed request and never clears, so a callback resuming after an `await` wrote its failure to a later request's client while its own caller hung until timeout.
|
|
96
|
-
- **Fixed — the `query` validation rule no longer writes into shared proxy config (#B522).** A rule targeting another bundle set `method`, `path` and a route-derived `requestTimeout` on the process-wide proxy target, so a later live-check from a different route silently ran on the earlier route's deadline — and on HTTP/2 the timeout destroys the pooled session shared with every other request to that authority.
|
|
97
|
-
- **Fixed — the logger's `file` container writes (#B523).** It connected to the MQ, received every line and wrote nothing; it is now an in-process transport writing only its own process's lines, needing no daemon.
|
|
98
|
-
- **Fixed — `gina-container` applies the container logging preset itself (#B524).** A bundle it runs emits JSON and skips the MQ transport, instead of writing coloured text while two processes dial a listener that cannot exist in that topology. Explicit values still win.
|
|
99
|
-
- **Fixed — a req-less `getRoute()` returns a boolean `isProxyHost` (#B537).** Cloning such a route no longer logs a warning, with a stack, for a value that was legitimately unset.
|
|
79
|
+
**The availability release.** Two security fixes lead: a request carrying a
|
|
80
|
+
top-level field named `count` could terminate the bundle process —
|
|
81
|
+
unauthenticated, one request, on any URL, in every published version — and a
|
|
82
|
+
queued async job could run inside another request's context. Alongside them,
|
|
83
|
+
RFC 9218 request priorities arrive on both engines, a Couchbase connector that
|
|
84
|
+
cannot reach its cluster at boot now says so instead of hanging until the CLI
|
|
85
|
+
kills the bundle, and one bundle without a release `config/` no longer moves
|
|
86
|
+
every other bundle's configuration root. Full detail in
|
|
87
|
+
[CHANGELOG.md](./CHANGELOG.md).
|
|
88
|
+
|
|
89
|
+
- **Security — a request field named `count` no longer terminates the bundle (#B546).** gina installs a `count()` helper on `Object.prototype`, and the framework reached it as `<container>.count()` on containers whose keys the client chooses — the parsed body, the query bag, route params, uploaded files. An own property of that name shadowed the helper, so the framework called a string: a 500 on the body branches, an `uncaughtException` that exited the process on the query branches, and a request left hanging open on a route param. Every published version was affected. The framework now reaches the helper through a form no own property can shadow; application code calling `x.count()` is untouched.
|
|
90
|
+
- **Security — a queued async job runs inside a detached copy of its creator's context (#B543).** The worker pumps its queue from the settle chain of the job that just finished, so under load a job created by one request ran inside the context of whichever request's job had freed the slot: a URL it built through `getRoute().toUrl()` used the other request's host, a failure it raised through the global `getConfig()` / `getLib()` was written to the other request's response, and its JSON log lines carried the other request's id. A job now captures the creating request's identity and proxy context — never `req`, `res` or `next` — and runs its whole lifecycle inside that copy.
|
|
91
|
+
- **Added — RFC 9218 request priorities (#H12).** `req.priority` is parsed on both engines from the `Priority` header (urgency 0–7, the incremental flag; malformed values ignored as the RFC requires), `self.query()` and `self.forward()` propagate it to the target bundle, `self.setPriority()` emits the response header, and `self.startJob(fn, { urgency })` starts the lowest-urgency queued job first. The header is advisory: the framework carries the signal and never reorders response writes.
|
|
92
|
+
- **Fixed — a Couchbase connector that cannot reach its cluster at boot fails loudly (#B541).** Every failure path in `connect()` re-armed a retry without ever emitting `ready`, so the model layer's ready gate never closed and `bundle:start` killed the bundle after roughly 64 seconds with nothing logged. `init()` now arms its own deadline (`readyTimeout` per `connectors.json` entry, default 50000 ms) and reports the failure itself; a single failed attempt also reports once rather than twice. Both SDK v3 and v4 connectors.
|
|
93
|
+
- **Fixed — a bundle without a release `config/` no longer moves every other bundle's configuration root (#B542).** The source-tree fallback wrote that bundle's own directory into the process-wide `bundles` path and reassigned the shared loop variable, so a later, healthy bundle silently loaded its source config in production, or died on a spliced path. The fallback is now scoped to the bundle it recovers, the three config-directory refusals name the bundle and the environment, and an aborted initialisation reports its retained reason instead of an opaque `TypeError`.
|
|
94
|
+
- **Fixed — two dead external references refreshed.** The X-Permitted-Cross-Domain-Policies plugin and the Couchbase connector each cited a page that no longer serves the document; both now point at the live copy. Documentation only.
|
|
100
95
|
|
|
101
96
|
|
|
102
97
|
## Documentation
|
package/ROADMAP.md
CHANGED
|
@@ -82,9 +82,10 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
82
82
|
| **Q4 2026** | `0.6.28` ✅ | **Security**: absolute URLs built by an application-level `getRoute().toUrl()` no longer inherit another request's proxy context — after a single request carrying a port-less `Host` (an orchestrator probe, a sibling-bundle call) reached a worker, every later direct request on it built URLs from a worker-global, dropping the port on HTTP/1.1 and emitting the *last port-less client's host* verbatim on HTTP/2 + HTTPS, which is a host-header-injection class for application-built links and redirects; the proxied classification and proxy hostname now resolve from the request itself, and on earlier versions `server.proxy.requireForwardedHeaders` closes the port-less-`Host` path only. **Added**: `self.forward()` relays a `multipart/form-data` request, uploads included, through a new RFC 7578 encoder and a raw-body pass-through, bounded by the source bundle's upload cap (413 on breach, 400 for a body-less method). **Fixed**: `self.forward()` forwards to the route it resolves instead of the target bundle's webroot alone; the browser client no longer stays half-booted on a light page or inside a cross-origin iframe; the HTTP/2 `rel=preload` header is sent on every response rather than only the first per view; the automatic 103 Early Hints response fires at all; the Inspector View tab shows its assets map again; a custom error page carries its preloads and its external plugins; a retried HTTP/1 request goes out with its body; the fluent `.onComplete()` handles of `query()`, `store()`, `run()` and `Shell::run()` refuse a callback they cannot call, and the dead one on entity method objects is removed; `{% extends %}` extraction stops at its own directive and tolerates the layout being named ahead of it; `POST /_gina/maintenance` refuses an invalid `ttlSeconds` instead of arming an unbounded window. Restart your bundles **and rebuild them** — three of the fixes are browser-bundled. |
|
|
83
83
|
| **Q4 2026** | `0.6.29` ✅ | **Security**: a failed Couchbase N1QL statement no longer carries its own result rows into the error it raises — the connector put the query service's whole response envelope, result documents included, on `error.stack` and `error.cause.http_body`, so a `RETURNING` statement that lost a CAS race or a SELECT that timed out part-way wrote the records it had already produced into any log that printed the error, with no interception point for a bundle; both now carry the envelope with `results` replaced by a row-count marker, while `errors`, `requestID`, `status`, `signature` and the classifier's `first_error_code`/`retry` are unchanged. **Added**: `bundle:build` and `project:build` gain an opt-in `--skip-unchanged` — a release whose source is byte-identical to what it was built from keeps its copy, signed by content rather than timestamps and recorded as `.gina-build.json`, with the manifest update, fingerprint stamp, `node_modules` link and both hooks still running and any doubt rebuilding. **Fixed**: a server-side field error reaches the visible control when a hidden twin of the same name comes first in document order; a path-form `getUrl` route containing `@` — the retina-asset idiom — no longer renders a 500 on either template engine; a staged upload no longer posts the literal `[object Object]` into a form that declares no `[preview][...]` sub-fields. Restart your bundles **and rebuild them** — two of the fixes are browser-bundled. |
|
|
84
84
|
| **Q4 2026** | `0.6.30` ✅ | **Security**: the isolation release — a response rendered on the default swig path no longer carries a concurrent request's negotiated culture and webroot (50 of 50 concurrent pairs bled before the fix, 0 of 100 after); a later `util.promisify`-style caller of an entity method no longer receives an earlier call's record, which where the method reads a user-scoped row could pass an ownership check on another principal's data; and the error raised by the global `getConfig()` / `getLib()` helpers no longer writes its stack to the response, minting an incident `ref` and logging one full-detail line instead. **Changed**: `self.getConfig()` returns a per-call copy-on-write view of the configuration instead of a deep clone — reads pass through, your writes stay yours, and a route behind two middlewares reading `this.getConfig()` measured 14,719 ms → 1,884 ms per 3,000 requests. **Added**: log rotation for the logger's opt-in `file` container, and `gina tail` renders JSON when its logger's format is `json`. **Fixed**: bundle templates render through a per-bundle engine; a framework error is answered to the request that raised it rather than the most recently routed one; the server-side `query` validation rule no longer writes into the shared proxy configuration; the `file` container writes at all; and `gina-container` applies the container logging preset itself. |
|
|
85
|
-
| **
|
|
85
|
+
| **Q4 2026** | `0.6.31` ✅ | **Security**: the availability release — a request carrying a top-level field named `count` no longer terminates the bundle process (unauthenticated, one request, on any URL including one matching no route; every published version was affected), and a queued async job runs inside a detached copy of the request context that created it instead of whichever request's job freed the worker slot. **Added**: RFC 9218 request priorities — `req.priority` on both engines, propagation through `self.query()` / `self.forward()`, `self.setPriority()`, and urgency-ordered async jobs. **Fixed**: a Couchbase connector that cannot reach its cluster at boot reports the failure instead of hanging until the CLI kills the bundle; one bundle without a release `config/` no longer moves every other bundle's configuration root, and the config-directory refusals name the bundle; two dead external references refreshed. Restart your bundles **and rebuild them** — the `count` fix touches the validator's shared rule engine, which is browser-bundled. |
|
|
86
|
+
| **Q1 2027** | `0.6.x` | HTTP/2 priorities ✅ shipped early in `0.6.31` (the `Priority` header half — read, propagated, emitted, job urgency; response ordering stays blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
|
|
86
87
|
| **2027** | `0.7.0` | Performance — remaining measure-gated candidates: multipart & WebSocket fast paths, render/log cleanups, SIMD scanner (the render-path deep-clone & id-mint reduction shipped early in `0.6.2` with a measured 4.4× render-throughput gain; the profiling baseline itself also shipped in `0.6.2`; the per-request configuration view — `getConfig()` without the deep clone — landed for the next `0.6.x` cut) |
|
|
87
|
-
| **2027** | `0.8.0` |
|
|
88
|
+
| **2027** | `0.8.0` | ⚠️ **Delivered early — this content shipped in `0.6.25` (2026-09-03)**: XML request/response handling · pluggable message-schema validation · IBAN/BIC validation rules · money & ISO 4217 minor-unit utilities · idempotency keys. No committed content remains against this milestone; re-scope before planning around it. |
|
|
88
89
|
| **2027** | `0.9.0` | Financial-integration heavyweights — entity-layer datastore transaction seam · message-queue connector family (AMQP / Kafka / IBM MQ) |
|
|
89
90
|
| **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
|
|
90
91
|
|
|
@@ -106,7 +107,7 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
106
107
|
| ✅ | **Stale built-release watch** — For LOCAL production rehearsals. A bundle serving a built release under `local` scope + a non-dev env has no hot-reload, so after you edit source it silently keeps serving the stale build. Opt in via `server.releaseWatch` in `settings.json`: the bundle watches its SOURCE tree, compares fingerprints against the manifest release stamp, and surfaces staleness on `GET /_gina/release/status` and a live `GET /_gina/release/events` SSE stream (notify mode, the default) — or auto-rebuilds on change (opt-in `auto` mode). `POST /_gina/release/rebuild` rebuilds with an **idle-gated restart** that waits on in-flight HTTP requests and `gina.registerBusyProbe` application probes, so a restart never interrupts in-flight work. Hard-gated on `local` scope + a non-dev env — never active on a real cluster. | `0.5.18-alpha` | 2026-07-16 |
|
|
107
108
|
| ✅ | **Popin eager preload** — Opt-in idle warming for AJAX popin content. Mark a trigger with `data-gina-dialog-preload="eager"` (case-insensitive) and the popin plugin fetches its content after `window` load, at browser idle — one trigger at a time, off the critical path — so opening feels instant with no second GET. Same safety gates as the hover/focus warm: the `"false"` opt-out and the disabled skip apply identically, and an eager warm and a hover warm coalesce into a single GET (whichever runs second is a no-op). The pass is skipped when the browser signals Save-Data. Default behavior is unchanged — hover/focus warm remains the default. | `0.5.21-alpha` | 2026-07-19 |
|
|
108
109
|
| ✅ | **Upload progress + drag-and-drop** — Extend the `data-gina-form-upload-*` staged client layer with transfer progress and drop-target support. **Progress shipped** (`0.5.24-alpha.2`): the staging POST reports real upload progress (`xhr.upload.onprogress`) through the registered `uploadProgress.<id>` client event, a `data-gina-form-upload-on-progress` window callback, and a declarative indicator (`data-gina-form-upload-progress`, default `<fieldId>-progress`) with a fully managed lifecycle. **Drag-and-drop shipped** (`0.5.24-alpha.2`): an attribute-marked dropzone (`data-gina-form-upload-dropzone="<elementId>"`, explicit id, opt-in) accepting dropped files through the exact same staging pipeline as the native file input — group tagging, previews, hidden metadata fields, reset/delete and upload progress included — with `idle`/`over`/`dropped` CSS state hooks, file-drags-only reaction, and first-file truncation on single-file inputs. Opt-in attributes, zero new dependencies, no server-contract change. | `0.5.24-alpha.2` | 2026-07-22 |
|
|
109
|
-
|
|
|
110
|
+
| ✅ | **Pluggable object storage** — Named drivers pairing an **adapter** (where the bytes live) with a **strategy** (how keys are laid out), behind one callback-shaped contract. Keys are opaque, so a later layout change never breaks stored references; writes publish atomically by temp-and-rename, so a reader never observes a partial object; and every object carries a metadata row written through a pluggable store seam — an embedded SQLite file by default, or a `connectors.json` entry when several processes share one root. A driver root that sits inside any web-served directory refuses the boot, since objects there would be publicly fetchable. Much of the layer has already shipped: the `local` adapter with the `sharded` (dated), `cas` (content-addressed, deduplicating, refcounted) and `stream` (large sequential media, with resumable out-of-order segment uploads) strategies, size tiering, byte-range reads, the metadata seam and its Couchbase store, boot validation, the `gina.storage()` accessor, upload groups publishing straight to a driver, the `storage:stats` / `storage:gc` / `storage:verify` maintenance CLI with its admin-gated `/_gina/storage/*` endpoints, and HTTP Range serving on both engines (`serveFromStorage()` — 206/416/304, conditional GET, strong key ETags). The `s3` adapter — storeless (the provider owns each object's metadata), S3-compatible, its client a project-side dependency, with presigned-URL offload serving (307) — completed the layer and shipped in `0.6.8`, which closes this milestone. Remaining maintenance verbs (`storage:migrate`, a deep `verify`, sharded verify) are demand-gated and tracked separately. | `0.6.8` | 2026-08-15 |
|
|
110
111
|
|
|
111
112
|
---
|
|
112
113
|
|
|
@@ -438,7 +439,7 @@ A cold audit of the Couchbase connector identified two critical security vulnera
|
|
|
438
439
|
| ✅ | **Application-level rapid reset rate limiter** (CVE-2023-44487) — per-session stream creation counter | `0.3.13` | 2026-05-14 | The Isaac HTTP/2 session handler counts new streams in a rolling 1s window per session; over `maxStreamsPerSecond` (default 200) it sends a GOAWAY and closes the session. More targeted than `maxSessionRejectedStreams` (which counts refused streams, not created ones). Configurable via `settings.json` `http2Options.maxStreamsPerSecond`; `/_gina/info` exposes a `rapidResetBlocked` counter. |
|
|
439
440
|
| ✅ | **Trailer support** — `stream.sendTrailers()` + `waitForTrailers: true` | `0.4.0` | 2026-05-22 | Opt-in HTTP/2 response trailers via `self.sendTrailers(fields)`. The render pipeline sets `waitForTrailers` and emits the trailing headers after the body (in the `wantTrailers` event), across all render delegates. Activated only when a controller calls `self.sendTrailers(fields)`; HTTP/1.1 and the no-trailers path are unchanged. For gRPC-style streaming (`grpc-status`) and content-integrity (`Digest`) use cases. |
|
|
440
441
|
| ✅ | **Alt-Svc header** — advertise HTTP/3 availability | `0.4.2` | 2026-06-02 | Set `Alt-Svc: h3=":443"; ma=86400` response header to advertise HTTP/3 (QUIC) availability via a QUIC-capable reverse proxy (nginx, Caddy, Cloudflare). Gina does not need to implement QUIC — just announce it. Opt-in via `settings.server.json`. Native HTTP/3 is out of scope: Node.js has no stable QUIC API, and the standard deployment topology (Gina → proxy → client) already delivers HTTP/3 at the edge. |
|
|
441
|
-
|
|
|
442
|
+
| ✅ | **RFC 9218 Extensible Priorities** — read, expose and propagate the `Priority: u=N, i` header | `0.6.31` | 2026-09-14 | Shipped: `req.priority` (urgency 0–7, the incremental flag, `present`) parsed on both engines, propagated on outbound `self.query()` / `self.forward()` calls (a caller-set header wins, `priority: false` suppresses), emitted with `self.setPriority()`, and consulted by the async-job worker through `startJob(fn, { urgency })` — explicit, never inherited from the request. Browsers do send it over HTTP/2 — Chrome spans the full urgency range and distinguishes documents, stylesheets, scripts, images and `fetch()` — while HTTP/1.1 sends nothing. Ordering the response writes themselves is **not** included: Node exposes no `PRIORITY_UPDATE` frame and no send-scheduler hook, so that half waits on the runtime. |
|
|
442
443
|
| ✅ | **WebSocket over HTTP/2** (RFC 8441 extended CONNECT) — opt-in via `http2Options.enableConnectProtocol` (default off; https and cleartext h2c HTTP/2 bundles). From `onInitialize`, `app.onWebSocket(path, handler)` registers per-path WebSocket handlers; accepted streams arrive as full sessions backed by a built-in dependency-free RFC 6455 codec (auto-pong, timed close handshake, UTF-8 + close-code validation, payload/fragment DoS caps, backpressure passthrough, graceful shutdown drain). Unknown paths are refused with 404, plain CONNECT keeps its 405, and default-off deployments are byte-identical. **Extended in `0.5.5`:** endpoints are declarable in `routing.json` (`method: "ws"` + `param.wsHandler` → `channels/<name>.js`, `:param` paths, per-route `param.wsOptions`), and handlers can call other bundles over HTTP with `session.query()`. | `0.4.7` | 2026-06-11 |
|
|
443
444
|
|
|
444
445
|
---
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.6.31
|
|
@@ -3037,6 +3037,33 @@ if ( ( typeof(module) !== 'undefined' ) && module.exports ) {
|
|
|
3037
3037
|
* `_validator.<rule>` namespace (catalog wins per key, English defaults fill).
|
|
3038
3038
|
* A non-string (e.g. the routing-mode rule object) is ignored by the overlay guard.
|
|
3039
3039
|
* */
|
|
3040
|
+
/**
|
|
3041
|
+
* Own-property count, reached WITHOUT the shadowable `<container>.count()` lookup (#B546).
|
|
3042
|
+
*
|
|
3043
|
+
* gina installs a `count()` helper on `Object.prototype` (`utils/prototypes.js`), so the
|
|
3044
|
+
* shorthand is an ordinary property lookup that an OWN property of the same name shadows.
|
|
3045
|
+
* Every container counted through this function is keyed by the CLIENT — a request body, a
|
|
3046
|
+
* query bag, route params, uploaded files, caller-supplied query data — so one field named
|
|
3047
|
+
* `count` made the framework call a string instead of the helper: a 500 on the guarded body
|
|
3048
|
+
* branches, and an uncaughtException that exited the process on the unguarded query ones.
|
|
3049
|
+
*
|
|
3050
|
+
* `ownCount()` reaches the helper itself, which no own property can
|
|
3051
|
+
* shadow, and is the same function body, so every receiver shape counts exactly as before.
|
|
3052
|
+
* The null/undefined branch is deliberate rather than defensive: `.call(null)` would bind
|
|
3053
|
+
* `this` to the global object and return ITS key count, while the shorthand threw — and the
|
|
3054
|
+
* empty-object seeding in the body-parse branches is built on that throw.
|
|
3055
|
+
*
|
|
3056
|
+
* @param {*} container - Any value the shorthand would have been called on.
|
|
3057
|
+
* @returns {number} Own enumerable property count.
|
|
3058
|
+
* @inner
|
|
3059
|
+
*/
|
|
3060
|
+
function ownCount(container) {
|
|
3061
|
+
if (container === null || typeof container === 'undefined') {
|
|
3062
|
+
return container.count(); // preserve the exact TypeError the shorthand raised
|
|
3063
|
+
}
|
|
3064
|
+
return Object.prototype.count.call(container);
|
|
3065
|
+
}
|
|
3066
|
+
|
|
3040
3067
|
function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
|
|
3041
3068
|
|
|
3042
3069
|
var isGFFCtx = ( ( typeof(module) !== 'undefined' ) && module.exports ) ? false : true;
|
|
@@ -4250,7 +4277,10 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
|
|
|
4250
4277
|
: serverInstance;
|
|
4251
4278
|
controller.setOptions(request, response, next, controllerOptions);
|
|
4252
4279
|
|
|
4253
|
-
|
|
4280
|
+
// #B546 — `options.data` carries the rule's declared data merged with the request's
|
|
4281
|
+
// own body/query bag (lib/routing), so its keys are client-chosen; counted through
|
|
4282
|
+
// `Object.prototype.count` so a field named `count` cannot shadow the helper.
|
|
4283
|
+
var data = ( typeof(options.data) == 'object' && ownCount(options.data) > 0 )
|
|
4254
4284
|
? options.data
|
|
4255
4285
|
: {};
|
|
4256
4286
|
// inherited data from current query asking for validation
|
|
@@ -52,7 +52,7 @@ G[u]==null||typeof G[u][T]=='undefined'||p[u][T]!=G[u][T]||(v[u]=A?G[u]:p[u]):v.
|
|
|
52
52
|
!1);return!G.constructor||A||T?!0:!1};K.setKeyComparison=function(G){L.keyComparison=G;return K};K.getKeyComparison=function(){var G=L.keyComparison||'id';L.keyComparison='id';return G};return K}typeof module!=='undefined'&&module.exports?(typeof JSON.clone=='undefined'&&(JSON.clone=require(__dirname+'/../../../../../utils/prototypes.json_clone')),module.exports=Merge()):typeof define==='function'&&define.amd&&define('lib/merge',[],function(){return Merge()});
|
|
53
53
|
var _alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',_mask=63,_step=7;function uuid(g){g=g||4;for(var v=g<=4?_step:Math.ceil(1.6*(_mask+1)*g/_alphabet.length),F='';;)for(var K=crypto.getRandomValues(new Uint8Array(v)),L=0;L<v;L++){var H=K[L]&_mask;if(H<62&&(F+=_alphabet[H],F.length===g))return F}}
|
|
54
54
|
uuid.customAlphabet=function(g,v){v=v||4;for(var F=1;F<g.length-1;)F=F<<1|1;var K=Math.ceil(1.6*(F+1)*v/g.length);K<5&&(K=5);return function(L){L=L||v;for(var H='';;)for(var G=crypto.getRandomValues(new Uint8Array(K)),p=0;p<K;p++){var A=G[p]&F;if(A<g.length&&(H+=g[A],H.length===L))return H}}};
|
|
55
|
-
if(typeof module!=='undefined'&&module.exports){if(typeof crypto==='undefined'||typeof crypto.getRandomValues!=='function'){var _webcrypto=require('crypto').webcrypto||require('crypto');typeof globalThis!=='undefined'?globalThis.crypto=_webcrypto:crypto=_webcrypto}module.exports=uuid}else typeof define==='function'&&define.amd&&define('lib/uuid',[],function(){return uuid});
|
|
55
|
+
if(typeof module!=='undefined'&&module.exports){if(typeof crypto==='undefined'||typeof crypto.getRandomValues!=='function'){var _webcrypto=require('crypto').webcrypto||require('crypto');typeof globalThis!=='undefined'?globalThis.crypto=_webcrypto:crypto=_webcrypto}module.exports=uuid}else typeof define==='function'&&define.amd&&define('lib/uuid',[],function(){return uuid});function ownCount(g){return g===null||typeof g==='undefined'?g.count():Object.prototype.count.call(g)}
|
|
56
56
|
function FormValidatorUtil(g,v,F,K,L){var H=typeof module!=='undefined'&&module.exports?!1:!0,G=H?require('lib/merge'):require('../../../../../lib/merge');H||require('../../../../../helpers');H&&require('helpers/dateFormat');var p=H?require('lib/routing'):require('../../../../../lib/routing'),A=H?null:require('../../../../../lib/i18n'),T=function(){if(typeof document==='undefined'||!document||typeof document.cookie!=='string')return null;var Q=document.cookie||'';if(!Q)return null;Q=Q.split(';');
|
|
57
57
|
for(var X=0,ha=Q.length;X<ha;++X){for(var Fa=Q[X];Fa.charAt(0)===' '||Fa.charAt(0)==='\t';)Fa=Fa.slice(1);var N=Fa.indexOf('=');if(!(N<0)&&Fa.slice(0,N)==='gina-csrf-token'){Q=Fa.slice(N+1);try{return decodeURIComponent(Q)}catch(P){return Q}}}return null},q=function(Q){if(typeof Q!=='string'||!Q)return!1;Q=Q.toUpperCase();return Q!=='GET'&&Q!=='HEAD'&&Q!=='OPTIONS'},u=function(){var Q=!1,X=null;H?H&&typeof gina.forms!='undefined'&&(X=gina.forms):X=getContext('gina').forms||null;X&&typeof X.validators!=
|
|
58
58
|
'undefined'&&(Q=!0);return Q},y={errors:{},keys:{'%l':'label','%n':'name','%s':'size'},errorLabels:{},data:{},excluded:[]},k={is:'Condition not satisfied',isEmail:'A valid email is required',isRequired:'Cannot be left empty',isBoolean:'Must be a valid boolean',isNumber:'Must be a number: allowed values are integers or floats',isNumberLength:'Must contain %s characters',isNumberMinLength:'Should be at least %s characters',isNumberMaxLength:'Should not be more than %s characters',isInteger:'Must be an integer',
|
|
@@ -82,7 +82,7 @@ A=async function(Q,X,ha,Fa){var N=(new (require(_(GINA_FRAMEWORK_DIR+'/core/conf
|
|
|
82
82
|
Ja=JSON.clone(p.getRoute(Q.url,Q.data));var ma=N[da][N.env],Oa=ma.content.server;typeof Oa._cached=='undefined'&&(Oa._cached=new Map);typeof Oa._cachedPath=='undefined'&&(Oa._cachePath=Oa.cache.path);typeof Oa._cacheIsEnabled=='undefined'&&(Oa._cacheIsEnabled=Oa.cache.enable);P||(N.bundle==da&&(P=getConfig(va,'settings').server.credentials,Q.ca=P.ca||null,Q.hostname=ma.server.scheme+'://'+ma.host,Q.port=ma.port[ma.server.protocol][ma.server.scheme],Q.protocol=ma.server.protocol,Q.rejectUnauthorized=
|
|
83
83
|
!1),P={ca:Q.ca,hostname:Q.hostname,port:Q.port,path:Q.path},typeof Q.protocol!='undefined'&&(P.protocol=Q.protocol),typeof Q.rejectUnauthorized!='undefined'&&(P.rejectUnauthorized=Q.rejectUnauthorized));ia={method:Ja.method,requirements:Ja.requirements,namespace:Ja.namespace||void 0,url:decodeURI(Ja.url),rule:ia+'@'+da,param:JSON.clone(Ja.param),middleware:JSON.clone(Ja.middleware),bundle:Ja.bundle,isXMLRequest:X.isXMLRequest,isWithCredentials:X.isWithCredentials};da=ia.rule.replace('@'+da,'')||'_common';
|
|
84
84
|
da={template:typeof ma.content.templates!='undefined'?ma.content.templates[da]||ma.content.templates._common:void 0,isCacheless:ma.isCacheless};da=G(da,ia);ma=JSON.clone(ma);da.conf=ma;da.conf.content.routing[da.rule].param=ia.param;da.template&&typeof da.template.ginaLoader=='undefined'&&(da.template.ginaLoader=da.conf.content.templates._common.ginaLoader);da.conf.content.routing[da.rule].param=ia.param;delete da.middleware;delete da.param;delete da.requirements;ma=new (require(_(GINA_FRAMEWORK_DIR+
|
|
85
|
-
'/core/controller/controller.js'),!0))(da);ma.name=Ja.param.control;ma.serverInstance=process.gina&&process.gina._serverInstance?process.gina._serverInstance:Oa;ma.setOptions(X,ha,Fa,da);X=typeof Q.data=='object'&&Q.data
|
|
85
|
+
'/core/controller/controller.js'),!0))(da);ma.name=Ja.param.control;ma.serverInstance=process.gina&&process.gina._serverInstance?process.gina._serverInstance:Oa;ma.setOptions(X,ha,Fa,da);X=typeof Q.data=='object'&&ownCount(Q.data)>0?Q.data:{};if(/^get|delete|put$/i.test(Q.method)){ha=0;for(let Ma in X)typeof X[Ma]=='object'&&encodeRFC5987ValueChars(JSON.stringify(X[Ma])),ha++}P.method=Q.method;P.path=Ja.url;Q=require('util').promisify;var ja={isValid:!1},Ca=!1;await Q(ma.query)(P,X).then(function(Ma){ja=
|
|
86
86
|
Ma}).catch(function(Ma){Ca=Ma});Ca&&(console.error(Ca),ja.error=Ca);return ja};var ea=null;ea=H?la:A;var ta=function(Q,X){var ha=null,Fa=null;typeof m[Q]=='undefined'&&typeof X!='undefined'&&(m[Q]=ha=X);if(typeof m[Q]=='object')try{ha=JSON.parse(JSON.stringify(m[Q]))}catch(N){ha=m[Q]}else ha=m[Q];Fa='';H&&typeof v!='undefined'&&(Fa=v[Q].getAttribute('data-gina-form-field-label')||'');m[Q]={target:H&&typeof v!='undefined'?v[Q]:null,name:Q,value:ha,valid:!1,label:Fa,exclude:!1};m[Q].is=function(N,P,
|
|
87
87
|
ia){var da=!1,va=typeof window!='undefined'?window:typeof global!='undefined'?global:null,Ja=va&&typeof va._currentValidatorAlias!='undefined'?va._currentValidatorAlias:'is';va&&va._currentValidatorAlias&&delete va._currentValidatorAlias;va=m[this.name].errors||{};y.data[this.name]=m[this.name].value;this.value===''&&(da=!0);if(!da&&/^(true|false)$/i.test(N))da=N;else if(!da){var ma=null,Oa=null;if(/[!=>><a-z 0-9]+/i.test(N)){if((Oa=N.match(/\${0}[-_,.\[\]a-z0-9]+/ig))&&Oa.length>0){for(var ja=0,
|
|
88
88
|
Ca=Oa.length;ja<Ca;++ja)typeof m[Oa[ja]]!='undefined'&&Oa[ja]&&(ma=new RegExp('\\$'+Oa[ja]+'(?!\\S+)','g'),N=m[Oa[ja]].value==''?N.replace(ma,'""'):typeof m[Oa[ja]].value=='string'?N.replace(ma,'"'+m[Oa[ja]].value+'"'):N.replace(ma,m[Oa[ja]].value));try{if(/^\//.test(N)){var Ma=N.match(/^\/(.+)\/([a-z]*)$/);if(!Ma)throw Error('Invalid regex literal: `'+N+'`');da=(new RegExp(Ma[1],Ma[2])).test(this.value)}else{N=N.replace(/(\(|\)|return)/g,'');Ma=/^\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*$/;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
//Imports.
|
|
10
10
|
var fs = require('fs');
|
|
11
|
+
var path = require('path');
|
|
11
12
|
var os = require('os');
|
|
12
13
|
var dns = require('dns');
|
|
13
14
|
var util = require('util');
|
|
@@ -241,6 +242,14 @@ function Config(opt, contextResetNeeded) {
|
|
|
241
242
|
console.error(_bundlesMsg);
|
|
242
243
|
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
243
244
|
try { fs.writeSync(2, _bundlesMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
245
|
+
// #B542 — retain the reason. Init is fully SYNCHRONOUS, so this
|
|
246
|
+
// branch runs INSIDE `new Config(...)` while the exit below is
|
|
247
|
+
// still only scheduled; a caller that chains `.getInstance()` in
|
|
248
|
+
// the same statement (helpers/context.js does) gets there first,
|
|
249
|
+
// with `Config.initialized` and `Config.instance` both unset.
|
|
250
|
+
// Without this, getInstance had nothing to report and invented an
|
|
251
|
+
// instance instead — see the guard in getInstance below.
|
|
252
|
+
Config.initError = err;
|
|
244
253
|
setTimeout(() => {
|
|
245
254
|
process.exit(1);
|
|
246
255
|
}, 0);
|
|
@@ -310,11 +319,34 @@ function Config(opt, contextResetNeeded) {
|
|
|
310
319
|
* @memberof module:gina/core/config
|
|
311
320
|
* @param {string} [bundle] - Bundle name; omit to return the full envConf
|
|
312
321
|
* @returns {object|undefined} Config instance, envConf slice, or undefined
|
|
322
|
+
* @throws {Error} If initialisation aborted — the retained reason, named (#B542)
|
|
313
323
|
*/
|
|
314
324
|
this.getInstance = function(bundle) {
|
|
315
325
|
|
|
326
|
+
// #B542 — refuse rather than fabricate. When init aborted, `Config.instance`
|
|
327
|
+
// is undefined (it is only assigned on the success branch) and the process is
|
|
328
|
+
// already scheduled to exit; a caller reaching here in the meantime used to
|
|
329
|
+
// fall into the merge below and get something that is not a Config back. Say
|
|
330
|
+
// what actually went wrong, once, instead of a downstream TypeError that names
|
|
331
|
+
// neither the bundle nor the file.
|
|
332
|
+
if ( typeof(Config.initialized) == 'undefined' && Config.initError ) {
|
|
333
|
+
throw new Error('[ CONFIG ] initialisation failed — '
|
|
334
|
+
+ (Config.initError.message || Config.initError));
|
|
335
|
+
}
|
|
336
|
+
|
|
316
337
|
if ( typeof(Config.instance) == 'undefined' && typeof(getContext('gina')) != 'undefined' ) {
|
|
317
|
-
|
|
338
|
+
// #B542 — lib/merge returns a non-object source WHOLESALE, and the worker
|
|
339
|
+
// branch of helpers/context.js puts the Config CONSTRUCTOR on `gina.config`.
|
|
340
|
+
// Unguarded, that made `Config.instance === Config`, whose `.Env` is
|
|
341
|
+
// undefined — the self-sustaining `Cannot set properties of undefined
|
|
342
|
+
// (setting 'parent')` two lines down, which survives every later call
|
|
343
|
+
// because this block's own guard then reads as satisfied.
|
|
344
|
+
var _merged = merge( self, getContext('gina').config, true );
|
|
345
|
+
if ( typeof(_merged) != 'object' || !_merged ) {
|
|
346
|
+
throw new Error('[ CONFIG ] cannot resolve an instance: the global context holds no usable `gina.config` (got '
|
|
347
|
+
+ (_merged === null ? 'null' : typeof(_merged)) + ')');
|
|
348
|
+
}
|
|
349
|
+
Config.instance = _merged;
|
|
318
350
|
self.envConf = Config.instance.envConf
|
|
319
351
|
}
|
|
320
352
|
|
|
@@ -916,11 +948,50 @@ function Config(opt, contextResetNeeded) {
|
|
|
916
948
|
// reverted: async readdir (#P33) breaks synchronous Config init contract
|
|
917
949
|
configFiles = fs.readdirSync(_(appSrcPath + '/config'));
|
|
918
950
|
} catch (srcReadErr) {
|
|
919
|
-
|
|
951
|
+
// #B542 — the last-chance branch: the release tree had no
|
|
952
|
+
// readable config/ and neither does the source tree. Report
|
|
953
|
+
// BOTH paths. `appPath` still holds the release link here
|
|
954
|
+
// (the `appPath = appSrcPath` reassignment is below), so the
|
|
955
|
+
// operator sees exactly what was tried and in what order,
|
|
956
|
+
// instead of a bare ENOENT naming only the second attempt.
|
|
957
|
+
let _noConfigMsg = '[ ' + app + ' ][ ' + env + ' ] no readable config/ in the release tree ('
|
|
958
|
+
+ appPath + ') nor in the source tree (' + appSrcPath + ') — '
|
|
959
|
+
+ (srcReadErr.message || srcReadErr) + '; refusing to start';
|
|
960
|
+
console.error(_noConfigMsg);
|
|
961
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
962
|
+
try { fs.writeSync(2, _noConfigMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
963
|
+
return callback(new Error(_noConfigMsg));
|
|
920
964
|
}
|
|
921
|
-
|
|
965
|
+
// #B542 — this fallback is PER-APP and must stay per-app. It used to
|
|
966
|
+
// do two things that outlived the one bundle it was recovering:
|
|
967
|
+
//
|
|
968
|
+
// 1. `setPath('bundles', _(appSrcPath, true))` wrote this ONE
|
|
969
|
+
// bundle's own directory into the process-global `bundles`
|
|
970
|
+
// registry, which every other writer (gna.js, helpers/context.js)
|
|
971
|
+
// and reader (this function's own `bundlesPath` initialiser,
|
|
972
|
+
// lib/proc.js's unmount) treats as the CONTAINER of all
|
|
973
|
+
// bundles. Nothing restored it. It is not load-bearing here —
|
|
974
|
+
// `appPath = appSrcPath` on the next line is what makes the
|
|
975
|
+
// src config readable — so it is simply gone.
|
|
976
|
+
// 2. `= bundlesPath =` reassigned the function-scoped loop local
|
|
977
|
+
// declared at the top of loadWithTemplate, which the guarded
|
|
978
|
+
// assignment above hands to every LATER app in this same loop.
|
|
979
|
+
// One bundle whose release tree carries no config/ therefore
|
|
980
|
+
// rewrote the config root of every bundle walked after it: in
|
|
981
|
+
// a non-dev env they silently loaded their SRC config instead
|
|
982
|
+
// of their release config, or died on a spliced path with an
|
|
983
|
+
// unnamed ENOENT.
|
|
984
|
+
//
|
|
985
|
+
// The old value was also computed by stripping `'/'+ app` from the
|
|
986
|
+
// path with an UNANCHORED, UNESCAPED RegExp keyed on the manifest
|
|
987
|
+
// KEY while the path carries the src DIRNAME — so it silently
|
|
988
|
+
// produced a wrong path whenever the two differ, whenever the
|
|
989
|
+
// project path contains the bundle's name earlier (`/demo` inside
|
|
990
|
+
// `/demo-x` is stripped first), or whenever the name carries a
|
|
991
|
+
// regex metacharacter. `path.dirname()` answers the same question
|
|
992
|
+
// ("which directory contains this bundle?") without any of that.
|
|
922
993
|
appPath = appSrcPath;
|
|
923
|
-
newContent[app][env].bundlesPath =
|
|
994
|
+
newContent[app][env].bundlesPath = path.dirname(appSrcPath);
|
|
924
995
|
console.warn('[CONFIG] Dependency bundle config loaded from '+ appSrcPath);
|
|
925
996
|
}
|
|
926
997
|
|
|
@@ -1783,7 +1854,20 @@ function Config(opt, contextResetNeeded) {
|
|
|
1783
1854
|
try {
|
|
1784
1855
|
configFiles = fs.readdirSync(_(appPath + '/config', true));
|
|
1785
1856
|
} catch (configReadErr) {
|
|
1786
|
-
|
|
1857
|
+
// #B542 — name it. This abort ends the SHARED config load for every
|
|
1858
|
+
// bundle in the project, and the bare `callback(err)` it replaces sent
|
|
1859
|
+
// up a raw ENOENT whose only clue was a path — which, when it came from
|
|
1860
|
+
// loadWithTemplate's src fallback, was a path no operator had ever
|
|
1861
|
+
// written down. `bundle`, `env` and `appPath` are all in scope here, so
|
|
1862
|
+
// "which bundle?" costs nothing to answer. Same shape as the #B132
|
|
1863
|
+
// routing.json refusal below, with #B181(b)'s stderr flush.
|
|
1864
|
+
e = '[ ' + bundle + ' ][ ' + env + ' ] config directory not readable at '
|
|
1865
|
+
+ appPath + '/config — ' + (configReadErr.message || configReadErr)
|
|
1866
|
+
+ '; refusing to start';
|
|
1867
|
+
console.error(e);
|
|
1868
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
1869
|
+
try { fs.writeSync(2, e + '\n'); } catch (_e) { /* best-effort */ }
|
|
1870
|
+
return callback(new Error(e));
|
|
1787
1871
|
}
|
|
1788
1872
|
|
|
1789
1873
|
if ( sharedConfigPathObj.existsSync() ) {
|
|
@@ -1792,7 +1876,17 @@ function Config(opt, contextResetNeeded) {
|
|
|
1792
1876
|
try {
|
|
1793
1877
|
sharedConfigFiles = fs.readdirSync(sharedconfigPath);
|
|
1794
1878
|
} catch (sharedReadErr) {
|
|
1795
|
-
|
|
1879
|
+
// #B542 — same treatment as the bundle config/ refusal above. The
|
|
1880
|
+
// path reached existsSync() one line earlier, so a failure here is a
|
|
1881
|
+
// permissions or race condition, not a typo — say which bundle's load
|
|
1882
|
+
// it killed and which directory it was.
|
|
1883
|
+
e = '[ ' + bundle + ' ][ ' + env + ' ] shared config directory not readable at '
|
|
1884
|
+
+ sharedconfigPath + ' — ' + (sharedReadErr.message || sharedReadErr)
|
|
1885
|
+
+ '; refusing to start';
|
|
1886
|
+
console.error(e);
|
|
1887
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
1888
|
+
try { fs.writeSync(2, e + '\n'); } catch (_e) { /* best-effort */ }
|
|
1889
|
+
return callback(new Error(e));
|
|
1796
1890
|
}
|
|
1797
1891
|
for (let i=0, len = sharedConfigFiles.length; i<len; i++) {
|
|
1798
1892
|
let file = sharedConfigFiles[i];
|
|
@@ -818,7 +818,7 @@ function Couchbase(conn, infos) {
|
|
|
818
818
|
//
|
|
819
819
|
// For more, visit :
|
|
820
820
|
// - https://blog.couchbase.com/high-performance-consistency/
|
|
821
|
-
// - https://
|
|
821
|
+
// - https://docs.couchbase.com/server/current/learn/services-and-indexes/services/query-service.html
|
|
822
822
|
// Query options values by default
|
|
823
823
|
var queryOptions = {
|
|
824
824
|
// Do not turn off the adhoc flag for each query since
|
|
@@ -10,6 +10,9 @@ var lib = gina.lib;
|
|
|
10
10
|
var console = lib.logger;
|
|
11
11
|
var merge = lib.merge;
|
|
12
12
|
var modelUtil = new lib.Model();
|
|
13
|
+
// #B432 — per-call at-most-once settle guard for a connector outcome
|
|
14
|
+
// (core/connectors/settle-once.js).
|
|
15
|
+
var settleOnce = require('./../../settle-once');
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
/**
|
|
@@ -24,6 +27,10 @@ var modelUtil = new lib.Model();
|
|
|
24
27
|
* `1m` will set the ping interval to 1 minute
|
|
25
28
|
* `1h` will set the ping interval to 1 hour
|
|
26
29
|
* `1d` will set the ping interval to 1 day
|
|
30
|
+
* - readyTimeout (default: 50000)
|
|
31
|
+
* milliseconds to wait for the connector to become ready at boot before
|
|
32
|
+
* failing loudly. Values at or above the CLI's ~64s bundle-start budget
|
|
33
|
+
* (`lib/cmd/bundle/start.js`) cannot take effect.
|
|
27
34
|
*
|
|
28
35
|
* @class
|
|
29
36
|
* */
|
|
@@ -39,6 +46,8 @@ function Connector(dbString) {
|
|
|
39
46
|
collection: '_default', // by default
|
|
40
47
|
keepAlive: true,
|
|
41
48
|
pingInterval : "2m",
|
|
49
|
+
// #B541 — boot readiness deadline, in milliseconds.
|
|
50
|
+
readyTimeout: 50000,
|
|
42
51
|
configProfile: "wan"
|
|
43
52
|
}
|
|
44
53
|
}
|
|
@@ -47,6 +56,38 @@ function Connector(dbString) {
|
|
|
47
56
|
}
|
|
48
57
|
;
|
|
49
58
|
|
|
59
|
+
// #B541 — boot readiness state. `_markSettled()` records that `ready` has
|
|
60
|
+
// been settled and disarms the boot deadline armed in init(); it does NOT
|
|
61
|
+
// gate `self.emit('ready', …)`. Repeat emits are load-bearing:
|
|
62
|
+
// `core/model/index.js` attaches a persistent `.on('ready')` that surfaces
|
|
63
|
+
// reconnect churn on the Inspector event signal, and both `onReady`
|
|
64
|
+
// consumers register `once`, which already drops a late delivery.
|
|
65
|
+
var _settled = false
|
|
66
|
+
, _deadlineId = null
|
|
67
|
+
;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Record that `ready` has been settled and disarm the boot deadline.
|
|
71
|
+
*
|
|
72
|
+
* Idempotent — a reconnect calls it again, by which point the timer is
|
|
73
|
+
* already `null`.
|
|
74
|
+
*
|
|
75
|
+
* @memberof Connector
|
|
76
|
+
* @inner
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* _markSettled();
|
|
81
|
+
* self.emit('ready', false, self.instance);
|
|
82
|
+
*/
|
|
83
|
+
var _markSettled = function() {
|
|
84
|
+
_settled = true;
|
|
85
|
+
if (_deadlineId) {
|
|
86
|
+
clearTimeout(_deadlineId);
|
|
87
|
+
_deadlineId = null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
50
91
|
/**
|
|
51
92
|
* arrayToValues
|
|
52
93
|
* Eg.: array like: ['a', 0.5, 'b', false]
|
|
@@ -72,7 +113,25 @@ function Connector(dbString) {
|
|
|
72
113
|
// Attention: the connection is lost 5 minutes once the bucket is opened.
|
|
73
114
|
var conn = null;
|
|
74
115
|
|
|
75
|
-
|
|
116
|
+
// #B541 — one outcome per connect attempt.
|
|
117
|
+
//
|
|
118
|
+
// On failure the couchbase SDK settles BOTH of its channels: it invokes
|
|
119
|
+
// the onBucketOpened callback AND rejects the awaited promise. So a
|
|
120
|
+
// single failed attempt called onError twice, arming TWO retry chains —
|
|
121
|
+
// and each of those, failing in turn, armed two more (2 -> 4 -> 8 ...) —
|
|
122
|
+
// while double-counting _reconnectAttempts, so the backoff escalated at
|
|
123
|
+
// twice the intended rate and reached its 60s cap after five real
|
|
124
|
+
// attempts instead of ten. The guard is minted PER connect() invocation,
|
|
125
|
+
// never at module scope, so a later reconnect's own attempt stays
|
|
126
|
+
// independently reportable.
|
|
127
|
+
var onError = settleOnce('couchbase-v' + sdk.version + ':connector#connect', function onErrorImpl(err, next) {
|
|
128
|
+
// The promise channel can run WITHOUT the callback channel having
|
|
129
|
+
// run first (a rejection that never calls back), and only the
|
|
130
|
+
// callback channel assigns self.instance — which is not initialised
|
|
131
|
+
// at construction. Without this guard that ordering throws here,
|
|
132
|
+
// before any retry is armed, and the throw surfaces only as an
|
|
133
|
+
// unhandled rejection of the bare self.connect(dbString) call.
|
|
134
|
+
if (!self.instance) self.instance = {};
|
|
76
135
|
delete self.instance.reconnecting;
|
|
77
136
|
self.instance.reconnected = self.instance.connected = false;
|
|
78
137
|
console.debug('[CONNECTOR][' + local.bundle +'] Scope is: '+ process.env.NODE_SCOPE );
|
|
@@ -98,7 +157,7 @@ function Connector(dbString) {
|
|
|
98
157
|
}
|
|
99
158
|
}, _backoffDelay)
|
|
100
159
|
|
|
101
|
-
};
|
|
160
|
+
}, console);
|
|
102
161
|
|
|
103
162
|
// once
|
|
104
163
|
var onConnect = function onConnect(cb){
|
|
@@ -239,6 +298,8 @@ function Connector(dbString) {
|
|
|
239
298
|
// setTimeout(() => {
|
|
240
299
|
// self.emit('ready', false, self.instance);
|
|
241
300
|
// }, 300);
|
|
301
|
+
// #B541 — disarm the boot deadline; the emit itself stays ungated.
|
|
302
|
+
_markSettled();
|
|
242
303
|
self.emit('ready', false, self.instance);
|
|
243
304
|
}
|
|
244
305
|
|
|
@@ -392,6 +453,40 @@ function Connector(dbString) {
|
|
|
392
453
|
dbString = merge(dbString, local.options);
|
|
393
454
|
local.options = dbString;
|
|
394
455
|
|
|
456
|
+
// #B541 — arm the boot readiness deadline.
|
|
457
|
+
//
|
|
458
|
+
// Every failure path in connect() routes to onError(), which only
|
|
459
|
+
// re-arms a retry — it never emits. Without this, a connector that
|
|
460
|
+
// cannot reach couchbase at boot NEVER settles: lib/model.js's
|
|
461
|
+
// all-or-nothing ready gate never closes, the bundle never prints
|
|
462
|
+
// the flags bundle:start watches for, and the CLI SIGKILLs it at
|
|
463
|
+
// ~64s (lib/cmd/bundle/start.js: maxRetry 15 x maxTimeout 4000ms)
|
|
464
|
+
// with no terminal error logged anywhere.
|
|
465
|
+
//
|
|
466
|
+
// lib/model.js's onModelReady ALREADY handles an error correctly —
|
|
467
|
+
// console.error + process.exit(1) — and that is how every other
|
|
468
|
+
// connector reports a dead database. It was simply unreachable
|
|
469
|
+
// here. So if nothing has settled by the deadline, emit the error
|
|
470
|
+
// ourselves and let that existing path run.
|
|
471
|
+
//
|
|
472
|
+
// NOT a retry cap: onError's uncapped reconnect is untouched, so a
|
|
473
|
+
// connector that HAS settled still recovers from a later blip.
|
|
474
|
+
// Deliberately NOT unref'd — were this the only handle holding the
|
|
475
|
+
// event loop, unref would let node exit 0 silently instead of
|
|
476
|
+
// reporting, and onError's retry timer already holds the loop.
|
|
477
|
+
var _readyTimeout = ( typeof(local.options.readyTimeout) == 'number' && local.options.readyTimeout > 0 )
|
|
478
|
+
? local.options.readyTimeout
|
|
479
|
+
: 50000;
|
|
480
|
+
|
|
481
|
+
if ( !_settled && !_deadlineId ) {
|
|
482
|
+
_deadlineId = setTimeout(function onReadyDeadline() {
|
|
483
|
+
_deadlineId = null;
|
|
484
|
+
if (_settled) return;
|
|
485
|
+
|
|
486
|
+
_markSettled();
|
|
487
|
+
self.emit('ready', new Error('[CONNECTOR][' + local.bundle +'][' + dbString.connector +'][' + dbString.database +'] Couchbase did not become ready within '+ (_readyTimeout/1000) +'s @`'+ dbString.protocol + dbString.host +'`\nCheck:\n - if couchbase is running and reachable from this host\n - if bucket `'+ dbString.database +'` exists\n - if the credentials are valid\nRaise `readyTimeout` on this connector entry to wait longer; it must stay under the ~64s bundle-start budget to take effect.'), null);
|
|
488
|
+
}, _readyTimeout);
|
|
489
|
+
}
|
|
395
490
|
|
|
396
491
|
console.info('[CONNECTOR][' + local.bundle +'][' + dbString.connector +'][' + dbString.database +'] authenticating to couchbase cluster @'+ dbString.protocol + dbString.host);
|
|
397
492
|
|
|
@@ -410,6 +505,8 @@ function Connector(dbString) {
|
|
|
410
505
|
|
|
411
506
|
} catch (err) {
|
|
412
507
|
console.error(err.stack);
|
|
508
|
+
// #B541 — a synchronous throw already settles; disarm the deadline.
|
|
509
|
+
_markSettled();
|
|
413
510
|
self.emit('ready', err, null)
|
|
414
511
|
}
|
|
415
512
|
}
|