@marinoscar/platform-api 0.0.0-stage → 0.1.0-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +106 -2
- package/dist/core/crypto/encryption-key-startup-check.d.ts +29 -0
- package/dist/core/crypto/encryption-key-startup-check.d.ts.map +1 -0
- package/dist/core/crypto/encryption-key-startup-check.js +221 -0
- package/dist/core/crypto/encryption-key-startup-check.js.map +1 -0
- package/dist/core/crypto/secret-cipher.d.ts +151 -0
- package/dist/core/crypto/secret-cipher.d.ts.map +1 -0
- package/dist/core/crypto/secret-cipher.js +452 -0
- package/dist/core/crypto/secret-cipher.js.map +1 -0
- package/dist/core/data-access/index.d.ts +6 -0
- package/dist/core/data-access/index.d.ts.map +1 -0
- package/dist/core/data-access/index.js +19 -0
- package/dist/core/data-access/index.js.map +1 -0
- package/dist/core/data-access/scoped-access.error.d.ts +35 -0
- package/dist/core/data-access/scoped-access.error.d.ts.map +1 -0
- package/dist/core/data-access/scoped-access.error.js +43 -0
- package/dist/core/data-access/scoped-access.error.js.map +1 -0
- package/dist/core/data-access/scoped-client.d.ts +104 -0
- package/dist/core/data-access/scoped-client.d.ts.map +1 -0
- package/dist/core/data-access/scoped-client.js +270 -0
- package/dist/core/data-access/scoped-client.js.map +1 -0
- package/dist/core/data-access/types.d.ts +85 -0
- package/dist/core/data-access/types.d.ts.map +1 -0
- package/dist/core/data-access/types.js +12 -0
- package/dist/core/data-access/types.js.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts +60 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.js +140 -0
- package/dist/core/data-access/user-owned-data.registry.js.map +1 -0
- package/dist/core/errors/database-seed.exception.d.ts +23 -0
- package/dist/core/errors/database-seed.exception.d.ts.map +1 -0
- package/dist/core/errors/database-seed.exception.js +49 -0
- package/dist/core/errors/database-seed.exception.js.map +1 -0
- package/dist/core/errors/error.dto.d.ts +47 -0
- package/dist/core/errors/error.dto.d.ts.map +1 -0
- package/dist/core/errors/error.dto.js +121 -0
- package/dist/core/errors/error.dto.js.map +1 -0
- package/dist/core/errors/http-exception.filter.d.ts +63 -0
- package/dist/core/errors/http-exception.filter.d.ts.map +1 -0
- package/dist/core/errors/http-exception.filter.js +234 -0
- package/dist/core/errors/http-exception.filter.js.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts +46 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.js +135 -0
- package/dist/core/errors/verbatim-error-body.exception.js.map +1 -0
- package/dist/core/host/index.d.ts +7 -0
- package/dist/core/host/index.d.ts.map +1 -0
- package/dist/core/host/index.js +14 -0
- package/dist/core/host/index.js.map +1 -0
- package/dist/core/host/platform-host.d.ts +58 -0
- package/dist/core/host/platform-host.d.ts.map +1 -0
- package/dist/core/host/platform-host.js +104 -0
- package/dist/core/host/platform-host.js.map +1 -0
- package/dist/core/host/platform-host.module.d.ts +53 -0
- package/dist/core/host/platform-host.module.d.ts.map +1 -0
- package/dist/core/host/platform-host.module.js +90 -0
- package/dist/core/host/platform-host.module.js.map +1 -0
- package/dist/core/host/ports.d.ts +132 -0
- package/dist/core/host/ports.d.ts.map +1 -0
- package/dist/core/host/ports.js +48 -0
- package/dist/core/host/ports.js.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +77 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts +80 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.js +72 -0
- package/dist/core/openapi/openapi-tag.registry.js.map +1 -0
- package/dist/core/principal/index.d.ts +6 -0
- package/dist/core/principal/index.d.ts.map +1 -0
- package/dist/core/principal/index.js +3 -0
- package/dist/core/principal/index.js.map +1 -0
- package/dist/core/principal/principal.types.d.ts +222 -0
- package/dist/core/principal/principal.types.d.ts.map +1 -0
- package/dist/core/principal/principal.types.js +22 -0
- package/dist/core/principal/principal.types.js.map +1 -0
- package/dist/core/registry/index.d.ts +4 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +19 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/registry-freeze.service.d.ts +14 -0
- package/dist/core/registry/registry-freeze.service.d.ts.map +1 -0
- package/dist/core/registry/registry-freeze.service.js +55 -0
- package/dist/core/registry/registry-freeze.service.js.map +1 -0
- package/dist/core/registry/registry.d.ts +268 -0
- package/dist/core/registry/registry.d.ts.map +1 -0
- package/dist/core/registry/registry.js +351 -0
- package/dist/core/registry/registry.js.map +1 -0
- package/dist/core/registry/testing.d.ts +29 -0
- package/dist/core/registry/testing.d.ts.map +1 -0
- package/dist/core/registry/testing.js +63 -0
- package/dist/core/registry/testing.js.map +1 -0
- package/dist/doctor/doctor-check.interface.d.ts +100 -0
- package/dist/doctor/doctor-check.interface.d.ts.map +1 -0
- package/dist/doctor/doctor-check.interface.js +95 -0
- package/dist/doctor/doctor-check.interface.js.map +1 -0
- package/dist/doctor/doctor-check.registry.d.ts +37 -0
- package/dist/doctor/doctor-check.registry.d.ts.map +1 -0
- package/dist/doctor/doctor-check.registry.js +96 -0
- package/dist/doctor/doctor-check.registry.js.map +1 -0
- package/dist/doctor/doctor.controller.factory.d.ts +29 -0
- package/dist/doctor/doctor.controller.factory.d.ts.map +1 -0
- package/dist/doctor/doctor.controller.factory.js +121 -0
- package/dist/doctor/doctor.controller.factory.js.map +1 -0
- package/dist/doctor/doctor.module.d.ts +78 -0
- package/dist/doctor/doctor.module.d.ts.map +1 -0
- package/dist/doctor/doctor.module.js +158 -0
- package/dist/doctor/doctor.module.js.map +1 -0
- package/dist/doctor/doctor.options.d.ts +39 -0
- package/dist/doctor/doctor.options.d.ts.map +1 -0
- package/dist/doctor/doctor.options.js +21 -0
- package/dist/doctor/doctor.options.js.map +1 -0
- package/dist/doctor/doctor.service.d.ts +80 -0
- package/dist/doctor/doctor.service.d.ts.map +1 -0
- package/dist/doctor/doctor.service.js +301 -0
- package/dist/doctor/doctor.service.js.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts +15 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.js +16 -0
- package/dist/doctor/dto/doctor-query.dto.js.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts +27 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.js +23 -0
- package/dist/doctor/dto/doctor-report.dto.js.map +1 -0
- package/dist/doctor/egress/classify-host.d.ts +73 -0
- package/dist/doctor/egress/classify-host.d.ts.map +1 -0
- package/dist/doctor/egress/classify-host.js +210 -0
- package/dist/doctor/egress/classify-host.js.map +1 -0
- package/dist/doctor/egress/egress.registry.d.ts +34 -0
- package/dist/doctor/egress/egress.registry.d.ts.map +1 -0
- package/dist/doctor/egress/egress.registry.js +70 -0
- package/dist/doctor/egress/egress.registry.js.map +1 -0
- package/dist/doctor/egress/egress.types.d.ts +135 -0
- package/dist/doctor/egress/egress.types.d.ts.map +1 -0
- package/dist/doctor/egress/egress.types.js +42 -0
- package/dist/doctor/egress/egress.types.js.map +1 -0
- package/dist/doctor/egress/index.d.ts +6 -0
- package/dist/doctor/egress/index.d.ts.map +1 -0
- package/dist/doctor/egress/index.js +23 -0
- package/dist/doctor/egress/index.js.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts +78 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.js +226 -0
- package/dist/doctor/egress/network-egress.doctor-check.js.map +1 -0
- package/dist/doctor/index.d.ts +19 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +66 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/support-bundle/index.d.ts +12 -0
- package/dist/doctor/support-bundle/index.d.ts.map +1 -0
- package/dist/doctor/support-bundle/index.js +32 -0
- package/dist/doctor/support-bundle/index.js.map +1 -0
- package/dist/doctor/support-bundle/redact.d.ts +76 -0
- package/dist/doctor/support-bundle/redact.d.ts.map +1 -0
- package/dist/doctor/support-bundle/redact.js +236 -0
- package/dist/doctor/support-bundle/redact.js.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts +81 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js +83 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts +73 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.js +97 -0
- package/dist/doctor/support-bundle/sections/egress.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts +39 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.js +89 -0
- package/dist/doctor/support-bundle/sections/meta.section.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts +100 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js +59 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts +57 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js +141 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts +92 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.js +100 -0
- package/dist/doctor/support-bundle/support-bundle.options.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts +38 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js +90 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts +63 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.js +244 -0
- package/dist/doctor/support-bundle/support-bundle.service.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/otel-core/index.d.ts +9 -0
- package/dist/otel-core/index.d.ts.map +1 -0
- package/dist/otel-core/index.js +58 -0
- package/dist/otel-core/index.js.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts +44 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.js +37 -0
- package/dist/otel-core/metrics/gauge-provider.js.map +1 -0
- package/dist/otel-core/metrics/labels.d.ts +79 -0
- package/dist/otel-core/metrics/labels.d.ts.map +1 -0
- package/dist/otel-core/metrics/labels.js +135 -0
- package/dist/otel-core/metrics/labels.js.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts +130 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.js +134 -0
- package/dist/otel-core/metrics/metric-name.registry.js.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts +163 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.js +344 -0
- package/dist/otel-core/metrics/metrics-host.service.js.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts +54 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.js +83 -0
- package/dist/otel-core/metrics/otel-metrics.module.js.map +1 -0
- package/dist/otel-core/sdk/index.d.ts +5 -0
- package/dist/otel-core/sdk/index.d.ts.map +1 -0
- package/dist/otel-core/sdk/index.js +27 -0
- package/dist/otel-core/sdk/index.js.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts +126 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.js +204 -0
- package/dist/otel-core/sdk/initialize-otel.js.map +1 -0
- package/dist/otel-core/sdk/instance-id.d.ts +29 -0
- package/dist/otel-core/sdk/instance-id.d.ts.map +1 -0
- package/dist/otel-core/sdk/instance-id.js +65 -0
- package/dist/otel-core/sdk/instance-id.js.map +1 -0
- package/dist/otel-core/sdk/service-name.d.ts +28 -0
- package/dist/otel-core/sdk/service-name.d.ts.map +1 -0
- package/dist/otel-core/sdk/service-name.js +63 -0
- package/dist/otel-core/sdk/service-name.js.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts +116 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.js +297 -0
- package/dist/otel-core/sdk/telemetry-gate.js.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts +58 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.js +155 -0
- package/dist/otel-core/spans/request-span-attributes.js.map +1 -0
- package/dist/otel-core/spans/trace.decorator.d.ts +36 -0
- package/dist/otel-core/spans/trace.decorator.d.ts.map +1 -0
- package/dist/otel-core/spans/trace.decorator.js +74 -0
- package/dist/otel-core/spans/trace.decorator.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js +50 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts +14 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js +178 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts +147 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js +495 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts +216 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js +1256 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts +69 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js +471 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js +68 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts +92 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js +41 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts +45 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js +303 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts +41 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js +187 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts +14 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js +192 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts +28 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js +106 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts +197 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.js +461 -0
- package/dist/telemetry/connection/telemetry-connection.service.js.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts +19 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.js +75 -0
- package/dist/telemetry/dashboard/sql-literals.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts +14 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js +277 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +112 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js +904 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts +212 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js +486 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +235 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +269 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts +51 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.js +77 -0
- package/dist/telemetry/dashboard/verdict-policy.js.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts +21 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js +59 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js +69 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts +33 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js +105 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts +38 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js +104 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js +65 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js +91 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts +14 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js +29 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts +59 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.js +18 -0
- package/dist/telemetry/dto/telemetry-config.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +397 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js +118 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts +44 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.js +42 -0
- package/dist/telemetry/dto/telemetry-query.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts +22 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.js +12 -0
- package/dist/telemetry/dto/telemetry-status.dto.js.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts +13 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.js +29 -0
- package/dist/telemetry/export/parquet-writer.loader.js.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts +39 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.js +185 -0
- package/dist/telemetry/export/telemetry-export.service.js.map +1 -0
- package/dist/telemetry/greptime/greptime-host.d.ts +44 -0
- package/dist/telemetry/greptime/greptime-host.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime-host.js +114 -0
- package/dist/telemetry/greptime/greptime-host.js.map +1 -0
- package/dist/telemetry/greptime/greptime.client.d.ts +171 -0
- package/dist/telemetry/greptime/greptime.client.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.client.js +352 -0
- package/dist/telemetry/greptime/greptime.client.js.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts +59 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.js +100 -0
- package/dist/telemetry/greptime/greptime.errors.js.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts +27 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js +123 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js.map +1 -0
- package/dist/telemetry/index.d.ts +37 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +97 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/internal/blank-secret.d.ts +3 -0
- package/dist/telemetry/internal/blank-secret.d.ts.map +1 -0
- package/dist/telemetry/internal/blank-secret.js +14 -0
- package/dist/telemetry/internal/blank-secret.js.map +1 -0
- package/dist/telemetry/internal/csv.d.ts +9 -0
- package/dist/telemetry/internal/csv.d.ts.map +1 -0
- package/dist/telemetry/internal/csv.js +23 -0
- package/dist/telemetry/internal/csv.js.map +1 -0
- package/dist/telemetry/internal/sse.d.ts +23 -0
- package/dist/telemetry/internal/sse.d.ts.map +1 -0
- package/dist/telemetry/internal/sse.js +43 -0
- package/dist/telemetry/internal/sse.js.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js +146 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js +144 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js +163 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js +103 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts +324 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts +30 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js +37 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.js +180 -0
- package/dist/telemetry/metrics/metric-catalog.js.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts +59 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js +99 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.d.ts +113 -0
- package/dist/telemetry/metrics/metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.js +647 -0
- package/dist/telemetry/metrics/metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts +2 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.js +30 -0
- package/dist/telemetry/metrics/metric-group.manifest.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts +109 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.js +181 -0
- package/dist/telemetry/metrics/metric-group.registry.js.map +1 -0
- package/dist/telemetry/metrics/metric-sql.d.ts +98 -0
- package/dist/telemetry/metrics/metric-sql.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-sql.js +259 -0
- package/dist/telemetry/metrics/metric-sql.js.map +1 -0
- package/dist/telemetry/metrics/metric-values.d.ts +19 -0
- package/dist/telemetry/metrics/metric-values.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-values.js +97 -0
- package/dist/telemetry/metrics/metric-values.js.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts +20 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.js +218 -0
- package/dist/telemetry/metrics/metric-verdict.js.map +1 -0
- package/dist/telemetry/ports.d.ts +575 -0
- package/dist/telemetry/ports.d.ts.map +1 -0
- package/dist/telemetry/ports.js +78 -0
- package/dist/telemetry/ports.js.map +1 -0
- package/dist/telemetry/query/sql-guard.d.ts +71 -0
- package/dist/telemetry/query/sql-guard.d.ts.map +1 -0
- package/dist/telemetry/query/sql-guard.js +258 -0
- package/dist/telemetry/query/sql-guard.js.map +1 -0
- package/dist/telemetry/query/telemetry-availability.d.ts +11 -0
- package/dist/telemetry/query/telemetry-availability.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-availability.js +55 -0
- package/dist/telemetry/query/telemetry-availability.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts +48 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.js +100 -0
- package/dist/telemetry/query/telemetry-query.errors.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts +57 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.js +194 -0
- package/dist/telemetry/query/telemetry-query.service.js.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts +36 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.js +154 -0
- package/dist/telemetry/query/telemetry-schema.service.js.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +29 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js +27 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts +76 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.js +208 -0
- package/dist/telemetry/stack/stack-agent.client.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts +43 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js +159 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts +14 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js +107 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts +19 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.js +122 -0
- package/dist/telemetry/stack/telemetry-stack.service.js.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts +8 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js +61 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.js +148 -0
- package/dist/telemetry/telemetry-admin.controller.js.map +1 -0
- package/dist/telemetry/telemetry-config.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-config.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-config.controller.js +73 -0
- package/dist/telemetry/telemetry-config.controller.js.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.js +193 -0
- package/dist/telemetry/telemetry-explorer.controller.js.map +1 -0
- package/dist/telemetry/telemetry-settings.service.d.ts +85 -0
- package/dist/telemetry/telemetry-settings.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-settings.service.js +278 -0
- package/dist/telemetry/telemetry-settings.service.js.map +1 -0
- package/dist/telemetry/telemetry-status.service.d.ts +28 -0
- package/dist/telemetry/telemetry-status.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-status.service.js +185 -0
- package/dist/telemetry/telemetry-status.service.js.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts +163 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.js +187 -0
- package/dist/telemetry/telemetry-support-bundle.section.js.map +1 -0
- package/dist/telemetry/telemetry.module.d.ts +35 -0
- package/dist/telemetry/telemetry.module.d.ts.map +1 -0
- package/dist/telemetry/telemetry.module.js +210 -0
- package/dist/telemetry/telemetry.module.js.map +1 -0
- package/dist/telemetry/telemetry.options.d.ts +176 -0
- package/dist/telemetry/telemetry.options.d.ts.map +1 -0
- package/dist/telemetry/telemetry.options.js +246 -0
- package/dist/telemetry/telemetry.options.js.map +1 -0
- package/dist/telemetry/telemetry.permissions.d.ts +76 -0
- package/dist/telemetry/telemetry.permissions.d.ts.map +1 -0
- package/dist/telemetry/telemetry.permissions.js +85 -0
- package/dist/telemetry/telemetry.permissions.js.map +1 -0
- package/dist/telemetry/telemetry.settings.d.ts +79 -0
- package/dist/telemetry/telemetry.settings.d.ts.map +1 -0
- package/dist/telemetry/telemetry.settings.js +92 -0
- package/dist/telemetry/telemetry.settings.js.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts +17 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js +128 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js.map +1 -0
- package/dist/telemetry/testing/conformance.d.ts +257 -0
- package/dist/telemetry/testing/conformance.d.ts.map +1 -0
- package/dist/telemetry/testing/conformance.js +626 -0
- package/dist/telemetry/testing/conformance.js.map +1 -0
- package/dist/telemetry/testing/index.d.ts +10 -0
- package/dist/telemetry/testing/index.d.ts.map +1 -0
- package/dist/telemetry/testing/index.js +41 -0
- package/dist/telemetry/testing/index.js.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts +73 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.js +362 -0
- package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -0
- package/dist/telemetry/testing/stub-ports.d.ts +46 -0
- package/dist/telemetry/testing/stub-ports.d.ts.map +1 -0
- package/dist/telemetry/testing/stub-ports.js +119 -0
- package/dist/telemetry/testing/stub-ports.js.map +1 -0
- package/dist/testing/conformance-suite.d.ts +106 -0
- package/dist/testing/conformance-suite.d.ts.map +1 -0
- package/dist/testing/conformance-suite.js +8 -0
- package/dist/testing/conformance-suite.js.map +1 -0
- package/dist/testing/conformance-suites.d.ts +14 -0
- package/dist/testing/conformance-suites.d.ts.map +1 -0
- package/dist/testing/conformance-suites.js +27 -0
- package/dist/testing/conformance-suites.js.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts +23 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.js +30 -0
- package/dist/testing/host/in-memory-audit-sink.js.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts +31 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.js +54 -0
- package/dist/testing/host/in-memory-system-settings-store.js.map +1 -0
- package/dist/testing/host/index.d.ts +4 -0
- package/dist/testing/host/index.d.ts.map +1 -0
- package/dist/testing/host/index.js +13 -0
- package/dist/testing/host/index.js.map +1 -0
- package/dist/testing/host/test-platform-host.d.ts +35 -0
- package/dist/testing/host/test-platform-host.d.ts.map +1 -0
- package/dist/testing/host/test-platform-host.js +81 -0
- package/dist/testing/host/test-platform-host.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +32 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/prisma-schema.d.ts +99 -0
- package/dist/testing/prisma-schema.d.ts.map +1 -0
- package/dist/testing/prisma-schema.js +175 -0
- package/dist/testing/prisma-schema.js.map +1 -0
- package/dist/testing/run-platform-conformance.d.ts +70 -0
- package/dist/testing/run-platform-conformance.d.ts.map +1 -0
- package/dist/testing/run-platform-conformance.js +77 -0
- package/dist/testing/run-platform-conformance.js.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts +46 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.js +177 -0
- package/dist/testing/suites/cron-enqueue-only.js.map +1 -0
- package/dist/testing/suites/user-owned-data.d.ts +86 -0
- package/dist/testing/suites/user-owned-data.d.ts.map +1 -0
- package/dist/testing/suites/user-owned-data.js +329 -0
- package/dist/testing/suites/user-owned-data.js.map +1 -0
- package/package.json +129 -4
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var HttpExceptionFilter_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.HttpExceptionFilter = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const nestjs_zod_1 = require("nestjs-zod");
|
|
13
|
+
const verbatim_error_body_exception_1 = require("./verbatim-error-body.exception");
|
|
14
|
+
/**
|
|
15
|
+
* The application-wide exception filter: turns every thrown value into the one
|
|
16
|
+
* error envelope (`{ statusCode, code, message, details?, timestamp, path }`,
|
|
17
|
+
* documented by {@link ErrorDto}) on a Fastify reply, and logs one line per
|
|
18
|
+
* failure (`warn` below 500, `error` with the stack from 500 up).
|
|
19
|
+
*
|
|
20
|
+
* `code` is always derived from the HTTP status; a `code` on the thrown
|
|
21
|
+
* payload is ignored. `details` is the only place endpoint-specific data
|
|
22
|
+
* survives. An exception branded with {@link withVerbatimErrorBody} skips the
|
|
23
|
+
* envelope and is sent exactly as thrown. A 429 whose `details.retryAfterMs`
|
|
24
|
+
* is a positive number also gets a `Retry-After` header (whole seconds,
|
|
25
|
+
* rounded up). A `ZodValidationException` without explicit details answers
|
|
26
|
+
* `details.issues` (`[{ path, message }]`), never the submitted value. A
|
|
27
|
+
* non-`HttpException` error is a 500 whose `details` carries the stack unless
|
|
28
|
+
* `NODE_ENV` is `production`.
|
|
29
|
+
*
|
|
30
|
+
* Register it once, as an `APP_FILTER` provider of the root module. There is
|
|
31
|
+
* no module to import and nothing to configure.
|
|
32
|
+
*
|
|
33
|
+
* @stability stable
|
|
34
|
+
* @extensionPoint component
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { APP_FILTER } from '@nestjs/core';
|
|
38
|
+
* import { HttpExceptionFilter } from '@marinoscar/platform-api/core';
|
|
39
|
+
*
|
|
40
|
+
* @Module({ providers: [{ provide: APP_FILTER, useClass: HttpExceptionFilter }] })
|
|
41
|
+
* export class AppModule {}
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
let HttpExceptionFilter = HttpExceptionFilter_1 = class HttpExceptionFilter {
|
|
45
|
+
logger = new common_1.Logger(HttpExceptionFilter_1.name);
|
|
46
|
+
/**
|
|
47
|
+
* Nest's `ExceptionFilter` hook: write the error response for `exception`
|
|
48
|
+
* on the HTTP reply of `host`. Called by Nest, not by application code.
|
|
49
|
+
*
|
|
50
|
+
* @param exception - Whatever was thrown.
|
|
51
|
+
* @param host - The Nest arguments host of the failed request (HTTP only).
|
|
52
|
+
*/
|
|
53
|
+
catch(exception, host) {
|
|
54
|
+
const ctx = host.switchToHttp();
|
|
55
|
+
const response = ctx.getResponse();
|
|
56
|
+
const request = ctx.getRequest();
|
|
57
|
+
let status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
58
|
+
let code = 'INTERNAL_ERROR';
|
|
59
|
+
let message = 'An unexpected error occurred';
|
|
60
|
+
let details;
|
|
61
|
+
if (exception instanceof common_1.HttpException) {
|
|
62
|
+
status = exception.getStatus();
|
|
63
|
+
const exceptionResponse = exception.getResponse();
|
|
64
|
+
// ---------------------------------------------------------------------
|
|
65
|
+
// Verbatim bodies (#153) — checked FIRST, and returns immediately.
|
|
66
|
+
// ---------------------------------------------------------------------
|
|
67
|
+
// A branded exception carries a body dictated by an external spec, not by
|
|
68
|
+
// us: today that is `POST /auth/device/token`, whose RFC 8628 §3.5 body is
|
|
69
|
+
// `{ error, error_description }`. Sending it through the envelope below
|
|
70
|
+
// destroys it — the envelope reads only `message`, `code` and `details`,
|
|
71
|
+
// so all four RFC outcomes used to arrive as the same generic 400 and a
|
|
72
|
+
// polling client could not tell them apart. See
|
|
73
|
+
// `./verbatim-error-body.exception.ts` for why the opt-out
|
|
74
|
+
// is an explicit brand rather than the filter sniffing for an `error` key.
|
|
75
|
+
//
|
|
76
|
+
// Nothing is merged in — not `statusCode`, not `timestamp`, not `path`.
|
|
77
|
+
// Extra keys would not upset a tolerant parser, but they would put fields
|
|
78
|
+
// the RFC never defines into a protocol response, and a body that is
|
|
79
|
+
// "mostly the spec" is exactly the kind of thing a strict client rejects
|
|
80
|
+
// and a reader stops trusting. The status line still carries the code.
|
|
81
|
+
//
|
|
82
|
+
// The object guard matters: a string payload has nothing to send
|
|
83
|
+
// verbatim, so such an exception falls through to the envelope rather than
|
|
84
|
+
// putting a bare JSON string on the wire.
|
|
85
|
+
if ((0, verbatim_error_body_exception_1.hasVerbatimErrorBody)(exception) &&
|
|
86
|
+
typeof exceptionResponse === 'object' &&
|
|
87
|
+
exceptionResponse !== null) {
|
|
88
|
+
this.logOutcome(request, status, this.summarize(exceptionResponse), exception);
|
|
89
|
+
response.code(status).send(exceptionResponse);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (typeof exceptionResponse === 'string') {
|
|
93
|
+
message = exceptionResponse;
|
|
94
|
+
}
|
|
95
|
+
else if (typeof exceptionResponse === 'object') {
|
|
96
|
+
const resp = exceptionResponse;
|
|
97
|
+
message = resp.message || message;
|
|
98
|
+
details = resp.details;
|
|
99
|
+
}
|
|
100
|
+
// A body/query that failed the global `ZodValidationPipe` names the
|
|
101
|
+
// failing fields under `details.issues` (`{ path, message }` each). Only
|
|
102
|
+
// the path and Zod's (or the schema's own) message are published — never
|
|
103
|
+
// the submitted value, which may be personal data or free text.
|
|
104
|
+
if (exception instanceof nestjs_zod_1.ZodValidationException && details === undefined) {
|
|
105
|
+
details = zodIssueDetails(exception.getZodError());
|
|
106
|
+
}
|
|
107
|
+
// `code` is ALWAYS derived from the status, and a `code` on the thrown
|
|
108
|
+
// payload is deliberately ignored.
|
|
109
|
+
//
|
|
110
|
+
// This line used to be preceded by `code = (resp.code as string) ||
|
|
111
|
+
// this.getCodeFromStatus(status)`, which this one immediately overwrote —
|
|
112
|
+
// dead since it was written, so no exception in the app could ever set its
|
|
113
|
+
// own code (#153). The dead line was removed rather than made to work,
|
|
114
|
+
// because honouring a payload `code` is a real behaviour change on the
|
|
115
|
+
// wire and the current behaviour is the one the API actually promises:
|
|
116
|
+
//
|
|
117
|
+
// * `./error.dto.ts` publishes `code` as a CLOSED ENUM of the
|
|
118
|
+
// nine status-derived values, and says in so many words that the
|
|
119
|
+
// filter overwrites any `code` an exception supplied. That DTO is the
|
|
120
|
+
// `default` error response on every operation in the OpenAPI document,
|
|
121
|
+
// so it is a published contract, not a comment.
|
|
122
|
+
// * `test/core/http-exception.filter.spec.ts` asserts it ("The filter overrides
|
|
123
|
+
// custom code with standard code mapping"). The behaviour is tested,
|
|
124
|
+
// not accidental.
|
|
125
|
+
// * One exception does pass a `code`: `DatabaseSeedException` sends
|
|
126
|
+
// `DATABASE_SEED_REQUIRED`. Reviving the dead line would have changed
|
|
127
|
+
// that response's `code` from `INTERNAL_ERROR` to a value outside the
|
|
128
|
+
// published enum — a silent contract break in the one place nobody
|
|
129
|
+
// would think to check. Its identifying data is already in `details`,
|
|
130
|
+
// which the envelope carries through.
|
|
131
|
+
//
|
|
132
|
+
// Endpoint-specific machine-readable data belongs under `details`; an
|
|
133
|
+
// externally-specified body belongs behind the verbatim brand above.
|
|
134
|
+
code = this.getCodeFromStatus(status);
|
|
135
|
+
}
|
|
136
|
+
else if (exception instanceof Error) {
|
|
137
|
+
message = exception.message;
|
|
138
|
+
// Don't expose stack traces in production
|
|
139
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
140
|
+
details = exception.stack;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const errorResponse = {
|
|
144
|
+
statusCode: status,
|
|
145
|
+
code,
|
|
146
|
+
message,
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
path: request.url,
|
|
149
|
+
};
|
|
150
|
+
if (details) {
|
|
151
|
+
errorResponse.details = details;
|
|
152
|
+
}
|
|
153
|
+
this.logOutcome(request, status, message, exception);
|
|
154
|
+
// A 429 that says when to come back (`details.retryAfterMs` — every
|
|
155
|
+
// `AiError('AI_RATE_LIMITED')` that knows, including the AI rate limits of
|
|
156
|
+
// #450) also says so in the standard header, in whole seconds rounded UP
|
|
157
|
+
// so a client that honours it never retries early.
|
|
158
|
+
const retryAfterSeconds = status === 429 ? retryAfterSecondsOf(details) : undefined;
|
|
159
|
+
if (retryAfterSeconds !== undefined) {
|
|
160
|
+
response.header('Retry-After', String(retryAfterSeconds));
|
|
161
|
+
}
|
|
162
|
+
// Fastify response - use code() and send()
|
|
163
|
+
response.code(status).send(errorResponse);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* One log line per handled failure, identical for enveloped and verbatim
|
|
167
|
+
* responses. Extracted so the verbatim early-return above cannot silently
|
|
168
|
+
* skip logging — a device-flow `slow_down` storm has to be visible in the
|
|
169
|
+
* logs like any other 4xx.
|
|
170
|
+
*/
|
|
171
|
+
logOutcome(request, status, summary, exception) {
|
|
172
|
+
if (status >= 500) {
|
|
173
|
+
this.logger.error(`${request.method} ${request.url} - ${status}`, exception instanceof Error ? exception.stack : exception);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.logger.warn(`${request.method} ${request.url} - ${status}: ${summary}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* A short log-only description of a verbatim body.
|
|
181
|
+
*
|
|
182
|
+
* Reading `error` here is for the LOG LINE ONLY and shapes nothing — an RFC
|
|
183
|
+
* body's `error` is the single most useful thing to see in operations
|
|
184
|
+
* (`slow_down` and `access_denied` mean very different things at 3am), and
|
|
185
|
+
* without it every device-flow failure logs as an indistinguishable 400. The
|
|
186
|
+
* body itself is never stringified into the log: a verbatim payload is
|
|
187
|
+
* whatever the spec says it is, and this filter should not assume the rest of
|
|
188
|
+
* it is safe to print.
|
|
189
|
+
*/
|
|
190
|
+
summarize(body) {
|
|
191
|
+
const label = body.error ?? body.message;
|
|
192
|
+
return typeof label === 'string' ? label : 'verbatim error body';
|
|
193
|
+
}
|
|
194
|
+
getCodeFromStatus(status) {
|
|
195
|
+
const codeMap = {
|
|
196
|
+
400: 'BAD_REQUEST',
|
|
197
|
+
401: 'UNAUTHORIZED',
|
|
198
|
+
403: 'FORBIDDEN',
|
|
199
|
+
404: 'NOT_FOUND',
|
|
200
|
+
409: 'CONFLICT',
|
|
201
|
+
412: 'PRECONDITION_FAILED',
|
|
202
|
+
413: 'PAYLOAD_TOO_LARGE',
|
|
203
|
+
422: 'UNPROCESSABLE_ENTITY',
|
|
204
|
+
429: 'TOO_MANY_REQUESTS',
|
|
205
|
+
500: 'INTERNAL_ERROR',
|
|
206
|
+
};
|
|
207
|
+
return codeMap[status] || 'ERROR';
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
exports.HttpExceptionFilter = HttpExceptionFilter;
|
|
211
|
+
exports.HttpExceptionFilter = HttpExceptionFilter = HttpExceptionFilter_1 = __decorate([
|
|
212
|
+
(0, common_1.Catch)()
|
|
213
|
+
], HttpExceptionFilter);
|
|
214
|
+
/** `details.retryAfterMs` as a `Retry-After` delta-seconds value (at least 1), or `undefined`. */
|
|
215
|
+
function retryAfterSecondsOf(details) {
|
|
216
|
+
if (details === null || typeof details !== 'object')
|
|
217
|
+
return undefined;
|
|
218
|
+
const ms = details.retryAfterMs;
|
|
219
|
+
return typeof ms === 'number' && Number.isFinite(ms) && ms > 0 ? Math.max(1, Math.ceil(ms / 1000)) : undefined;
|
|
220
|
+
}
|
|
221
|
+
/** `{ issues: [{ path: 'readings.0.unit', message }] }`, or undefined. */
|
|
222
|
+
function zodIssueDetails(error) {
|
|
223
|
+
const issues = error?.issues;
|
|
224
|
+
if (!Array.isArray(issues) || issues.length === 0) {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
issues: issues.map((issue) => ({
|
|
229
|
+
path: Array.isArray(issue.path) ? issue.path.map(String).join('.') : '',
|
|
230
|
+
message: typeof issue.message === 'string' ? issue.message : 'Invalid value',
|
|
231
|
+
})),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=http-exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-exception.filter.js","sourceRoot":"","sources":["../../../src/core/errors/http-exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
/**
|
|
3
|
+
* Mark an exception so `HttpExceptionFilter` sends its payload to the client
|
|
4
|
+
* exactly as given, instead of rebuilding it as
|
|
5
|
+
* `{ statusCode, code, message, … }`.
|
|
6
|
+
*
|
|
7
|
+
* Returns the same exception instance, so the class identity is untouched:
|
|
8
|
+
* `withVerbatimErrorBody(new BadRequestException(…))` is still a
|
|
9
|
+
* `BadRequestException` and still carries status 400. That matters — guards,
|
|
10
|
+
* interceptors and existing tests that branch on the exception type keep
|
|
11
|
+
* working, and the opt-out stays a single orthogonal fact about the response
|
|
12
|
+
* body rather than a parallel exception hierarchy.
|
|
13
|
+
*
|
|
14
|
+
* The payload MUST be an object; a string payload has nothing to send verbatim
|
|
15
|
+
* and the filter falls back to the envelope for it.
|
|
16
|
+
*
|
|
17
|
+
* Only for a body an external standard dictates (RFC 8628's
|
|
18
|
+
* `{ error, error_description }` is the one use in the reference app); see
|
|
19
|
+
* the header of this file.
|
|
20
|
+
*
|
|
21
|
+
* @param exception - The exception to brand; returned as is.
|
|
22
|
+
* @returns The same exception instance.
|
|
23
|
+
* @stability stable
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* throw withVerbatimErrorBody(
|
|
27
|
+
* new BadRequestException({ error: 'slow_down', error_description: 'Polling too fast' }),
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function withVerbatimErrorBody<T extends HttpException>(exception: T): T;
|
|
32
|
+
/**
|
|
33
|
+
* Whether an exception opted out of the envelope. Read only by
|
|
34
|
+
* `HttpExceptionFilter`.
|
|
35
|
+
*
|
|
36
|
+
* @param exception - Anything thrown.
|
|
37
|
+
* @returns `true` only for an `HttpException` branded by
|
|
38
|
+
* {@link withVerbatimErrorBody}.
|
|
39
|
+
* @stability stable
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* hasVerbatimErrorBody(withVerbatimErrorBody(new BadRequestException({ error: 'x' }))); // true
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function hasVerbatimErrorBody(exception: unknown): boolean;
|
|
46
|
+
//# sourceMappingURL=verbatim-error-body.exception.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbatim-error-body.exception.d.ts","sourceRoot":"","sources":["../../../src/core/errors/verbatim-error-body.exception.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2E/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,aAAa,EAC3D,SAAS,EAAE,CAAC,GACX,CAAC,CAYH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAOhE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withVerbatimErrorBody = withVerbatimErrorBody;
|
|
4
|
+
exports.hasVerbatimErrorBody = hasVerbatimErrorBody;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
/**
|
|
7
|
+
* Opt-out from the shared error envelope (issue #153).
|
|
8
|
+
*
|
|
9
|
+
* ---------------------------------------------------------------------------
|
|
10
|
+
* WHY THIS EXISTS
|
|
11
|
+
* ---------------------------------------------------------------------------
|
|
12
|
+
* `HttpExceptionFilter` rebuilds EVERY error response from a fixed key
|
|
13
|
+
* allowlist — it reads `message`, `code` and `details` off the thrown payload
|
|
14
|
+
* and discards everything else. That is the right default and must stay the
|
|
15
|
+
* default: one envelope, parsed by exactly one code path in the web app and one
|
|
16
|
+
* in the CLI (`ApiError`, #140), with no endpoint quietly inventing its own
|
|
17
|
+
* error shape for its own callers to special-case.
|
|
18
|
+
*
|
|
19
|
+
* It is wrong for the small set of endpoints whose error body is dictated by an
|
|
20
|
+
* external specification rather than by us. `POST /auth/device/token` is the
|
|
21
|
+
* live example and the reason this file exists: RFC 8628 §3.5 (deferring to
|
|
22
|
+
* RFC 6749 §5.2) specifies `{ error, error_description }` at the TOP LEVEL of
|
|
23
|
+
* the token response, and the codes it defines — `authorization_pending`,
|
|
24
|
+
* `slow_down`, `expired_token`, `access_denied` — ARE the protocol. Each one
|
|
25
|
+
* demands a different action from the polling client: keep waiting, back off,
|
|
26
|
+
* restart the flow, stop and tell the user they declined. Flattened into the
|
|
27
|
+
* envelope all four arrived byte-identical, the RFC code destroyed server-side
|
|
28
|
+
* where no amount of client parsing could recover it, and the endpoint was
|
|
29
|
+
* simply not RFC 8628 compliant.
|
|
30
|
+
*
|
|
31
|
+
* ---------------------------------------------------------------------------
|
|
32
|
+
* WHY A BRAND, AND NOT "A PAYLOAD THAT HAPPENS TO CARRY `error`"
|
|
33
|
+
* ---------------------------------------------------------------------------
|
|
34
|
+
* The smaller fix considered in #153 was for the filter to sniff the payload:
|
|
35
|
+
* if it has an `error` key, pass it through untouched. Fewer lines, no new
|
|
36
|
+
* concepts — and implicit in exactly the way that hurts later. It would make an
|
|
37
|
+
* endpoint's WIRE SHAPE a consequence of the KEY NAMES somebody happened to
|
|
38
|
+
* pick inside a thrown object, decided silently and at a distance from both the
|
|
39
|
+
* throw site and the filter.
|
|
40
|
+
*
|
|
41
|
+
* `throw new BadRequestException({ error: 'could not reach the mailer' })` is a
|
|
42
|
+
* completely natural line for someone to write. Under a sniffing filter that
|
|
43
|
+
* line drops its endpoint out of the envelope, the web app's error rendering
|
|
44
|
+
* stops finding `message`, and nothing at the throw site hints at why. Nobody
|
|
45
|
+
* would connect the failure to a decision made in an exception filter over a
|
|
46
|
+
* key name.
|
|
47
|
+
*
|
|
48
|
+
* The brand inverts that. An error leaves the envelope only because someone
|
|
49
|
+
* said so, in the throw, in one word that is greppable and links back here. An
|
|
50
|
+
* ordinary exception cannot fall out of the envelope by accident no matter what
|
|
51
|
+
* keys it carries, and the next person to add an RFC-shaped endpoint finds the
|
|
52
|
+
* mechanism by following the brand from the filter or from the throw site.
|
|
53
|
+
* The cost is one file of machinery; the thing it buys is that the default
|
|
54
|
+
* cannot be broken by inattention.
|
|
55
|
+
*
|
|
56
|
+
* ---------------------------------------------------------------------------
|
|
57
|
+
* WHEN TO USE IT
|
|
58
|
+
* ---------------------------------------------------------------------------
|
|
59
|
+
* Only when an external standard dictates the body. NOT to give an endpoint a
|
|
60
|
+
* nicer error shape, and NOT to smuggle an extra field to a client: that field
|
|
61
|
+
* belongs under `details`, which the envelope already carries through. Every
|
|
62
|
+
* new use is a new shape some client has to learn, so it should be rare enough
|
|
63
|
+
* that each one is argued for.
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Registered via `Symbol.for` rather than a module-local `Symbol()` on purpose.
|
|
67
|
+
* The brand is set in one module and read in another, and both this module and
|
|
68
|
+
* the filter can be instantiated twice in a single process — ts-jest gives each
|
|
69
|
+
* test file its own module registry, and a `src`/`dist` double-load does the
|
|
70
|
+
* same in a mis-built container. Two module instances mean two distinct local
|
|
71
|
+
* symbols, and the brand check would then silently return false: the response
|
|
72
|
+
* would quietly revert to the flattened envelope and #153 would be back with no
|
|
73
|
+
* error anywhere. The global symbol registry is keyed by string, so every copy
|
|
74
|
+
* of this module resolves to the same symbol.
|
|
75
|
+
*/
|
|
76
|
+
const VERBATIM_ERROR_BODY = Symbol.for('EnterpriseAppBase.verbatimErrorBody');
|
|
77
|
+
/**
|
|
78
|
+
* Mark an exception so `HttpExceptionFilter` sends its payload to the client
|
|
79
|
+
* exactly as given, instead of rebuilding it as
|
|
80
|
+
* `{ statusCode, code, message, … }`.
|
|
81
|
+
*
|
|
82
|
+
* Returns the same exception instance, so the class identity is untouched:
|
|
83
|
+
* `withVerbatimErrorBody(new BadRequestException(…))` is still a
|
|
84
|
+
* `BadRequestException` and still carries status 400. That matters — guards,
|
|
85
|
+
* interceptors and existing tests that branch on the exception type keep
|
|
86
|
+
* working, and the opt-out stays a single orthogonal fact about the response
|
|
87
|
+
* body rather than a parallel exception hierarchy.
|
|
88
|
+
*
|
|
89
|
+
* The payload MUST be an object; a string payload has nothing to send verbatim
|
|
90
|
+
* and the filter falls back to the envelope for it.
|
|
91
|
+
*
|
|
92
|
+
* Only for a body an external standard dictates (RFC 8628's
|
|
93
|
+
* `{ error, error_description }` is the one use in the reference app); see
|
|
94
|
+
* the header of this file.
|
|
95
|
+
*
|
|
96
|
+
* @param exception - The exception to brand; returned as is.
|
|
97
|
+
* @returns The same exception instance.
|
|
98
|
+
* @stability stable
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* throw withVerbatimErrorBody(
|
|
102
|
+
* new BadRequestException({ error: 'slow_down', error_description: 'Polling too fast' }),
|
|
103
|
+
* );
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
function withVerbatimErrorBody(exception) {
|
|
107
|
+
Object.defineProperty(exception, VERBATIM_ERROR_BODY, {
|
|
108
|
+
value: true,
|
|
109
|
+
// Non-enumerable so the brand cannot leak into anything that walks the
|
|
110
|
+
// exception's own properties — a log serializer, a test snapshot, an
|
|
111
|
+
// error-reporting SDK. It is an instruction to the filter, not data.
|
|
112
|
+
enumerable: false,
|
|
113
|
+
writable: false,
|
|
114
|
+
configurable: false,
|
|
115
|
+
});
|
|
116
|
+
return exception;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Whether an exception opted out of the envelope. Read only by
|
|
120
|
+
* `HttpExceptionFilter`.
|
|
121
|
+
*
|
|
122
|
+
* @param exception - Anything thrown.
|
|
123
|
+
* @returns `true` only for an `HttpException` branded by
|
|
124
|
+
* {@link withVerbatimErrorBody}.
|
|
125
|
+
* @stability stable
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* hasVerbatimErrorBody(withVerbatimErrorBody(new BadRequestException({ error: 'x' }))); // true
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
function hasVerbatimErrorBody(exception) {
|
|
132
|
+
return (exception instanceof common_1.HttpException &&
|
|
133
|
+
exception[VERBATIM_ERROR_BODY] === true);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=verbatim-error-body.exception.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbatim-error-body.exception.js","sourceRoot":"","sources":["../../../src/core/errors/verbatim-error-body.exception.ts"],"names":[],"mappings":";;AAwGA,sDAcC;AAeD,oDAOC;AA5ID,2CAA+C;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,SAAgB,qBAAqB,CACnC,SAAY;IAEZ,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,mBAAmB,EAAE;QACpD,KAAK,EAAE,IAAI;QACX,uEAAuE;QACvE,qEAAqE;QACrE,qEAAqE;QACrE,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAAC,SAAkB;IACrD,OAAO,CACL,SAAS,YAAY,sBAAa;QACjC,SAAgD,CAC/C,mBAAmB,CACpB,KAAK,IAAI,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { definePlatformHost } from './platform-host';
|
|
2
|
+
export type { PlatformAccessPort, PlatformHost } from './platform-host';
|
|
3
|
+
export { AUDIT_SINK, PLATFORM_PRISMA, SYSTEM_SETTINGS_STORE } from './ports';
|
|
4
|
+
export type { AuditEventInput, AuditSink, PortBinding, PrismaClientLike, SystemSettingsSnapshot, SystemSettingsStore, } from './ports';
|
|
5
|
+
export { PlatformHostModule } from './platform-host.module';
|
|
6
|
+
export type { PlatformHostPorts } from './platform-host.module';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/host/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC7E,YAAY,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// The host ports (issue #696, PP-2.7): how a packaged slice reaches app-owned
|
|
3
|
+
// capabilities without importing app code. Recipe: ../README.md, "Host ports".
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.PlatformHostModule = exports.SYSTEM_SETTINGS_STORE = exports.PLATFORM_PRISMA = exports.AUDIT_SINK = exports.definePlatformHost = void 0;
|
|
6
|
+
var platform_host_1 = require("./platform-host");
|
|
7
|
+
Object.defineProperty(exports, "definePlatformHost", { enumerable: true, get: function () { return platform_host_1.definePlatformHost; } });
|
|
8
|
+
var ports_1 = require("./ports");
|
|
9
|
+
Object.defineProperty(exports, "AUDIT_SINK", { enumerable: true, get: function () { return ports_1.AUDIT_SINK; } });
|
|
10
|
+
Object.defineProperty(exports, "PLATFORM_PRISMA", { enumerable: true, get: function () { return ports_1.PLATFORM_PRISMA; } });
|
|
11
|
+
Object.defineProperty(exports, "SYSTEM_SETTINGS_STORE", { enumerable: true, get: function () { return ports_1.SYSTEM_SETTINGS_STORE; } });
|
|
12
|
+
var platform_host_module_1 = require("./platform-host.module");
|
|
13
|
+
Object.defineProperty(exports, "PlatformHostModule", { enumerable: true, get: function () { return platform_host_module_1.PlatformHostModule; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/host/index.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,+EAA+E;;;AAE/E,iDAAqD;AAA5C,mHAAA,kBAAkB,OAAA;AAE3B,iCAA6E;AAApE,mGAAA,UAAU,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,8GAAA,qBAAqB,OAAA;AAS3D,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a packaged controller authenticates and authorizes its caller, supplied
|
|
3
|
+
* by the app. Each function returns ONE decorator (usually the app's own
|
|
4
|
+
* `applyDecorators(...)` composite) that a packaged controller applies to a
|
|
5
|
+
* handler or a class.
|
|
6
|
+
*
|
|
7
|
+
* @stability experimental
|
|
8
|
+
*/
|
|
9
|
+
export interface PlatformAccessPort {
|
|
10
|
+
/**
|
|
11
|
+
* Decorators that authenticate the caller AND require every listed
|
|
12
|
+
* permission. Must never be a no-op.
|
|
13
|
+
*
|
|
14
|
+
* @param permissions - the permission strings, all required; never empty.
|
|
15
|
+
*/
|
|
16
|
+
requirePermissions(permissions: readonly string[]): MethodDecorator & ClassDecorator;
|
|
17
|
+
/** Decorators that authenticate the caller with no specific permission. */
|
|
18
|
+
requireAuthenticated(): MethodDecorator & ClassDecorator;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Everything a packaged slice needs from the app at decorator time. Built once
|
|
22
|
+
* with {@link definePlatformHost} and passed to every slice's `forRoot({ host })`.
|
|
23
|
+
*
|
|
24
|
+
* @stability experimental
|
|
25
|
+
*/
|
|
26
|
+
export interface PlatformHost {
|
|
27
|
+
/** The app's authentication and authorization decorators. */
|
|
28
|
+
readonly access: PlatformAccessPort;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates and freezes the app's platform host.
|
|
32
|
+
*
|
|
33
|
+
* Checks that `access.requirePermissions` and `access.requireAuthenticated`
|
|
34
|
+
* are functions and that each returns a decorator (both are called once, with
|
|
35
|
+
* a probe permission, to find out). The returned host wraps them so a later
|
|
36
|
+
* call that returns something else, or `requirePermissions([])`, throws too.
|
|
37
|
+
* Passing an already-defined host returns it unchanged.
|
|
38
|
+
*
|
|
39
|
+
* @param host - the app's access decorators.
|
|
40
|
+
* @returns the frozen, validated host.
|
|
41
|
+
* @throws Error when either access function is missing or returns a non-function.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* // apps/api/src/platform/platform-host.ts
|
|
46
|
+
* export const platformHost = definePlatformHost({
|
|
47
|
+
* access: {
|
|
48
|
+
* requirePermissions: (permissions) => Auth({ permissions: [...permissions] as PermissionName[] }),
|
|
49
|
+
* requireAuthenticated: () => Auth(),
|
|
50
|
+
* },
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @extensionPoint option
|
|
55
|
+
* @stability experimental
|
|
56
|
+
*/
|
|
57
|
+
export declare function definePlatformHost(host: PlatformHost): PlatformHost;
|
|
58
|
+
//# sourceMappingURL=platform-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-host.d.ts","sourceRoot":"","sources":["../../../src/core/host/platform-host.ts"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,kBAAkB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,GAAG,cAAc,CAAC;IACrF,2EAA2E;IAC3E,oBAAoB,IAAI,eAAe,GAAG,cAAc,CAAC;CAC1D;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CA+BnE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// The decorator-time host port (issue #696, PP-2.7)
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// A packaged controller must authenticate and authorize its caller exactly as
|
|
7
|
+
// the app's own controllers do, without importing the app's auth code. Nest
|
|
8
|
+
// applies decorators when a class is DEFINED, long before any container
|
|
9
|
+
// exists, so access cannot be an injection token: it is a static port, built
|
|
10
|
+
// once by the app (`apps/api/src/platform/platform-host.ts`) and handed to each
|
|
11
|
+
// slice's `forRoot({ host })`. The slice then creates its controller class
|
|
12
|
+
// inside `forRoot` with the host's decorators (the controller-factory recipe,
|
|
13
|
+
// README.md next to this folder).
|
|
14
|
+
//
|
|
15
|
+
// FAIL CLOSED. `definePlatformHost` refuses a host whose access functions are
|
|
16
|
+
// missing or do not return decorators, and a gate with no permission at all,
|
|
17
|
+
// so a packaged route can never be public by accident.
|
|
18
|
+
// =============================================================================
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.definePlatformHost = definePlatformHost;
|
|
21
|
+
/** Hosts already validated and frozen, so passing one twice is free. */
|
|
22
|
+
const definedHosts = new WeakSet();
|
|
23
|
+
/** A permission string the define-time probe passes; never enforced anywhere. */
|
|
24
|
+
const PROBE_PERMISSION = 'platform:probe';
|
|
25
|
+
function fail(why) {
|
|
26
|
+
throw new Error(`definePlatformHost: ${why}. A platform host must supply working access decorators; ` +
|
|
27
|
+
'without them a packaged route would have no access check, and a platform route is never public.');
|
|
28
|
+
}
|
|
29
|
+
function assertDecorator(value, name) {
|
|
30
|
+
if (typeof value !== 'function')
|
|
31
|
+
fail(`access.${name}() returned ${value === null ? 'null' : typeof value}, not a decorator`);
|
|
32
|
+
}
|
|
33
|
+
function assertPermissions(permissions) {
|
|
34
|
+
if (!Array.isArray(permissions) || permissions.length === 0) {
|
|
35
|
+
fail('access.requirePermissions() was called with no permission; use requireAuthenticated() for "any signed-in caller"');
|
|
36
|
+
}
|
|
37
|
+
for (const permission of permissions) {
|
|
38
|
+
if (typeof permission !== 'string' || permission.trim() === '') {
|
|
39
|
+
fail(`access.requirePermissions() was called with an invalid permission ${JSON.stringify(permission)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return permissions;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validates and freezes the app's platform host.
|
|
46
|
+
*
|
|
47
|
+
* Checks that `access.requirePermissions` and `access.requireAuthenticated`
|
|
48
|
+
* are functions and that each returns a decorator (both are called once, with
|
|
49
|
+
* a probe permission, to find out). The returned host wraps them so a later
|
|
50
|
+
* call that returns something else, or `requirePermissions([])`, throws too.
|
|
51
|
+
* Passing an already-defined host returns it unchanged.
|
|
52
|
+
*
|
|
53
|
+
* @param host - the app's access decorators.
|
|
54
|
+
* @returns the frozen, validated host.
|
|
55
|
+
* @throws Error when either access function is missing or returns a non-function.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* // apps/api/src/platform/platform-host.ts
|
|
60
|
+
* export const platformHost = definePlatformHost({
|
|
61
|
+
* access: {
|
|
62
|
+
* requirePermissions: (permissions) => Auth({ permissions: [...permissions] as PermissionName[] }),
|
|
63
|
+
* requireAuthenticated: () => Auth(),
|
|
64
|
+
* },
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @extensionPoint option
|
|
69
|
+
* @stability experimental
|
|
70
|
+
*/
|
|
71
|
+
function definePlatformHost(host) {
|
|
72
|
+
if (host !== null && typeof host === 'object' && definedHosts.has(host))
|
|
73
|
+
return host;
|
|
74
|
+
if (host === null || typeof host !== 'object')
|
|
75
|
+
fail('no host was given');
|
|
76
|
+
const access = host.access;
|
|
77
|
+
if (access === null || typeof access !== 'object')
|
|
78
|
+
fail('`access` is missing');
|
|
79
|
+
if (typeof access.requirePermissions !== 'function')
|
|
80
|
+
fail('`access.requirePermissions` is missing or not a function');
|
|
81
|
+
if (typeof access.requireAuthenticated !== 'function')
|
|
82
|
+
fail('`access.requireAuthenticated` is missing or not a function');
|
|
83
|
+
const requirePermissions = access.requirePermissions.bind(access);
|
|
84
|
+
const requireAuthenticated = access.requireAuthenticated.bind(access);
|
|
85
|
+
assertDecorator(requirePermissions([PROBE_PERMISSION]), 'requirePermissions');
|
|
86
|
+
assertDecorator(requireAuthenticated(), 'requireAuthenticated');
|
|
87
|
+
const defined = Object.freeze({
|
|
88
|
+
access: Object.freeze({
|
|
89
|
+
requirePermissions(permissions) {
|
|
90
|
+
const decorator = requirePermissions([...assertPermissions(permissions)]);
|
|
91
|
+
assertDecorator(decorator, 'requirePermissions');
|
|
92
|
+
return decorator;
|
|
93
|
+
},
|
|
94
|
+
requireAuthenticated() {
|
|
95
|
+
const decorator = requireAuthenticated();
|
|
96
|
+
assertDecorator(decorator, 'requireAuthenticated');
|
|
97
|
+
return decorator;
|
|
98
|
+
},
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
definedHosts.add(defined);
|
|
102
|
+
return defined;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=platform-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-host.js","sourceRoot":"","sources":["../../../src/core/host/platform-host.ts"],"names":[],"mappings":"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"}
|