gina 0.6.7 → 0.6.8
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 +22 -0
- package/README.md +27 -26
- package/ROADMAP.md +3 -2
- package/framework/v0.6.8/VERSION +1 -0
- package/framework/{v0.6.7 → v0.6.8}/core/config.js +10 -0
- package/framework/v0.6.8/core/connectors/couchbase/lib/storage-store.js +1074 -0
- package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.js +532 -22
- package/framework/v0.6.8/core/controller/controller.render-stream.js +270 -0
- package/framework/{v0.6.7 → v0.6.8}/core/gna.js +10 -2
- package/framework/{v0.6.7 → v0.6.8}/core/router.js +30 -10
- package/framework/{v0.6.7 → v0.6.8}/core/server.isaac.js +42 -7
- package/framework/{v0.6.7 → v0.6.8}/lib/cmd/storage/gc.js +6 -0
- package/framework/{v0.6.7 → v0.6.8}/lib/cmd/storage/stats.js +7 -0
- package/framework/{v0.6.7 → v0.6.8}/lib/cmd/storage/verify.js +6 -0
- package/framework/{v0.6.7 → v0.6.8}/lib/storage/src/local-cas.js +107 -9
- package/framework/v0.6.8/lib/storage/src/local-stream.js +1418 -0
- package/framework/{v0.6.7 → v0.6.8}/lib/storage/src/local.js +177 -16
- package/framework/{v0.6.7 → v0.6.8}/lib/storage/src/main.js +406 -25
- package/framework/{v0.6.7 → v0.6.8}/lib/storage/src/meta-store.js +13 -2
- package/framework/v0.6.8/lib/storage/src/s3.js +759 -0
- package/framework/{v0.6.7 → v0.6.8}/lib/storage/src/util.js +26 -1
- package/framework/{v0.6.7 → v0.6.8}/lib/storage-store.js +33 -23
- package/framework/{v0.6.7 → v0.6.8}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +22 -47
- package/package.json +3 -3
- package/schema/routing.json +4 -0
- package/schema/settings.json +84 -10
- package/script/check_no_local_leak.js +2 -1
- package/script/retry_lockfile_sync.js +2 -1
- package/script/soak/storage-couchbase/README.md +61 -0
- package/script/soak/storage-couchbase/probe-cas.js +77 -0
- package/script/soak/storage-couchbase/probe-store.js +101 -0
- package/types/index.d.ts +18 -0
- package/framework/v0.6.7/VERSION +0 -1
- package/framework/v0.6.7/core/controller/controller.render-stream.js +0 -169
- /package/framework/{v0.6.7 → v0.6.8}/AUTHORS +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/LICENSE +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/content.encoding +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/dev/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/locales/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/mime.types +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/model/entity.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/model/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/server.express.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/server.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/status.codes +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/console.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/context.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/path.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/task.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/helpers/text.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/async/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/config.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/job/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/job-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/math/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/model.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/proc.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/session-store.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/shell.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/state.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/url/README.md +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/url/index.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/validator.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.7 → v0.6.8}/lib/ws-session/src/main.js +0 -0
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
* strategy; the tiering slice adds size tiering (sub-threshold objects live
|
|
16
16
|
* inline in the metadata store — see `inlineThreshold`); the cas slice adds
|
|
17
17
|
* the `cas` strategy (content-addressed, refcounted, GC-swept — see
|
|
18
|
-
* `src/local-cas`);
|
|
19
|
-
*
|
|
18
|
+
* `src/local-cas`); the stream slice adds the `stream` strategy (large
|
|
19
|
+
* sequential media with resumable, out-of-order segment uploads — see
|
|
20
|
+
* `src/local-stream`); `s3` arrives with the demand that needs it, each
|
|
21
|
+
* capability-gated.
|
|
20
22
|
*
|
|
21
23
|
* **Keys are opaque.** A caller stores a stream and receives a key; it must
|
|
22
24
|
* never parse, compose or assume anything about that key's shape. That is what
|
|
@@ -112,6 +114,15 @@ var createLocalDriver = require('./local');
|
|
|
112
114
|
*/
|
|
113
115
|
var createLocalCasDriver = require('./local-cas');
|
|
114
116
|
|
|
117
|
+
/**
|
|
118
|
+
* The `local` adapter / `stream` strategy pair — large sequential media with
|
|
119
|
+
* resumable, out-of-order segment uploads.
|
|
120
|
+
*
|
|
121
|
+
* @inner
|
|
122
|
+
* @type {function(string, object, object): StorageDriver}
|
|
123
|
+
*/
|
|
124
|
+
var createLocalStreamDriver = require('./local-stream');
|
|
125
|
+
|
|
115
126
|
/**
|
|
116
127
|
* Strategy name → driver factory. THE dispatch seam: `start()` builds each
|
|
117
128
|
* driver through this map (strategy names are validated before `start()`
|
|
@@ -124,7 +135,37 @@ var createLocalCasDriver = require('./local-cas');
|
|
|
124
135
|
*/
|
|
125
136
|
var FACTORIES = {
|
|
126
137
|
sharded : createLocalDriver,
|
|
127
|
-
cas : createLocalCasDriver
|
|
138
|
+
cas : createLocalCasDriver,
|
|
139
|
+
stream : createLocalStreamDriver
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* `s3` adapter factory — object storage on any S3-compatible provider,
|
|
144
|
+
* storeless (the provider owns metadata). The SDK stays the consuming
|
|
145
|
+
* project's dependency, resolved through `start()`'s injected
|
|
146
|
+
* `requireProjectModule` (lib/storage is framework-independent, so the
|
|
147
|
+
* resolver is built by the caller where the path globals are legal).
|
|
148
|
+
*
|
|
149
|
+
* @inner
|
|
150
|
+
* @type {function(string, object, ?object, object): StorageDriver}
|
|
151
|
+
*/
|
|
152
|
+
var createS3Driver = require('./s3');
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Adapter × strategy — THE two-axis dispatch the strategy map above always
|
|
156
|
+
* said would arrive with a second adapter. Expressed as COMPOSITION rather
|
|
157
|
+
* than a rekey: `FACTORIES` keeps its flat strategy-keyed shape because the
|
|
158
|
+
* `storage:*` CLI's offline path dispatches through it directly (and its
|
|
159
|
+
* source is pinned by the maintenance suite) — offline builds are local-only
|
|
160
|
+
* by construction, so the flat map IS the local adapter's row here.
|
|
161
|
+
*
|
|
162
|
+
* @inner
|
|
163
|
+
* @constant
|
|
164
|
+
* @type {Object.<string, Object.<string, function>>}
|
|
165
|
+
*/
|
|
166
|
+
var ADAPTER_FACTORIES = {
|
|
167
|
+
local : FACTORIES,
|
|
168
|
+
s3 : { sharded: createS3Driver }
|
|
128
169
|
};
|
|
129
170
|
|
|
130
171
|
/**
|
|
@@ -146,7 +187,7 @@ var createEmbeddedMetaStore = require('./meta-store');
|
|
|
146
187
|
* @constant
|
|
147
188
|
* @type {string[]}
|
|
148
189
|
*/
|
|
149
|
-
var ADAPTERS = ['local'];
|
|
190
|
+
var ADAPTERS = ['local', 's3'];
|
|
150
191
|
|
|
151
192
|
/**
|
|
152
193
|
* Strategies implemented today.
|
|
@@ -155,18 +196,26 @@ var ADAPTERS = ['local'];
|
|
|
155
196
|
* @constant
|
|
156
197
|
* @type {string[]}
|
|
157
198
|
*/
|
|
158
|
-
var STRATEGIES = ['sharded', 'cas'];
|
|
199
|
+
var STRATEGIES = ['sharded', 'cas', 'stream'];
|
|
159
200
|
|
|
160
201
|
/**
|
|
161
202
|
* Strategies named in the design but not yet implemented. Kept distinct from
|
|
162
203
|
* "unknown" so the boot message can say *deferred* instead of *typo* — an
|
|
163
|
-
* operator who wrote
|
|
204
|
+
* operator who wrote a designed-but-unshipped name made a scheduling mistake,
|
|
205
|
+
* not a spelling one.
|
|
206
|
+
*
|
|
207
|
+
* **Currently EMPTY**: `cas` left this list when the cas slice shipped, and
|
|
208
|
+
* `stream` when the stream slice did (`s3` arrived as an ADAPTER — the
|
|
209
|
+
* two-axis dispatch below — so it never passed through here). The list and
|
|
210
|
+
* its boot branch stay — cheap, and the next designed-before-implemented
|
|
211
|
+
* strategy inherits a working message instead of re-deriving one. Until then
|
|
212
|
+
* the branch is exercised by nothing, which is recorded rather than hidden.
|
|
164
213
|
*
|
|
165
214
|
* @inner
|
|
166
215
|
* @constant
|
|
167
216
|
* @type {string[]}
|
|
168
217
|
*/
|
|
169
|
-
var DEFERRED_STRATEGIES = [
|
|
218
|
+
var DEFERRED_STRATEGIES = [];
|
|
170
219
|
|
|
171
220
|
/**
|
|
172
221
|
* Per-driver keys, BY STRATEGY. Anything else in a driver block is reported
|
|
@@ -182,10 +231,35 @@ var DEFERRED_STRATEGIES = ['stream'];
|
|
|
182
231
|
* @type {Object.<string, string[]>}
|
|
183
232
|
*/
|
|
184
233
|
var STRATEGY_KEYS = {
|
|
185
|
-
sharded
|
|
186
|
-
|
|
234
|
+
// NB `sharded` consumes `sweepGrace` but NOT `sweepInterval`: it reclaims
|
|
235
|
+
// crashed-put temp orphans at BUILD only, and has no periodic machinery to
|
|
236
|
+
// hang a tick on. A restart is also the earliest moment the previous
|
|
237
|
+
// process is provably gone, which is the whole safety argument (#B349).
|
|
238
|
+
sharded : ['adapter', 'strategy', 'root', 'maxObjectSize', 'store', 'inlineThreshold', 'sweepGrace'],
|
|
239
|
+
cas : ['adapter', 'strategy', 'root', 'maxObjectSize', 'store', 'inlineThreshold', 'hash', 'fsync', 'sweepInterval', 'sweepGrace'],
|
|
240
|
+
// NB `stream` carries NEITHER `inlineThreshold` NOR `hash`, deliberately:
|
|
241
|
+
// a multi-gigabyte strategy has no business inlining its payload into a
|
|
242
|
+
// metadata row, and its write path does not hash. Accepting either key
|
|
243
|
+
// would be exactly the "configured behaviour that never happens" lie this
|
|
244
|
+
// whole warning exists to prevent, so both warn as ignored instead.
|
|
245
|
+
stream : ['adapter', 'strategy', 'root', 'maxObjectSize', 'store', 'chunkSize', 'fsync', 'sessionTtl', 'sessionSweepInterval']
|
|
187
246
|
};
|
|
188
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Per-driver keys for the `s3` ADAPTER (one list — s3 runs a single
|
|
250
|
+
* strategy, so the per-strategy split above does not apply). NB what is
|
|
251
|
+
* deliberately ABSENT: `root` (no filesystem), `store`/`inlineThreshold`
|
|
252
|
+
* (storeless — no metadata rows to inline into), `hash`/`fsync` (the
|
|
253
|
+
* provider owns integrity and durability). Each warns as ignored — the
|
|
254
|
+
* same "configured behaviour that never happens" honesty as the strategy
|
|
255
|
+
* lists.
|
|
256
|
+
*
|
|
257
|
+
* @inner
|
|
258
|
+
* @constant
|
|
259
|
+
* @type {string[]}
|
|
260
|
+
*/
|
|
261
|
+
var S3_KEYS = ['adapter', 'strategy', 'bucket', 'region', 'endpoint', 'prefix', 'accessKeyId', 'secretAccessKey', 'sessionToken', 'forcePathStyle', 'presignExpiry', 'maxObjectSize', 'sweepGrace'];
|
|
262
|
+
|
|
189
263
|
/**
|
|
190
264
|
* Default per-object byte ceiling when a driver sets no `maxObjectSize`.
|
|
191
265
|
* Defense in depth only: no per-file cap exists anywhere upstream today (the
|
|
@@ -217,6 +291,20 @@ var DEFAULT_MAX_OBJECT_SIZE = 100 * 1024 * 1024;
|
|
|
217
291
|
*/
|
|
218
292
|
var DEFAULT_INLINE_THRESHOLD = 64 * 1024;
|
|
219
293
|
|
|
294
|
+
/**
|
|
295
|
+
* Default presigned-URL lifetime for `s3` drivers when `presignExpiry` is
|
|
296
|
+
* unset. 15 minutes: long enough for a redirect chain and a slow download to
|
|
297
|
+
* START (a transfer in flight survives expiry — S3 validates the signature
|
|
298
|
+
* at request time), short enough that a leaked URL goes stale fast. The
|
|
299
|
+
* serving facade re-presigns per request, so the lifetime is not a caching
|
|
300
|
+
* knob.
|
|
301
|
+
*
|
|
302
|
+
* @inner
|
|
303
|
+
* @constant
|
|
304
|
+
* @type {number}
|
|
305
|
+
*/
|
|
306
|
+
var DEFAULT_PRESIGN_EXPIRY = 15 * 60 * 1000;
|
|
307
|
+
|
|
220
308
|
/**
|
|
221
309
|
* Default digest algorithm for `cas` drivers. SHA-256: hardware-accelerated
|
|
222
310
|
* on every deployment target (SHA-NI, ARMv8 crypto extensions put it around
|
|
@@ -269,6 +357,64 @@ var DEFAULT_SWEEP_INTERVAL = 15 * 60 * 1000;
|
|
|
269
357
|
*/
|
|
270
358
|
var DEFAULT_SWEEP_GRACE = 60 * 60 * 1000;
|
|
271
359
|
|
|
360
|
+
/**
|
|
361
|
+
* Default segment size for `stream` drivers, in bytes. It becomes the write
|
|
362
|
+
* stream's `highWaterMark` — the same syscall size with no hand-rolled buffer
|
|
363
|
+
* and no extra copy, so memory stays bounded by the stream machinery rather
|
|
364
|
+
* than by us — and is echoed to clients as the size the write path is tuned
|
|
365
|
+
* for. 8MB: large enough that per-segment overheads (an fsync, a marker
|
|
366
|
+
* create) disappear against the transfer, small enough that re-sending one
|
|
367
|
+
* after a broken connection is cheap.
|
|
368
|
+
*
|
|
369
|
+
* REASONED against a measured mechanism, NOT tuned to a workload: no consumer
|
|
370
|
+
* with a large-sequential-media workload exists yet, so re-measure when one
|
|
371
|
+
* appears.
|
|
372
|
+
*
|
|
373
|
+
* @inner
|
|
374
|
+
* @constant
|
|
375
|
+
* @type {number}
|
|
376
|
+
*/
|
|
377
|
+
var DEFAULT_CHUNK_SIZE = 8 * 1024 * 1024;
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Whether `stream` publishes and segment writes fsync by default. `true` —
|
|
381
|
+
* the durability contract of a RESUMABLE upload is that a range the client
|
|
382
|
+
* was told is durable actually is, and the cost is ~2% of network-paced
|
|
383
|
+
* ingest at 100 Mbps (measured; ~19% at 1 Gbps, fsync-dominant at 10 Gbps).
|
|
384
|
+
* A LAN-ingest consumer sets `fsync: false` and accepts the documented
|
|
385
|
+
* power-loss window.
|
|
386
|
+
*
|
|
387
|
+
* @inner
|
|
388
|
+
* @constant
|
|
389
|
+
* @type {boolean}
|
|
390
|
+
*/
|
|
391
|
+
var DEFAULT_STREAM_FSYNC = true;
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Default lifetime of an untouched resumable upload session for `stream`
|
|
395
|
+
* drivers, in ms. REASONED, not benchmarked: it must comfortably exceed a
|
|
396
|
+
* paused-then-resumed upload over a bad link, and a session holds real disk,
|
|
397
|
+
* so 24 hours. A zero TTL would eat in-flight sessions and snaps back to this
|
|
398
|
+
* default (the `sweepGrace` reasoning).
|
|
399
|
+
*
|
|
400
|
+
* @inner
|
|
401
|
+
* @constant
|
|
402
|
+
* @type {number}
|
|
403
|
+
*/
|
|
404
|
+
var DEFAULT_SESSION_TTL = 24 * 60 * 60 * 1000;
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Default period of the abandoned-session sweep for `stream` drivers, in ms.
|
|
408
|
+
* REASONED, not benchmarked: the sweep gates reclaim latency only — no hot
|
|
409
|
+
* path — so the default just bounds how long an abandoned session's disk
|
|
410
|
+
* lingers past its TTL. 1 hour.
|
|
411
|
+
*
|
|
412
|
+
* @inner
|
|
413
|
+
* @constant
|
|
414
|
+
* @type {number}
|
|
415
|
+
*/
|
|
416
|
+
var DEFAULT_SESSION_SWEEP_INTERVAL = 60 * 60 * 1000;
|
|
417
|
+
|
|
272
418
|
/**
|
|
273
419
|
* Built drivers, keyed by name. `null` until {@link start} runs — deliberately
|
|
274
420
|
* NOT built at require time, because `test/lib/types-runtime-parity.test.js`
|
|
@@ -326,6 +472,12 @@ var _default = null;
|
|
|
326
472
|
* (which would re-open the sweep-vs-put race) — each falls back to its
|
|
327
473
|
* default; `'0s'` is legal and silent for `sweepInterval` only (periodic
|
|
328
474
|
* sweep off);
|
|
475
|
+
* - a stream `chunkSize` that is not a unit-suffixed size (or is zero), a
|
|
476
|
+
* `fsync` that is not a boolean, a `sessionTtl`/`sessionSweepInterval`
|
|
477
|
+
* that is not a unit-suffixed duration, or a zero `sessionTtl` (which
|
|
478
|
+
* would reclaim in-flight uploads) — each falls back to its default;
|
|
479
|
+
* `'0s'` is legal and silent for `sessionSweepInterval` only (periodic
|
|
480
|
+
* session sweep off, the build-time pass still runs);
|
|
329
481
|
* - driver keys the selected strategy does not consume — they are ignored,
|
|
330
482
|
* and a silently-ignored key reads as configured behaviour that never
|
|
331
483
|
* happens (the list is per-strategy: `fsync` is consumed by `cas` and
|
|
@@ -426,6 +578,105 @@ function validateConfig(storageBlock, context) {
|
|
|
426
578
|
return out;
|
|
427
579
|
}
|
|
428
580
|
|
|
581
|
+
// ─── `s3` — a SELF-CONTAINED branch, so the local checks below stay
|
|
582
|
+
// byte-identical. On external object storage the layout algorithm
|
|
583
|
+
// collapses to key naming, the filesystem keys (`root`, `store`,
|
|
584
|
+
// tiering, fsync) have no meaning, and the identity keys are the
|
|
585
|
+
// provider coordinates instead.
|
|
586
|
+
if ( d.adapter === 's3' ) {
|
|
587
|
+
if ( typeof(d.strategy) != 'undefined' && d.strategy !== null && d.strategy !== 'sharded' ) {
|
|
588
|
+
if ( d.strategy === 'cas' || d.strategy === 'stream' ) {
|
|
589
|
+
out.fatal = 'driver `' + name + '`: the `' + d.strategy + '` strategy does not run on the `s3` adapter — the provider owns placement: S3 ETags are not content digests (no cas dedup), and multipart is the provider\'s own resumable (no stream sessions). Use `sharded` (or omit `strategy`, it is the s3 default), or move the driver to the `local` adapter.';
|
|
590
|
+
return out;
|
|
591
|
+
}
|
|
592
|
+
out.fatal = 'driver `' + name + '`: unknown strategy ' + JSON.stringify(d.strategy) + ' — the `s3` adapter supports `sharded` only, and defaults to it when `strategy` is omitted';
|
|
593
|
+
return out;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if ( typeof(d.bucket) != 'string' || d.bucket.length === 0 ) {
|
|
597
|
+
out.fatal = 'driver `' + name + '`: `bucket` must be a non-empty bucket name for the `s3` adapter';
|
|
598
|
+
return out;
|
|
599
|
+
}
|
|
600
|
+
if ( /\$\{/.test(d.bucket) ) {
|
|
601
|
+
out.fatal = 'driver `' + name + '`: `bucket` carries an unresolved `${...}` placeholder (' + d.bucket + ') — only the anchored `${secret:KEY}` form is substituted at config load';
|
|
602
|
+
return out;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
if ( typeof(d.prefix) != 'undefined' && d.prefix !== null && d.prefix !== '' ) {
|
|
606
|
+
if ( typeof(d.prefix) != 'string' ) {
|
|
607
|
+
out.fatal = 'driver `' + name + '`: `prefix` must be a string key prefix';
|
|
608
|
+
return out;
|
|
609
|
+
}
|
|
610
|
+
if ( /\$\{/.test(d.prefix) ) {
|
|
611
|
+
out.fatal = 'driver `' + name + '`: `prefix` carries an unresolved `${...}` placeholder (' + d.prefix + ') — only the anchored `${secret:KEY}` form is substituted at config load';
|
|
612
|
+
return out;
|
|
613
|
+
}
|
|
614
|
+
if ( d.prefix.charAt(0) === '/' || d.prefix.indexOf('\\') > -1 || d.prefix.indexOf('..') > -1 ) {
|
|
615
|
+
out.fatal = 'driver `' + name + '`: `prefix` must be a relative key prefix (no leading `/`, no `\\`, no `..`) — got `' + d.prefix + '`';
|
|
616
|
+
return out;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
if ( typeof(d.endpoint) != 'undefined' && d.endpoint !== null && ( typeof(d.endpoint) != 'string' || d.endpoint.length === 0 ) ) {
|
|
621
|
+
out.fatal = 'driver `' + name + '`: `endpoint` must be a non-empty S3-compatible endpoint (e.g. "s3.fr-par.scw.cloud")';
|
|
622
|
+
return out;
|
|
623
|
+
}
|
|
624
|
+
if ( typeof(d.region) != 'undefined' && d.region !== null && ( typeof(d.region) != 'string' || d.region.length === 0 ) ) {
|
|
625
|
+
out.fatal = 'driver `' + name + '`: `region` must be a non-empty region name';
|
|
626
|
+
return out;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// static credentials are BOTH-OR-NEITHER: a half pair is almost
|
|
630
|
+
// certainly a mistake, but the SDK default provider chain
|
|
631
|
+
// (env/IMDS/IRSA) is a legitimate fallback, so this warns rather
|
|
632
|
+
// than refusing the boot.
|
|
633
|
+
var hasAk = ( typeof(d.accessKeyId) == 'string' && d.accessKeyId.length > 0 );
|
|
634
|
+
var hasSk = ( typeof(d.secretAccessKey) == 'string' && d.secretAccessKey.length > 0 );
|
|
635
|
+
if ( hasAk !== hasSk ) {
|
|
636
|
+
out.warnings.push('driver `' + name + '`: only one of `accessKeyId`/`secretAccessKey` is set — static credentials need BOTH; falling back to the SDK default provider chain (env / shared config / IMDS / IRSA)');
|
|
637
|
+
} else if ( !hasAk && typeof(d.sessionToken) == 'string' && d.sessionToken.length > 0 ) {
|
|
638
|
+
out.warnings.push('driver `' + name + '`: `sessionToken` is set without `accessKeyId`/`secretAccessKey` — it is ignored; the SDK default provider chain supplies its own session credentials');
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
if ( typeof(d.forcePathStyle) != 'undefined' && d.forcePathStyle !== null && typeof(d.forcePathStyle) != 'boolean' ) {
|
|
642
|
+
out.warnings.push('driver `' + name + '`: `forcePathStyle` must be a boolean — got ' + JSON.stringify(d.forcePathStyle) + '; using the default (false)');
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
if ( typeof(d.presignExpiry) != 'undefined' && d.presignExpiry !== null ) {
|
|
646
|
+
if ( isNaN(util.parseDuration(d.presignExpiry)) ) {
|
|
647
|
+
out.warnings.push('driver `' + name + '`: `presignExpiry` must carry a unit (ms/s/m/h/d, e.g. "15m") — got ' + JSON.stringify(d.presignExpiry) + '; using the default (' + DEFAULT_PRESIGN_EXPIRY + ' ms)');
|
|
648
|
+
} else if ( util.parseDuration(d.presignExpiry) <= 0 ) {
|
|
649
|
+
out.warnings.push('driver `' + name + '`: `presignExpiry` must be greater than zero — got ' + JSON.stringify(d.presignExpiry) + '; using the default (' + DEFAULT_PRESIGN_EXPIRY + ' ms)');
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// same key, same default as the local strategies' temp-orphan
|
|
654
|
+
// gate — here it ages the multipart-orphan sweep (an incomplete
|
|
655
|
+
// multipart upload bills until aborted).
|
|
656
|
+
if ( typeof(d.sweepGrace) != 'undefined' && d.sweepGrace !== null ) {
|
|
657
|
+
if ( isNaN(util.parseDuration(d.sweepGrace)) ) {
|
|
658
|
+
out.warnings.push('driver `' + name + '`: `sweepGrace` must carry a unit (ms/s/m/h/d, e.g. "1h") — got ' + JSON.stringify(d.sweepGrace) + '; using the default (' + DEFAULT_SWEEP_GRACE + ' ms)');
|
|
659
|
+
} else if ( util.parseDuration(d.sweepGrace) <= 0 ) {
|
|
660
|
+
out.warnings.push('driver `' + name + '`: `sweepGrace` must be greater than zero — got ' + JSON.stringify(d.sweepGrace) + '; using the default (' + DEFAULT_SWEEP_GRACE + ' ms)');
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
if ( typeof(d.maxObjectSize) != 'undefined' && d.maxObjectSize !== null ) {
|
|
665
|
+
if ( isNaN(util.parseSize(d.maxObjectSize)) ) {
|
|
666
|
+
out.warnings.push('driver `' + name + '`: `maxObjectSize` must carry a unit (B/KB/MB/GB, e.g. "50MB") — got ' + JSON.stringify(d.maxObjectSize) + '; using the default (' + DEFAULT_MAX_OBJECT_SIZE + ' bytes)');
|
|
667
|
+
} else if ( util.parseSize(d.maxObjectSize) <= 0 ) {
|
|
668
|
+
out.warnings.push('driver `' + name + '`: `maxObjectSize` must be greater than zero — got ' + JSON.stringify(d.maxObjectSize) + '; using the default (' + DEFAULT_MAX_OBJECT_SIZE + ' bytes)');
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
var s3extra = Object.keys(d).filter(function (k) { return S3_KEYS.indexOf(k) < 0; });
|
|
673
|
+
if ( s3extra.length > 0 ) {
|
|
674
|
+
out.warnings.push('driver `' + name + '`: key(s) ' + s3extra.join(', ') + ' are not used by the `s3` adapter and are ignored');
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
|
|
429
680
|
if ( DEFERRED_STRATEGIES.indexOf(d.strategy) > -1 ) {
|
|
430
681
|
out.fatal = 'driver `' + name + '`: the `' + d.strategy + '` strategy is designed but not implemented yet — use `' + STRATEGIES.join('|') + '` for now';
|
|
431
682
|
return out;
|
|
@@ -514,17 +765,63 @@ function validateConfig(storageBlock, context) {
|
|
|
514
765
|
out.warnings.push('driver `' + name + '`: `sweepInterval` must carry a unit (ms/s/m/h/d, e.g. "15m"), or be "0s" to disable the periodic sweep — got ' + JSON.stringify(d.sweepInterval) + '; using the default (' + DEFAULT_SWEEP_INTERVAL + ' ms)');
|
|
515
766
|
}
|
|
516
767
|
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
// `sweepGrace` is shared, so its lint is too: under `cas` it gates the
|
|
771
|
+
// blob GC AND the temp-orphan cutoff, under `sharded` the temp-orphan
|
|
772
|
+
// cutoff alone (#B349). `sweepInterval` deliberately stays cas-only —
|
|
773
|
+
// sharded sweeps at build, never on a tick.
|
|
774
|
+
if ( d.strategy === 'cas' || d.strategy === 'sharded' ) {
|
|
517
775
|
if ( typeof(d.sweepGrace) != 'undefined' && d.sweepGrace !== null ) {
|
|
518
776
|
if ( isNaN(util.parseDuration(d.sweepGrace)) ) {
|
|
519
777
|
out.warnings.push('driver `' + name + '`: `sweepGrace` must carry a unit (ms/s/m/h/d, e.g. "1h") — got ' + JSON.stringify(d.sweepGrace) + '; using the default (' + DEFAULT_SWEEP_GRACE + ' ms)');
|
|
520
778
|
} else if ( util.parseDuration(d.sweepGrace) <= 0 ) {
|
|
521
|
-
// grace 0 would let the sweep
|
|
522
|
-
//
|
|
779
|
+
// grace 0 would let the sweep eat a temp still being
|
|
780
|
+
// written — under cas it would also race an in-flight
|
|
781
|
+
// identical put. Either way it re-opens the exact window
|
|
782
|
+
// the grace exists to close.
|
|
523
783
|
out.warnings.push('driver `' + name + '`: `sweepGrace` must be greater than zero — got ' + JSON.stringify(d.sweepGrace) + '; using the default (' + DEFAULT_SWEEP_GRACE + ' ms)');
|
|
524
784
|
}
|
|
525
785
|
}
|
|
526
786
|
}
|
|
527
787
|
|
|
788
|
+
if ( d.strategy === 'stream' ) {
|
|
789
|
+
// `chunkSize` is a size key and takes the size parser's strictness
|
|
790
|
+
// (a unit is required); it only tunes the write stream's
|
|
791
|
+
// highWaterMark, so an unusable value degrades to the default
|
|
792
|
+
// rather than refusing the boot.
|
|
793
|
+
if ( typeof(d.chunkSize) != 'undefined' && d.chunkSize !== null ) {
|
|
794
|
+
if ( isNaN(util.parseSize(d.chunkSize)) ) {
|
|
795
|
+
out.warnings.push('driver `' + name + '`: `chunkSize` must carry a unit (B/KB/MB/GB, e.g. "8MB") — got ' + JSON.stringify(d.chunkSize) + '; using the default (' + DEFAULT_CHUNK_SIZE + ' bytes)');
|
|
796
|
+
} else if ( util.parseSize(d.chunkSize) <= 0 ) {
|
|
797
|
+
out.warnings.push('driver `' + name + '`: `chunkSize` must be greater than zero — got ' + JSON.stringify(d.chunkSize) + '; using the default (' + DEFAULT_CHUNK_SIZE + ' bytes)');
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if ( typeof(d.fsync) != 'undefined' && d.fsync !== null && typeof(d.fsync) != 'boolean' ) {
|
|
802
|
+
out.warnings.push('driver `' + name + '`: `fsync` must be a boolean — got ' + JSON.stringify(d.fsync) + '; using the default (' + DEFAULT_STREAM_FSYNC + ')');
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// duration keys, same strictness as the cas pair: a unit is
|
|
806
|
+
// required, because `'15m'` means minutes here and megabytes in a
|
|
807
|
+
// size key and neither parser guesses.
|
|
808
|
+
if ( typeof(d.sessionTtl) != 'undefined' && d.sessionTtl !== null ) {
|
|
809
|
+
if ( isNaN(util.parseDuration(d.sessionTtl)) ) {
|
|
810
|
+
out.warnings.push('driver `' + name + '`: `sessionTtl` must carry a unit (ms/s/m/h/d, e.g. "24h") — got ' + JSON.stringify(d.sessionTtl) + '; using the default (' + DEFAULT_SESSION_TTL + ' ms)');
|
|
811
|
+
} else if ( util.parseDuration(d.sessionTtl) <= 0 ) {
|
|
812
|
+
// a zero TTL would reclaim sessions that are still being
|
|
813
|
+
// written to — the same class of foot-gun as a zero
|
|
814
|
+
// sweepGrace, so it never means "off"
|
|
815
|
+
out.warnings.push('driver `' + name + '`: `sessionTtl` must be greater than zero — a zero TTL would reclaim in-flight uploads; got ' + JSON.stringify(d.sessionTtl) + '; using the default (' + DEFAULT_SESSION_TTL + ' ms)');
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
if ( typeof(d.sessionSweepInterval) != 'undefined' && d.sessionSweepInterval !== null ) {
|
|
819
|
+
if ( isNaN(util.parseDuration(d.sessionSweepInterval)) ) {
|
|
820
|
+
out.warnings.push('driver `' + name + '`: `sessionSweepInterval` must carry a unit (ms/s/m/h/d, e.g. "1h"), or be "0s" to disable the periodic sweep — got ' + JSON.stringify(d.sessionSweepInterval) + '; using the default (' + DEFAULT_SESSION_SWEEP_INTERVAL + ' ms)');
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
528
825
|
var consumed = STRATEGY_KEYS[d.strategy];
|
|
529
826
|
var extra = Object.keys(d).filter(function (k) { return consumed.indexOf(k) < 0; });
|
|
530
827
|
if ( extra.length > 0 ) {
|
|
@@ -597,6 +894,50 @@ function resolveDriverConf(conf) {
|
|
|
597
894
|
inlineThreshold : inline
|
|
598
895
|
};
|
|
599
896
|
|
|
897
|
+
// s3 resolves here and RETURNS EARLY — none of the local strategy blocks
|
|
898
|
+
// below apply. `strategy` collapses to key naming (`sharded`, the only
|
|
899
|
+
// value and the default); `prefix`/`endpoint` are normalised so the
|
|
900
|
+
// factory stays dumb; `region` falls back to the S3-compat convention
|
|
901
|
+
// (`us-east-1`) ONLY when a custom endpoint is configured — real AWS
|
|
902
|
+
// keeps the SDK's own resolution chain, whose "missing region" message
|
|
903
|
+
// beats a silently mis-signed default.
|
|
904
|
+
if ( conf.adapter === 's3' ) {
|
|
905
|
+
resolved.strategy = 'sharded';
|
|
906
|
+
resolved.bucket = conf.bucket;
|
|
907
|
+
var pfx = ( typeof conf.prefix === 'string' ) ? conf.prefix : '';
|
|
908
|
+
if ( pfx.length && pfx.charAt(pfx.length - 1) !== '/' ) { pfx += '/'; }
|
|
909
|
+
resolved.prefix = pfx;
|
|
910
|
+
if ( typeof conf.endpoint === 'string' && conf.endpoint.length ) {
|
|
911
|
+
resolved.endpoint = /^https?:\/\//i.test(conf.endpoint) ? conf.endpoint : ('https://' + conf.endpoint);
|
|
912
|
+
}
|
|
913
|
+
resolved.region = ( typeof conf.region === 'string' && conf.region.length )
|
|
914
|
+
? conf.region
|
|
915
|
+
: ( resolved.endpoint ? 'us-east-1' : undefined );
|
|
916
|
+
if ( conf.forcePathStyle === true ) { resolved.forcePathStyle = true; }
|
|
917
|
+
if ( typeof conf.accessKeyId === 'string' && conf.accessKeyId.length
|
|
918
|
+
&& typeof conf.secretAccessKey === 'string' && conf.secretAccessKey.length ) {
|
|
919
|
+
resolved.accessKeyId = conf.accessKeyId;
|
|
920
|
+
resolved.secretAccessKey = conf.secretAccessKey;
|
|
921
|
+
if ( typeof conf.sessionToken === 'string' && conf.sessionToken.length ) {
|
|
922
|
+
resolved.sessionToken = conf.sessionToken;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
var pe = util.parseDuration(conf.presignExpiry);
|
|
926
|
+
resolved.presignExpiry = ( isNaN(pe) || pe <= 0 ) ? DEFAULT_PRESIGN_EXPIRY : pe;
|
|
927
|
+
var s3g = util.parseDuration(conf.sweepGrace);
|
|
928
|
+
resolved.sweepGrace = ( isNaN(s3g) || s3g <= 0 ) ? DEFAULT_SWEEP_GRACE : s3g;
|
|
929
|
+
return resolved;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// sharded takes `sweepGrace` alone — the age gate on its build-time
|
|
933
|
+
// temp-orphan sweep (#B349). Same key, same default and same meaning as
|
|
934
|
+
// cas's ("how long before an unfinished temp is presumed abandoned"), but
|
|
935
|
+
// no `sweepInterval`: there is no periodic pass to configure.
|
|
936
|
+
if ( conf.strategy === 'sharded' ) {
|
|
937
|
+
var tsg = util.parseDuration(conf.sweepGrace);
|
|
938
|
+
resolved.sweepGrace = ( isNaN(tsg) || tsg <= 0 ) ? DEFAULT_SWEEP_GRACE : tsg;
|
|
939
|
+
}
|
|
940
|
+
|
|
600
941
|
// cas defaults resolve here too, same pattern. `hash` was validated
|
|
601
942
|
// against crypto.getHashes() by validateConfig; lowercasing makes the
|
|
602
943
|
// key's algorithm segment canonical.
|
|
@@ -611,6 +952,20 @@ function resolveDriverConf(conf) {
|
|
|
611
952
|
resolved.sweepGrace = ( isNaN(sg) || sg <= 0 ) ? DEFAULT_SWEEP_GRACE : sg; // 0 grace would re-open the sweep race
|
|
612
953
|
}
|
|
613
954
|
|
|
955
|
+
// stream defaults, same pattern. NB `inlineThreshold` is resolved above
|
|
956
|
+
// for every strategy but the stream factory ignores it — the key is not in
|
|
957
|
+
// STRATEGY_KEYS.stream, so setting it warns as ignored, and
|
|
958
|
+
// capabilities.inline stays false.
|
|
959
|
+
if ( conf.strategy === 'stream' ) {
|
|
960
|
+
var cs = util.parseSize(conf.chunkSize);
|
|
961
|
+
resolved.chunkSize = ( isNaN(cs) || cs <= 0 ) ? DEFAULT_CHUNK_SIZE : cs;
|
|
962
|
+
resolved.fsync = ( typeof conf.fsync === 'boolean' ) ? conf.fsync : DEFAULT_STREAM_FSYNC;
|
|
963
|
+
var st = util.parseDuration(conf.sessionTtl);
|
|
964
|
+
resolved.sessionTtl = ( isNaN(st) || st <= 0 ) ? DEFAULT_SESSION_TTL : st; // 0 would reclaim in-flight uploads
|
|
965
|
+
var ssi = util.parseDuration(conf.sessionSweepInterval);
|
|
966
|
+
resolved.sessionSweepInterval = ( isNaN(ssi) || ssi < 0 ) ? DEFAULT_SESSION_SWEEP_INTERVAL : ssi; // '0s' is legal: periodic sweep off
|
|
967
|
+
}
|
|
968
|
+
|
|
614
969
|
return resolved;
|
|
615
970
|
}
|
|
616
971
|
|
|
@@ -628,7 +983,15 @@ function resolveDriverConf(conf) {
|
|
|
628
983
|
* @param {object} [opt.stores] - Pre-built connector metadata stores keyed by driver
|
|
629
984
|
* name (the caller resolves them through
|
|
630
985
|
* `lib/storage-store`). A driver absent from this map
|
|
631
|
-
* gets the embedded SQLite store inside its own root
|
|
986
|
+
* gets the embedded SQLite store inside its own root
|
|
987
|
+
* (`s3` drivers get neither — storeless).
|
|
988
|
+
* @param {function} [opt.requireProjectModule] - Project-module resolver for adapters whose
|
|
989
|
+
* SDK is the consuming project's dependency (`s3`).
|
|
990
|
+
* Built by the CALLER (gna.js, from
|
|
991
|
+
* `getPath('project')`) because this module is
|
|
992
|
+
* framework-independent and cannot reach the path
|
|
993
|
+
* globals itself; tests inject a fake SDK loader.
|
|
994
|
+
* Omitted: building an `s3` driver throws (fatal).
|
|
632
995
|
* @param {function} [opt.warn] - Boot-warning sink for the per-root strategy-stamp
|
|
633
996
|
* checks (§4: a strategy flip on populated storage is
|
|
634
997
|
* unrecoverable by config, so it warns every boot; a
|
|
@@ -673,31 +1036,43 @@ function start(opt) {
|
|
|
673
1036
|
// A connector store when one was built for this driver, else the
|
|
674
1037
|
// embedded SQLite file inside the driver's own root — self-contained,
|
|
675
1038
|
// so moving the root moves its metadata with it, and never web-served
|
|
676
|
-
// because validateConfig refuses a served root.
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
1039
|
+
// because validateConfig refuses a served root. `s3` is STORELESS:
|
|
1040
|
+
// the provider carries the metadata ON the object (immutable after
|
|
1041
|
+
// upload, like the key), so there is no embedded file to create.
|
|
1042
|
+
var isRemote = ( conf.adapter === 's3' );
|
|
1043
|
+
var store = isRemote
|
|
1044
|
+
? null
|
|
1045
|
+
: ( ( opt.stores && opt.stores[name] )
|
|
1046
|
+
? opt.stores[name]
|
|
1047
|
+
: createEmbeddedMetaStore(nodePath.join(conf.root, '.meta.db')) );
|
|
680
1048
|
|
|
681
1049
|
// Defaults, size/duration parsing and the cas hash canonicalisation —
|
|
682
1050
|
// ONE shared resolver, also driven by the `storage:*` CLI's offline
|
|
683
1051
|
// path (see resolveDriverConf).
|
|
684
1052
|
var resolved = resolveDriverConf(conf);
|
|
685
1053
|
|
|
686
|
-
// THE
|
|
687
|
-
//
|
|
688
|
-
//
|
|
689
|
-
//
|
|
690
|
-
// store lacking the refcount verbs
|
|
691
|
-
//
|
|
692
|
-
|
|
1054
|
+
// THE dispatch — adapter × strategy via the composition map (an
|
|
1055
|
+
// adapter-less conf is a direct caller's, and behaves exactly as
|
|
1056
|
+
// before: the local row). validateConfig has already refused unknown
|
|
1057
|
+
// names, so a miss here is a programming error and gets its loud
|
|
1058
|
+
// TypeError. A factory throw (a store lacking the refcount verbs, a
|
|
1059
|
+
// missing s3 SDK) propagates to the caller, whose documented contract
|
|
1060
|
+
// treats it as fatal. The 4th argument carries the injected
|
|
1061
|
+
// dependencies the s3 factory needs; local factories ignore it.
|
|
1062
|
+
built[name] = ADAPTER_FACTORIES[conf.adapter || 'local'][resolved.strategy](
|
|
1063
|
+
name, resolved, store, { requireModule: opt.requireProjectModule }
|
|
1064
|
+
);
|
|
693
1065
|
|
|
694
1066
|
// §4 — keys are strategy-specific, so a strategy flip on populated
|
|
695
1067
|
// storage is unrecoverable by config edit; persist the strategy on
|
|
696
1068
|
// the root's own metadata and warn on mismatch, every boot, until it
|
|
697
1069
|
// is resolved. Fire-and-forget: with the embedded store it completes
|
|
698
1070
|
// synchronously, with a connector store the warning simply lands
|
|
699
|
-
// when it lands — it gates nothing.
|
|
700
|
-
|
|
1071
|
+
// when it lands — it gates nothing. NOT for s3: no store to stamp,
|
|
1072
|
+
// and only one strategy to flip to.
|
|
1073
|
+
if ( !isRemote ) {
|
|
1074
|
+
checkDriverStamp(name, conf.strategy, resolved.hash || null, store, warn);
|
|
1075
|
+
}
|
|
701
1076
|
}
|
|
702
1077
|
|
|
703
1078
|
_drivers = built;
|
|
@@ -871,6 +1246,8 @@ module.exports = {
|
|
|
871
1246
|
// and factories a boot uses — in-tree consumers, versioned together.
|
|
872
1247
|
_resolveDriverConf : resolveDriverConf,
|
|
873
1248
|
_FACTORIES : FACTORIES,
|
|
1249
|
+
_ADAPTER_FACTORIES : ADAPTER_FACTORIES,
|
|
1250
|
+
_S3_KEYS : S3_KEYS,
|
|
874
1251
|
_createEmbeddedMetaStore : createEmbeddedMetaStore,
|
|
875
1252
|
_ulid : util.ulid,
|
|
876
1253
|
_parseSize : util.parseSize,
|
|
@@ -886,5 +1263,9 @@ module.exports = {
|
|
|
886
1263
|
_DEFAULT_CAS_FSYNC : DEFAULT_CAS_FSYNC,
|
|
887
1264
|
_DEFAULT_SWEEP_INTERVAL : DEFAULT_SWEEP_INTERVAL,
|
|
888
1265
|
_DEFAULT_SWEEP_GRACE : DEFAULT_SWEEP_GRACE,
|
|
1266
|
+
_DEFAULT_CHUNK_SIZE : DEFAULT_CHUNK_SIZE,
|
|
1267
|
+
_DEFAULT_STREAM_FSYNC : DEFAULT_STREAM_FSYNC,
|
|
1268
|
+
_DEFAULT_SESSION_TTL : DEFAULT_SESSION_TTL,
|
|
1269
|
+
_DEFAULT_SESSION_SWEEP_INTERVAL : DEFAULT_SESSION_SWEEP_INTERVAL,
|
|
889
1270
|
_parseDuration : util.parseDuration
|
|
890
1271
|
};
|
|
@@ -112,8 +112,19 @@ function noop() {}
|
|
|
112
112
|
* primitive is) and inherits the documented residual: across PROCESSES, the
|
|
113
113
|
* sweep's unlink can in principle race a same-content publish in the
|
|
114
114
|
* nanoseconds between claim and unlink — which is why the sweep only collects
|
|
115
|
-
* blobs at zero for longer than the grace window
|
|
116
|
-
*
|
|
115
|
+
* blobs at zero for longer than the grace window.
|
|
116
|
+
*
|
|
117
|
+
* Multi-process sweep COORDINATION was expected to arrive with the first
|
|
118
|
+
* connector store; measured against that store (couchbase, 2026-08-14), it
|
|
119
|
+
* turned out to need no election layer, because `removeIfZero`'s atomicity IS
|
|
120
|
+
* the coordination: several processes may sweep one root concurrently and
|
|
121
|
+
* exactly one claim per blob wins, every loser reading a compare-and-set
|
|
122
|
+
* failure and skipping. An election would also have made `storage:gc` report
|
|
123
|
+
* `collected: 0` on whichever process did not hold the lease. The residual
|
|
124
|
+
* above is UNCHANGED by that finding — it is put-vs-sweep, not
|
|
125
|
+
* sweeper-vs-sweeper, so no coordination between sweepers could have closed
|
|
126
|
+
* it; the grace window, the put-side heal and `storage:verify` remain its
|
|
127
|
+
* mitigations.
|
|
117
128
|
*
|
|
118
129
|
* @typedef {Object} StorageMetaStore
|
|
119
130
|
* @property {function(string, StorageMeta, function=): void} set - Upsert `meta` under `key`; `fn(err, meta)`. MUST report failure through the callback, never by throwing. NEVER call it on a refcounted row — REPLACE semantics would reset the count; `acquireRef` owns those rows.
|