@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
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HasRequestForm, HasRequestJson, HasRequestPath } from "./request-context.port";
|
|
2
2
|
import type { SecurityRuleNameType } from "./security-rule-name.vo";
|
|
3
3
|
|
|
4
|
-
type RequestContextCapabilities = HasRequestPath & HasRequestJSON;
|
|
5
|
-
|
|
6
4
|
export interface SecurityRuleStrategy {
|
|
7
|
-
isViolated(context:
|
|
5
|
+
isViolated(context: HasRequestPath & HasRequestJson & HasRequestForm): Promise<boolean>;
|
|
8
6
|
|
|
9
7
|
get name(): SecurityRuleNameType;
|
|
10
8
|
}
|
package/src/semaphore.service.ts
CHANGED
|
@@ -3,24 +3,27 @@ import type * as tools from "@bgord/tools";
|
|
|
3
3
|
export type SemaphoreConfig = { limit: tools.IntegerPositiveType };
|
|
4
4
|
|
|
5
5
|
export class Semaphore {
|
|
6
|
-
private readonly
|
|
6
|
+
private readonly limit: tools.IntegerPositiveType;
|
|
7
|
+
|
|
8
|
+
private active = 0;
|
|
9
|
+
|
|
10
|
+
private readonly waiting: Array<() => void> = [];
|
|
7
11
|
|
|
8
12
|
constructor(config: SemaphoreConfig) {
|
|
9
|
-
this.
|
|
13
|
+
this.limit = config.limit;
|
|
10
14
|
}
|
|
11
15
|
|
|
12
16
|
async run<T>(action: () => Promise<T>): Promise<T> {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.slots.push(promise);
|
|
17
|
-
|
|
18
|
-
await slot;
|
|
17
|
+
if (this.active >= this.limit) await new Promise<void>((resolve) => this.waiting.push(resolve));
|
|
18
|
+
else this.active++;
|
|
19
19
|
|
|
20
20
|
try {
|
|
21
21
|
return await action();
|
|
22
22
|
} finally {
|
|
23
|
-
|
|
23
|
+
const next = this.waiting.shift();
|
|
24
|
+
|
|
25
|
+
if (next) next();
|
|
26
|
+
else this.active--;
|
|
24
27
|
}
|
|
25
28
|
}
|
|
26
29
|
}
|
|
@@ -53,6 +53,7 @@ export class SetupHono {
|
|
|
53
53
|
new ShieldMaintenanceHonoStrategy(config.maintenanceMode).handle(),
|
|
54
54
|
new TrailingSlashHonoMiddleware().handle(),
|
|
55
55
|
new CorrelationHonoMiddleware(deps).handle(),
|
|
56
|
+
new TimingHonoMiddleware(deps).handle(),
|
|
56
57
|
new ApiVersionHonoMiddleware(deps).handle(),
|
|
57
58
|
new ShieldCsrfHonoStrategy(config.csrf).handle(),
|
|
58
59
|
secureHeaders({
|
|
@@ -76,7 +77,6 @@ export class SetupHono {
|
|
|
76
77
|
new LanguageDetectorHonoMiddleware(config.I18n).handle(),
|
|
77
78
|
new TimeZoneOffsetHonoMiddleware().handle(),
|
|
78
79
|
new HttpLoggerHonoMiddleware(deps, config.httpLogger).handle(),
|
|
79
|
-
new TimingHonoMiddleware(deps).handle(),
|
|
80
80
|
];
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -20,7 +20,7 @@ export class ShieldApiKeyHonoStrategy implements MiddlewareHonoPort {
|
|
|
20
20
|
const context = new RequestContextHonoAdapter(c);
|
|
21
21
|
|
|
22
22
|
if (this.strategy.evaluate(context)) return next();
|
|
23
|
-
throw new HTTPException(
|
|
23
|
+
throw new HTTPException(401, { message: ShieldApiKeyStrategyError.Rejected });
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { timingSafeEqual } from "node:crypto";
|
|
2
|
-
import
|
|
2
|
+
import * as tools from "@bgord/tools";
|
|
3
|
+
import * as v from "valibot";
|
|
3
4
|
import type { HasRequestHeader } from "./request-context.port";
|
|
4
5
|
|
|
5
6
|
export type ApiKeyShieldConfig = { API_KEY: tools.ApiKeyType };
|
|
@@ -12,11 +13,10 @@ export class ShieldApiKeyStrategy {
|
|
|
12
13
|
constructor(private readonly config: ApiKeyShieldConfig) {}
|
|
13
14
|
|
|
14
15
|
evaluate(context: HasRequestHeader): boolean {
|
|
15
|
-
const header = context.request.header(ShieldApiKeyStrategy.HEADER_NAME);
|
|
16
|
-
const config = this.config.API_KEY;
|
|
16
|
+
const header = v.safeParse(tools.ApiKey, context.request.header(ShieldApiKeyStrategy.HEADER_NAME));
|
|
17
17
|
|
|
18
|
-
if (header
|
|
18
|
+
if (!header.success) return false;
|
|
19
19
|
|
|
20
|
-
return timingSafeEqual(Buffer.from(header), Buffer.from(config));
|
|
20
|
+
return timingSafeEqual(Buffer.from(header.output), Buffer.from(this.config.API_KEY));
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -3,7 +3,10 @@ import type { HasRequestHeaders } from "./request-context.port";
|
|
|
3
3
|
|
|
4
4
|
type Dependencies<User, Session> = { AuthSessionReader: AuthSessionReaderPort<User, Session> };
|
|
5
5
|
|
|
6
|
-
export const ShieldAuthStrategyError = {
|
|
6
|
+
export const ShieldAuthStrategyError = {
|
|
7
|
+
Rejected: "shield.auth.rejected",
|
|
8
|
+
NotAttached: "shield.auth.not.attached",
|
|
9
|
+
};
|
|
7
10
|
|
|
8
11
|
export class ShieldAuthStrategy<User, Session> {
|
|
9
12
|
constructor(private readonly deps: Dependencies<User, Session>) {}
|
|
@@ -12,11 +15,13 @@ export class ShieldAuthStrategy<User, Session> {
|
|
|
12
15
|
return await this.deps.AuthSessionReader.getSession(context);
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
verify(user: User | null): boolean {
|
|
16
|
-
|
|
18
|
+
verify(user: User | null | undefined): boolean {
|
|
19
|
+
if (user === undefined) throw new Error(ShieldAuthStrategyError.NotAttached);
|
|
20
|
+
return user !== null;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
|
-
reverse(user: User | null): boolean {
|
|
20
|
-
|
|
23
|
+
reverse(user: User | null | undefined): boolean {
|
|
24
|
+
if (user === undefined) throw new Error(ShieldAuthStrategyError.NotAttached);
|
|
25
|
+
return user === null;
|
|
21
26
|
}
|
|
22
27
|
}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
export class ShieldBasicAuthHonoStrategy implements MiddlewareHonoPort {
|
|
12
12
|
private readonly strategy: ShieldBasicAuthStrategy;
|
|
13
13
|
|
|
14
|
-
constructor(config: ShieldBasicAuthConfig) {
|
|
14
|
+
constructor(private readonly config: ShieldBasicAuthConfig) {
|
|
15
15
|
this.strategy = new ShieldBasicAuthStrategy(config);
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -20,7 +20,13 @@ export class ShieldBasicAuthHonoStrategy implements MiddlewareHonoPort {
|
|
|
20
20
|
const context = new RequestContextHonoAdapter(c);
|
|
21
21
|
|
|
22
22
|
if (this.strategy.evaluate(context)) return next();
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
throw new HTTPException(401, {
|
|
25
|
+
message: ShieldBasicAuthStrategyError.Rejected,
|
|
26
|
+
res: new Response(ShieldBasicAuthStrategyError.Rejected, {
|
|
27
|
+
headers: { "WWW-Authenticate": `Basic realm="${this.config.realm}"` },
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
24
30
|
};
|
|
25
31
|
}
|
|
26
32
|
}
|
|
@@ -3,7 +3,11 @@ import type { BasicAuthPasswordType } from "./basic-auth-password.vo";
|
|
|
3
3
|
import type { BasicAuthUsernameType } from "./basic-auth-username.vo";
|
|
4
4
|
import type { HasRequestHeader } from "./request-context.port";
|
|
5
5
|
|
|
6
|
-
export type ShieldBasicAuthConfig = {
|
|
6
|
+
export type ShieldBasicAuthConfig = {
|
|
7
|
+
username: BasicAuthUsernameType;
|
|
8
|
+
password: BasicAuthPasswordType;
|
|
9
|
+
realm: string;
|
|
10
|
+
};
|
|
7
11
|
|
|
8
12
|
export const ShieldBasicAuthStrategyError = { Rejected: "shield.basic.auth.rejected" };
|
|
9
13
|
|
|
@@ -16,11 +20,20 @@ export class ShieldBasicAuthStrategy {
|
|
|
16
20
|
try {
|
|
17
21
|
const credentials = atob(String(header).replace("Basic ", ""));
|
|
18
22
|
|
|
19
|
-
const
|
|
23
|
+
const index = credentials.indexOf(":");
|
|
20
24
|
|
|
21
|
-
if (
|
|
25
|
+
if (index === -1) return false;
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
const username = credentials.slice(0, index);
|
|
28
|
+
const password = credentials.slice(index + 1);
|
|
29
|
+
|
|
30
|
+
// Stryker disable next-line ConditionalExpression
|
|
31
|
+
if (username.length !== this.config.username.length) return false;
|
|
32
|
+
|
|
33
|
+
if (!timingSafeEqual(Buffer.from(username), Buffer.from(this.config.username))) return false;
|
|
34
|
+
|
|
35
|
+
// Stryker disable next-line ConditionalExpression
|
|
36
|
+
if (password.length !== this.config.password.length) return false;
|
|
24
37
|
|
|
25
38
|
return timingSafeEqual(Buffer.from(password), Buffer.from(this.config.password));
|
|
26
39
|
} catch {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HasRequestHeader, HasRequestMethod } from "./request-context.port";
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const SAFE_METHODS = ["GET", "HEAD", "OPTIONS", "TRACE"];
|
|
4
4
|
|
|
5
5
|
export type ShieldCsrfConfig = { origin: ReadonlyArray<string> };
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ export class ShieldCsrfStrategy {
|
|
|
10
10
|
constructor(private readonly config: ShieldCsrfConfig) {}
|
|
11
11
|
|
|
12
12
|
evaluate(context: HasRequestMethod & HasRequestHeader): boolean {
|
|
13
|
-
if (
|
|
13
|
+
if (SAFE_METHODS.includes(context.request.method)) return true;
|
|
14
14
|
|
|
15
15
|
const origin = context.request.header("origin");
|
|
16
16
|
|
|
@@ -3,7 +3,7 @@ import { HTTPException } from "hono/http-exception";
|
|
|
3
3
|
import * as v from "valibot";
|
|
4
4
|
import { HCaptchaSecretKey } from "./hcaptcha-secret-key.vo";
|
|
5
5
|
import type { MiddlewareHonoPort } from "./middleware-hono.port";
|
|
6
|
-
import type { HasRequestForm } from "./request-context.port";
|
|
6
|
+
import type { HasRequestForm, HasRequestJson } from "./request-context.port";
|
|
7
7
|
import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyField } from "./shield-hcaptcha.strategy";
|
|
8
8
|
|
|
9
9
|
export const ShieldHcaptchaLocalStrategyError = { Rejected: "shield.hcaptcha.local.rejected" };
|
|
@@ -26,7 +26,9 @@ export class ShieldHcaptchaLocalHonoStrategy implements MiddlewareHonoPort {
|
|
|
26
26
|
return async (_c, next) => {
|
|
27
27
|
const form = new FormData();
|
|
28
28
|
form.set(ShieldHcaptchaStrategyField, ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL);
|
|
29
|
-
const context: HasRequestForm
|
|
29
|
+
const context: HasRequestForm & HasRequestJson = {
|
|
30
|
+
request: { form: async () => form, json: async () => ({}) },
|
|
31
|
+
};
|
|
30
32
|
|
|
31
33
|
if (await this.strategy.evaluate(context)) return next();
|
|
32
34
|
throw new HTTPException(403, { message: ShieldHcaptchaLocalStrategyError.Rejected });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HCaptchaService } from "./hcaptcha.service";
|
|
2
2
|
import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
|
|
3
|
-
import type { HasRequestForm } from "./request-context.port";
|
|
3
|
+
import type { HasRequestForm, HasRequestJson } from "./request-context.port";
|
|
4
4
|
|
|
5
5
|
export const ShieldHcaptchaStrategyError = { Rejected: "shield.hcaptcha.rejected" };
|
|
6
6
|
|
|
@@ -11,12 +11,19 @@ export class ShieldHcaptchaStrategy {
|
|
|
11
11
|
|
|
12
12
|
constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
|
|
13
13
|
|
|
14
|
-
async evaluate(context: HasRequestForm): Promise<boolean> {
|
|
14
|
+
async evaluate(context: HasRequestForm & HasRequestJson): Promise<boolean> {
|
|
15
15
|
try {
|
|
16
16
|
const form = await context.request.form();
|
|
17
|
-
const
|
|
17
|
+
const json = await context.request.json();
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const fromForm = form.get(ShieldHcaptchaStrategyField)?.toString();
|
|
20
|
+
const fromJson = json[ShieldHcaptchaStrategyField];
|
|
21
|
+
|
|
22
|
+
const token = fromForm ?? (typeof fromJson === "string" ? fromJson : undefined);
|
|
23
|
+
|
|
24
|
+
if (!token) return false;
|
|
25
|
+
|
|
26
|
+
const result = await this.hcaptcha.verify(this.secretKey, token);
|
|
20
27
|
|
|
21
28
|
return result.success;
|
|
22
29
|
} catch {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
2
|
import { ClientIp, type ClientIpType } from "./client-ip.vo";
|
|
3
|
-
import type {
|
|
3
|
+
import type { HasIdentityRemoteIp } from "./request-context.port";
|
|
4
4
|
|
|
5
5
|
export type ShieldIpBlacklistConfig = { blacklist: ReadonlyArray<ClientIpType> };
|
|
6
6
|
|
|
@@ -9,10 +9,10 @@ export const ShieldIpBlacklistStrategyError = { Rejected: "shield.ip.blacklist.r
|
|
|
9
9
|
export class ShieldIpBlacklistStrategy {
|
|
10
10
|
constructor(private readonly config: ShieldIpBlacklistConfig) {}
|
|
11
11
|
|
|
12
|
-
evaluate(context:
|
|
13
|
-
const ip = v.safeParse(ClientIp, context.identity.
|
|
12
|
+
evaluate(context: HasIdentityRemoteIp): boolean {
|
|
13
|
+
const ip = v.safeParse(ClientIp, context.identity.remoteIp());
|
|
14
14
|
|
|
15
|
-
if (!ip.success) return
|
|
15
|
+
if (!ip.success) return true;
|
|
16
16
|
return !this.config.blacklist.includes(ip.output);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
2
|
import { ClientIp, type ClientIpType } from "./client-ip.vo";
|
|
3
|
-
import type {
|
|
3
|
+
import type { HasIdentityRemoteIp } from "./request-context.port";
|
|
4
4
|
|
|
5
5
|
export type ShieldIpWhitelistConfig = { whitelist: ReadonlyArray<ClientIpType> };
|
|
6
6
|
|
|
@@ -9,8 +9,8 @@ export const ShieldIpWhitelistStrategyError = { Rejected: "shield.ip.whitelist.r
|
|
|
9
9
|
export class ShieldIpWhitelistStrategy {
|
|
10
10
|
constructor(private readonly config: ShieldIpWhitelistConfig) {}
|
|
11
11
|
|
|
12
|
-
evaluate(context:
|
|
13
|
-
const ip = v.safeParse(ClientIp, context.identity.
|
|
12
|
+
evaluate(context: HasIdentityRemoteIp): boolean {
|
|
13
|
+
const ip = v.safeParse(ClientIp, context.identity.remoteIp());
|
|
14
14
|
|
|
15
15
|
if (!ip.success) return false;
|
|
16
16
|
return this.config.whitelist.includes(ip.output);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MiddlewareHandler } from "hono";
|
|
2
2
|
import type { MiddlewareHonoPort } from "./middleware-hono.port";
|
|
3
|
+
import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
|
|
3
4
|
import { type ShieldMaintenanceConfig, ShieldMaintenanceStrategy } from "./shield-maintenance.strategy";
|
|
4
5
|
|
|
5
6
|
export class ShieldMaintenanceHonoStrategy implements MiddlewareHonoPort {
|
|
@@ -11,13 +12,15 @@ export class ShieldMaintenanceHonoStrategy implements MiddlewareHonoPort {
|
|
|
11
12
|
|
|
12
13
|
handle(): MiddlewareHandler {
|
|
13
14
|
return async (c, next) => {
|
|
14
|
-
const
|
|
15
|
+
const context = new RequestContextHonoAdapter(c);
|
|
16
|
+
|
|
17
|
+
if (this.strategy.shouldSkip(context)) return next();
|
|
18
|
+
|
|
19
|
+
const maintenance = await this.strategy.evaluate();
|
|
15
20
|
|
|
16
21
|
if (!maintenance.enabled) return next();
|
|
17
22
|
|
|
18
|
-
return c.json(
|
|
19
|
-
"Retry-After": maintenance.RetryAfter.seconds.toString(),
|
|
20
|
-
});
|
|
23
|
+
return c.json(maintenance.body, maintenance.code, maintenance.headers);
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
}
|
|
@@ -1,17 +1,53 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import type { ReactiveConfigPort } from "./reactive-config.port";
|
|
4
|
+
import type { HasRequestPath } from "./request-context.port";
|
|
2
5
|
|
|
3
|
-
export
|
|
6
|
+
export const Maintenance = v.object({ enabled: tools.FeatureFlagValue });
|
|
7
|
+
|
|
8
|
+
export type MaintenanceType = v.InferOutput<typeof Maintenance>;
|
|
9
|
+
|
|
10
|
+
export type ShieldMaintenanceConfig = {
|
|
11
|
+
MaintenanceConfig: ReactiveConfigPort<MaintenanceType>;
|
|
12
|
+
RetryAfter?: tools.Duration;
|
|
13
|
+
skip?: ReadonlyArray<string | URLPattern>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type ShieldMaintenanceResult = {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
code: 503;
|
|
19
|
+
body: { reason: string };
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
};
|
|
4
22
|
|
|
5
23
|
export class ShieldMaintenanceStrategy {
|
|
6
|
-
private readonly
|
|
24
|
+
private readonly rounding = new tools.RoundingUpStrategy();
|
|
25
|
+
private readonly MaintenanceConfig?: ReactiveConfigPort<MaintenanceType>;
|
|
7
26
|
private readonly RetryAfter: tools.Duration;
|
|
8
27
|
|
|
9
|
-
constructor(config?: ShieldMaintenanceConfig) {
|
|
10
|
-
this.
|
|
28
|
+
constructor(private readonly config?: ShieldMaintenanceConfig) {
|
|
29
|
+
this.MaintenanceConfig = config?.MaintenanceConfig;
|
|
11
30
|
this.RetryAfter = config?.RetryAfter ?? tools.Duration.Hours(1);
|
|
12
31
|
}
|
|
13
32
|
|
|
14
|
-
|
|
15
|
-
return
|
|
33
|
+
shouldSkip(context: HasRequestPath): boolean {
|
|
34
|
+
return (
|
|
35
|
+
this.config?.skip?.some((rule) => {
|
|
36
|
+
if (rule instanceof URLPattern) return rule.test({ pathname: context.request.path });
|
|
37
|
+
return context.request.path.startsWith(rule);
|
|
38
|
+
}) ?? false
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async evaluate(): Promise<ShieldMaintenanceResult> {
|
|
43
|
+
const maintenance = await this.MaintenanceConfig?.get();
|
|
44
|
+
const enabled = maintenance ? tools.FeatureFlag.from(maintenance.enabled).isEnabled() : false;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
enabled,
|
|
48
|
+
code: 503,
|
|
49
|
+
body: { reason: "maintenance" },
|
|
50
|
+
headers: { "Retry-After": this.rounding.round(this.RetryAfter.seconds).toString() },
|
|
51
|
+
};
|
|
16
52
|
}
|
|
17
53
|
}
|
|
@@ -4,7 +4,7 @@ import type { ClockPort } from "./clock.port";
|
|
|
4
4
|
import type { RequestContext } from "./request-context.port";
|
|
5
5
|
import type { SubjectRequestResolver } from "./subject-request-resolver.vo";
|
|
6
6
|
|
|
7
|
-
export type ShieldRateLimitConfig = { resolver: SubjectRequestResolver;
|
|
7
|
+
export type ShieldRateLimitConfig = { resolver: SubjectRequestResolver; interval: tools.Duration };
|
|
8
8
|
type ShieldRateLimitResult = { allowed: true } | { allowed: false; retryAfter: tools.Duration };
|
|
9
9
|
|
|
10
10
|
type Dependencies = { Clock: ClockPort; CacheResolver: CacheResolverStrategy };
|
|
@@ -24,7 +24,7 @@ export class ShieldRateLimitStrategy {
|
|
|
24
24
|
|
|
25
25
|
const limiter = await this.deps.CacheResolver.resolve(
|
|
26
26
|
subject.hex,
|
|
27
|
-
async () => new tools.RateLimiter(this.config.
|
|
27
|
+
async () => new tools.RateLimiter(this.config.interval),
|
|
28
28
|
);
|
|
29
29
|
|
|
30
30
|
const decision = limiter.verify(this.deps.Clock.now());
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as tools from "@bgord/tools";
|
|
3
3
|
import * as v from "valibot";
|
|
4
4
|
import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
|
|
5
|
-
import type {
|
|
5
|
+
import type { HasIdentityIp, HasRequestForm, HasRequestJson } from "./request-context.port";
|
|
6
6
|
|
|
7
7
|
export type ShieldRecaptchaConfig = { secretKey: RecaptchaSecretKeyType; threshold?: number };
|
|
8
8
|
export type RecaptchaResult = { success: boolean; score: number };
|
|
@@ -21,21 +21,25 @@ export class ShieldRecaptchaStrategy {
|
|
|
21
21
|
|
|
22
22
|
constructor(private readonly config: ShieldRecaptchaConfig) {}
|
|
23
23
|
|
|
24
|
-
async evaluate(context:
|
|
24
|
+
async evaluate(context: HasIdentityIp & HasRequestForm & HasRequestJson): Promise<boolean> {
|
|
25
25
|
const threshold = this.config.threshold ?? ShieldRecaptchaStrategy.DEFAULT_THRESHOLD;
|
|
26
26
|
|
|
27
27
|
try {
|
|
28
|
-
const header = context.request.header("x-recaptcha-token");
|
|
29
|
-
const query = context.request.query()["recaptchaToken"];
|
|
30
|
-
const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
|
|
31
28
|
const form = await context.request.form();
|
|
32
|
-
const
|
|
29
|
+
const json = await context.request.json();
|
|
33
30
|
|
|
34
|
-
const
|
|
31
|
+
const fromForm = form.get(ShieldRecaptchaStrategyField)?.toString();
|
|
32
|
+
const fromJson = json[ShieldRecaptchaStrategyField];
|
|
33
|
+
|
|
34
|
+
const token = fromForm ?? (typeof fromJson === "string" ? fromJson : undefined);
|
|
35
35
|
|
|
36
36
|
if (!token) return false;
|
|
37
37
|
|
|
38
|
-
const
|
|
38
|
+
const remoteip = context.identity.ip();
|
|
39
|
+
|
|
40
|
+
const params = new URLSearchParams({ secret: this.config.secretKey, response: token });
|
|
41
|
+
|
|
42
|
+
if (remoteip) params.set("remoteip", remoteip);
|
|
39
43
|
|
|
40
44
|
const response = await fetch(ShieldRecaptchaStrategy.URL, {
|
|
41
45
|
method: "POST",
|
|
@@ -45,7 +49,9 @@ export class ShieldRecaptchaStrategy {
|
|
|
45
49
|
|
|
46
50
|
const result: RecaptchaResult = await response.json();
|
|
47
51
|
|
|
48
|
-
if (!result.success
|
|
52
|
+
if (!result.success) return false;
|
|
53
|
+
if (typeof result.score !== "number" || result.score < threshold) return false;
|
|
54
|
+
|
|
49
55
|
return true;
|
|
50
56
|
} catch {
|
|
51
57
|
return false;
|
|
@@ -13,7 +13,7 @@ export class ShieldTimeoutHonoStrategy implements MiddlewareHonoPort {
|
|
|
13
13
|
|
|
14
14
|
this.timeout = timeout(
|
|
15
15
|
strategy.config.ms,
|
|
16
|
-
new HTTPException(
|
|
16
|
+
new HTTPException(504, { message: ShieldTimeoutStrategyError.Rejected }),
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -20,7 +20,7 @@ export class ShieldWebhookHonoStrategy implements MiddlewareHonoPort {
|
|
|
20
20
|
const context = new RequestContextHonoAdapter(c);
|
|
21
21
|
|
|
22
22
|
if (await this.strategy.evaluate(context)) return next();
|
|
23
|
-
throw new HTTPException(
|
|
23
|
+
throw new HTTPException(401, { message: ShieldWebhookStrategyError.Rejected });
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HasRequestHeader, HasRequestText } from "./request-context.port";
|
|
2
2
|
import type { WebhookBodyBuilderStrategy } from "./webhook-body-builder.strategy";
|
|
3
3
|
import type { WebhookSignatureExtractorStrategy } from "./webhook-signature-extractor.strategy";
|
|
4
4
|
import type { WebhookVerifierStrategy } from "./webhook-verifier.strategy";
|
|
@@ -14,7 +14,7 @@ export type ShieldWebhookStrategyConfig = {
|
|
|
14
14
|
export class ShieldWebhookStrategy {
|
|
15
15
|
constructor(private readonly config: ShieldWebhookStrategyConfig) {}
|
|
16
16
|
|
|
17
|
-
async evaluate(context:
|
|
17
|
+
async evaluate(context: HasRequestHeader & HasRequestText): Promise<boolean> {
|
|
18
18
|
const signature = this.config.WebhookSignatureExtractor.extract(context);
|
|
19
19
|
|
|
20
20
|
if (!signature) return false;
|
package/src/sitemap-entry.vo.ts
CHANGED
|
@@ -28,7 +28,7 @@ export class SitemapEntry {
|
|
|
28
28
|
const lastmod = this.entry.lastmod ? `<lastmod>${this.entry.lastmod}</lastmod>` : "";
|
|
29
29
|
const changefreq = this.entry.changefreq ? `<changefreq>${this.entry.changefreq}</changefreq>` : "";
|
|
30
30
|
const priority =
|
|
31
|
-
this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(
|
|
31
|
+
this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(2)}</priority>` : "";
|
|
32
32
|
|
|
33
33
|
return ["<url>", loc, lastmod, changefreq, priority, "</url>"].join("");
|
|
34
34
|
}
|
|
@@ -6,6 +6,7 @@ export const SitemapPriority = v.pipe(
|
|
|
6
6
|
v.number(SitemapPriorityError.Invalid),
|
|
7
7
|
v.minValue(0, SitemapPriorityError.Invalid),
|
|
8
8
|
v.maxValue(1, SitemapPriorityError.Invalid),
|
|
9
|
+
v.check((value) => Number(value.toFixed(2)) === value, SitemapPriorityError.Invalid),
|
|
9
10
|
// Stryker disable next-line StringLiteral
|
|
10
11
|
v.brand("SitemapPriority"),
|
|
11
12
|
);
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import type * as tools from "@bgord/tools";
|
|
2
2
|
import type { MiddlewareHandler } from "hono";
|
|
3
3
|
import type { MiddlewareHonoPort } from "./middleware-hono.port";
|
|
4
|
-
import type
|
|
5
|
-
import { SlowerMiddleware } from "./slower.middleware";
|
|
6
|
-
|
|
7
|
-
type Dependencies = { Sleeper: SleeperPort };
|
|
4
|
+
import { SlowerMiddleware, type SlowerMiddlewareDependencies } from "./slower.middleware";
|
|
8
5
|
|
|
9
6
|
export class SlowerHonoMiddleware implements MiddlewareHonoPort {
|
|
10
7
|
private readonly middleware: SlowerMiddleware;
|
|
11
8
|
|
|
12
|
-
constructor(offset: tools.Duration, deps:
|
|
9
|
+
constructor(offset: tools.Duration, deps: SlowerMiddlewareDependencies) {
|
|
13
10
|
this.middleware = new SlowerMiddleware(offset, deps);
|
|
14
11
|
}
|
|
15
12
|
|
package/src/slower.middleware.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type * as tools from "@bgord/tools";
|
|
2
2
|
import type { SleeperPort } from "./sleeper.port";
|
|
3
3
|
|
|
4
|
-
type
|
|
4
|
+
export type SlowerMiddlewareDependencies = { Sleeper: SleeperPort };
|
|
5
5
|
|
|
6
6
|
export class SlowerMiddleware {
|
|
7
7
|
constructor(
|
|
8
8
|
private readonly offset: tools.Duration,
|
|
9
|
-
private readonly deps:
|
|
9
|
+
private readonly deps: SlowerMiddlewareDependencies,
|
|
10
10
|
) {}
|
|
11
11
|
|
|
12
12
|
async evaluate(): Promise<void> {
|
package/src/sse-hono.handler.ts
CHANGED
|
@@ -34,13 +34,15 @@ export class SseHonoHandler<Messages extends Message> implements HandlerHonoPort
|
|
|
34
34
|
await stream.writeSSE({ event: message.name, data: JSON.stringify(message) });
|
|
35
35
|
};
|
|
36
36
|
|
|
37
|
-
this.deps.registry.register(subject.hex.get(), send);
|
|
37
|
+
const registered = this.deps.registry.register(subject.hex.get(), send);
|
|
38
|
+
|
|
39
|
+
if (!registered) return;
|
|
38
40
|
|
|
39
41
|
// Stryker disable all
|
|
40
42
|
stream.onAbort(() => this.deps.registry.unregister(subject.hex.get(), send));
|
|
41
43
|
// Stryker restore all
|
|
42
44
|
|
|
43
|
-
while (!stream.closed) {
|
|
45
|
+
while (!(stream.closed || stream.aborted)) {
|
|
44
46
|
await stream.sleep(this.config.keepalive.ms);
|
|
45
47
|
await stream.writeSSE({ event: "ping", data: JSON.stringify({ keepalive: true }) });
|
|
46
48
|
}
|
|
@@ -5,7 +5,9 @@ import type { SseRegistryPort, SseSenderType } from "./sse-registry.port";
|
|
|
5
5
|
export class SseRegistryCollectingAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
6
6
|
public emitted: Array<{ identity: HashValueType; message: Messages }> = [];
|
|
7
7
|
|
|
8
|
-
register(_identity: HashValueType, _sender: SseSenderType<Messages>):
|
|
8
|
+
register(_identity: HashValueType, _sender: SseSenderType<Messages>): boolean {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
9
11
|
|
|
10
12
|
unregister(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
|
|
11
13
|
|
|
@@ -3,7 +3,9 @@ import type { Message } from "./message.types";
|
|
|
3
3
|
import type { SseRegistryPort, SseSenderType } from "./sse-registry.port";
|
|
4
4
|
|
|
5
5
|
export class SseRegistryNoopAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
6
|
-
register(_identity: HashValueType, _sender: SseSenderType<Messages>):
|
|
6
|
+
register(_identity: HashValueType, _sender: SseSenderType<Messages>): boolean {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
7
9
|
|
|
8
10
|
unregister(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
|
|
9
11
|
|
|
@@ -11,10 +11,10 @@ type Dependencies<Messages extends Message> = {
|
|
|
11
11
|
export class SseRegistryWithLimitAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
12
12
|
constructor(private readonly deps: Dependencies<Messages>) {}
|
|
13
13
|
|
|
14
|
-
register(identity: HashValueType, sender: SseSenderType<Messages>):
|
|
15
|
-
if (this.deps.inner.count(identity) >= this.deps.limit) return;
|
|
14
|
+
register(identity: HashValueType, sender: SseSenderType<Messages>): boolean {
|
|
15
|
+
if (this.deps.inner.count(identity) >= this.deps.limit) return false;
|
|
16
16
|
|
|
17
|
-
this.deps.inner.register(identity, sender);
|
|
17
|
+
return this.deps.inner.register(identity, sender);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
unregister(identity: HashValueType, sender: SseSenderType<Messages>): void {
|