@bgord/bun 1.20.5 → 1.21.1
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/dist/ab-assignment-composite.strategy.d.ts +4 -2
- package/dist/ab-assignment-composite.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-composite.strategy.js +5 -2
- package/dist/ab-assignment-composite.strategy.js.map +1 -1
- package/dist/ab-assignment-cookie.strategy.d.ts +3 -2
- package/dist/ab-assignment-cookie.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-cookie.strategy.js +5 -3
- package/dist/ab-assignment-cookie.strategy.js.map +1 -1
- package/dist/ab-assignment-fixed.strategy.d.ts +1 -2
- package/dist/ab-assignment-fixed.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-fixed.strategy.js +1 -1
- package/dist/ab-assignment-fixed.strategy.js.map +1 -1
- package/dist/ab-assignment-hash.strategy.d.ts +1 -1
- package/dist/ab-assignment-hash.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-hash.strategy.js +1 -1
- package/dist/ab-assignment-hash.strategy.js.map +1 -1
- package/dist/ab-assignment-header.strategy.d.ts +3 -2
- package/dist/ab-assignment-header.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-header.strategy.js +5 -3
- package/dist/ab-assignment-header.strategy.js.map +1 -1
- package/dist/ab-assignment-query.strategy.d.ts +3 -2
- package/dist/ab-assignment-query.strategy.d.ts.map +1 -1
- package/dist/ab-assignment-query.strategy.js +5 -3
- package/dist/ab-assignment-query.strategy.js.map +1 -1
- package/dist/ab-assignment.strategy.d.ts +1 -2
- package/dist/ab-assignment.strategy.d.ts.map +1 -1
- package/dist/ab-hono-noop.middleware.d.ts +4 -1
- package/dist/ab-hono-noop.middleware.d.ts.map +1 -1
- package/dist/ab-hono-noop.middleware.js.map +1 -1
- package/dist/ab-hono.middleware.d.ts +4 -3
- package/dist/ab-hono.middleware.d.ts.map +1 -1
- package/dist/ab-hono.middleware.js +7 -4
- package/dist/ab-hono.middleware.js.map +1 -1
- package/dist/ab.middleware.d.ts +1 -3
- package/dist/ab.middleware.d.ts.map +1 -1
- package/dist/ab.middleware.js +2 -4
- package/dist/ab.middleware.js.map +1 -1
- package/dist/alert-channel-composite.adapter.d.ts +1 -0
- package/dist/alert-channel-composite.adapter.d.ts.map +1 -1
- package/dist/alert-channel-composite.adapter.js +6 -1
- package/dist/alert-channel-composite.adapter.js.map +1 -1
- package/dist/alert-channel-with-logger.adapter.js +1 -1
- package/dist/alert-channel-with-logger.adapter.js.map +1 -1
- package/dist/antivirus-clamav.adapter.d.ts.map +1 -1
- package/dist/antivirus-clamav.adapter.js +3 -4
- package/dist/antivirus-clamav.adapter.js.map +1 -1
- package/dist/antivirus-with-logger.adapter.js +2 -2
- package/dist/antivirus-with-logger.adapter.js.map +1 -1
- package/dist/api-version-hono.middleware.d.ts +2 -11
- package/dist/api-version-hono.middleware.d.ts.map +1 -1
- package/dist/api-version-hono.middleware.js +6 -3
- package/dist/api-version-hono.middleware.js.map +1 -1
- package/dist/api-version.middleware.d.ts +2 -3
- package/dist/api-version.middleware.d.ts.map +1 -1
- package/dist/api-version.middleware.js.map +1 -1
- package/dist/auth-session-reader-noop.adapter.d.ts +2 -2
- package/dist/auth-session-reader-noop.adapter.d.ts.map +1 -1
- package/dist/better-auth-logger.service.d.ts.map +1 -1
- package/dist/better-auth-logger.service.js +6 -0
- package/dist/better-auth-logger.service.js.map +1 -1
- package/dist/cache-file.service.d.ts.map +1 -1
- package/dist/cache-file.service.js +4 -2
- package/dist/cache-file.service.js.map +1 -1
- package/dist/cache-repository-node-cache.adapter.d.ts.map +1 -1
- package/dist/cache-repository-node-cache.adapter.js +4 -1
- package/dist/cache-repository-node-cache.adapter.js.map +1 -1
- package/dist/cache-response-hono.middleware.d.ts +2 -7
- package/dist/cache-response-hono.middleware.d.ts.map +1 -1
- package/dist/cache-response-hono.middleware.js +1 -1
- package/dist/cache-response-hono.middleware.js.map +1 -1
- package/dist/cache-response.middleware.d.ts +3 -4
- package/dist/cache-response.middleware.d.ts.map +1 -1
- package/dist/cache-response.middleware.js.map +1 -1
- package/dist/certificate-inspector-tls.adapter.d.ts.map +1 -1
- package/dist/certificate-inspector-tls.adapter.js +19 -16
- package/dist/certificate-inspector-tls.adapter.js.map +1 -1
- package/dist/correlation-hono.middleware.d.ts +5 -7
- package/dist/correlation-hono.middleware.d.ts.map +1 -1
- package/dist/correlation-hono.middleware.js +4 -2
- package/dist/correlation-hono.middleware.js.map +1 -1
- package/dist/correlation.middleware.d.ts +2 -3
- package/dist/correlation.middleware.d.ts.map +1 -1
- package/dist/correlation.middleware.js.map +1 -1
- package/dist/cron-scheduler.adapter.d.ts +1 -0
- package/dist/cron-scheduler.adapter.d.ts.map +1 -1
- package/dist/cron-scheduler.adapter.js +3 -2
- package/dist/cron-scheduler.adapter.js.map +1 -1
- package/dist/cron-task-handler-with-logger.strategy.js +7 -7
- package/dist/cron-task-handler-with-logger.strategy.js.map +1 -1
- package/dist/csv-stringifier.adapter.d.ts +1 -1
- package/dist/csv-stringifier.adapter.d.ts.map +1 -1
- package/dist/csv-stringifier.adapter.js +1 -1
- package/dist/csv-stringifier.adapter.js.map +1 -1
- package/dist/{disk-space-checker-shell.adapter.d.ts → disk-space-checker-fs.adapter.d.ts} +2 -2
- package/dist/disk-space-checker-fs.adapter.d.ts.map +1 -0
- package/dist/disk-space-checker-fs.adapter.js +10 -0
- package/dist/disk-space-checker-fs.adapter.js.map +1 -0
- package/dist/dynamic-import.service.js +2 -2
- package/dist/dynamic-import.service.js.map +1 -1
- package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
- package/dist/environment-loader-process-safe.adapter.js +3 -1
- package/dist/environment-loader-process-safe.adapter.js.map +1 -1
- package/dist/environment-loader.port.d.ts +1 -1
- package/dist/environment-loader.port.d.ts.map +1 -1
- package/dist/etag-extractor-header.strategy.d.ts.map +1 -1
- package/dist/etag-extractor-header.strategy.js +2 -0
- package/dist/etag-extractor-header.strategy.js.map +1 -1
- package/dist/etag-extractor-hono.middleware.d.ts +3 -1
- package/dist/etag-extractor-hono.middleware.d.ts.map +1 -1
- package/dist/etag-extractor-param.strategy.d.ts.map +1 -1
- package/dist/etag-extractor-param.strategy.js +2 -0
- package/dist/etag-extractor-param.strategy.js.map +1 -1
- package/dist/etag-extractor.strategy.d.ts +2 -2
- package/dist/etag-extractor.strategy.d.ts.map +1 -1
- package/dist/file-inspection.adapter.js +4 -4
- package/dist/file-inspection.adapter.js.map +1 -1
- package/dist/file-reader-json-forgiving.adapter.js +1 -1
- package/dist/file-reader-json-forgiving.adapter.js.map +1 -1
- package/dist/graceful-shutdown.service.d.ts.map +1 -1
- package/dist/graceful-shutdown.service.js +3 -3
- package/dist/graceful-shutdown.service.js.map +1 -1
- package/dist/hash.vo.js +1 -1
- package/dist/hash.vo.js.map +1 -1
- package/dist/hcaptcha.service.d.ts +1 -2
- package/dist/hcaptcha.service.d.ts.map +1 -1
- package/dist/hcaptcha.service.js +1 -1
- package/dist/hcaptcha.service.js.map +1 -1
- package/dist/http-logger-hono.middleware.d.ts +2 -9
- package/dist/http-logger-hono.middleware.d.ts.map +1 -1
- package/dist/http-logger-hono.middleware.js +1 -1
- package/dist/http-logger-hono.middleware.js.map +1 -1
- package/dist/http-logger.middleware.d.ts +2 -3
- package/dist/http-logger.middleware.d.ts.map +1 -1
- package/dist/http-logger.middleware.js.map +1 -1
- package/dist/image-blur-noop.adapter.js +1 -1
- package/dist/image-blur-noop.adapter.js.map +1 -1
- package/dist/image-blur.adapter.d.ts.map +1 -1
- package/dist/image-blur.adapter.js +2 -4
- package/dist/image-blur.adapter.js.map +1 -1
- package/dist/image-blur.port.d.ts +1 -8
- package/dist/image-blur.port.d.ts.map +1 -1
- package/dist/in-flight-requests-hono.middleware.d.ts.map +1 -1
- package/dist/in-flight-requests-hono.middleware.js +1 -0
- package/dist/in-flight-requests-hono.middleware.js.map +1 -1
- package/dist/in-flight-requests-tracker.service.js +2 -2
- package/dist/in-flight-requests-tracker.service.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/instrumentation.service.d.ts.map +1 -1
- package/dist/instrumentation.service.js +5 -2
- package/dist/instrumentation.service.js.map +1 -1
- package/dist/job-queue-sqlite-store.service.d.ts.map +1 -1
- package/dist/job-queue-sqlite-store.service.js +1 -0
- package/dist/job-queue-sqlite-store.service.js.map +1 -1
- package/dist/job-queue-with-logger.adapter.d.ts +1 -1
- package/dist/job-queue-with-logger.adapter.d.ts.map +1 -1
- package/dist/job-queue-with-logger.adapter.js +2 -2
- package/dist/job-queue-with-logger.adapter.js.map +1 -1
- package/dist/language-detector-cookie.strategy.js +1 -1
- package/dist/language-detector-cookie.strategy.js.map +1 -1
- package/dist/language-detector-header.strategy.d.ts.map +1 -1
- package/dist/language-detector-header.strategy.js +12 -1
- package/dist/language-detector-header.strategy.js.map +1 -1
- package/dist/language-detector-hono.middleware.d.ts +3 -1
- package/dist/language-detector-hono.middleware.d.ts.map +1 -1
- package/dist/language-detector-query.strategy.js +1 -1
- package/dist/language-detector-query.strategy.js.map +1 -1
- package/dist/language-detector.middleware.d.ts +2 -2
- package/dist/language-detector.middleware.d.ts.map +1 -1
- package/dist/language-detector.middleware.js.map +1 -1
- package/dist/language-detector.strategy.d.ts +2 -2
- package/dist/language-detector.strategy.d.ts.map +1 -1
- package/dist/liveness-hono.handler.d.ts.map +1 -1
- package/dist/liveness-hono.handler.js +4 -1
- package/dist/liveness-hono.handler.js.map +1 -1
- package/dist/liveness.handler.d.ts +1 -0
- package/dist/liveness.handler.d.ts.map +1 -1
- package/dist/liveness.handler.js +1 -1
- package/dist/liveness.handler.js.map +1 -1
- package/dist/mailer-content-html.vo.d.ts +1 -5
- package/dist/mailer-content-html.vo.d.ts.map +1 -1
- package/dist/mailer-content-html.vo.js +1 -1
- package/dist/mailer-content-html.vo.js.map +1 -1
- package/dist/mailer-smtp.adapter.d.ts.map +1 -1
- package/dist/mailer-smtp.adapter.js +1 -0
- package/dist/mailer-smtp.adapter.js.map +1 -1
- package/dist/mailer-with-logger.adapter.js +2 -2
- package/dist/mailer-with-logger.adapter.js.map +1 -1
- package/dist/markdown-generator.adapter.js +1 -1
- package/dist/markdown-generator.adapter.js.map +1 -1
- package/dist/memory-consumption.service.d.ts +0 -1
- package/dist/memory-consumption.service.d.ts.map +1 -1
- package/dist/memory-consumption.service.js +0 -3
- package/dist/memory-consumption.service.js.map +1 -1
- package/dist/modules/system/jobs/SEND_EMAIL_JOB.d.ts +1 -1
- package/dist/nonce-provider-crypto.adapter.js +1 -1
- package/dist/nonce-provider-crypto.adapter.js.map +1 -1
- package/dist/nonce-provider-noop.adapter.js +1 -1
- package/dist/nonce-provider-noop.adapter.js.map +1 -1
- package/dist/nonce-value.vo.js +2 -2
- package/dist/pdf-generator-with-logger.adapter.js +1 -1
- package/dist/pdf-generator-with-logger.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-memory.adapter.js +1 -1
- package/dist/prerequisite-verifier-memory.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-translations.adapter.d.ts.map +1 -1
- package/dist/prerequisite-verifier-translations.adapter.js +7 -11
- package/dist/prerequisite-verifier-translations.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-with-logger.adapter.js +1 -1
- package/dist/prerequisite-verifier-with-logger.adapter.js.map +1 -1
- package/dist/randomness.strategy.d.ts.map +1 -1
- package/dist/reactive-config-noop.adapter.d.ts +0 -1
- package/dist/reactive-config-noop.adapter.d.ts.map +1 -1
- package/dist/reactive-config-noop.adapter.js +2 -4
- package/dist/reactive-config-noop.adapter.js.map +1 -1
- package/dist/reactive-config-with-cache.adapter.js +1 -1
- package/dist/reactive-config-with-cache.adapter.js.map +1 -1
- package/dist/reactive-config-with-fallback.adapter.d.ts +0 -1
- package/dist/reactive-config-with-fallback.adapter.d.ts.map +1 -1
- package/dist/reactive-config-with-fallback.adapter.js +2 -4
- package/dist/reactive-config-with-fallback.adapter.js.map +1 -1
- package/dist/reactive-config-with-logger.adapter.d.ts +15 -0
- package/dist/reactive-config-with-logger.adapter.d.ts.map +1 -0
- package/dist/reactive-config-with-logger.adapter.js +38 -0
- package/dist/reactive-config-with-logger.adapter.js.map +1 -0
- package/dist/readiness-hono.handler.d.ts +4 -7
- package/dist/readiness-hono.handler.d.ts.map +1 -1
- package/dist/readiness-hono.handler.js +2 -3
- package/dist/readiness-hono.handler.js.map +1 -1
- package/dist/readiness.handler.d.ts +6 -1
- package/dist/readiness.handler.d.ts.map +1 -1
- package/dist/readiness.handler.js +11 -1
- package/dist/readiness.handler.js.map +1 -1
- package/dist/redactor-metadata-compact-array.strategy.d.ts.map +1 -1
- package/dist/redactor-metadata-compact-array.strategy.js +2 -0
- package/dist/redactor-metadata-compact-array.strategy.js.map +1 -1
- package/dist/redactor-metadata-compact-object.strategy.d.ts.map +1 -1
- package/dist/redactor-metadata-compact-object.strategy.js +2 -0
- package/dist/redactor-metadata-compact-object.strategy.js.map +1 -1
- package/dist/redactor-url-query.strategy.d.ts +8 -0
- package/dist/redactor-url-query.strategy.d.ts.map +1 -0
- package/dist/redactor-url-query.strategy.js +26 -0
- package/dist/redactor-url-query.strategy.js.map +1 -0
- package/dist/remote-file-storage-disk.adapter.d.ts +2 -0
- package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
- package/dist/remote-file-storage-disk.adapter.js +2 -5
- package/dist/remote-file-storage-disk.adapter.js.map +1 -1
- package/dist/request-context-hono.adapter.d.ts.map +1 -1
- package/dist/request-context-hono.adapter.js +2 -0
- package/dist/request-context-hono.adapter.js.map +1 -1
- package/dist/request-context.port.d.ts +13 -1
- package/dist/request-context.port.d.ts.map +1 -1
- package/dist/sealer-aes-gcm.adapter.d.ts +1 -0
- package/dist/sealer-aes-gcm.adapter.d.ts.map +1 -1
- package/dist/sealer-aes-gcm.adapter.js +6 -1
- package/dist/sealer-aes-gcm.adapter.js.map +1 -1
- package/dist/secure-key-generator-crypto.adapter.d.ts +1 -0
- package/dist/secure-key-generator-crypto.adapter.d.ts.map +1 -1
- package/dist/secure-key-generator-crypto.adapter.js +6 -1
- package/dist/secure-key-generator-crypto.adapter.js.map +1 -1
- package/dist/security-rule-bait-routes.strategy.js +1 -1
- package/dist/security-rule-bait-routes.strategy.js.map +1 -1
- package/dist/security-rule-honey-pot-field.strategy.d.ts +2 -2
- package/dist/security-rule-honey-pot-field.strategy.d.ts.map +1 -1
- package/dist/security-rule-honey-pot-field.strategy.js +3 -2
- package/dist/security-rule-honey-pot-field.strategy.js.map +1 -1
- package/dist/security-rule.strategy.d.ts +2 -4
- package/dist/security-rule.strategy.d.ts.map +1 -1
- package/dist/semaphore.service.d.ts +3 -1
- package/dist/semaphore.service.d.ts.map +1 -1
- package/dist/semaphore.service.js +13 -7
- package/dist/semaphore.service.js.map +1 -1
- package/dist/setup-hono.service.js +1 -1
- package/dist/setup-hono.service.js.map +1 -1
- package/dist/shield-api-key-hono.strategy.js +1 -1
- package/dist/shield-api-key.strategy.d.ts +1 -1
- package/dist/shield-api-key.strategy.d.ts.map +1 -1
- package/dist/shield-api-key.strategy.js +5 -4
- package/dist/shield-api-key.strategy.js.map +1 -1
- package/dist/shield-auth.strategy.d.ts +3 -2
- package/dist/shield-auth.strategy.d.ts.map +1 -1
- package/dist/shield-auth.strategy.js +10 -3
- package/dist/shield-auth.strategy.js.map +1 -1
- package/dist/shield-basic-auth-hono.strategy.d.ts +1 -0
- package/dist/shield-basic-auth-hono.strategy.d.ts.map +1 -1
- package/dist/shield-basic-auth-hono.strategy.js +8 -1
- package/dist/shield-basic-auth-hono.strategy.js.map +1 -1
- package/dist/shield-basic-auth.strategy.d.ts +1 -0
- package/dist/shield-basic-auth.strategy.d.ts.map +1 -1
- package/dist/shield-basic-auth.strategy.js +11 -3
- package/dist/shield-basic-auth.strategy.js.map +1 -1
- package/dist/shield-csrf.strategy.js +2 -2
- package/dist/shield-csrf.strategy.js.map +1 -1
- package/dist/shield-hcaptcha-hono-local.strategy.d.ts.map +1 -1
- package/dist/shield-hcaptcha-hono-local.strategy.js +3 -1
- package/dist/shield-hcaptcha-hono-local.strategy.js.map +1 -1
- package/dist/shield-hcaptcha.strategy.d.ts +2 -2
- package/dist/shield-hcaptcha.strategy.d.ts.map +1 -1
- package/dist/shield-hcaptcha.strategy.js +7 -2
- package/dist/shield-hcaptcha.strategy.js.map +1 -1
- package/dist/shield-ip-blacklist.strategy.d.ts +2 -2
- package/dist/shield-ip-blacklist.strategy.d.ts.map +1 -1
- package/dist/shield-ip-blacklist.strategy.js +2 -2
- package/dist/shield-ip-blacklist.strategy.js.map +1 -1
- package/dist/shield-ip-whitelist.strategy.d.ts +2 -2
- package/dist/shield-ip-whitelist.strategy.d.ts.map +1 -1
- package/dist/shield-ip-whitelist.strategy.js +1 -1
- package/dist/shield-ip-whitelist.strategy.js.map +1 -1
- package/dist/shield-maintenance-hono.strategy.d.ts.map +1 -1
- package/dist/shield-maintenance-hono.strategy.js +6 -4
- package/dist/shield-maintenance-hono.strategy.js.map +1 -1
- package/dist/shield-maintenance.strategy.d.ts +23 -7
- package/dist/shield-maintenance.strategy.d.ts.map +1 -1
- package/dist/shield-maintenance.strategy.js +23 -4
- package/dist/shield-maintenance.strategy.js.map +1 -1
- package/dist/shield-rate-limit.strategy.d.ts +1 -1
- package/dist/shield-rate-limit.strategy.d.ts.map +1 -1
- package/dist/shield-rate-limit.strategy.js +1 -1
- package/dist/shield-rate-limit.strategy.js.map +1 -1
- package/dist/shield-recaptcha.strategy.d.ts +2 -2
- package/dist/shield-recaptcha.strategy.d.ts.map +1 -1
- package/dist/shield-recaptcha.strategy.js +11 -7
- package/dist/shield-recaptcha.strategy.js.map +1 -1
- package/dist/shield-timeout-hono.strategy.js +1 -1
- package/dist/shield-webhook-hono.strategy.js +1 -1
- package/dist/shield-webhook.strategy.d.ts +2 -2
- package/dist/shield-webhook.strategy.d.ts.map +1 -1
- package/dist/shield-webhook.strategy.js.map +1 -1
- package/dist/simulated-error.middleware.d.ts +3 -0
- package/dist/simulated-error.middleware.d.ts.map +1 -1
- package/dist/simulated-error.middleware.js +2 -1
- package/dist/simulated-error.middleware.js.map +1 -1
- package/dist/sitemap-entry.vo.js +1 -1
- package/dist/sitemap-priority.vo.d.ts +1 -1
- package/dist/sitemap-priority.vo.d.ts.map +1 -1
- package/dist/sitemap-priority.vo.js +1 -1
- package/dist/sitemap-priority.vo.js.map +1 -1
- package/dist/slower-hono.middleware.d.ts +2 -6
- package/dist/slower-hono.middleware.d.ts.map +1 -1
- package/dist/slower-hono.middleware.js.map +1 -1
- package/dist/slower.middleware.d.ts +2 -3
- package/dist/slower.middleware.d.ts.map +1 -1
- package/dist/slower.middleware.js.map +1 -1
- package/dist/sms-with-logger.adapter.js +1 -1
- package/dist/sms-with-logger.adapter.js.map +1 -1
- package/dist/sse-hono.handler.d.ts.map +1 -1
- package/dist/sse-hono.handler.js +4 -2
- package/dist/sse-hono.handler.js.map +1 -1
- package/dist/sse-registry-collecting.adapter.d.ts +1 -1
- package/dist/sse-registry-collecting.adapter.d.ts.map +1 -1
- package/dist/sse-registry-collecting.adapter.js +3 -1
- package/dist/sse-registry-collecting.adapter.js.map +1 -1
- package/dist/sse-registry-noop.adapter.d.ts +1 -1
- package/dist/sse-registry-noop.adapter.d.ts.map +1 -1
- package/dist/sse-registry-noop.adapter.js +3 -1
- package/dist/sse-registry-noop.adapter.js.map +1 -1
- package/dist/sse-registry-with-limit.adapter.d.ts +1 -1
- package/dist/sse-registry-with-limit.adapter.d.ts.map +1 -1
- package/dist/sse-registry-with-limit.adapter.js +2 -2
- package/dist/sse-registry-with-limit.adapter.js.map +1 -1
- package/dist/sse-registry-with-logger.adapter.d.ts +1 -1
- package/dist/sse-registry-with-logger.adapter.d.ts.map +1 -1
- package/dist/sse-registry-with-logger.adapter.js +4 -3
- package/dist/sse-registry-with-logger.adapter.js.map +1 -1
- package/dist/sse-registry.adapter.d.ts +1 -1
- package/dist/sse-registry.adapter.d.ts.map +1 -1
- package/dist/sse-registry.adapter.js +7 -1
- package/dist/sse-registry.adapter.js.map +1 -1
- package/dist/sse-registry.port.d.ts +1 -1
- package/dist/sse-registry.port.d.ts.map +1 -1
- package/dist/ssr-bun.service.js +1 -1
- package/dist/ssr-bun.service.js.map +1 -1
- package/dist/ssr.service.d.ts +1 -1
- package/dist/ssr.service.d.ts.map +1 -1
- package/dist/ssr.service.js +1 -1
- package/dist/ssr.service.js.map +1 -1
- package/dist/standard-schema-validator.service.js +1 -1
- package/dist/standard-schema-validator.service.js.map +1 -1
- package/dist/static-config.adapter.js +1 -1
- package/dist/static-config.adapter.js.map +1 -1
- package/dist/static-files-hono.service.d.ts +1 -1
- package/dist/static-files-hono.service.js +2 -2
- package/dist/static-files-hono.service.js.map +1 -1
- package/dist/subject-application-resolver.vo.d.ts +2 -2
- package/dist/subject-application-resolver.vo.d.ts.map +1 -1
- package/dist/subject-application-resolver.vo.js +1 -1
- package/dist/subject-application-resolver.vo.js.map +1 -1
- package/dist/subject-request-resolver.vo.d.ts +2 -2
- package/dist/subject-request-resolver.vo.d.ts.map +1 -1
- package/dist/subject-request-resolver.vo.js +1 -1
- package/dist/subject-request-resolver.vo.js.map +1 -1
- package/dist/subject-segment-application.strategy.d.ts +1 -0
- package/dist/subject-segment-application.strategy.d.ts.map +1 -1
- package/dist/subject-segment-application.strategy.js +1 -1
- package/dist/subject-segment-application.strategy.js.map +1 -1
- package/dist/subject-segment-build.strategy.d.ts +1 -0
- package/dist/subject-segment-build.strategy.d.ts.map +1 -1
- package/dist/subject-segment-build.strategy.js +1 -0
- package/dist/subject-segment-build.strategy.js.map +1 -1
- package/dist/subject-segment-cookie.strategy.d.ts +1 -0
- package/dist/subject-segment-cookie.strategy.d.ts.map +1 -1
- package/dist/subject-segment-cookie.strategy.js +3 -0
- package/dist/subject-segment-cookie.strategy.js.map +1 -1
- package/dist/subject-segment-env.strategy.d.ts +1 -0
- package/dist/subject-segment-env.strategy.d.ts.map +1 -1
- package/dist/subject-segment-env.strategy.js +1 -0
- package/dist/subject-segment-env.strategy.js.map +1 -1
- package/dist/subject-segment-fixed.strategy.d.ts +1 -0
- package/dist/subject-segment-fixed.strategy.d.ts.map +1 -1
- package/dist/subject-segment-fixed.strategy.js +1 -0
- package/dist/subject-segment-fixed.strategy.js.map +1 -1
- package/dist/subject-segment-header.strategy.d.ts +1 -0
- package/dist/subject-segment-header.strategy.d.ts.map +1 -1
- package/dist/subject-segment-header.strategy.js +3 -0
- package/dist/subject-segment-header.strategy.js.map +1 -1
- package/dist/subject-segment-ip.strategy.d.ts +1 -0
- package/dist/subject-segment-ip.strategy.d.ts.map +1 -1
- package/dist/subject-segment-ip.strategy.js +1 -0
- package/dist/subject-segment-ip.strategy.js.map +1 -1
- package/dist/subject-segment-method.strategy.d.ts +7 -0
- package/dist/subject-segment-method.strategy.d.ts.map +1 -0
- package/dist/subject-segment-method.strategy.js +7 -0
- package/dist/subject-segment-method.strategy.js.map +1 -0
- package/dist/subject-segment-param.strategy.d.ts +1 -0
- package/dist/subject-segment-param.strategy.d.ts.map +1 -1
- package/dist/subject-segment-param.strategy.js +3 -0
- package/dist/subject-segment-param.strategy.js.map +1 -1
- package/dist/subject-segment-path.strategy.d.ts +1 -0
- package/dist/subject-segment-path.strategy.d.ts.map +1 -1
- package/dist/subject-segment-path.strategy.js +1 -0
- package/dist/subject-segment-path.strategy.js.map +1 -1
- package/dist/subject-segment-query.strategy.d.ts +3 -2
- package/dist/subject-segment-query.strategy.d.ts.map +1 -1
- package/dist/subject-segment-query.strategy.js +5 -5
- package/dist/subject-segment-query.strategy.js.map +1 -1
- package/dist/subject-segment-request.strategy.d.ts +5 -3
- package/dist/subject-segment-request.strategy.d.ts.map +1 -1
- package/dist/subject-segment-request.strategy.js +1 -1
- package/dist/subject-segment-request.strategy.js.map +1 -1
- package/dist/subject-segment-user.strategy.d.ts +1 -0
- package/dist/subject-segment-user.strategy.d.ts.map +1 -1
- package/dist/subject-segment-user.strategy.js +1 -0
- package/dist/subject-segment-user.strategy.js.map +1 -1
- package/dist/time-zone-offset-hono.middleware.d.ts +3 -1
- package/dist/time-zone-offset-hono.middleware.d.ts.map +1 -1
- package/dist/time-zone-offset.middleware.d.ts +2 -2
- package/dist/time-zone-offset.middleware.d.ts.map +1 -1
- package/dist/time-zone-offset.middleware.js +2 -0
- package/dist/time-zone-offset.middleware.js.map +1 -1
- package/dist/timekeeper-google.adapter.d.ts +1 -1
- package/dist/timekeeper-google.adapter.d.ts.map +1 -1
- package/dist/timekeeper-google.adapter.js.map +1 -1
- package/dist/timing-hono.middleware.d.ts +2 -6
- package/dist/timing-hono.middleware.d.ts.map +1 -1
- package/dist/timing-hono.middleware.js +1 -1
- package/dist/timing-hono.middleware.js.map +1 -1
- package/dist/timing.middleware.d.ts +5 -5
- package/dist/timing.middleware.d.ts.map +1 -1
- package/dist/timing.middleware.js +10 -2
- package/dist/timing.middleware.js.map +1 -1
- package/dist/trailing-slash-hono.middleware.d.ts +1 -1
- package/dist/trailing-slash-hono.middleware.js +2 -2
- package/dist/trailing-slash-hono.middleware.js.map +1 -1
- package/dist/trailing-slash.middleware.d.ts +2 -0
- package/dist/trailing-slash.middleware.d.ts.map +1 -1
- package/dist/trailing-slash.middleware.js +6 -1
- package/dist/trailing-slash.middleware.js.map +1 -1
- package/dist/translations-provider-json.adapter.d.ts +1 -1
- package/dist/translations-provider-json.adapter.d.ts.map +1 -1
- package/dist/translations-provider-json.adapter.js +2 -6
- package/dist/translations-provider-json.adapter.js.map +1 -1
- package/dist/translations-provider.port.d.ts +5 -0
- package/dist/translations-provider.port.d.ts.map +1 -1
- package/dist/translations-provider.port.js +3 -1
- package/dist/translations-provider.port.js.map +1 -1
- package/dist/weak-etag-extractor-header.strategy.d.ts +1 -0
- package/dist/weak-etag-extractor-header.strategy.d.ts.map +1 -1
- package/dist/weak-etag-extractor-header.strategy.js +3 -0
- package/dist/weak-etag-extractor-header.strategy.js.map +1 -1
- package/dist/weak-etag-extractor-hono.middleware.d.ts +3 -1
- package/dist/weak-etag-extractor-hono.middleware.d.ts.map +1 -1
- package/dist/weak-etag-extractor-param.strategy.d.ts.map +1 -1
- package/dist/weak-etag-extractor-param.strategy.js +2 -0
- package/dist/weak-etag-extractor-param.strategy.js.map +1 -1
- package/dist/weak-etag-extractor.strategy.d.ts +2 -2
- package/dist/weak-etag-extractor.strategy.d.ts.map +1 -1
- package/dist/webhook-signature-extractor.strategy.d.ts +2 -2
- package/dist/webhook-signature-extractor.strategy.d.ts.map +1 -1
- package/dist/woodchopper-dispatcher-async.strategy.d.ts +0 -3
- package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +1 -1
- package/dist/woodchopper-dispatcher-async.strategy.js +7 -6
- package/dist/woodchopper-dispatcher-async.strategy.js.map +1 -1
- package/package.json +12 -17
- package/readme.md +4 -3
- package/src/ab-assignment-composite.strategy.ts +7 -4
- package/src/ab-assignment-cookie.strategy.ts +6 -3
- package/src/ab-assignment-fixed.strategy.ts +1 -2
- package/src/ab-assignment-hash.strategy.ts +1 -1
- package/src/ab-assignment-header.strategy.ts +6 -3
- package/src/ab-assignment-query.strategy.ts +6 -3
- package/src/ab-assignment.strategy.ts +1 -2
- package/src/ab-hono-noop.middleware.ts +2 -1
- package/src/ab-hono.middleware.ts +7 -6
- package/src/ab.middleware.ts +2 -6
- package/src/alert-channel-composite.adapter.ts +8 -1
- package/src/alert-channel-with-logger.adapter.ts +1 -1
- package/src/antivirus-clamav.adapter.ts +5 -4
- package/src/antivirus-with-logger.adapter.ts +2 -2
- package/src/api-version-hono.middleware.ts +7 -15
- package/src/api-version.middleware.ts +2 -2
- package/src/auth-session-reader-noop.adapter.ts +2 -2
- package/src/better-auth-logger.service.ts +5 -0
- package/src/cache-file.service.ts +4 -2
- package/src/cache-repository-node-cache.adapter.ts +3 -1
- package/src/cache-response-hono.middleware.ts +6 -6
- package/src/cache-response.middleware.ts +4 -4
- package/src/certificate-inspector-tls.adapter.ts +21 -19
- package/src/correlation-hono.middleware.ts +8 -8
- package/src/correlation.middleware.ts +2 -2
- package/src/cron-scheduler.adapter.ts +4 -2
- package/src/cron-task-handler-with-logger.strategy.ts +8 -8
- package/src/csv-stringifier.adapter.ts +2 -2
- package/src/disk-space-checker-fs.adapter.ts +12 -0
- package/src/dynamic-import.service.ts +2 -2
- package/src/environment-loader-process-safe.adapter.ts +4 -1
- package/src/environment-loader.port.ts +1 -1
- package/src/etag-extractor-header.strategy.ts +2 -0
- package/src/etag-extractor-hono.middleware.ts +1 -1
- package/src/etag-extractor-param.strategy.ts +2 -0
- package/src/etag-extractor.strategy.ts +2 -2
- package/src/file-inspection.adapter.ts +4 -4
- package/src/file-reader-json-forgiving.adapter.ts +1 -1
- package/src/graceful-shutdown.service.ts +3 -3
- package/src/hash.vo.ts +1 -1
- package/src/hcaptcha.service.ts +3 -3
- package/src/http-logger-hono.middleware.ts +6 -6
- package/src/http-logger.middleware.ts +2 -2
- package/src/image-blur-noop.adapter.ts +1 -1
- package/src/image-blur.adapter.ts +2 -6
- package/src/image-blur.port.ts +1 -7
- package/src/in-flight-requests-hono.middleware.ts +1 -0
- package/src/in-flight-requests-tracker.service.ts +2 -2
- package/src/index.ts +4 -3
- package/src/instrumentation.service.ts +5 -2
- package/src/job-queue-sqlite-store.service.ts +1 -0
- package/src/job-queue-with-logger.adapter.ts +2 -2
- package/src/language-detector-cookie.strategy.ts +1 -1
- package/src/language-detector-header.strategy.ts +13 -1
- package/src/language-detector-hono.middleware.ts +1 -1
- package/src/language-detector-query.strategy.ts +1 -1
- package/src/language-detector.middleware.ts +2 -2
- package/src/language-detector.strategy.ts +2 -2
- package/src/liveness-hono.handler.ts +5 -1
- package/src/liveness.handler.ts +2 -2
- package/src/mailer-content-html.vo.ts +1 -2
- package/src/mailer-smtp.adapter.ts +1 -0
- package/src/mailer-with-logger.adapter.ts +2 -2
- package/src/markdown-generator.adapter.ts +1 -1
- package/src/memory-consumption.service.ts +0 -4
- package/src/nonce-provider-crypto.adapter.ts +1 -1
- package/src/nonce-provider-noop.adapter.ts +1 -1
- package/src/nonce-value.vo.ts +2 -2
- package/src/pdf-generator-with-logger.adapter.ts +1 -1
- package/src/prerequisite-verifier-memory.adapter.ts +1 -1
- package/src/prerequisite-verifier-translations.adapter.ts +7 -13
- package/src/prerequisite-verifier-with-logger.adapter.ts +1 -1
- package/src/randomness.strategy.ts +1 -0
- package/src/reactive-config-noop.adapter.ts +6 -5
- package/src/reactive-config-with-cache.adapter.ts +1 -1
- package/src/reactive-config-with-fallback.adapter.ts +8 -4
- package/src/reactive-config-with-logger.adapter.ts +50 -0
- package/src/readiness-hono.handler.ts +2 -3
- package/src/readiness.handler.ts +13 -2
- package/src/redactor-metadata-compact-array.strategy.ts +1 -0
- package/src/redactor-metadata-compact-object.strategy.ts +1 -0
- package/src/redactor-url-query.strategy.ts +33 -0
- package/src/remote-file-storage-disk.adapter.ts +5 -5
- package/src/request-context-hono.adapter.ts +2 -0
- package/src/request-context.port.ts +11 -1
- package/src/sealer-aes-gcm.adapter.ts +6 -1
- package/src/secure-key-generator-crypto.adapter.ts +9 -1
- package/src/security-rule-bait-routes.strategy.ts +1 -1
- package/src/security-rule-honey-pot-field.strategy.ts +5 -4
- package/src/security-rule.strategy.ts +2 -4
- package/src/semaphore.service.ts +12 -9
- package/src/setup-hono.service.ts +1 -1
- package/src/shield-api-key-hono.strategy.ts +1 -1
- package/src/shield-api-key.strategy.ts +5 -5
- package/src/shield-auth.strategy.ts +10 -5
- package/src/shield-basic-auth-hono.strategy.ts +8 -2
- package/src/shield-basic-auth.strategy.ts +17 -4
- package/src/shield-csrf.strategy.ts +2 -2
- package/src/shield-hcaptcha-hono-local.strategy.ts +4 -2
- package/src/shield-hcaptcha.strategy.ts +11 -4
- package/src/shield-ip-blacklist.strategy.ts +4 -4
- package/src/shield-ip-whitelist.strategy.ts +3 -3
- package/src/shield-maintenance-hono.strategy.ts +7 -4
- package/src/shield-maintenance.strategy.ts +42 -6
- package/src/shield-rate-limit.strategy.ts +2 -2
- package/src/shield-recaptcha.strategy.ts +15 -9
- package/src/shield-timeout-hono.strategy.ts +1 -1
- package/src/shield-webhook-hono.strategy.ts +1 -1
- package/src/shield-webhook.strategy.ts +2 -2
- package/src/simulated-error.middleware.ts +3 -1
- package/src/sitemap-entry.vo.ts +1 -1
- package/src/sitemap-priority.vo.ts +1 -0
- package/src/slower-hono.middleware.ts +2 -5
- package/src/slower.middleware.ts +2 -2
- package/src/sms-with-logger.adapter.ts +1 -1
- package/src/sse-hono.handler.ts +4 -2
- package/src/sse-registry-collecting.adapter.ts +3 -1
- package/src/sse-registry-noop.adapter.ts +3 -1
- package/src/sse-registry-with-limit.adapter.ts +3 -3
- package/src/sse-registry-with-logger.adapter.ts +6 -4
- package/src/sse-registry.adapter.ts +10 -2
- package/src/sse-registry.port.ts +1 -1
- package/src/ssr-bun.service.ts +1 -1
- package/src/ssr.service.ts +1 -1
- package/src/standard-schema-validator.service.ts +1 -1
- package/src/static-config.adapter.ts +1 -1
- package/src/static-files-hono.service.ts +2 -2
- package/src/subject-application-resolver.vo.ts +3 -3
- package/src/subject-request-resolver.vo.ts +6 -3
- package/src/subject-segment-application.strategy.ts +2 -1
- package/src/subject-segment-build.strategy.ts +2 -0
- package/src/subject-segment-cookie.strategy.ts +4 -0
- package/src/subject-segment-env.strategy.ts +2 -0
- package/src/subject-segment-fixed.strategy.ts +2 -0
- package/src/subject-segment-header.strategy.ts +4 -0
- package/src/subject-segment-ip.strategy.ts +2 -0
- package/src/subject-segment-method.strategy.ts +10 -0
- package/src/subject-segment-param.strategy.ts +4 -0
- package/src/subject-segment-path.strategy.ts +2 -0
- package/src/subject-segment-query.strategy.ts +7 -7
- package/src/subject-segment-request.strategy.ts +8 -4
- package/src/subject-segment-user.strategy.ts +2 -0
- package/src/time-zone-offset-hono.middleware.ts +1 -1
- package/src/time-zone-offset.middleware.ts +4 -2
- package/src/timekeeper-google.adapter.ts +1 -1
- package/src/timing-hono.middleware.ts +3 -6
- package/src/timing.middleware.ts +15 -6
- package/src/trailing-slash-hono.middleware.ts +2 -2
- package/src/trailing-slash.middleware.ts +14 -2
- package/src/translations-provider-json.adapter.ts +6 -6
- package/src/translations-provider.port.ts +5 -0
- package/src/weak-etag-extractor-header.strategy.ts +4 -0
- package/src/weak-etag-extractor-hono.middleware.ts +1 -1
- package/src/weak-etag-extractor-param.strategy.ts +2 -0
- package/src/weak-etag-extractor.strategy.ts +2 -2
- package/src/webhook-signature-extractor.strategy.ts +2 -2
- package/src/woodchopper-dispatcher-async.strategy.ts +6 -11
- package/dist/cron-scheduler-croner.adapter.d.ts +0 -15
- package/dist/cron-scheduler-croner.adapter.d.ts.map +0 -1
- package/dist/cron-scheduler-croner.adapter.js +0 -23
- package/dist/cron-scheduler-croner.adapter.js.map +0 -1
- package/dist/disk-space-checker-shell.adapter.d.ts.map +0 -1
- package/dist/disk-space-checker-shell.adapter.js +0 -14
- package/dist/disk-space-checker-shell.adapter.js.map +0 -1
- package/dist/file-reader-raw-with-cache.adapter.d.ts +0 -20
- package/dist/file-reader-raw-with-cache.adapter.d.ts.map +0 -1
- package/dist/file-reader-raw-with-cache.adapter.js +0 -20
- package/dist/file-reader-raw-with-cache.adapter.js.map +0 -1
- package/src/cron-scheduler-croner.adapter.ts +0 -34
- package/src/disk-space-checker-shell.adapter.ts +0 -18
- package/src/file-reader-raw-with-cache.adapter.ts +0 -31
|
@@ -9,7 +9,7 @@ export class LanguageDetectorCookieStrategy<T extends tools.LanguageType>
|
|
|
9
9
|
constructor(private readonly name: string) {}
|
|
10
10
|
|
|
11
11
|
detect(context: HasRequestCookie, languages: Languages<T>): T | null {
|
|
12
|
-
const detected = context.request.cookie(this.name);
|
|
12
|
+
const detected = context.request.cookie(this.name)?.toLowerCase();
|
|
13
13
|
|
|
14
14
|
return languages.isSupported(detected) ? detected : null;
|
|
15
15
|
}
|
|
@@ -14,7 +14,19 @@ export class LanguageDetectorHeaderStrategy<T extends tools.LanguageType>
|
|
|
14
14
|
// Example Accept-Language header: en-US,en;q=0.9,pl;q=0.8
|
|
15
15
|
const incoming = header
|
|
16
16
|
.split(",")
|
|
17
|
-
.map((
|
|
17
|
+
.map((part) => {
|
|
18
|
+
// Stryker disable next-line StringLiteral
|
|
19
|
+
const [tag = "", quality = "q=1"] = part.split(";");
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
language: tag.trim().toLowerCase().split("-")[0],
|
|
23
|
+
quality: Number(quality.replace("q=", "")),
|
|
24
|
+
};
|
|
25
|
+
})
|
|
26
|
+
// Quality of 0 means the language is explicitly not acceptable
|
|
27
|
+
.filter((candidate) => candidate.quality > 0)
|
|
28
|
+
.sort((first, second) => second.quality - first.quality)
|
|
29
|
+
.map((candidate) => candidate.language);
|
|
18
30
|
|
|
19
31
|
return incoming.find((language) => languages.isSupported(language)) ?? null;
|
|
20
32
|
}
|
|
@@ -16,7 +16,7 @@ export class LanguageDetectorHonoMiddleware<T extends tools.LanguageType> implem
|
|
|
16
16
|
this.middleware = new LanguageDetectorMiddleware(config);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
handle(): MiddlewareHandler {
|
|
19
|
+
handle(): MiddlewareHandler<{ Variables: LanguageDetectorVariables }> {
|
|
20
20
|
return async (c, next) => {
|
|
21
21
|
const context = new RequestContextHonoAdapter(c);
|
|
22
22
|
|
|
@@ -9,7 +9,7 @@ export class LanguageDetectorQueryStrategy<T extends tools.LanguageType>
|
|
|
9
9
|
constructor(private readonly name: string) {}
|
|
10
10
|
|
|
11
11
|
detect(context: HasRequestQuery, languages: Languages<T>): T | null {
|
|
12
|
-
const detected = context.request.query()[this.name];
|
|
12
|
+
const detected = context.request.query()[this.name]?.toLowerCase();
|
|
13
13
|
|
|
14
14
|
return languages.isSupported(detected) ? detected : null;
|
|
15
15
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as tools from "@bgord/tools";
|
|
2
2
|
import type { LanguageDetectorStrategy } from "./language-detector.strategy";
|
|
3
3
|
import type { Languages } from "./languages.vo";
|
|
4
|
-
import type {
|
|
4
|
+
import type { HasRequestCookie, HasRequestHeaders, HasRequestQuery } from "./request-context.port";
|
|
5
5
|
|
|
6
6
|
export const LanguageDetectorMiddlewareError = {
|
|
7
7
|
MaxStrategies: "language.detector.middleware.max.strategies",
|
|
@@ -17,7 +17,7 @@ export class LanguageDetectorMiddleware<T extends tools.LanguageType> {
|
|
|
17
17
|
if (config.strategies.length > 5) throw new Error(LanguageDetectorMiddlewareError.MaxStrategies);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
evaluate(context:
|
|
20
|
+
evaluate(context: HasRequestCookie & HasRequestHeaders & HasRequestQuery): T {
|
|
21
21
|
for (const strategy of this.config.strategies) {
|
|
22
22
|
const detected = strategy.detect(context, this.config.languages);
|
|
23
23
|
if (detected !== null) return detected;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as tools from "@bgord/tools";
|
|
2
2
|
import type { Languages } from "./languages.vo";
|
|
3
|
-
import type {
|
|
3
|
+
import type { HasRequestCookie, HasRequestHeaders, HasRequestQuery } from "./request-context.port";
|
|
4
4
|
|
|
5
5
|
export interface LanguageDetectorStrategy<T extends tools.LanguageType> {
|
|
6
|
-
detect(context:
|
|
6
|
+
detect(context: HasRequestCookie & HasRequestHeaders & HasRequestQuery, languages: Languages<T>): T | null;
|
|
7
7
|
}
|
|
@@ -8,6 +8,10 @@ export class LivenessHonoHandler implements HandlerHonoPort {
|
|
|
8
8
|
private readonly handler = new LivenessHandler();
|
|
9
9
|
|
|
10
10
|
handle() {
|
|
11
|
-
return factory.createHandlers(async (c) =>
|
|
11
|
+
return factory.createHandlers(async (c) => {
|
|
12
|
+
const { headers, ...body } = this.handler.execute();
|
|
13
|
+
|
|
14
|
+
return c.json(body, 200, headers);
|
|
15
|
+
});
|
|
12
16
|
}
|
|
13
17
|
}
|
package/src/liveness.handler.ts
CHANGED
|
@@ -5,10 +5,9 @@ export const MailerContentHtmlError = { Invalid: "mailer.content.html.invalid" }
|
|
|
5
5
|
export const MailerContentHtml = v.pipe(
|
|
6
6
|
v.string(MailerContentHtmlError.Invalid),
|
|
7
7
|
v.minLength(1, MailerContentHtmlError.Invalid),
|
|
8
|
-
v.maxLength(
|
|
8
|
+
v.maxLength(100_000, MailerContentHtmlError.Invalid),
|
|
9
9
|
// Stryker disable next-line StringLiteral
|
|
10
10
|
v.brand("MailerContentHtml"),
|
|
11
11
|
);
|
|
12
12
|
|
|
13
13
|
export type MailerContentHtmlType = v.InferOutput<typeof MailerContentHtml>;
|
|
14
|
-
export type EmailAttachmentType = { filename: string; path: string };
|
|
@@ -19,7 +19,7 @@ export class MailerWithLoggerAdapter implements MailerPort {
|
|
|
19
19
|
this.deps.Logger.info({
|
|
20
20
|
message: "Mailer attempt",
|
|
21
21
|
correlationId: CorrelationStorage.get(),
|
|
22
|
-
metadata: template.toJSON(),
|
|
22
|
+
metadata: { template: template.toJSON() },
|
|
23
23
|
...this.base,
|
|
24
24
|
});
|
|
25
25
|
|
|
@@ -36,7 +36,7 @@ export class MailerWithLoggerAdapter implements MailerPort {
|
|
|
36
36
|
message: "Mailer error",
|
|
37
37
|
correlationId: CorrelationStorage.get(),
|
|
38
38
|
error,
|
|
39
|
-
metadata: duration.stop(),
|
|
39
|
+
metadata: { duration: duration.stop() },
|
|
40
40
|
...this.base,
|
|
41
41
|
});
|
|
42
42
|
|
|
@@ -2,6 +2,6 @@ import type { MarkdownGeneratorPort } from "./markdown-generator.port";
|
|
|
2
2
|
|
|
3
3
|
export class MarkdownGeneratorAdapter implements MarkdownGeneratorPort {
|
|
4
4
|
generate(template: string): string {
|
|
5
|
-
return Bun.markdown.html(template);
|
|
5
|
+
return Bun.markdown.html(template, { tagFilter: true, noHtmlBlocks: true, noHtmlSpans: true });
|
|
6
6
|
}
|
|
7
7
|
}
|
|
@@ -7,10 +7,6 @@ type MemoryConsumptionSnapshotType = { total: tools.Size; heap: { used: tools.Si
|
|
|
7
7
|
// Heap used - how much of the reserved memory is actually used for the JS heap
|
|
8
8
|
|
|
9
9
|
export class MemoryConsumption {
|
|
10
|
-
static get(): tools.Size {
|
|
11
|
-
return tools.Size.fromBytes(process.memoryUsage().rss);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
10
|
static snapshot(): MemoryConsumptionSnapshotType {
|
|
15
11
|
const { rss, heapUsed, heapTotal } = process.memoryUsage();
|
|
16
12
|
|
|
@@ -4,7 +4,7 @@ import { NonceValue, type NonceValueType } from "./nonce-value.vo";
|
|
|
4
4
|
|
|
5
5
|
export class NonceProviderCryptoAdapter implements NonceProviderPort {
|
|
6
6
|
generate(): NonceValueType {
|
|
7
|
-
const buffer = new Uint8Array(
|
|
7
|
+
const buffer = new Uint8Array(16);
|
|
8
8
|
crypto.getRandomValues(buffer);
|
|
9
9
|
|
|
10
10
|
return v.parse(NonceValue, buffer.toHex());
|
|
@@ -4,6 +4,6 @@ import { NonceValue, type NonceValueType } from "./nonce-value.vo";
|
|
|
4
4
|
|
|
5
5
|
export class NonceProviderNoopAdapter implements NonceProviderPort {
|
|
6
6
|
generate(): NonceValueType {
|
|
7
|
-
return v.parse(NonceValue, "
|
|
7
|
+
return v.parse(NonceValue, "00000000000000000000000000000000");
|
|
8
8
|
}
|
|
9
9
|
}
|
package/src/nonce-value.vo.ts
CHANGED
|
@@ -5,8 +5,8 @@ export const NonceValueError = {
|
|
|
5
5
|
InvalidHex: "nonce.value.invalid.hex",
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
-
//
|
|
9
|
-
const CHARS_WHITELIST = /^[a-fA-F0-9]{
|
|
8
|
+
// 32 hex chars allowed
|
|
9
|
+
const CHARS_WHITELIST = /^[a-fA-F0-9]{32}$/;
|
|
10
10
|
|
|
11
11
|
export const NonceValue = v.pipe(
|
|
12
12
|
v.string(NonceValueError.Type),
|
|
@@ -39,7 +39,7 @@ export class PdfGeneratorWithLoggerAdapter implements PdfGeneratorPort {
|
|
|
39
39
|
message: "PDF generator error",
|
|
40
40
|
correlationId: CorrelationStorage.get(),
|
|
41
41
|
error,
|
|
42
|
-
metadata: duration.stop(),
|
|
42
|
+
metadata: { duration: duration.stop() },
|
|
43
43
|
...this.base,
|
|
44
44
|
});
|
|
45
45
|
|
|
@@ -12,7 +12,7 @@ export class PrerequisiteVerifierMemoryAdapter implements PrerequisiteVerifierPo
|
|
|
12
12
|
constructor(private readonly config: Config) {}
|
|
13
13
|
|
|
14
14
|
async verify(): Promise<PrerequisiteVerificationResult> {
|
|
15
|
-
const memoryConsumption = MemoryConsumption.
|
|
15
|
+
const memoryConsumption = MemoryConsumption.snapshot().total;
|
|
16
16
|
|
|
17
17
|
if (memoryConsumption.isSmallerThan(this.config.maximum)) return PrerequisiteVerification.success;
|
|
18
18
|
return PrerequisiteVerification.failure(
|
|
@@ -26,12 +26,12 @@ export class PrerequisiteVerifierTranslationsAdapter<T extends tools.LanguageTyp
|
|
|
26
26
|
async verify(): Promise<PrerequisiteVerificationResult> {
|
|
27
27
|
const languages = this.config.values;
|
|
28
28
|
|
|
29
|
-
const
|
|
29
|
+
const translations = new Map<T, Set<TranslationsKeyType>>();
|
|
30
30
|
|
|
31
31
|
for (const language of languages) {
|
|
32
32
|
try {
|
|
33
|
-
const
|
|
34
|
-
|
|
33
|
+
const dictionary = await this.deps.TranslationsProvider.getTranslationsFor(language);
|
|
34
|
+
translations.set(language, new Set(Object.keys(dictionary)));
|
|
35
35
|
} catch {
|
|
36
36
|
return PrerequisiteVerification.failure(`${language} translations not available`);
|
|
37
37
|
}
|
|
@@ -39,16 +39,10 @@ export class PrerequisiteVerifierTranslationsAdapter<T extends tools.LanguageTyp
|
|
|
39
39
|
|
|
40
40
|
const problems: Array<PrerequisiteTranslationsProblemType> = [];
|
|
41
41
|
|
|
42
|
-
for (const language
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
for (const key of translations) {
|
|
48
|
-
for (const supportedLanguage of languages) {
|
|
49
|
-
const exists = new Set(dictionary[supportedLanguage]).has(key);
|
|
50
|
-
|
|
51
|
-
if (!exists) problems.push({ key, existsIn: language, missingIn: supportedLanguage });
|
|
42
|
+
for (const [language, keys] of translations) {
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
for (const [supportedLanguage, supported] of translations) {
|
|
45
|
+
if (!supported.has(key)) problems.push({ key, existsIn: language, missingIn: supportedLanguage });
|
|
52
46
|
}
|
|
53
47
|
}
|
|
54
48
|
}
|
|
@@ -16,7 +16,7 @@ export class PrerequisiteVerifierWithLoggerAdapter implements PrerequisiteVerifi
|
|
|
16
16
|
private readonly base = (duration: tools.Duration) => ({
|
|
17
17
|
component: "infra",
|
|
18
18
|
operation: "prerequisite_verify",
|
|
19
|
-
metadata: duration,
|
|
19
|
+
metadata: { duration },
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
constructor(
|
|
@@ -2,12 +2,13 @@ import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config
|
|
|
2
2
|
import { StandardSchemaValidator } from "./standard-schema-validator.service";
|
|
3
3
|
|
|
4
4
|
export class ReactiveConfigNoopAdapter<T extends object> implements ReactiveConfigPort<T> {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
private readonly value: Readonly<T>;
|
|
6
|
+
|
|
7
|
+
constructor(schema: ReactiveConfigSchema<T>, value: T) {
|
|
8
|
+
this.value = Object.freeze(StandardSchemaValidator.validate(schema, value));
|
|
9
|
+
}
|
|
9
10
|
|
|
10
11
|
async get(): Promise<Readonly<T>> {
|
|
11
|
-
return
|
|
12
|
+
return this.value;
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -14,6 +14,6 @@ export class ReactiveConfigWithCacheAdapter<T extends object> implements Reactiv
|
|
|
14
14
|
async get(): Promise<Readonly<T>> {
|
|
15
15
|
const key = await this.deps.HashContent.hash(this.subject);
|
|
16
16
|
|
|
17
|
-
return this.deps.CacheResolver.resolve(key, () => this.inner.get());
|
|
17
|
+
return Object.freeze(await this.deps.CacheResolver.resolve(key, () => this.inner.get()));
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -2,17 +2,21 @@ import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config
|
|
|
2
2
|
import { StandardSchemaValidator } from "./standard-schema-validator.service";
|
|
3
3
|
|
|
4
4
|
export class ReactiveConfigWithFallbackAdapter<T extends object> implements ReactiveConfigPort<T> {
|
|
5
|
+
private readonly fallback: Readonly<T>;
|
|
6
|
+
|
|
5
7
|
constructor(
|
|
6
8
|
private readonly inner: ReactiveConfigPort<T>,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
) {
|
|
9
|
+
schema: ReactiveConfigSchema<T>,
|
|
10
|
+
fallback: T,
|
|
11
|
+
) {
|
|
12
|
+
this.fallback = Object.freeze(StandardSchemaValidator.validate(schema, fallback));
|
|
13
|
+
}
|
|
10
14
|
|
|
11
15
|
async get(): Promise<Readonly<T>> {
|
|
12
16
|
try {
|
|
13
17
|
return await this.inner.get();
|
|
14
18
|
} catch {
|
|
15
|
-
return
|
|
19
|
+
return this.fallback;
|
|
16
20
|
}
|
|
17
21
|
}
|
|
18
22
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ClockPort } from "./clock.port";
|
|
2
|
+
import { CorrelationStorage } from "./correlation-storage.service";
|
|
3
|
+
import type { LoggerPort } from "./logger.port";
|
|
4
|
+
import type { ReactiveConfigPort } from "./reactive-config.port";
|
|
5
|
+
import { Stopwatch } from "./stopwatch.service";
|
|
6
|
+
|
|
7
|
+
export type ReactiveConfigWithLoggerAdapterDependencies<T extends object> = {
|
|
8
|
+
inner: ReactiveConfigPort<T>;
|
|
9
|
+
Logger: LoggerPort;
|
|
10
|
+
Clock: ClockPort;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export class ReactiveConfigWithLoggerAdapter<T extends object> implements ReactiveConfigPort<T> {
|
|
14
|
+
private readonly base = { component: "infra", operation: "reactive_config" };
|
|
15
|
+
|
|
16
|
+
constructor(private readonly deps: ReactiveConfigWithLoggerAdapterDependencies<T>) {}
|
|
17
|
+
|
|
18
|
+
async get(): Promise<Readonly<T>> {
|
|
19
|
+
const duration = new Stopwatch(this.deps);
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
this.deps.Logger.info({
|
|
23
|
+
message: "Reactive config read attempt",
|
|
24
|
+
correlationId: CorrelationStorage.get(),
|
|
25
|
+
...this.base,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const result = await this.deps.inner.get();
|
|
29
|
+
|
|
30
|
+
this.deps.Logger.info({
|
|
31
|
+
message: "Reactive config read success",
|
|
32
|
+
correlationId: CorrelationStorage.get(),
|
|
33
|
+
metadata: { duration: duration.stop() },
|
|
34
|
+
...this.base,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
return result;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
this.deps.Logger.error({
|
|
40
|
+
message: "Reactive config read error",
|
|
41
|
+
correlationId: CorrelationStorage.get(),
|
|
42
|
+
error,
|
|
43
|
+
metadata: { duration: duration.stop() },
|
|
44
|
+
...this.base,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -13,10 +13,9 @@ export class ReadinessHonoHandler implements HandlerHonoPort {
|
|
|
13
13
|
|
|
14
14
|
handle() {
|
|
15
15
|
return factory.createHandlers(async (c) => {
|
|
16
|
-
const
|
|
17
|
-
const code = readiness.ok ? 200 : 503;
|
|
16
|
+
const result = await this.handler.check();
|
|
18
17
|
|
|
19
|
-
return c.json(
|
|
18
|
+
return c.json(result.details, result.code, result.headers);
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
}
|
package/src/readiness.handler.ts
CHANGED
|
@@ -6,9 +6,15 @@ import {
|
|
|
6
6
|
|
|
7
7
|
export type ReadinessConfig = { prerequisites: ReadonlyArray<Prerequisite> };
|
|
8
8
|
|
|
9
|
+
export enum ReadinessStatusCode {
|
|
10
|
+
Ready = 200,
|
|
11
|
+
NotReady = 503,
|
|
12
|
+
}
|
|
13
|
+
|
|
9
14
|
type ReadinessResult = {
|
|
10
|
-
|
|
15
|
+
code: ReadinessStatusCode;
|
|
11
16
|
details: ReadonlyArray<{ label: PrerequisiteLabelType; outcome: PrerequisiteVerificationResult }>;
|
|
17
|
+
headers: Record<string, string>;
|
|
12
18
|
};
|
|
13
19
|
|
|
14
20
|
export class ReadinessHandler {
|
|
@@ -26,8 +32,13 @@ export class ReadinessHandler {
|
|
|
26
32
|
})),
|
|
27
33
|
);
|
|
28
34
|
|
|
35
|
+
// Undetermined keeps traffic flowing here, unlike healthcheck where it degrades to 207
|
|
29
36
|
const ok = details.every((detail) => detail.outcome.outcome !== PrerequisiteVerificationOutcome.failure);
|
|
30
37
|
|
|
31
|
-
return {
|
|
38
|
+
return {
|
|
39
|
+
code: ok ? ReadinessStatusCode.Ready : ReadinessStatusCode.NotReady,
|
|
40
|
+
details,
|
|
41
|
+
headers: { "Cache-Control": "no-store" },
|
|
42
|
+
};
|
|
32
43
|
}
|
|
33
44
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as tools from "@bgord/tools";
|
|
2
|
+
import type { RedactorStrategy } from "./redactor.strategy";
|
|
3
|
+
import { RedactorMask } from "./redactor-mask.strategy";
|
|
4
|
+
|
|
5
|
+
export class RedactorUrlQuery implements RedactorStrategy {
|
|
6
|
+
private readonly keys: Set<string>;
|
|
7
|
+
|
|
8
|
+
constructor(keys?: ReadonlyArray<string>) {
|
|
9
|
+
this.keys = new Set((keys?.length ? keys : RedactorMask.DEFAULT_KEYS).map((key) => key.toLowerCase()));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
redact<T>(input: T): T {
|
|
13
|
+
if (!tools.isPlainObject(input)) return input;
|
|
14
|
+
if (typeof input["url"] !== "string") return input;
|
|
15
|
+
|
|
16
|
+
return { ...input, url: this.mask(input["url"]) };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private mask(url: string): string {
|
|
20
|
+
const [base, query] = url.split("?");
|
|
21
|
+
|
|
22
|
+
if (!query) return url;
|
|
23
|
+
|
|
24
|
+
const masked = new URLSearchParams(
|
|
25
|
+
Array.from(new URLSearchParams(query), ([key, value]) => [
|
|
26
|
+
key,
|
|
27
|
+
this.keys.has(key.toLowerCase()) ? "***" : value,
|
|
28
|
+
]),
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
return `${base}?${masked.toString()}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -3,6 +3,7 @@ import * as v from "valibot";
|
|
|
3
3
|
import type { DirectoryEnsurerPort } from "./directory-ensurer.port";
|
|
4
4
|
import type { FileCleanerPort } from "./file-cleaner.port";
|
|
5
5
|
import type { FileCopierPort } from "./file-copier.port";
|
|
6
|
+
import type { FileInspectionPort } from "./file-inspection.port";
|
|
6
7
|
import type { FileRenamerPort } from "./file-renamer.port";
|
|
7
8
|
import type { HashFilePort } from "./hash-file.port";
|
|
8
9
|
import type { NonceProviderPort } from "./nonce-provider.port";
|
|
@@ -15,6 +16,7 @@ import type {
|
|
|
15
16
|
|
|
16
17
|
type Dependencies = {
|
|
17
18
|
HashFile: HashFilePort;
|
|
19
|
+
FileInspection: FileInspectionPort;
|
|
18
20
|
FileCleaner: FileCleanerPort;
|
|
19
21
|
FileRenamer: FileRenamerPort;
|
|
20
22
|
FileCopier: FileCopierPort;
|
|
@@ -71,11 +73,9 @@ export class RemoteFileStorageDiskAdapter implements RemoteFileStoragePort {
|
|
|
71
73
|
async getStream(key: tools.ObjectKeyType): Promise<ReadableStream | null> {
|
|
72
74
|
const path = this.resolveKeyToAbsoluteFilePath(key);
|
|
73
75
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
76
|
+
if (!(await this.deps.FileInspection.exists(path))) return null;
|
|
77
|
+
|
|
78
|
+
return Bun.file(path.get()).stream();
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
async delete(key: tools.ObjectKeyType): Promise<tools.ObjectKeyType> {
|
|
@@ -26,6 +26,7 @@ export class RequestContextHonoAdapter implements RequestContext {
|
|
|
26
26
|
return headers;
|
|
27
27
|
},
|
|
28
28
|
query: () => context.req.query(),
|
|
29
|
+
queries: () => context.req.queries(),
|
|
29
30
|
params: () => context.req.param(),
|
|
30
31
|
param: (name: string) => context.req.param(name),
|
|
31
32
|
cookie: (name) => getCookie(context)[name],
|
|
@@ -65,6 +66,7 @@ export class RequestContextHonoAdapter implements RequestContext {
|
|
|
65
66
|
context.req.header("x-real-ip") ||
|
|
66
67
|
context.req.header("x-forwarded-for")?.split(",")[0]?.trim() ||
|
|
67
68
|
getConnInfo(context).remote.address,
|
|
69
|
+
remoteIp: () => getConnInfo(context).remote.address,
|
|
68
70
|
ua: () => context.req.header("user-agent"),
|
|
69
71
|
};
|
|
70
72
|
|
|
@@ -8,6 +8,7 @@ export interface RequestContext {
|
|
|
8
8
|
url(): string;
|
|
9
9
|
header(name: string): string | undefined;
|
|
10
10
|
query(): Record<string, string>;
|
|
11
|
+
queries(): Record<string, ReadonlyArray<string>>;
|
|
11
12
|
params(): Record<string, string>;
|
|
12
13
|
param(name: string): string | undefined;
|
|
13
14
|
cookie(name: string): string | undefined;
|
|
@@ -21,6 +22,7 @@ export interface RequestContext {
|
|
|
21
22
|
readonly identity: {
|
|
22
23
|
userId(): UUIDType | undefined;
|
|
23
24
|
ip(): string | undefined;
|
|
25
|
+
remoteIp(): string | undefined;
|
|
24
26
|
ua(): string | undefined;
|
|
25
27
|
};
|
|
26
28
|
|
|
@@ -59,6 +61,10 @@ export interface HasRequestQuery {
|
|
|
59
61
|
readonly request: { query(): Record<string, string> };
|
|
60
62
|
}
|
|
61
63
|
|
|
64
|
+
export interface HasRequestQueries {
|
|
65
|
+
readonly request: { queries(): Record<string, ReadonlyArray<string>> };
|
|
66
|
+
}
|
|
67
|
+
|
|
62
68
|
export interface HasRequestParams {
|
|
63
69
|
readonly request: { params(): Record<string, string> };
|
|
64
70
|
}
|
|
@@ -71,7 +77,7 @@ export interface HasRequestCookie {
|
|
|
71
77
|
readonly request: { cookie(name: string): string | undefined };
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
export interface
|
|
80
|
+
export interface HasRequestJson {
|
|
75
81
|
readonly request: { json(): Promise<Record<string, unknown>> };
|
|
76
82
|
}
|
|
77
83
|
|
|
@@ -91,6 +97,10 @@ export interface HasIdentityIp {
|
|
|
91
97
|
readonly identity: { ip(): string | undefined };
|
|
92
98
|
}
|
|
93
99
|
|
|
100
|
+
export interface HasIdentityRemoteIp {
|
|
101
|
+
readonly identity: { remoteIp(): string | undefined };
|
|
102
|
+
}
|
|
103
|
+
|
|
94
104
|
export interface HasIdentityUa {
|
|
95
105
|
readonly identity: { ua(): string | undefined };
|
|
96
106
|
}
|
|
@@ -5,7 +5,10 @@ import type { SealerPort } from "./sealer.port";
|
|
|
5
5
|
|
|
6
6
|
type Dependencies = { CryptoKeyProvider: CryptoKeyProviderPort };
|
|
7
7
|
|
|
8
|
-
export const SealerAesGcmAdapterError = {
|
|
8
|
+
export const SealerAesGcmAdapterError = {
|
|
9
|
+
InvalidPayload: "sealer.aes.gcm.adapter.invalid.payload",
|
|
10
|
+
Undefined: "sealer.aes.gcm.adapter.undefined.value",
|
|
11
|
+
};
|
|
9
12
|
|
|
10
13
|
export class SealerAesGcmAdapter implements SealerPort {
|
|
11
14
|
private static readonly PREFIX = "sealed:gcm:";
|
|
@@ -13,6 +16,8 @@ export class SealerAesGcmAdapter implements SealerPort {
|
|
|
13
16
|
constructor(private readonly deps: Dependencies) {}
|
|
14
17
|
|
|
15
18
|
async seal(value: unknown): Promise<string> {
|
|
19
|
+
if (value === undefined) throw new Error(SealerAesGcmAdapterError.Undefined);
|
|
20
|
+
|
|
16
21
|
const key = await this.deps.CryptoKeyProvider.get();
|
|
17
22
|
const iv = EncryptionIV.generate();
|
|
18
23
|
|
|
@@ -2,9 +2,17 @@ import type * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { SecureKeyGeneratorPort } from "./secure-key-generator.port";
|
|
3
3
|
|
|
4
4
|
export class SecureKeyGeneratorCryptoAdapter implements SecureKeyGeneratorPort {
|
|
5
|
+
// crypto.getRandomValues is spec-limited to a 65536-byte view
|
|
6
|
+
static readonly MAX_BYTES = 65_536;
|
|
7
|
+
|
|
5
8
|
generate(bytes: tools.IntegerPositiveType): Uint8Array {
|
|
6
9
|
const buffer = new Uint8Array(bytes);
|
|
7
|
-
|
|
10
|
+
|
|
11
|
+
// Stryker disable next-line EqualityOperator
|
|
12
|
+
for (let offset = 0; offset < bytes; offset += SecureKeyGeneratorCryptoAdapter.MAX_BYTES) {
|
|
13
|
+
crypto.getRandomValues(buffer.subarray(offset, offset + SecureKeyGeneratorCryptoAdapter.MAX_BYTES));
|
|
14
|
+
}
|
|
15
|
+
|
|
8
16
|
return buffer;
|
|
9
17
|
}
|
|
10
18
|
}
|
|
@@ -7,7 +7,7 @@ export class SecurityRuleBaitRoutesStrategy implements SecurityRuleStrategy {
|
|
|
7
7
|
constructor(private readonly routes: ReadonlyArray<string>) {}
|
|
8
8
|
|
|
9
9
|
async isViolated(context: HasRequestPath): Promise<boolean> {
|
|
10
|
-
return this.routes.includes(context.request.path);
|
|
10
|
+
return this.routes.includes(context.request.path.toLowerCase().replace(/\/+$/, ""));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
get name(): SecurityRuleNameType {
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
|
-
import type {
|
|
2
|
+
import type { HasRequestForm, HasRequestJson } from "./request-context.port";
|
|
3
3
|
import type { SecurityRuleStrategy } from "./security-rule.strategy";
|
|
4
4
|
import { SecurityRuleName, type SecurityRuleNameType } from "./security-rule-name.vo";
|
|
5
5
|
|
|
6
6
|
export class SecurityRuleHoneyPotFieldStrategy implements SecurityRuleStrategy {
|
|
7
7
|
constructor(private readonly field: string) {}
|
|
8
8
|
|
|
9
|
-
async isViolated(context:
|
|
9
|
+
async isViolated(context: HasRequestJson & HasRequestForm): Promise<boolean> {
|
|
10
10
|
const body = await context.request.json();
|
|
11
|
+
const form = await context.request.form();
|
|
11
12
|
|
|
12
|
-
const value = body[this.field];
|
|
13
|
+
const value = body[this.field] ?? form.get(this.field);
|
|
13
14
|
|
|
14
|
-
return value !==
|
|
15
|
+
return value !== null && value !== "";
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
get name(): SecurityRuleNameType {
|