@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,452 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.USER_CREDENTIAL_DOMAIN_PREFIX = void 0;
|
|
4
|
+
exports.isCanonicalUuid = isCanonicalUuid;
|
|
5
|
+
exports.encryptSecret = encryptSecret;
|
|
6
|
+
exports.decryptSecret = decryptSecret;
|
|
7
|
+
exports.assertEncryptionKeyConfigured = assertEncryptionKeyConfigured;
|
|
8
|
+
exports.deriveSigningKey = deriveSigningKey;
|
|
9
|
+
exports.userCredentialPurpose = userCredentialPurpose;
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// AES-256-GCM Secret Cipher (issues #114, epic #108)
|
|
13
|
+
// =============================================================================
|
|
14
|
+
//
|
|
15
|
+
// The primitive underneath every runtime-configured secret this application
|
|
16
|
+
// will ever store. Deploy-time secrets (JWT_SECRET, GOOGLE_CLIENT_SECRET)
|
|
17
|
+
// correctly live in the environment; this module exists for the other kind —
|
|
18
|
+
// an SMTP password or an SES secret access key an administrator types into a
|
|
19
|
+
// form, which cannot come from an env var because it needs a redeploy to
|
|
20
|
+
// change.
|
|
21
|
+
//
|
|
22
|
+
// Payload layout (concatenated, then base64-encoded into one opaque string):
|
|
23
|
+
//
|
|
24
|
+
// [iv: 12 bytes][authTag: 16 bytes][ciphertext: variable]
|
|
25
|
+
//
|
|
26
|
+
// Self-describing on purpose: a single `text` column holds the whole thing, so
|
|
27
|
+
// the IV and the auth tag can never be stored in separate columns and drift
|
|
28
|
+
// away from the ciphertext they authenticate.
|
|
29
|
+
//
|
|
30
|
+
// Key source: SECRETS_ENCRYPTION_KEY, a base64-encoded 32 bytes.
|
|
31
|
+
// Generate with: openssl rand -base64 32
|
|
32
|
+
//
|
|
33
|
+
// MOVED INTO @marinoscar/platform-api/core (issue #698) BYTE-COMPATIBLE: the
|
|
34
|
+
// env var name, the sub-key label, the IV/tag lengths, the payload layout and
|
|
35
|
+
// every error text are unchanged. A ciphertext written by the app before the
|
|
36
|
+
// move decrypts after it (apps/api/test/platform/secret-cipher-compat.spec.ts).
|
|
37
|
+
//
|
|
38
|
+
// THIS MODULE MUST NOT LOG. Every value passing through it is either a secret,
|
|
39
|
+
// a key, or a key-derived value; a Logger here is a plaintext leak waiting for
|
|
40
|
+
// someone to raise the log level. Errors carry lengths and variable names only.
|
|
41
|
+
// =============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* 96 bits. The GCM-standard IV size, and not an arbitrary choice: at exactly 12
|
|
44
|
+
* bytes the spec uses the IV directly as the initial counter block, while any
|
|
45
|
+
* other length is folded through GHASH first. Twelve is the well-analysed path
|
|
46
|
+
* and the one every other implementation interoperates on.
|
|
47
|
+
*/
|
|
48
|
+
const IV_LENGTH = 12;
|
|
49
|
+
/**
|
|
50
|
+
* 128 bits — the full GCM tag. Node will happily accept a truncated tag (as
|
|
51
|
+
* short as 4 bytes) via `setAuthTag`, and a shorter tag means proportionally
|
|
52
|
+
* cheaper forgery. We always write and read exactly 16.
|
|
53
|
+
*/
|
|
54
|
+
const AUTH_TAG_LENGTH = 16;
|
|
55
|
+
/** AES-256 key size, for both the master key and every derived sub-key. */
|
|
56
|
+
const KEY_LENGTH = 32;
|
|
57
|
+
const KEY_ENV_VAR = 'SECRETS_ENCRYPTION_KEY';
|
|
58
|
+
/**
|
|
59
|
+
* Fixed, versioned label prefix for sub-key derivation. The `v1` is the hook
|
|
60
|
+
* for ever changing the derivation scheme: bumping it changes every derived
|
|
61
|
+
* key, which makes existing ciphertexts undecryptable, so it must only move
|
|
62
|
+
* together with a re-encryption migration.
|
|
63
|
+
*/
|
|
64
|
+
const SUBKEY_LABEL_PREFIX = 'enterpriseappbase:secret-cipher:v1:';
|
|
65
|
+
/**
|
|
66
|
+
* Fixed, versioned label prefix for MAC (signing) sub-keys (issue #822).
|
|
67
|
+
* Never change it: it is part of every derived signing key, so a different
|
|
68
|
+
* label invalidates every outstanding token signed under it. It differs from
|
|
69
|
+
* {@link SUBKEY_LABEL_PREFIX} at a fixed position (`signing-key` vs
|
|
70
|
+
* `secret-cipher`), so no signing purpose can ever produce an encryption
|
|
71
|
+
* sub-key, or the reverse.
|
|
72
|
+
*/
|
|
73
|
+
const SIGNING_SUBKEY_LABEL_PREFIX = 'enterpriseappbase:signing-key:v1:';
|
|
74
|
+
/**
|
|
75
|
+
* First segment of every owner-bound sub-key domain (issue #387). See
|
|
76
|
+
* {@link userCredentialPurpose}. System purposes may not contain `:` at all
|
|
77
|
+
* (the reference app enforces it in `credentials/credential-internals.ts`),
|
|
78
|
+
* so no system purpose can begin with this.
|
|
79
|
+
*
|
|
80
|
+
* @stability stable
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* purpose.startsWith(USER_CREDENTIAL_DOMAIN_PREFIX); // an owner-bound domain
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
exports.USER_CREDENTIAL_DOMAIN_PREFIX = 'user:';
|
|
87
|
+
/**
|
|
88
|
+
* A canonical UUID: lowercase hex, 8-4-4-4-12. Postgres and Prisma both
|
|
89
|
+
* render `uuid` values this way, so an id read back from the database always
|
|
90
|
+
* matches; an uppercase or brace-wrapped spelling of the same id does not.
|
|
91
|
+
*/
|
|
92
|
+
const CANONICAL_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
93
|
+
/**
|
|
94
|
+
* Is `value` a canonical (lowercase, hyphenated) UUID string?
|
|
95
|
+
*
|
|
96
|
+
* @param value - Anything.
|
|
97
|
+
* @returns `true` for `8-4-4-4-12` lowercase hex, the spelling Postgres and
|
|
98
|
+
* Prisma render.
|
|
99
|
+
* @stability stable
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* isCanonicalUuid('00000000-0000-4000-8000-000000000001'); // true
|
|
103
|
+
* isCanonicalUuid('00000000-0000-4000-8000-00000000000A'); // false (uppercase)
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
function isCanonicalUuid(value) {
|
|
107
|
+
return typeof value === 'string' && CANONICAL_UUID_PATTERN.test(value);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Strict base64 (standard alphabet, canonical padding). We validate the *text*
|
|
111
|
+
* rather than trusting the decode, because `Buffer.from(x, 'base64')` silently
|
|
112
|
+
* skips characters it does not recognise — `"not a real key!!!"` decodes to
|
|
113
|
+
* some bytes rather than failing, and a typo'd key that happened to decode to
|
|
114
|
+
* 32 bytes would be accepted as valid and silently encrypt everything under
|
|
115
|
+
* the wrong key.
|
|
116
|
+
*/
|
|
117
|
+
const BASE64_PATTERN = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
118
|
+
/**
|
|
119
|
+
* Build the operator-facing error for a bad key. The audience is someone
|
|
120
|
+
* configuring a deployment, not someone reading this source, so the message
|
|
121
|
+
* names the variable and hands over the exact generation command.
|
|
122
|
+
*
|
|
123
|
+
* `reason` describes the *shape* of the failure (absent, not base64, wrong
|
|
124
|
+
* length) and may contain a byte count, never any bytes: an operator needs to
|
|
125
|
+
* know "24 bytes, expected 32" to fix their key, and a length is not key
|
|
126
|
+
* material. Nothing derived from the key value itself may appear here.
|
|
127
|
+
*/
|
|
128
|
+
function keyConfigError(reason) {
|
|
129
|
+
return new Error(`${KEY_ENV_VAR} ${reason}. It must be a base64-encoded ${KEY_LENGTH}-byte key. ` +
|
|
130
|
+
`Generate one with: openssl rand -base64 ${KEY_LENGTH}`);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The master key, read once and cached for the life of the process.
|
|
134
|
+
*
|
|
135
|
+
* Caching is deliberate — the key cannot change without a restart, and re-
|
|
136
|
+
* reading `process.env` on every decrypt would only add a way for a late
|
|
137
|
+
* mutation of the environment to silently split the ciphertexts written before
|
|
138
|
+
* it from the ones written after.
|
|
139
|
+
*
|
|
140
|
+
* Consequence for tests: changing `process.env.SECRETS_ENCRYPTION_KEY` after
|
|
141
|
+
* this module has been touched has no effect. Use `jest.resetModules()` and
|
|
142
|
+
* re-`require` the module to exercise a different key.
|
|
143
|
+
*/
|
|
144
|
+
let cachedMasterKey = null;
|
|
145
|
+
function getMasterKey() {
|
|
146
|
+
if (cachedMasterKey)
|
|
147
|
+
return cachedMasterKey;
|
|
148
|
+
const raw = process.env[KEY_ENV_VAR];
|
|
149
|
+
if (!raw) {
|
|
150
|
+
throw keyConfigError('is not set');
|
|
151
|
+
}
|
|
152
|
+
// .env files and container orchestrators routinely leave a trailing newline
|
|
153
|
+
// or stray space on a value. That is an operator typo we can absorb safely —
|
|
154
|
+
// whitespace carries no information for a base64 key — and refusing it would
|
|
155
|
+
// burn someone's afternoon on an invisible character.
|
|
156
|
+
const trimmed = raw.trim();
|
|
157
|
+
if (!BASE64_PATTERN.test(trimmed)) {
|
|
158
|
+
throw keyConfigError('is not valid base64');
|
|
159
|
+
}
|
|
160
|
+
const key = Buffer.from(trimmed, 'base64');
|
|
161
|
+
if (key.length !== KEY_LENGTH) {
|
|
162
|
+
throw keyConfigError(`decoded to ${key.length} bytes`);
|
|
163
|
+
}
|
|
164
|
+
cachedMasterKey = key;
|
|
165
|
+
return cachedMasterKey;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Derived sub-keys, cached by purpose.
|
|
169
|
+
*
|
|
170
|
+
* A derived key is a pure function of two values that are both fixed for the
|
|
171
|
+
* life of the process (the master key and the purpose string), so the cache
|
|
172
|
+
* can never go stale — and it is only ever populated through `deriveKey`,
|
|
173
|
+
* which resolves the master key first, so an unconfigured key still throws
|
|
174
|
+
* before anything lands here.
|
|
175
|
+
*
|
|
176
|
+
* The purpose set is a small, closed vocabulary chosen by callers in code
|
|
177
|
+
* ('smtp', 'oauth', …), not user input, so this Map cannot grow unboundedly.
|
|
178
|
+
*
|
|
179
|
+
* OWNER-BOUND DOMAINS ARE NOT CACHED (issue #387). A per-user domain
|
|
180
|
+
* (`userCredentialPurpose()` below) is one string per user × purpose, which is
|
|
181
|
+
* exactly the open-ended vocabulary this cache must not hold: it would grow
|
|
182
|
+
* with the user base for the life of the process and keep one derived key per
|
|
183
|
+
* user resident in the heap. One HMAC-SHA256 per decrypt costs microseconds.
|
|
184
|
+
*/
|
|
185
|
+
const derivedKeyCache = new Map();
|
|
186
|
+
/**
|
|
187
|
+
* Derive the 32-byte key actually used for a given purpose.
|
|
188
|
+
*
|
|
189
|
+
* WHY NOT JUST USE THE MASTER KEY: domain separation. Every purpose gets an
|
|
190
|
+
* independent key, so a ciphertext lifted out of one column and pasted into
|
|
191
|
+
* another — an attacker with a SQL write but not the key, or a bug that copies
|
|
192
|
+
* a row across tables — fails authentication instead of decrypting into a
|
|
193
|
+
* context where it means something else. Without this, the only thing standing
|
|
194
|
+
* between an SMTP password blob and being read as, say, an OAuth client secret
|
|
195
|
+
* is whichever code happens to parse it. That is a lateral-movement control,
|
|
196
|
+
* and it is the whole reason `purpose` is a required parameter rather than an
|
|
197
|
+
* option with a default.
|
|
198
|
+
*
|
|
199
|
+
* WHY HMAC-SHA256 AND NOT scrypt/argon2/PBKDF2: those are *password* KDFs, and
|
|
200
|
+
* their slowness exists to punish guessing a low-entropy input. The input here
|
|
201
|
+
* is already 32 bytes of `openssl rand` output — there is nothing to brute
|
|
202
|
+
* force — so a slow KDF would buy zero security and add latency to every
|
|
203
|
+
* decrypt. HMAC over a fixed label keyed by a full-entropy secret is the
|
|
204
|
+
* standard construction for exactly this case (it is HKDF's extract step).
|
|
205
|
+
*
|
|
206
|
+
* WHY THE LABEL IS SAFE TO CONCATENATE: `purpose` is the final field of the
|
|
207
|
+
* label, so distinct purposes always produce distinct labels — the prefix is
|
|
208
|
+
* constant and cannot be shifted into it. If a second variable field were ever
|
|
209
|
+
* added *after* the purpose, this would need explicit length-prefixing to stop
|
|
210
|
+
* ('ab', 'c') and ('a', 'bc') from colliding onto one key.
|
|
211
|
+
*/
|
|
212
|
+
function deriveKey(purpose) {
|
|
213
|
+
// An empty or non-string purpose would silently collapse every domain onto a
|
|
214
|
+
// single key, quietly removing the separation above while everything still
|
|
215
|
+
// appeared to work. Reject it loudly. The check is a runtime one despite the
|
|
216
|
+
// `string` type because a plain-JS caller, a JSON round-trip, or an
|
|
217
|
+
// undefined config value can all deliver something else here.
|
|
218
|
+
if (typeof purpose !== 'string' || purpose.length === 0) {
|
|
219
|
+
throw new Error('encryptSecret/decryptSecret require a non-empty purpose string (e.g. "smtp").');
|
|
220
|
+
}
|
|
221
|
+
const cacheable = !purpose.startsWith(exports.USER_CREDENTIAL_DOMAIN_PREFIX);
|
|
222
|
+
if (cacheable) {
|
|
223
|
+
const cached = derivedKeyCache.get(purpose);
|
|
224
|
+
if (cached)
|
|
225
|
+
return cached;
|
|
226
|
+
}
|
|
227
|
+
const derived = (0, node_crypto_1.createHmac)('sha256', getMasterKey())
|
|
228
|
+
.update(`${SUBKEY_LABEL_PREFIX}${purpose}`)
|
|
229
|
+
.digest();
|
|
230
|
+
if (cacheable)
|
|
231
|
+
derivedKeyCache.set(purpose, derived);
|
|
232
|
+
return derived;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Encrypt `plaintext` under the purpose-bound sub-key for `purpose`.
|
|
236
|
+
*
|
|
237
|
+
* Returns a base64 string carrying its own IV and auth tag — safe to put
|
|
238
|
+
* straight into a `text` column.
|
|
239
|
+
*
|
|
240
|
+
* @param plaintext - The secret, as UTF-8 text.
|
|
241
|
+
* @param purpose - The sub-key domain: a short fixed string per kind of
|
|
242
|
+
* secret (`'smtp'`), or {@link userCredentialPurpose} for a per-user one.
|
|
243
|
+
* @returns base64 of `[iv: 12 bytes][authTag: 16 bytes][ciphertext]`.
|
|
244
|
+
* @throws if the key is missing/malformed, or `purpose` is empty.
|
|
245
|
+
* @stability stable
|
|
246
|
+
* @example
|
|
247
|
+
* ```ts
|
|
248
|
+
* const stored = encryptSecret(password, 'smtp');
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
function encryptSecret(plaintext, purpose) {
|
|
252
|
+
const key = deriveKey(purpose);
|
|
253
|
+
// A FRESH RANDOM IV ON EVERY CALL — never a counter, never a hash of the
|
|
254
|
+
// plaintext, never reused. This is the single most destructive mistake
|
|
255
|
+
// available in GCM: reusing an IV under the same key does not merely leak
|
|
256
|
+
// the XOR of the two plaintexts, it exposes the GHASH subkey and lets an
|
|
257
|
+
// attacker forge auth tags for that key outright. Deriving the IV from the
|
|
258
|
+
// plaintext would do exactly that for two equal secrets.
|
|
259
|
+
//
|
|
260
|
+
// It is also what keeps the store from leaking equality: two credentials
|
|
261
|
+
// holding the same password must not produce the same ciphertext, or the
|
|
262
|
+
// table answers "do these two accounts share a password?" to anyone who can
|
|
263
|
+
// read it.
|
|
264
|
+
const iv = (0, node_crypto_1.randomBytes)(IV_LENGTH);
|
|
265
|
+
const cipher = (0, node_crypto_1.createCipheriv)('aes-256-gcm', key, iv, {
|
|
266
|
+
authTagLength: AUTH_TAG_LENGTH,
|
|
267
|
+
});
|
|
268
|
+
const ciphertext = Buffer.concat([
|
|
269
|
+
cipher.update(plaintext, 'utf8'),
|
|
270
|
+
cipher.final(),
|
|
271
|
+
]);
|
|
272
|
+
// getAuthTag() is only valid after final(); reading it earlier returns a tag
|
|
273
|
+
// that does not cover the whole message.
|
|
274
|
+
const authTag = cipher.getAuthTag();
|
|
275
|
+
return Buffer.concat([iv, authTag, ciphertext]).toString('base64');
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Decrypt a payload produced by `encryptSecret` under the SAME `purpose`.
|
|
279
|
+
*
|
|
280
|
+
* Any tampering — a flipped bit in the IV, the tag, or the ciphertext — and
|
|
281
|
+
* any purpose mismatch fails here rather than returning plausible garbage.
|
|
282
|
+
* That is the entire reason this is GCM and not CBC: an unauthenticated mode
|
|
283
|
+
* would hand back corrupted bytes that then get used as an SMTP password.
|
|
284
|
+
*
|
|
285
|
+
* @param payload - A string returned by {@link encryptSecret}.
|
|
286
|
+
* @param purpose - The same purpose it was encrypted under.
|
|
287
|
+
* @returns The plaintext.
|
|
288
|
+
* @throws if the key is missing/malformed, `purpose` is empty, the payload is
|
|
289
|
+
* truncated, or authentication fails.
|
|
290
|
+
* @stability stable
|
|
291
|
+
* @example
|
|
292
|
+
* ```ts
|
|
293
|
+
* const password = decryptSecret(row.encryptedValue, 'smtp');
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
function decryptSecret(payload, purpose) {
|
|
297
|
+
const key = deriveKey(purpose);
|
|
298
|
+
// Invalid base64 is not rejected up front here (unlike the key, where a typo
|
|
299
|
+
// must be caught at configuration time): `Buffer.from` skips unrecognised
|
|
300
|
+
// characters, and whatever survives is caught by the length check below or
|
|
301
|
+
// by the auth tag. The tag — not input parsing — is what makes a payload
|
|
302
|
+
// trustworthy, so there is nothing to gain by pre-screening the encoding.
|
|
303
|
+
const buf = Buffer.from(payload, 'base64');
|
|
304
|
+
// A payload shorter than the header cannot be ours. Check BEFORE slicing:
|
|
305
|
+
// `subarray` clamps out-of-range indices instead of throwing, so a truncated
|
|
306
|
+
// input would silently yield a short IV and an empty tag and fail somewhere
|
|
307
|
+
// deeper with a far less obvious error. Equality is allowed — a 28-byte
|
|
308
|
+
// payload is the legitimate encryption of an empty string.
|
|
309
|
+
if (buf.length < IV_LENGTH + AUTH_TAG_LENGTH) {
|
|
310
|
+
throw new Error(`Malformed encrypted payload: expected at least ${IV_LENGTH + AUTH_TAG_LENGTH} bytes, got ${buf.length}.`);
|
|
311
|
+
}
|
|
312
|
+
const iv = buf.subarray(0, IV_LENGTH);
|
|
313
|
+
const authTag = buf.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
|
|
314
|
+
const ciphertext = buf.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
|
|
315
|
+
try {
|
|
316
|
+
const decipher = (0, node_crypto_1.createDecipheriv)('aes-256-gcm', key, iv, {
|
|
317
|
+
authTagLength: AUTH_TAG_LENGTH,
|
|
318
|
+
});
|
|
319
|
+
decipher.setAuthTag(authTag);
|
|
320
|
+
return Buffer.concat([
|
|
321
|
+
decipher.update(ciphertext),
|
|
322
|
+
decipher.final(), // verifies the auth tag; throws if it does not match
|
|
323
|
+
]).toString('utf8');
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Deliberately swallow the underlying error and throw a flat one instead.
|
|
327
|
+
//
|
|
328
|
+
// Two reasons. First, a caught error can be logged by a caller along with
|
|
329
|
+
// its `cause`, and we will not risk anything derived from the key or the
|
|
330
|
+
// partially-decrypted plaintext travelling out of this module in a stack.
|
|
331
|
+
// Second, a wrong purpose, a wrong key and a tampered byte are all the
|
|
332
|
+
// same event to the caller — "this payload is not readable here" — and
|
|
333
|
+
// distinguishing them only helps someone probing.
|
|
334
|
+
//
|
|
335
|
+
// The empty catch binding is intentional: there is nothing here we are
|
|
336
|
+
// willing to inspect or forward.
|
|
337
|
+
throw new Error('Failed to decrypt secret: the payload is corrupt, was encrypted under a different purpose, or the encryption key has changed.');
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Throw unless `SECRETS_ENCRYPTION_KEY` is present and well-formed.
|
|
342
|
+
*
|
|
343
|
+
* Exists so startup can fail on a bad key instead of the first administrator
|
|
344
|
+
* who tries to save a credential — a misconfiguration should surface in the
|
|
345
|
+
* deploy logs, not as a 500 weeks later. Wiring this into bootstrap is #116;
|
|
346
|
+
* this issue only provides the check.
|
|
347
|
+
*
|
|
348
|
+
* Also warms the cache, so the first real encrypt does not pay for validation.
|
|
349
|
+
*
|
|
350
|
+
* @throws the operator-facing key error (names the variable, the shape of the
|
|
351
|
+
* failure and the generation command; never key material).
|
|
352
|
+
* @stability stable
|
|
353
|
+
* @example
|
|
354
|
+
* ```ts
|
|
355
|
+
* assertEncryptionKeyConfigured(); // throws if SECRETS_ENCRYPTION_KEY is unusable
|
|
356
|
+
* ```
|
|
357
|
+
*/
|
|
358
|
+
function assertEncryptionKeyConfigured() {
|
|
359
|
+
getMasterKey();
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Signing sub-keys, cached by purpose. Same reasoning as `derivedKeyCache`:
|
|
363
|
+
* the purpose is a code constant, never user input, so the map stays small.
|
|
364
|
+
*/
|
|
365
|
+
const signingKeyCache = new Map();
|
|
366
|
+
/**
|
|
367
|
+
* A 32-byte HMAC key for `purpose`, derived from `SECRETS_ENCRYPTION_KEY`
|
|
368
|
+
* (issue #822).
|
|
369
|
+
*
|
|
370
|
+
* For server-signed, short-lived tokens (a download link, a one-time URL)
|
|
371
|
+
* that need a deployment secret without a new environment variable: the
|
|
372
|
+
* master key is already mandatory and validated at startup, and the label
|
|
373
|
+
* `enterpriseappbase:signing-key:v1:` keeps every signing domain independent
|
|
374
|
+
* of every encryption domain, so a signing key can never decrypt a stored
|
|
375
|
+
* credential.
|
|
376
|
+
*
|
|
377
|
+
* Derivation: `HMAC-SHA256(masterKey, "enterpriseappbase:signing-key:v1:" + purpose)`.
|
|
378
|
+
* The label is permanent. Rotating the master key invalidates every
|
|
379
|
+
* outstanding token, which for minutes-long tokens is the desired behaviour.
|
|
380
|
+
*
|
|
381
|
+
* `purpose` is a code constant (`'android-app-download'`), never user input:
|
|
382
|
+
* derived keys are cached per purpose for the life of the process. Never log
|
|
383
|
+
* or return the key.
|
|
384
|
+
*
|
|
385
|
+
* @param purpose - The signing domain: a short fixed string per kind of token.
|
|
386
|
+
* @returns A 32-byte key for `createHmac('sha256', key)`.
|
|
387
|
+
* @throws if the key is missing/malformed (the same operator-facing error as
|
|
388
|
+
* {@link assertEncryptionKeyConfigured}), or `purpose` is empty.
|
|
389
|
+
* @stability stable
|
|
390
|
+
* @example
|
|
391
|
+
* ```ts
|
|
392
|
+
* const mac = createHmac('sha256', deriveSigningKey('android-app-download'))
|
|
393
|
+
* .update(payload)
|
|
394
|
+
* .digest('base64url');
|
|
395
|
+
* ```
|
|
396
|
+
*/
|
|
397
|
+
function deriveSigningKey(purpose) {
|
|
398
|
+
if (typeof purpose !== 'string' || purpose.length === 0) {
|
|
399
|
+
throw new Error('deriveSigningKey requires a non-empty purpose string.');
|
|
400
|
+
}
|
|
401
|
+
const cached = signingKeyCache.get(purpose);
|
|
402
|
+
if (cached)
|
|
403
|
+
return cached;
|
|
404
|
+
const derived = (0, node_crypto_1.createHmac)('sha256', getMasterKey())
|
|
405
|
+
.update(`${SIGNING_SUBKEY_LABEL_PREFIX}${purpose}`)
|
|
406
|
+
.digest();
|
|
407
|
+
signingKeyCache.set(purpose, derived);
|
|
408
|
+
return derived;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* The owner-bound sub-key domain for a PER-USER credential (issue #387):
|
|
412
|
+
* `user:<userId>:<purpose>`.
|
|
413
|
+
*
|
|
414
|
+
* Pass the result as the `purpose` argument of {@link encryptSecret} /
|
|
415
|
+
* {@link decryptSecret}; those functions are unchanged. Binding the owner into
|
|
416
|
+
* the domain means a ciphertext copied from user A's row into user B's row —
|
|
417
|
+
* a SQL write, a bug copying rows — fails GCM authentication rather than
|
|
418
|
+
* handing B the use of A's key. The system store's domain is the bare purpose;
|
|
419
|
+
* this is the same construction with the owner prepended.
|
|
420
|
+
*
|
|
421
|
+
* WHY THE STRING DECOMPOSES ONE WAY ONLY:
|
|
422
|
+
* - `userId` must be a canonical UUID: fixed length, no `:`, one spelling
|
|
423
|
+
* per id (an uppercase variant would otherwise derive a second key for
|
|
424
|
+
* the same user and strand every row written under the first).
|
|
425
|
+
* - `purpose` must not contain `:`, so the final segment is unambiguous.
|
|
426
|
+
* - System purposes may not contain `:` either, so no system purpose can
|
|
427
|
+
* equal, or begin with, `user:` — the two key spaces cannot collide.
|
|
428
|
+
* Together that makes (userId, purpose) → domain injective, which is what the
|
|
429
|
+
* concatenation in `deriveKey` relies on.
|
|
430
|
+
*
|
|
431
|
+
* @throws a plain Error (no values in it) on a non-canonical id or a bad
|
|
432
|
+
* purpose. Callers validate first and report their own 400; this is
|
|
433
|
+
* the backstop that keeps a malformed domain from ever deriving a key.
|
|
434
|
+
* @param userId - The owner: a canonical UUID.
|
|
435
|
+
* @param purpose - The kind of secret; non-empty, no `:`.
|
|
436
|
+
* @returns `user:<userId>:<purpose>`.
|
|
437
|
+
* @stability stable
|
|
438
|
+
* @example
|
|
439
|
+
* ```ts
|
|
440
|
+
* const stored = encryptSecret(apiKey, userCredentialPurpose(userId, 'ai_user_key'));
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
function userCredentialPurpose(userId, purpose) {
|
|
444
|
+
if (!isCanonicalUuid(userId)) {
|
|
445
|
+
throw new Error('userCredentialPurpose requires a canonical (lowercase, hyphenated) UUID userId.');
|
|
446
|
+
}
|
|
447
|
+
if (typeof purpose !== 'string' || purpose.length === 0 || purpose.includes(':')) {
|
|
448
|
+
throw new Error('userCredentialPurpose requires a non-empty purpose containing no ":".');
|
|
449
|
+
}
|
|
450
|
+
return `${exports.USER_CREDENTIAL_DOMAIN_PREFIX}${userId}:${purpose}`;
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=secret-cipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-cipher.js","sourceRoot":"","sources":["../../../src/core/crypto/secret-cipher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { ExportPolicy, PurgePolicy, UserOwnedModelDef, UserOwnedModelLookup } from './types';
|
|
2
|
+
export { ScopedAccessError } from './scoped-access.error';
|
|
3
|
+
export { ownerFieldOf, ownerRelationOf, registerUserOwnedModels, userOwnedModelRegistry, } from './user-owned-data.registry';
|
|
4
|
+
export { asSystem, forUser, userScopeExtension } from './scoped-client';
|
|
5
|
+
export type { ExtendableClient, UserScopeExtension } from './scoped-client';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/data-access/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Scoped data access (issue #699; origin #688): the user-owned data registry,
|
|
3
|
+
// `forUser()` / `userScopeExtension()` and `asSystem()`. Framework-free and
|
|
4
|
+
// schema-independent: model names are strings, and the only Prisma import is
|
|
5
|
+
// `@prisma/client/extension`. See ../README.md, "Scoped data access".
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.userScopeExtension = exports.forUser = exports.asSystem = exports.userOwnedModelRegistry = exports.registerUserOwnedModels = exports.ownerRelationOf = exports.ownerFieldOf = exports.ScopedAccessError = void 0;
|
|
8
|
+
var scoped_access_error_1 = require("./scoped-access.error");
|
|
9
|
+
Object.defineProperty(exports, "ScopedAccessError", { enumerable: true, get: function () { return scoped_access_error_1.ScopedAccessError; } });
|
|
10
|
+
var user_owned_data_registry_1 = require("./user-owned-data.registry");
|
|
11
|
+
Object.defineProperty(exports, "ownerFieldOf", { enumerable: true, get: function () { return user_owned_data_registry_1.ownerFieldOf; } });
|
|
12
|
+
Object.defineProperty(exports, "ownerRelationOf", { enumerable: true, get: function () { return user_owned_data_registry_1.ownerRelationOf; } });
|
|
13
|
+
Object.defineProperty(exports, "registerUserOwnedModels", { enumerable: true, get: function () { return user_owned_data_registry_1.registerUserOwnedModels; } });
|
|
14
|
+
Object.defineProperty(exports, "userOwnedModelRegistry", { enumerable: true, get: function () { return user_owned_data_registry_1.userOwnedModelRegistry; } });
|
|
15
|
+
var scoped_client_1 = require("./scoped-client");
|
|
16
|
+
Object.defineProperty(exports, "asSystem", { enumerable: true, get: function () { return scoped_client_1.asSystem; } });
|
|
17
|
+
Object.defineProperty(exports, "forUser", { enumerable: true, get: function () { return scoped_client_1.forUser; } });
|
|
18
|
+
Object.defineProperty(exports, "userScopeExtension", { enumerable: true, get: function () { return scoped_client_1.userScopeExtension; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/data-access/index.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAC7E,sEAAsE;;;AAGtE,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,uEAKoC;AAJlC,wHAAA,YAAY,OAAA;AACZ,2HAAA,eAAe,OAAA;AACf,mIAAA,uBAAuB,OAAA;AACvB,kIAAA,sBAAsB,OAAA;AAExB,iDAAwE;AAA/D,yGAAA,QAAQ,OAAA;AAAE,wGAAA,OAAO,OAAA;AAAE,mHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown by a user-scoped Prisma client when a call would step outside its
|
|
3
|
+
* scope: a model that is not user-owned, raw SQL, or a write naming another
|
|
4
|
+
* owner. Also thrown by {@link asSystem} for an actor without a reason.
|
|
5
|
+
*
|
|
6
|
+
* A programming error, not a client error: it is deliberately not an
|
|
7
|
+
* `HttpException`, so a request that reaches it fails as a 500 and the log
|
|
8
|
+
* names the model. A row owned by someone else is never reported this way;
|
|
9
|
+
* reads and writes on it behave as "not found".
|
|
10
|
+
*
|
|
11
|
+
* @stability experimental
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* try {
|
|
15
|
+
* await forUser(prisma, { userId }).auditEvent.findMany();
|
|
16
|
+
* } catch (err) {
|
|
17
|
+
* if (err instanceof ScopedAccessError) logger.error(`${err.model}.${err.operation}: ${err.message}`);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class ScopedAccessError extends Error {
|
|
22
|
+
/** The Prisma model involved, when there is one. */
|
|
23
|
+
readonly model?: string;
|
|
24
|
+
/** The Prisma operation involved, e.g. `'findMany'` or `'$queryRaw'`. */
|
|
25
|
+
readonly operation?: string;
|
|
26
|
+
/**
|
|
27
|
+
* @param message - what was refused and what to do instead.
|
|
28
|
+
* @param details - the model and operation involved, when known.
|
|
29
|
+
*/
|
|
30
|
+
constructor(message: string, details?: {
|
|
31
|
+
model?: string;
|
|
32
|
+
operation?: string;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=scoped-access.error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-access.error.d.ts","sourceRoot":"","sources":["../../../src/core/data-access/scoped-access.error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;CAMlF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScopedAccessError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Thrown by a user-scoped Prisma client when a call would step outside its
|
|
6
|
+
* scope: a model that is not user-owned, raw SQL, or a write naming another
|
|
7
|
+
* owner. Also thrown by {@link asSystem} for an actor without a reason.
|
|
8
|
+
*
|
|
9
|
+
* A programming error, not a client error: it is deliberately not an
|
|
10
|
+
* `HttpException`, so a request that reaches it fails as a 500 and the log
|
|
11
|
+
* names the model. A row owned by someone else is never reported this way;
|
|
12
|
+
* reads and writes on it behave as "not found".
|
|
13
|
+
*
|
|
14
|
+
* @stability experimental
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* try {
|
|
18
|
+
* await forUser(prisma, { userId }).auditEvent.findMany();
|
|
19
|
+
* } catch (err) {
|
|
20
|
+
* if (err instanceof ScopedAccessError) logger.error(`${err.model}.${err.operation}: ${err.message}`);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class ScopedAccessError extends Error {
|
|
25
|
+
/** The Prisma model involved, when there is one. */
|
|
26
|
+
model;
|
|
27
|
+
/** The Prisma operation involved, e.g. `'findMany'` or `'$queryRaw'`. */
|
|
28
|
+
operation;
|
|
29
|
+
/**
|
|
30
|
+
* @param message - what was refused and what to do instead.
|
|
31
|
+
* @param details - the model and operation involved, when known.
|
|
32
|
+
*/
|
|
33
|
+
constructor(message, details = {}) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = 'ScopedAccessError';
|
|
36
|
+
if (details.model !== undefined)
|
|
37
|
+
this.model = details.model;
|
|
38
|
+
if (details.operation !== undefined)
|
|
39
|
+
this.operation = details.operation;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.ScopedAccessError = ScopedAccessError;
|
|
43
|
+
//# sourceMappingURL=scoped-access.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-access.error.js","sourceRoot":"","sources":["../../../src/core/data-access/scoped-access.error.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,oDAAoD;IAC3C,KAAK,CAAU;IACxB,yEAAyE;IAChE,SAAS,CAAU;IAE5B;;;OAGG;IACH,YAAY,OAAe,EAAE,UAAkD,EAAE;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC1E,CAAC;CACF;AAhBD,8CAgBC"}
|