@marinoscar/platform-api 0.1.0-next.19 → 0.1.0-next.21
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 +24 -0
- package/README.md +1 -0
- package/dist/alerts/alerts-admin.controller.d.ts +40 -0
- package/dist/alerts/alerts-admin.controller.d.ts.map +1 -0
- package/dist/alerts/alerts-admin.controller.js +297 -0
- package/dist/alerts/alerts-admin.controller.js.map +1 -0
- package/dist/alerts/alerts-context.service.d.ts +64 -0
- package/dist/alerts/alerts-context.service.d.ts.map +1 -0
- package/dist/alerts/alerts-context.service.js +190 -0
- package/dist/alerts/alerts-context.service.js.map +1 -0
- package/dist/alerts/alerts-dispatch.service.d.ts +53 -0
- package/dist/alerts/alerts-dispatch.service.d.ts.map +1 -0
- package/dist/alerts/alerts-dispatch.service.js +135 -0
- package/dist/alerts/alerts-dispatch.service.js.map +1 -0
- package/dist/alerts/alerts-evaluation.service.d.ts +88 -0
- package/dist/alerts/alerts-evaluation.service.d.ts.map +1 -0
- package/dist/alerts/alerts-evaluation.service.js +296 -0
- package/dist/alerts/alerts-evaluation.service.js.map +1 -0
- package/dist/alerts/alerts-event.listener.d.ts +22 -0
- package/dist/alerts/alerts-event.listener.d.ts.map +1 -0
- package/dist/alerts/alerts-event.listener.js +72 -0
- package/dist/alerts/alerts-event.listener.js.map +1 -0
- package/dist/alerts/alerts-incidents.service.d.ts +86 -0
- package/dist/alerts/alerts-incidents.service.d.ts.map +1 -0
- package/dist/alerts/alerts-incidents.service.js +144 -0
- package/dist/alerts/alerts-incidents.service.js.map +1 -0
- package/dist/alerts/alerts-rules.service.d.ts +73 -0
- package/dist/alerts/alerts-rules.service.d.ts.map +1 -0
- package/dist/alerts/alerts-rules.service.js +205 -0
- package/dist/alerts/alerts-rules.service.js.map +1 -0
- package/dist/alerts/alerts-seed.service.d.ts +25 -0
- package/dist/alerts/alerts-seed.service.d.ts.map +1 -0
- package/dist/alerts/alerts-seed.service.js +82 -0
- package/dist/alerts/alerts-seed.service.js.map +1 -0
- package/dist/alerts/alerts.constants.d.ts +53 -0
- package/dist/alerts/alerts.constants.d.ts.map +1 -0
- package/dist/alerts/alerts.constants.js +57 -0
- package/dist/alerts/alerts.constants.js.map +1 -0
- package/dist/alerts/alerts.errors.d.ts +44 -0
- package/dist/alerts/alerts.errors.d.ts.map +1 -0
- package/dist/alerts/alerts.errors.js +47 -0
- package/dist/alerts/alerts.errors.js.map +1 -0
- package/dist/alerts/alerts.metrics.d.ts +60 -0
- package/dist/alerts/alerts.metrics.d.ts.map +1 -0
- package/dist/alerts/alerts.metrics.js +135 -0
- package/dist/alerts/alerts.metrics.js.map +1 -0
- package/dist/alerts/alerts.module.d.ts +35 -0
- package/dist/alerts/alerts.module.d.ts.map +1 -0
- package/dist/alerts/alerts.module.js +96 -0
- package/dist/alerts/alerts.module.js.map +1 -0
- package/dist/alerts/alerts.options.d.ts +64 -0
- package/dist/alerts/alerts.options.d.ts.map +1 -0
- package/dist/alerts/alerts.options.js +34 -0
- package/dist/alerts/alerts.options.js.map +1 -0
- package/dist/alerts/alerts.permissions.d.ts +27 -0
- package/dist/alerts/alerts.permissions.d.ts.map +1 -0
- package/dist/alerts/alerts.permissions.js +29 -0
- package/dist/alerts/alerts.permissions.js.map +1 -0
- package/dist/alerts/alerts.types.d.ts +182 -0
- package/dist/alerts/alerts.types.d.ts.map +1 -0
- package/dist/alerts/alerts.types.js +3 -0
- package/dist/alerts/alerts.types.js.map +1 -0
- package/dist/alerts/data/alerts-db.d.ts +169 -0
- package/dist/alerts/data/alerts-db.d.ts.map +1 -0
- package/dist/alerts/data/alerts-db.js +18 -0
- package/dist/alerts/data/alerts-db.js.map +1 -0
- package/dist/alerts/dto/alerts.dto.d.ts +132 -0
- package/dist/alerts/dto/alerts.dto.d.ts.map +1 -0
- package/dist/alerts/dto/alerts.dto.js +42 -0
- package/dist/alerts/dto/alerts.dto.js.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts +23 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.js +71 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.js.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.d.ts +25 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.js +54 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.js.map +1 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts +29 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.js +76 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.js.map +1 -0
- package/dist/alerts/index.d.ts +45 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +108 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/kinds/alert-kind.registry.d.ts +33 -0
- package/dist/alerts/kinds/alert-kind.registry.d.ts.map +1 -0
- package/dist/alerts/kinds/alert-kind.registry.js +63 -0
- package/dist/alerts/kinds/alert-kind.registry.js.map +1 -0
- package/dist/alerts/kinds/builtin-kinds.d.ts +18 -0
- package/dist/alerts/kinds/builtin-kinds.d.ts.map +1 -0
- package/dist/alerts/kinds/builtin-kinds.js +33 -0
- package/dist/alerts/kinds/builtin-kinds.js.map +1 -0
- package/dist/alerts/kinds/metric-threshold.kind.d.ts +11 -0
- package/dist/alerts/kinds/metric-threshold.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/metric-threshold.kind.js +63 -0
- package/dist/alerts/kinds/metric-threshold.kind.js.map +1 -0
- package/dist/alerts/kinds/metric-threshold.sql.d.ts +41 -0
- package/dist/alerts/kinds/metric-threshold.sql.d.ts.map +1 -0
- package/dist/alerts/kinds/metric-threshold.sql.js +124 -0
- package/dist/alerts/kinds/metric-threshold.sql.js.map +1 -0
- package/dist/alerts/kinds/node-event.kind.d.ts +44 -0
- package/dist/alerts/kinds/node-event.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/node-event.kind.js +113 -0
- package/dist/alerts/kinds/node-event.kind.js.map +1 -0
- package/dist/alerts/kinds/node-offline.kind.d.ts +11 -0
- package/dist/alerts/kinds/node-offline.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/node-offline.kind.js +41 -0
- package/dist/alerts/kinds/node-offline.kind.js.map +1 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts +11 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.js +40 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.js.map +1 -0
- package/dist/alerts/kinds/verdict.kind.d.ts +13 -0
- package/dist/alerts/kinds/verdict.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/verdict.kind.js +34 -0
- package/dist/alerts/kinds/verdict.kind.js.map +1 -0
- package/dist/alerts/notifications/alerts.notifications.d.ts +77 -0
- package/dist/alerts/notifications/alerts.notifications.d.ts.map +1 -0
- package/dist/alerts/notifications/alerts.notifications.js +145 -0
- package/dist/alerts/notifications/alerts.notifications.js.map +1 -0
- package/dist/alerts/starter-rules.d.ts +21 -0
- package/dist/alerts/starter-rules.d.ts.map +1 -0
- package/dist/alerts/starter-rules.js +141 -0
- package/dist/alerts/starter-rules.js.map +1 -0
- package/dist/alerts/state/alert-state-machine.d.ts +92 -0
- package/dist/alerts/state/alert-state-machine.d.ts.map +1 -0
- package/dist/alerts/state/alert-state-machine.js +96 -0
- package/dist/alerts/state/alert-state-machine.js.map +1 -0
- package/dist/alerts/tasks/alerts-evaluate.task.d.ts +18 -0
- package/dist/alerts/tasks/alerts-evaluate.task.d.ts.map +1 -0
- package/dist/alerts/tasks/alerts-evaluate.task.js +61 -0
- package/dist/alerts/tasks/alerts-evaluate.task.js.map +1 -0
- package/dist/alerts/tasks/alerts-purge.task.d.ts +15 -0
- package/dist/alerts/tasks/alerts-purge.task.d.ts.map +1 -0
- package/dist/alerts/tasks/alerts-purge.task.js +58 -0
- package/dist/alerts/tasks/alerts-purge.task.js.map +1 -0
- package/dist/alerts/testing/conformance.d.ts +58 -0
- package/dist/alerts/testing/conformance.d.ts.map +1 -0
- package/dist/alerts/testing/conformance.js +198 -0
- package/dist/alerts/testing/conformance.js.map +1 -0
- package/dist/alerts/testing/fakes.d.ts +80 -0
- package/dist/alerts/testing/fakes.d.ts.map +1 -0
- package/dist/alerts/testing/fakes.js +230 -0
- package/dist/alerts/testing/fakes.js.map +1 -0
- package/dist/alerts/testing/index.d.ts +5 -0
- package/dist/alerts/testing/index.d.ts.map +1 -0
- package/dist/alerts/testing/index.js +15 -0
- package/dist/alerts/testing/index.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/net/ip-classify.d.ts +39 -0
- package/dist/core/net/ip-classify.d.ts.map +1 -0
- package/dist/core/net/ip-classify.js +196 -0
- package/dist/core/net/ip-classify.js.map +1 -0
- package/dist/credentials/testing/conformance.d.ts.map +1 -1
- package/dist/credentials/testing/conformance.js +1 -0
- package/dist/credentials/testing/conformance.js.map +1 -1
- package/dist/jobs/data/jobs-db.d.ts +26 -0
- package/dist/jobs/data/jobs-db.d.ts.map +1 -1
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/manifest/platform-model-ownership.d.ts +1 -1
- package/dist/manifest/platform-model-ownership.d.ts.map +1 -1
- package/dist/manifest/platform-model-ownership.js +30 -1
- package/dist/manifest/platform-model-ownership.js.map +1 -1
- package/dist/manifest/platform-permissions.d.ts +6 -2
- package/dist/manifest/platform-permissions.d.ts.map +1 -1
- package/dist/manifest/platform-permissions.js +56 -44
- package/dist/manifest/platform-permissions.js.map +1 -1
- package/dist/manifest/platform-user-owned-models.d.ts.map +1 -1
- package/dist/manifest/platform-user-owned-models.js +16 -0
- package/dist/manifest/platform-user-owned-models.js.map +1 -1
- package/dist/nodes/dto/node-admin.dto.d.ts +5 -0
- package/dist/nodes/dto/node-admin.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-admin.dto.js +19 -0
- package/dist/nodes/dto/node-admin.dto.js.map +1 -1
- package/dist/nodes/dto/node-control-plane.dto.d.ts +26 -0
- package/dist/nodes/dto/node-control-plane.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-event.dto.d.ts +100 -0
- package/dist/nodes/dto/node-event.dto.d.ts.map +1 -0
- package/dist/nodes/dto/node-event.dto.js +239 -0
- package/dist/nodes/dto/node-event.dto.js.map +1 -0
- package/dist/nodes/dto/node-response.dto.d.ts +21 -0
- package/dist/nodes/dto/node-response.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-response.dto.js +42 -1
- package/dist/nodes/dto/node-response.dto.js.map +1 -1
- package/dist/nodes/events/node-event.event.d.ts +41 -0
- package/dist/nodes/events/node-event.event.d.ts.map +1 -0
- package/dist/nodes/events/node-event.event.js +69 -0
- package/dist/nodes/events/node-event.event.js.map +1 -0
- package/dist/nodes/handlers/node-events-purge.handler.d.ts +31 -0
- package/dist/nodes/handlers/node-events-purge.handler.d.ts.map +1 -0
- package/dist/nodes/handlers/node-events-purge.handler.js +91 -0
- package/dist/nodes/handlers/node-events-purge.handler.js.map +1 -0
- package/dist/nodes/index.d.ts +11 -4
- package/dist/nodes/index.d.ts.map +1 -1
- package/dist/nodes/index.js +20 -1
- package/dist/nodes/index.js.map +1 -1
- package/dist/nodes/node-events.service.d.ts +87 -0
- package/dist/nodes/node-events.service.d.ts.map +1 -0
- package/dist/nodes/node-events.service.js +271 -0
- package/dist/nodes/node-events.service.js.map +1 -0
- package/dist/nodes/node-fleet-metrics.service.d.ts +10 -1
- package/dist/nodes/node-fleet-metrics.service.d.ts.map +1 -1
- package/dist/nodes/node-fleet-metrics.service.js +31 -0
- package/dist/nodes/node-fleet-metrics.service.js.map +1 -1
- package/dist/nodes/node-lifecycle.service.d.ts +16 -1
- package/dist/nodes/node-lifecycle.service.d.ts.map +1 -1
- package/dist/nodes/node-lifecycle.service.js +7 -0
- package/dist/nodes/node-lifecycle.service.js.map +1 -1
- package/dist/nodes/nodes-admin.controller.d.ts +5 -1
- package/dist/nodes/nodes-admin.controller.d.ts.map +1 -1
- package/dist/nodes/nodes-admin.controller.js +32 -2
- package/dist/nodes/nodes-admin.controller.js.map +1 -1
- package/dist/nodes/nodes.controller.d.ts +7 -3
- package/dist/nodes/nodes.controller.d.ts.map +1 -1
- package/dist/nodes/nodes.controller.js +46 -6
- package/dist/nodes/nodes.controller.js.map +1 -1
- package/dist/nodes/nodes.metrics.d.ts +23 -1
- package/dist/nodes/nodes.metrics.d.ts.map +1 -1
- package/dist/nodes/nodes.metrics.js +80 -1
- package/dist/nodes/nodes.metrics.js.map +1 -1
- package/dist/nodes/nodes.module.d.ts.map +1 -1
- package/dist/nodes/nodes.module.js +6 -0
- package/dist/nodes/nodes.module.js.map +1 -1
- package/dist/nodes/nodes.options.d.ts +17 -0
- package/dist/nodes/nodes.options.d.ts.map +1 -1
- package/dist/nodes/nodes.options.js +13 -2
- package/dist/nodes/nodes.options.js.map +1 -1
- package/dist/nodes/nodes.service.d.ts +3 -1
- package/dist/nodes/nodes.service.d.ts.map +1 -1
- package/dist/nodes/nodes.service.js +14 -3
- package/dist/nodes/nodes.service.js.map +1 -1
- package/dist/nodes/tasks/node-events-purge.task.d.ts +13 -0
- package/dist/nodes/tasks/node-events-purge.task.d.ts.map +1 -0
- package/dist/nodes/tasks/node-events-purge.task.js +73 -0
- package/dist/nodes/tasks/node-events-purge.task.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +30 -8
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js +12 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +15 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +17 -2
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -1
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +3 -3
- package/dist/telemetry/index.d.ts +4 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +4 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -1
- package/dist/telemetry/metrics/groups/nodes.metric-group.js +77 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -1
- package/dist/telemetry/metrics/metric-verdict.d.ts +1 -1
- package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -1
- package/dist/telemetry/metrics/metric-verdict.js +15 -1
- package/dist/telemetry/metrics/metric-verdict.js.map +1 -1
- package/dist/telemetry/query/telemetry-query-facade.d.ts +1 -1
- package/dist/telemetry/query/telemetry-query-facade.d.ts.map +1 -1
- package/dist/telemetry/query/telemetry-query-facade.js.map +1 -1
- package/dist/telemetry/query/telemetry-query.service.d.ts +2 -2
- package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -1
- package/dist/telemetry/query/telemetry-query.service.js +4 -0
- package/dist/telemetry/query/telemetry-query.service.js.map +1 -1
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +1 -1
- package/dist/telemetry/telemetry-support-bundle.section.d.ts +4 -4
- package/dist/telemetry/telemetry.module.d.ts.map +1 -1
- package/dist/telemetry/telemetry.module.js +1 -0
- package/dist/telemetry/telemetry.module.js.map +1 -1
- package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -1
- package/dist/telemetry/testing/metric-schema.fixture.js +56 -0
- package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -1
- package/dist/user-data/platform-user-data.d.ts.map +1 -1
- package/dist/user-data/platform-user-data.js +2 -0
- package/dist/user-data/platform-user-data.js.map +1 -1
- package/dist/webhooks/data/webhooks-db.d.ts +176 -0
- package/dist/webhooks/data/webhooks-db.d.ts.map +1 -0
- package/dist/webhooks/data/webhooks-db.js +14 -0
- package/dist/webhooks/data/webhooks-db.js.map +1 -0
- package/dist/webhooks/egress/egress-guard.d.ts +99 -0
- package/dist/webhooks/egress/egress-guard.d.ts.map +1 -0
- package/dist/webhooks/egress/egress-guard.js +172 -0
- package/dist/webhooks/egress/egress-guard.js.map +1 -0
- package/dist/webhooks/egress/transport.d.ts +58 -0
- package/dist/webhooks/egress/transport.d.ts.map +1 -0
- package/dist/webhooks/egress/transport.js +115 -0
- package/dist/webhooks/egress/transport.js.map +1 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.d.ts +76 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.js +333 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.js.map +1 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.d.ts +28 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.js +73 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.js.map +1 -0
- package/dist/webhooks/handlers/webhook-purge.handler.d.ts +33 -0
- package/dist/webhooks/handlers/webhook-purge.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-purge.handler.js +77 -0
- package/dist/webhooks/handlers/webhook-purge.handler.js.map +1 -0
- package/dist/webhooks/http/admin-webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/admin-webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/admin-webhooks.controller.js +250 -0
- package/dist/webhooks/http/admin-webhooks.controller.js.map +1 -0
- package/dist/webhooks/http/org-webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/org-webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/org-webhooks.controller.js +249 -0
- package/dist/webhooks/http/org-webhooks.controller.js.map +1 -0
- package/dist/webhooks/http/scope-context.d.ts +17 -0
- package/dist/webhooks/http/scope-context.d.ts.map +1 -0
- package/dist/webhooks/http/scope-context.js +28 -0
- package/dist/webhooks/http/scope-context.js.map +1 -0
- package/dist/webhooks/http/webhook.dto.d.ts +174 -0
- package/dist/webhooks/http/webhook.dto.d.ts.map +1 -0
- package/dist/webhooks/http/webhook.dto.js +58 -0
- package/dist/webhooks/http/webhook.dto.js.map +1 -0
- package/dist/webhooks/http/webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/webhooks.controller.js +243 -0
- package/dist/webhooks/http/webhooks.controller.js.map +1 -0
- package/dist/webhooks/index.d.ts +43 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +147 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/listeners/webhook-event.listeners.d.ts +23 -0
- package/dist/webhooks/listeners/webhook-event.listeners.d.ts.map +1 -0
- package/dist/webhooks/listeners/webhook-event.listeners.js +120 -0
- package/dist/webhooks/listeners/webhook-event.listeners.js.map +1 -0
- package/dist/webhooks/notifications/webhook-notification.channel.d.ts +31 -0
- package/dist/webhooks/notifications/webhook-notification.channel.d.ts.map +1 -0
- package/dist/webhooks/notifications/webhook-notification.channel.js +127 -0
- package/dist/webhooks/notifications/webhook-notification.channel.js.map +1 -0
- package/dist/webhooks/notifications/webhook-notifications.d.ts +98 -0
- package/dist/webhooks/notifications/webhook-notifications.d.ts.map +1 -0
- package/dist/webhooks/notifications/webhook-notifications.js +150 -0
- package/dist/webhooks/notifications/webhook-notifications.js.map +1 -0
- package/dist/webhooks/ports.d.ts +29 -0
- package/dist/webhooks/ports.d.ts.map +1 -0
- package/dist/webhooks/ports.js +23 -0
- package/dist/webhooks/ports.js.map +1 -0
- package/dist/webhooks/registry/builtin-events.d.ts +57 -0
- package/dist/webhooks/registry/builtin-events.d.ts.map +1 -0
- package/dist/webhooks/registry/builtin-events.js +113 -0
- package/dist/webhooks/registry/builtin-events.js.map +1 -0
- package/dist/webhooks/registry/webhook-catalog.d.ts +63 -0
- package/dist/webhooks/registry/webhook-catalog.d.ts.map +1 -0
- package/dist/webhooks/registry/webhook-catalog.js +123 -0
- package/dist/webhooks/registry/webhook-catalog.js.map +1 -0
- package/dist/webhooks/registry/webhook-event.registry.d.ts +116 -0
- package/dist/webhooks/registry/webhook-event.registry.d.ts.map +1 -0
- package/dist/webhooks/registry/webhook-event.registry.js +152 -0
- package/dist/webhooks/registry/webhook-event.registry.js.map +1 -0
- package/dist/webhooks/signing.d.ts +31 -0
- package/dist/webhooks/signing.d.ts.map +1 -0
- package/dist/webhooks/signing.js +48 -0
- package/dist/webhooks/signing.js.map +1 -0
- package/dist/webhooks/tasks/webhook-purge.task.d.ts +17 -0
- package/dist/webhooks/tasks/webhook-purge.task.d.ts.map +1 -0
- package/dist/webhooks/tasks/webhook-purge.task.js +68 -0
- package/dist/webhooks/tasks/webhook-purge.task.js.map +1 -0
- package/dist/webhooks/testing/conformance.d.ts +61 -0
- package/dist/webhooks/testing/conformance.d.ts.map +1 -0
- package/dist/webhooks/testing/conformance.js +316 -0
- package/dist/webhooks/testing/conformance.js.map +1 -0
- package/dist/webhooks/testing/in-memory.d.ts +156 -0
- package/dist/webhooks/testing/in-memory.d.ts.map +1 -0
- package/dist/webhooks/testing/in-memory.js +323 -0
- package/dist/webhooks/testing/in-memory.js.map +1 -0
- package/dist/webhooks/testing/index.d.ts +7 -0
- package/dist/webhooks/testing/index.d.ts.map +1 -0
- package/dist/webhooks/testing/index.js +25 -0
- package/dist/webhooks/testing/index.js.map +1 -0
- package/dist/webhooks/testing/kit.d.ts +86 -0
- package/dist/webhooks/testing/kit.d.ts.map +1 -0
- package/dist/webhooks/testing/kit.js +113 -0
- package/dist/webhooks/testing/kit.js.map +1 -0
- package/dist/webhooks/webhook-endpoints.service.d.ts +142 -0
- package/dist/webhooks/webhook-endpoints.service.d.ts.map +1 -0
- package/dist/webhooks/webhook-endpoints.service.js +366 -0
- package/dist/webhooks/webhook-endpoints.service.js.map +1 -0
- package/dist/webhooks/webhook-envelope.d.ts +36 -0
- package/dist/webhooks/webhook-envelope.d.ts.map +1 -0
- package/dist/webhooks/webhook-envelope.js +46 -0
- package/dist/webhooks/webhook-envelope.js.map +1 -0
- package/dist/webhooks/webhook-secrets.service.d.ts +49 -0
- package/dist/webhooks/webhook-secrets.service.d.ts.map +1 -0
- package/dist/webhooks/webhook-secrets.service.js +118 -0
- package/dist/webhooks/webhook-secrets.service.js.map +1 -0
- package/dist/webhooks/webhook-views.d.ts +34 -0
- package/dist/webhooks/webhook-views.d.ts.map +1 -0
- package/dist/webhooks/webhook-views.js +83 -0
- package/dist/webhooks/webhook-views.js.map +1 -0
- package/dist/webhooks/webhooks.access.d.ts +28 -0
- package/dist/webhooks/webhooks.access.d.ts.map +1 -0
- package/dist/webhooks/webhooks.access.js +55 -0
- package/dist/webhooks/webhooks.access.js.map +1 -0
- package/dist/webhooks/webhooks.constants.d.ts +73 -0
- package/dist/webhooks/webhooks.constants.d.ts.map +1 -0
- package/dist/webhooks/webhooks.constants.js +100 -0
- package/dist/webhooks/webhooks.constants.js.map +1 -0
- package/dist/webhooks/webhooks.credentials.d.ts +28 -0
- package/dist/webhooks/webhooks.credentials.d.ts.map +1 -0
- package/dist/webhooks/webhooks.credentials.js +51 -0
- package/dist/webhooks/webhooks.credentials.js.map +1 -0
- package/dist/webhooks/webhooks.errors.d.ts +25 -0
- package/dist/webhooks/webhooks.errors.d.ts.map +1 -0
- package/dist/webhooks/webhooks.errors.js +65 -0
- package/dist/webhooks/webhooks.errors.js.map +1 -0
- package/dist/webhooks/webhooks.metrics.d.ts +24 -0
- package/dist/webhooks/webhooks.metrics.d.ts.map +1 -0
- package/dist/webhooks/webhooks.metrics.js +70 -0
- package/dist/webhooks/webhooks.metrics.js.map +1 -0
- package/dist/webhooks/webhooks.module.d.ts +29 -0
- package/dist/webhooks/webhooks.module.d.ts.map +1 -0
- package/dist/webhooks/webhooks.module.js +108 -0
- package/dist/webhooks/webhooks.module.js.map +1 -0
- package/dist/webhooks/webhooks.options.d.ts +119 -0
- package/dist/webhooks/webhooks.options.d.ts.map +1 -0
- package/dist/webhooks/webhooks.options.js +80 -0
- package/dist/webhooks/webhooks.options.js.map +1 -0
- package/dist/webhooks/webhooks.permissions.d.ts +47 -0
- package/dist/webhooks/webhooks.permissions.d.ts.map +1 -0
- package/dist/webhooks/webhooks.permissions.js +83 -0
- package/dist/webhooks/webhooks.permissions.js.map +1 -0
- package/dist/webhooks/webhooks.repository.d.ts +162 -0
- package/dist/webhooks/webhooks.repository.d.ts.map +1 -0
- package/dist/webhooks/webhooks.repository.js +246 -0
- package/dist/webhooks/webhooks.repository.js.map +1 -0
- package/dist/webhooks/webhooks.service.d.ts +91 -0
- package/dist/webhooks/webhooks.service.d.ts.map +1 -0
- package/dist/webhooks/webhooks.service.js +216 -0
- package/dist/webhooks/webhooks.service.js.map +1 -0
- package/package.json +19 -3
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// The webhook egress guard (issue #1046)
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// A webhook URL is typed by an end user and POSTed to by the server: the
|
|
7
|
+
// classic SSRF primitive. Every request therefore passes this guard, at create
|
|
8
|
+
// and update time (a clear 422) and AGAIN at send time (the name may resolve
|
|
9
|
+
// elsewhere by then: DNS rebinding):
|
|
10
|
+
//
|
|
11
|
+
// 1. the URL parses, is `https:` (`http:` only with `allowInsecureHttp`), has
|
|
12
|
+
// no userinfo, and a port of 80, 443, 8443 or >= 1024;
|
|
13
|
+
// 2. every address the name resolves to (A and AAAA, all of them) is a public
|
|
14
|
+
// unicast address: no loopback, private, link-local (cloud metadata
|
|
15
|
+
// 169.254.169.254 included), carrier-grade NAT, multicast, unspecified,
|
|
16
|
+
// documentation or IPv4-mapped/embedded private address;
|
|
17
|
+
// 3. the connection is made to the address that was checked (pinned by the
|
|
18
|
+
// transport), never to a second lookup of the name.
|
|
19
|
+
//
|
|
20
|
+
// Redirects are never followed (the transport), so a 3xx cannot bounce a
|
|
21
|
+
// checked request to an unchecked target.
|
|
22
|
+
//
|
|
23
|
+
// `allowPrivateTargets` (on-prem, development) turns step 2 and the port rule
|
|
24
|
+
// off; `allowedHosts` exempts exactly the listed host names from step 2.
|
|
25
|
+
// =============================================================================
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.systemHostResolver = exports.WebhookEgressError = void 0;
|
|
28
|
+
exports.parseWebhookUrl = parseWebhookUrl;
|
|
29
|
+
exports.resolveWebhookTarget = resolveWebhookTarget;
|
|
30
|
+
exports.hostForLog = hostForLog;
|
|
31
|
+
const node_dns_1 = require("node:dns");
|
|
32
|
+
const node_net_1 = require("node:net");
|
|
33
|
+
const index_1 = require("../../core/index");
|
|
34
|
+
/**
|
|
35
|
+
* Thrown by the guard. The message never carries the URL's path or query (only
|
|
36
|
+
* the host), because a webhook URL may hold a token.
|
|
37
|
+
*
|
|
38
|
+
* @stability experimental
|
|
39
|
+
*/
|
|
40
|
+
class WebhookEgressError extends Error {
|
|
41
|
+
code;
|
|
42
|
+
constructor(
|
|
43
|
+
/** The refusal. */
|
|
44
|
+
code, message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.code = code;
|
|
47
|
+
this.name = 'WebhookEgressError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.WebhookEgressError = WebhookEgressError;
|
|
51
|
+
/**
|
|
52
|
+
* The default resolver: the operating system's (`dns.lookup`, `all: true`), the
|
|
53
|
+
* same one the connection would use.
|
|
54
|
+
*
|
|
55
|
+
* @stability experimental
|
|
56
|
+
*/
|
|
57
|
+
exports.systemHostResolver = {
|
|
58
|
+
resolveAll: (hostname) => new Promise((resolve, reject) => {
|
|
59
|
+
(0, node_dns_1.lookup)(hostname, { all: true, verbatim: true }, (error, addresses) => {
|
|
60
|
+
if (error)
|
|
61
|
+
reject(error);
|
|
62
|
+
else
|
|
63
|
+
resolve(addresses.map((entry) => ({ address: entry.address, family: entry.family === 6 ? 6 : 4 })));
|
|
64
|
+
});
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
const ALWAYS_OK_PORTS = new Set([80, 443, 8443]);
|
|
68
|
+
/** Strips the brackets of an IPv6 URL host. */
|
|
69
|
+
function bareHost(url) {
|
|
70
|
+
const host = url.hostname;
|
|
71
|
+
return host.startsWith('[') && host.endsWith(']') ? host.slice(1, -1) : host;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The syntactic checks (steps 1): no DNS.
|
|
75
|
+
*
|
|
76
|
+
* @param raw - the URL as typed.
|
|
77
|
+
* @param policy - the guard's policy.
|
|
78
|
+
* @returns the parsed URL.
|
|
79
|
+
* @throws WebhookEgressError for a malformed URL, a disallowed scheme, userinfo or a disallowed port.
|
|
80
|
+
*
|
|
81
|
+
* @stability experimental
|
|
82
|
+
*/
|
|
83
|
+
function parseWebhookUrl(raw, policy) {
|
|
84
|
+
let url;
|
|
85
|
+
try {
|
|
86
|
+
url = new URL(raw);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
throw new WebhookEgressError('invalid_url', 'The URL is not valid.');
|
|
90
|
+
}
|
|
91
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && policy.allowInsecureHttp)) {
|
|
92
|
+
throw new WebhookEgressError('scheme_not_allowed', url.protocol === 'http:' ? 'The URL must use https.' : 'The URL must be an https URL.');
|
|
93
|
+
}
|
|
94
|
+
if (url.username !== '' || url.password !== '') {
|
|
95
|
+
throw new WebhookEgressError('userinfo_not_allowed', 'The URL must not contain a user name or password.');
|
|
96
|
+
}
|
|
97
|
+
if (url.hostname === '')
|
|
98
|
+
throw new WebhookEgressError('invalid_url', 'The URL has no host.');
|
|
99
|
+
if (!policy.allowPrivateTargets && url.port !== '') {
|
|
100
|
+
const port = Number(url.port);
|
|
101
|
+
if (!ALWAYS_OK_PORTS.has(port) && port < 1024) {
|
|
102
|
+
throw new WebhookEgressError('port_not_allowed', `Port ${port} is not allowed; use 80, 443, 8443 or a port from 1024.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return url;
|
|
106
|
+
}
|
|
107
|
+
function isExemptHost(hostname, policy) {
|
|
108
|
+
const lower = hostname.toLowerCase();
|
|
109
|
+
return policy.allowedHosts.some((allowed) => allowed.toLowerCase() === lower);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The full guard: {@link parseWebhookUrl}, then resolve every address and
|
|
113
|
+
* refuse the target when any is not public.
|
|
114
|
+
*
|
|
115
|
+
* @param raw - the URL as typed.
|
|
116
|
+
* @param policy - the guard's policy.
|
|
117
|
+
* @param resolver - the DNS port.
|
|
118
|
+
* @returns the checked target, with the address to pin.
|
|
119
|
+
* @throws WebhookEgressError `private_target` when ANY resolved address is blocked, `unresolvable` when the name has none.
|
|
120
|
+
*
|
|
121
|
+
* @stability experimental
|
|
122
|
+
*/
|
|
123
|
+
async function resolveWebhookTarget(raw, policy, resolver) {
|
|
124
|
+
const url = parseWebhookUrl(raw, policy);
|
|
125
|
+
const hostname = bareHost(url);
|
|
126
|
+
const skipChecks = policy.allowPrivateTargets || isExemptHost(hostname, policy);
|
|
127
|
+
const literal = (0, node_net_1.isIP)(hostname);
|
|
128
|
+
if (literal !== 0) {
|
|
129
|
+
if (!skipChecks && (0, index_1.isBlockedAddress)(hostname)) {
|
|
130
|
+
throw new WebhookEgressError('private_target', `The address ${hostname} is not a public address.`);
|
|
131
|
+
}
|
|
132
|
+
return { url, hostname, address: hostname, family: literal === 6 ? 6 : 4 };
|
|
133
|
+
}
|
|
134
|
+
const lower = hostname.toLowerCase();
|
|
135
|
+
if (!skipChecks && (lower === 'localhost' || lower.endsWith('.localhost'))) {
|
|
136
|
+
throw new WebhookEgressError('private_target', `The host ${hostname} is not a public host.`);
|
|
137
|
+
}
|
|
138
|
+
let addresses;
|
|
139
|
+
try {
|
|
140
|
+
addresses = await resolver.resolveAll(hostname);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new WebhookEgressError('unresolvable', `The host ${hostname} does not resolve.`);
|
|
144
|
+
}
|
|
145
|
+
if (addresses.length === 0)
|
|
146
|
+
throw new WebhookEgressError('unresolvable', `The host ${hostname} does not resolve.`);
|
|
147
|
+
if (!skipChecks) {
|
|
148
|
+
const blocked = addresses.find((entry) => (0, index_1.isBlockedAddress)(entry.address));
|
|
149
|
+
if (blocked)
|
|
150
|
+
throw new WebhookEgressError('private_target', `The host ${hostname} resolves to a non-public address.`);
|
|
151
|
+
}
|
|
152
|
+
const first = addresses[0];
|
|
153
|
+
return { url, hostname, address: first.address, family: first.family };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The host of a URL for a log line or a metric: never the path, the query or
|
|
157
|
+
* the userinfo.
|
|
158
|
+
*
|
|
159
|
+
* @param raw - a URL.
|
|
160
|
+
* @returns the host, or `unknown`.
|
|
161
|
+
*
|
|
162
|
+
* @stability experimental
|
|
163
|
+
*/
|
|
164
|
+
function hostForLog(raw) {
|
|
165
|
+
try {
|
|
166
|
+
return new URL(raw).host || 'unknown';
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return 'unknown';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=egress-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress-guard.js","sourceRoot":"","sources":["../../../src/webhooks/egress/egress-guard.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,6EAA6E;AAC7E,qCAAqC;AACrC,EAAE;AACF,gFAAgF;AAChF,4DAA4D;AAC5D,gFAAgF;AAChF,yEAAyE;AACzE,6EAA6E;AAC7E,8DAA8D;AAC9D,6EAA6E;AAC7E,yDAAyD;AACzD,EAAE;AACF,yEAAyE;AACzE,0CAA0C;AAC1C,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,gFAAgF;;;AAiHhF,0CAqBC;AAmBD,oDAiCC;AAWD,gCAMC;AAzMD,uCAAkC;AAClC,uCAAgC;AAEhC,4CAAoD;AAWpD;;;;;GAKG;AACH,MAAa,kBAAmB,SAAQ,KAAK;IAGhC;IAFX;IACE,mBAAmB;IACV,IAA4B,EACrC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAwB;QAIrC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AATD,gDASC;AAoCD;;;;;GAKG;AACU,QAAA,kBAAkB,GAAiB;IAC9C,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CACvB,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,IAAA,iBAAM,EAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACnE,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;CACL,CAAC;AAcF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD,+CAA+C;AAC/C,SAAS,QAAQ,CAAC,GAAQ;IACxB,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,eAAe,CAAC,GAAW,EAAE,MAA2B;IACtE,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,EAAE,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC;IAC7I,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,EAAE,mDAAmD,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAAE,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IAC7F,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,QAAQ,IAAI,yDAAyD,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,MAA2B;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,MAA2B,EAAE,QAAsB;IACzG,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,IAAI,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAG,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,IAAI,IAAA,wBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,eAAe,QAAQ,2BAA2B,CAAC,CAAC;QACrG,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,QAAQ,wBAAwB,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,SAA4B,CAAC;IACjC,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,cAAc,EAAE,YAAY,QAAQ,oBAAoB,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,cAAc,EAAE,YAAY,QAAQ,oBAAoB,CAAC,CAAC;IAEnH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,wBAAgB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,QAAQ,oCAAoC,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC5B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ResolvedWebhookTarget } from './egress-guard';
|
|
2
|
+
/** One request. @stability experimental */
|
|
3
|
+
export interface WebhookTransportRequest {
|
|
4
|
+
/** The checked target. */
|
|
5
|
+
readonly target: ResolvedWebhookTarget;
|
|
6
|
+
/** The request headers (content type, user agent, the three signing headers). */
|
|
7
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
8
|
+
/** The exact body. */
|
|
9
|
+
readonly body: string;
|
|
10
|
+
/** The deadline for the whole exchange. */
|
|
11
|
+
readonly timeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
/** What came back. @stability experimental */
|
|
14
|
+
export interface WebhookTransportResponse {
|
|
15
|
+
/** The HTTP status. */
|
|
16
|
+
readonly status: number;
|
|
17
|
+
/** The `Retry-After` header, raw, when present. */
|
|
18
|
+
readonly retryAfter: string | null;
|
|
19
|
+
/** The first `WEBHOOK_SNIPPET_MAX` characters of the body, control characters removed. */
|
|
20
|
+
readonly snippet: string;
|
|
21
|
+
}
|
|
22
|
+
/** A transport failure with a stable code. @stability experimental */
|
|
23
|
+
export declare class WebhookTransportError extends Error {
|
|
24
|
+
/** `timeout` or `network`. */
|
|
25
|
+
readonly code: 'timeout' | 'network';
|
|
26
|
+
constructor(
|
|
27
|
+
/** `timeout` or `network`. */
|
|
28
|
+
code: 'timeout' | 'network', message: string);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sends one request. A port: the default is {@link nodeWebhookTransport}; the
|
|
32
|
+
* slice's testing entry has a recording fake.
|
|
33
|
+
*
|
|
34
|
+
* @stability experimental
|
|
35
|
+
*/
|
|
36
|
+
export interface WebhookTransport {
|
|
37
|
+
/**
|
|
38
|
+
* POSTs `request`.
|
|
39
|
+
*
|
|
40
|
+
* @param request - the request.
|
|
41
|
+
* @returns the response.
|
|
42
|
+
* @throws WebhookTransportError on a timeout or any network failure.
|
|
43
|
+
*/
|
|
44
|
+
send(request: WebhookTransportRequest): Promise<WebhookTransportResponse>;
|
|
45
|
+
}
|
|
46
|
+
/** Removes control characters and caps the length. */
|
|
47
|
+
export declare function toSnippet(raw: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* The default transport.
|
|
50
|
+
*
|
|
51
|
+
* @stability experimental
|
|
52
|
+
*/
|
|
53
|
+
export declare const nodeWebhookTransport: WebhookTransport;
|
|
54
|
+
/** Injection token of the {@link WebhookTransport}. @stability experimental */
|
|
55
|
+
export declare const WEBHOOKS_TRANSPORT: unique symbol;
|
|
56
|
+
/** Injection token of the {@link HostResolver}. @stability experimental */
|
|
57
|
+
export declare const WEBHOOKS_RESOLVER: unique symbol;
|
|
58
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/webhooks/egress/transport.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,sEAAsE;AACtE,qBAAa,qBAAsB,SAAQ,KAAK;IAE5C,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS;;IADpC,8BAA8B;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,EACpC,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC3E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAyElC,CAAC;AAMF,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,EAAE,OAAO,MAA8D,CAAC;AACvG,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAA6D,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// The webhook HTTP transport (issue #1046)
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// One POST to a checked, PINNED address. Node's `http(s).request` with a
|
|
7
|
+
// `lookup` that answers the address the guard approved (so a second DNS answer
|
|
8
|
+
// cannot redirect the connection) while the URL's host name still drives the
|
|
9
|
+
// Host header, the TLS server name and certificate verification. No redirect is
|
|
10
|
+
// followed (the platform's HTTP client never does), the whole exchange has a
|
|
11
|
+
// deadline, and only the first KiB of the response body is read.
|
|
12
|
+
// =============================================================================
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.WEBHOOKS_RESOLVER = exports.WEBHOOKS_TRANSPORT = exports.nodeWebhookTransport = exports.WebhookTransportError = void 0;
|
|
15
|
+
exports.toSnippet = toSnippet;
|
|
16
|
+
const node_http_1 = require("node:http");
|
|
17
|
+
const node_https_1 = require("node:https");
|
|
18
|
+
const webhooks_constants_1 = require("../webhooks.constants");
|
|
19
|
+
/** A transport failure with a stable code. @stability experimental */
|
|
20
|
+
class WebhookTransportError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
constructor(
|
|
23
|
+
/** `timeout` or `network`. */
|
|
24
|
+
code, message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.code = code;
|
|
27
|
+
this.name = 'WebhookTransportError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.WebhookTransportError = WebhookTransportError;
|
|
31
|
+
/** Removes control characters and caps the length. */
|
|
32
|
+
function toSnippet(raw) {
|
|
33
|
+
return raw.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '').slice(0, webhooks_constants_1.WEBHOOK_SNIPPET_MAX);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The default transport.
|
|
37
|
+
*
|
|
38
|
+
* @stability experimental
|
|
39
|
+
*/
|
|
40
|
+
exports.nodeWebhookTransport = {
|
|
41
|
+
send(req) {
|
|
42
|
+
const { target } = req;
|
|
43
|
+
const secure = target.url.protocol === 'https:';
|
|
44
|
+
const pinned = (_hostname, options, callback) => {
|
|
45
|
+
if (options.all) {
|
|
46
|
+
callback(null, [{ address: target.address, family: target.family }]);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
callback(null, target.address, target.family);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
let settled = false;
|
|
54
|
+
const finish = (action) => {
|
|
55
|
+
if (settled)
|
|
56
|
+
return;
|
|
57
|
+
settled = true;
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
action();
|
|
60
|
+
};
|
|
61
|
+
const options = {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
host: target.hostname,
|
|
64
|
+
port: target.url.port === '' ? (secure ? 443 : 80) : Number(target.url.port),
|
|
65
|
+
path: `${target.url.pathname}${target.url.search}`,
|
|
66
|
+
headers: { ...req.headers, 'content-length': String(Buffer.byteLength(req.body)) },
|
|
67
|
+
lookup: pinned,
|
|
68
|
+
// Verify the certificate against the host NAME, not the pinned address.
|
|
69
|
+
...(secure && !isLiteral(target.hostname) ? { servername: target.hostname } : {}),
|
|
70
|
+
agent: false,
|
|
71
|
+
};
|
|
72
|
+
const clientRequest = (secure ? node_https_1.request : node_http_1.request)(options, (response) => {
|
|
73
|
+
const chunks = [];
|
|
74
|
+
let size = 0;
|
|
75
|
+
const retryAfter = typeof response.headers['retry-after'] === 'string' ? response.headers['retry-after'] : null;
|
|
76
|
+
const done = () => finish(() => resolve({
|
|
77
|
+
status: response.statusCode ?? 0,
|
|
78
|
+
retryAfter,
|
|
79
|
+
snippet: toSnippet(Buffer.concat(chunks).toString('utf8')),
|
|
80
|
+
}));
|
|
81
|
+
response.on('data', (chunk) => {
|
|
82
|
+
if (size < webhooks_constants_1.WEBHOOK_SNIPPET_MAX * 4) {
|
|
83
|
+
chunks.push(chunk);
|
|
84
|
+
size += chunk.length;
|
|
85
|
+
}
|
|
86
|
+
if (size >= webhooks_constants_1.WEBHOOK_SNIPPET_MAX * 4) {
|
|
87
|
+
response.destroy();
|
|
88
|
+
done();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
response.on('end', done);
|
|
92
|
+
response.on('error', () => done());
|
|
93
|
+
response.on('close', done);
|
|
94
|
+
});
|
|
95
|
+
const timer = setTimeout(() => {
|
|
96
|
+
finish(() => reject(new WebhookTransportError('timeout', 'The receiver did not answer in time.')));
|
|
97
|
+
clientRequest.destroy();
|
|
98
|
+
}, req.timeoutMs);
|
|
99
|
+
timer.unref?.();
|
|
100
|
+
clientRequest.on('error', (error) => {
|
|
101
|
+
// The message may name the host and port; never the path or query.
|
|
102
|
+
finish(() => reject(new WebhookTransportError('network', `Network error${error.code ? ` (${error.code})` : ''}.`)));
|
|
103
|
+
});
|
|
104
|
+
clientRequest.end(req.body);
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
function isLiteral(host) {
|
|
109
|
+
return /^[\d.]+$/.test(host) || host.includes(':');
|
|
110
|
+
}
|
|
111
|
+
/** Injection token of the {@link WebhookTransport}. @stability experimental */
|
|
112
|
+
exports.WEBHOOKS_TRANSPORT = Symbol.for('@marinoscar/platform/webhooks/TRANSPORT');
|
|
113
|
+
/** Injection token of the {@link HostResolver}. @stability experimental */
|
|
114
|
+
exports.WEBHOOKS_RESOLVER = Symbol.for('@marinoscar/platform/webhooks/RESOLVER');
|
|
115
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/webhooks/egress/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { JobHandlerRegistry, type Job, type JobExecutionProfile, type JobHandler } from '../../jobs/index';
|
|
3
|
+
import { NotificationsService } from '../../notifications/index';
|
|
4
|
+
import { MetricsHostService } from '../../otel-core/index';
|
|
5
|
+
import { type HostResolver } from '../egress/egress-guard';
|
|
6
|
+
import { type WebhookTransport } from '../egress/transport';
|
|
7
|
+
import { WebhookSecrets } from '../webhook-secrets.service';
|
|
8
|
+
import { type ResolvedWebhooksModuleOptions } from '../webhooks.options';
|
|
9
|
+
import { WebhooksRepository } from '../webhooks.repository';
|
|
10
|
+
/**
|
|
11
|
+
* The delay before the retry that follows failed attempt number `attempt`.
|
|
12
|
+
*
|
|
13
|
+
* @param attempt - the attempt that just failed (1-based).
|
|
14
|
+
* @param retryAfterMs - the receiver's `Retry-After`, when it sent one.
|
|
15
|
+
* @param rand - a random source in [0, 1), for tests.
|
|
16
|
+
* @returns milliseconds: the schedule entry with half-range jitter, never less than `Retry-After` (capped at 24 h).
|
|
17
|
+
*
|
|
18
|
+
* @stability experimental
|
|
19
|
+
*/
|
|
20
|
+
export declare function retryDelayMs(attempt: number, retryAfterMs?: number | null, rand?: () => number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Parses a `Retry-After` header: delta-seconds or an HTTP date.
|
|
23
|
+
*
|
|
24
|
+
* @param value - the raw header.
|
|
25
|
+
* @param now - the current time in ms.
|
|
26
|
+
* @returns milliseconds to wait, or `null` when absent or malformed.
|
|
27
|
+
*
|
|
28
|
+
* @stability experimental
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseRetryAfter(value: string | null, now?: number): number | null;
|
|
31
|
+
/**
|
|
32
|
+
* The `webhooks.deliver` job. See the file header.
|
|
33
|
+
*
|
|
34
|
+
* @stability experimental
|
|
35
|
+
*/
|
|
36
|
+
export declare class WebhookDeliverHandler implements JobHandler, OnModuleInit {
|
|
37
|
+
private readonly registry;
|
|
38
|
+
private readonly repository;
|
|
39
|
+
private readonly secrets;
|
|
40
|
+
private readonly options;
|
|
41
|
+
private readonly transport;
|
|
42
|
+
private readonly resolver;
|
|
43
|
+
private readonly notifications?;
|
|
44
|
+
private readonly metrics?;
|
|
45
|
+
private readonly logger;
|
|
46
|
+
/** PERMANENT once jobs of this type exist. */
|
|
47
|
+
readonly type = "webhooks.deliver";
|
|
48
|
+
/** Its name in the jobs console. */
|
|
49
|
+
readonly label = "Webhook delivery";
|
|
50
|
+
/** 30 s per run (the request has 10 s); a failed attempt schedules its own retry, so the queue's attempts only cover infrastructure failures. */
|
|
51
|
+
readonly profile: JobExecutionProfile;
|
|
52
|
+
/** Overridable clock, for tests. */
|
|
53
|
+
now: () => Date;
|
|
54
|
+
/** Overridable random source, for tests. */
|
|
55
|
+
rand: () => number;
|
|
56
|
+
constructor(registry: JobHandlerRegistry, repository: WebhooksRepository, secrets: WebhookSecrets, options: ResolvedWebhooksModuleOptions, transport: WebhookTransport, resolver: HostResolver, notifications?: NotificationsService | undefined, metrics?: MetricsHostService | undefined);
|
|
57
|
+
/** Registers the handler with the job registry. */
|
|
58
|
+
onModuleInit(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Runs one attempt.
|
|
61
|
+
*
|
|
62
|
+
* @param job - the claimed job; `subjectId` is the delivery id and `orgId` its organization (`null`: a system endpoint).
|
|
63
|
+
*/
|
|
64
|
+
process(job: Job): Promise<void>;
|
|
65
|
+
private attempt;
|
|
66
|
+
private failed;
|
|
67
|
+
/** The current secret first, then the previous one while the rotation overlap lasts. */
|
|
68
|
+
private signingSecrets;
|
|
69
|
+
private policy;
|
|
70
|
+
private count;
|
|
71
|
+
/** After the commit, outside any transaction. */
|
|
72
|
+
private tellOwner;
|
|
73
|
+
}
|
|
74
|
+
/** The `webhook-*` header names a delivery carries, for the docs and the testing entry. @stability experimental */
|
|
75
|
+
export declare const WEBHOOK_REQUEST_HEADER_NAMES: readonly string[];
|
|
76
|
+
//# sourceMappingURL=webhook-deliver.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-deliver.handler.d.ts","sourceRoot":"","sources":["../../../src/webhooks/handlers/webhook-deliver.handler.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIzF,OAAO,EAAE,kBAAkB,EAAE,KAAK,GAAG,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAwD,KAAK,YAAY,EAA4B,MAAM,wBAAwB,CAAC;AAC3I,OAAO,EAAgE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI1H,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAS5D,OAAO,EAAoB,KAAK,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAuB,MAAM,wBAAwB,CAAC;AAEjF;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,EAAE,IAAI,GAAE,MAAM,MAAoB,GAAG,MAAM,CAM1H;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,GAAG,IAAI,CAM7F;AAED;;;;GAIG;AACH,qBACa,qBAAsB,YAAW,UAAU,EAAE,YAAY;IAmBlE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAzBvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IAEjE,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,sBAA4B;IAEzC,oCAAoC;IACpC,QAAQ,CAAC,KAAK,sBAAsB;IAEpC,iJAAiJ;IACjJ,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAA6C;IAElF,oCAAoC;IACpC,GAAG,EAAE,MAAM,IAAI,CAAoB;IAEnC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,MAAM,CAAe;gBAGd,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,cAAc,EACG,OAAO,EAAE,6BAA6B,EACpC,SAAS,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,YAAY,EACrC,aAAa,CAAC,EAAE,oBAAoB,YAAA,EACpC,OAAO,CAAC,EAAE,kBAAkB,YAAA;IAG3D,mDAAmD;IACnD,YAAY,IAAI,IAAI;IAIpB;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAgDxB,OAAO;IAwErB,OAAO,CAAC,MAAM;IA+Bd,wFAAwF;YAC1E,cAAc;IAY5B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,KAAK;IAOb,iDAAiD;YACnC,SAAS;CAcxB;AAED,mHAAmH;AACnH,eAAO,MAAM,4BAA4B,mBAA0H,CAAC"}
|