@evolith/core-domain 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domain/services/default-workflow-definition.js +1 -1
- package/dist/domain/services/default-workflow-definition.js.map +1 -1
- package/package.json +2 -1
- package/rulesets/README.es.md +170 -0
- package/rulesets/README.md +170 -0
- package/rulesets/acl/README.es.md +41 -0
- package/rulesets/acl/README.md +41 -0
- package/rulesets/acl/anti-corruption-layer.rules.es.json +99 -0
- package/rulesets/acl/anti-corruption-layer.rules.json +99 -0
- package/rulesets/adr/ADR_COVERAGE.es.md +133 -0
- package/rulesets/adr/ADR_COVERAGE.md +133 -0
- package/rulesets/adr/README.es.md +17 -0
- package/rulesets/adr/README.md +17 -0
- package/rulesets/adr/adr-0002-hexagonal-architecture.rules.json +103 -0
- package/rulesets/adr/adr-0005-cicd-quality-gates.rules.json +102 -0
- package/rulesets/adr/adr-0010-multi-tenancy.rules.json +129 -0
- package/rulesets/adr/adr-0018-testing-pyramid.rules.json +115 -0
- package/rulesets/adr/adr-0032-protocol-selection.rules.json +134 -0
- package/rulesets/adr/adr-0040-multi-runtime.rules.json +131 -0
- package/rulesets/adr/adr-0050-gitflow-branching.rules.json +176 -0
- package/rulesets/adr/generated/adr-0001-monorepo-orchestration-principle.rules.json +29 -0
- package/rulesets/adr/generated/adr-0006-microservices-transition-via-sidecar-pattern.rules.json +29 -0
- package/rulesets/adr/generated/adr-0009-strict-dependency-pinning-and-automated-vulnerability-manage.rules.json +29 -0
- package/rulesets/adr/generated/adr-0011-fault-tolerance-and-resiliency-patterns.rules.json +29 -0
- package/rulesets/adr/generated/adr-0013-cloud-infrastructure-topology-and-disaster-recovery-dr.rules.json +28 -0
- package/rulesets/adr/generated/adr-0014-multi-layer-distributed-caching-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0015-event-driven-architecture-eda-for-intra-domain-communication.rules.json +29 -0
- package/rulesets/adr/generated/adr-0016-immutable-business-audit-trail-and-change-tracking.rules.json +29 -0
- package/rulesets/adr/generated/adr-0017-feature-flagging-strategy-for-progressive-delivery.rules.json +28 -0
- package/rulesets/adr/generated/adr-0019-tactical-design-patterns-for-future-proofing.rules.json +29 -0
- package/rulesets/adr/generated/adr-0020-identity-provider-abstraction-strategy.rules.json +28 -0
- package/rulesets/adr/generated/adr-0024-centralized-configuration-feature-platform.rules.json +28 -0
- package/rulesets/adr/generated/adr-0025-feature-flag-provider-abstraction-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0028-self-hosted-open-source-hybrid-infrastructure.rules.json +29 -0
- package/rulesets/adr/generated/adr-0030-two-tier-distributed-gateway-model.rules.json +28 -0
- package/rulesets/adr/generated/adr-0031-schema-per-bounded-context-and-domain-event-catalog.rules.json +29 -0
- package/rulesets/adr/generated/adr-0033-transactional-outbox-pattern-for-async-messaging.rules.json +28 -0
- package/rulesets/adr/generated/adr-0034-cqrs-pattern-application-matrix.rules.json +29 -0
- package/rulesets/adr/generated/adr-0035-distributed-saga-pattern-implementation-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0036-message-bus-delivery-flow-control-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0037-enterprise-performance-concurrency-chaos-verification-strate.rules.json +28 -0
- package/rulesets/adr/generated/adr-0039-deployment-topology-abstraction-environment-switcher.rules.json +29 -0
- package/rulesets/adr/generated/adr-0041-dual-engine-policy-evaluation-native-opa.rules.json +28 -0
- package/rulesets/adr/generated/adr-0044-configurable-security-persistence-strategy-agnosticism-vs-na.rules.json +29 -0
- package/rulesets/adr/generated/adr-0045-microservice-extraction-readiness-criteria.rules.json +29 -0
- package/rulesets/adr/generated/adr-0046-unified-traceability-via-w3c-tracecontext.rules.json +29 -0
- package/rulesets/adr/generated/adr-0047-progressive-architecture-evolution-framework-modular-monolit.rules.json +29 -0
- package/rulesets/adr/generated/adr-0048-enterprise-taxonomy-standardization-and-reference-layout.rules.json +28 -0
- package/rulesets/adr/generated/adr-0049-naming-semantics-clean-code-policy-e2e-and-global.rules.json +29 -0
- package/rulesets/adr/generated/adr-0051-enterprise-database-engine-selection-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0052-unit-testing-isolation-strategy-mocks-vs-stubs.rules.json +29 -0
- package/rulesets/adr/generated/adr-0053-integration-and-e2e-testing-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0054-database-design-and-normalization-standards.rules.json +29 -0
- package/rulesets/adr/generated/adr-0055-microfrontends-architecture-strategy.rules.json +28 -0
- package/rulesets/adr/generated/adr-0056-enterprise-naming-design-conventions-multi-language-multi-pl.rules.json +29 -0
- package/rulesets/adr/generated/adr-0057-architecture-intelligence-catalog.rules.json +27 -0
- package/rulesets/adr/generated/adr-0058-ai-consumable-architecture-knowledge.rules.json +27 -0
- package/rulesets/adr/generated/adr-0067-modular-monolith-persistence-boundaries.rules.json +28 -0
- package/rulesets/adr/generated/adr-0068-documentation-release-gitflow.rules.json +29 -0
- package/rulesets/adr/generated/adr-0069-ai-agent-context-protocol-integration.rules.json +28 -0
- package/rulesets/adr/generated/adr-0070-lean-root-repository-taxonomy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0071-domain-layer-base-class-and-inheritance-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0072-utc-date-storage-browser-timezone-detection-and-language-res.rules.json +29 -0
- package/rulesets/adr/generated/adr-0073-unified-cli-mcp-output-contract-and-gate-evidence-schema.rules.json +29 -0
- package/rulesets/adr/generated/adr-0074-evolith-core-api-native-exposure-layer.rules.json +29 -0
- package/rulesets/adr/generated/adr-0075-core-api-authentication-strategy.rules.json +28 -0
- package/rulesets/adr/generated/adr-0076-domain-oriented-microservice-architecture-doma.rules.json +28 -0
- package/rulesets/adr/generated/adr-0077-masstransit-v9-commercial-pivot-stay-on-v8-monitor-opentrans.rules.json +28 -0
- package/rulesets/adr/generated/adr-0078-domain-financial-separation-governance.rules.json +29 -0
- package/rulesets/adr/generated/adr-0079-multi-topology-reference-corpus-and-topology-manifest-contra.rules.json +29 -0
- package/rulesets/adr/generated/adr-0080-remote-repository-reference-contract.rules.json +29 -0
- package/rulesets/adr/generated/adr-0081-agentic-ai-sandbox-isolation-boundary.rules.json +29 -0
- package/rulesets/adr/generated/adr-0082-agentic-ai-prompt-context-and-tool-trust-boundary.rules.json +28 -0
- package/rulesets/adr/generated/adr-0083-agentic-ai-action-authorization-and-audit.rules.json +29 -0
- package/rulesets/adr/generated/adr-0084-data-mesh-and-data-as-a-product.rules.json +29 -0
- package/rulesets/adr/generated/adr-0085-agnostic-opa-wasm-distribution-architecture.rules.json +28 -0
- package/rulesets/adr/generated/adr-0086-agentic-ai-telemetry-cost-control-standard.rules.json +27 -0
- package/rulesets/adr/generated/adr-0087-attribute-based-access-control-abac-for-agentic-tool-executi.rules.json +29 -0
- package/rulesets/adr/generated/adr-0088-sovereign-identity-for-agentic-ai.rules.json +29 -0
- package/rulesets/adr/generated/adr-0089-event-driven-agentic-workflow-pattern.rules.json +28 -0
- package/rulesets/adr/generated/adr-0090-rag-knowledge-governance-standard.rules.json +29 -0
- package/rulesets/adr/generated/adr-0091-workload-identity-token-rotation-standard.rules.json +29 -0
- package/rulesets/adr/generated/adr-0092-agent-infinite-loop-prevention-and-circuit-breaker-rules.rules.json +29 -0
- package/rulesets/adr/generated/adr-0093-concurrency-control-and-resource-locking-standard-for-mcp-to.rules.json +29 -0
- package/rulesets/adr/generated/adr-0094-multi-agent-handoff-and-task-delegation-standards.rules.json +29 -0
- package/rulesets/adr/generated/adr-0095-serverless-architecture-governance.rules.json +29 -0
- package/rulesets/adr/generated/adr-0096-edge-computing-architecture-governance.rules.json +29 -0
- package/rulesets/adr/generated/adr-0097-knowledge-lifecycle-governance-standard.rules.json +29 -0
- package/rulesets/adr/generated/adr-0098-rest-uri-versioning-and-deprecation-policy.rules.json +29 -0
- package/rulesets/adr/generated/adr-0099-opa-bundle-distribution-via-s3-minio.rules.json +27 -0
- package/rulesets/adr/generated/adr-ai-augmented-0001-harness-engineering-for-ai-augmented-development.rules.json +29 -0
- package/rulesets/adr/generated/adr-ai-augmented-0002-mcp-integration-protocol-for-agent-tool-invocation.rules.json +29 -0
- package/rulesets/adr/generated/adr-ai-augmented-0003-model-selection-governance-for-ai-augmented-workflows.rules.json +29 -0
- package/rulesets/adr/generated/adr-ai-augmented-0004-agents-md-as-mandatory-repository-artifact.rules.json +29 -0
- package/rulesets/adr/generated/adr-ai-augmented-0005-human-in-the-loop-policy-for-autonomous-agent-operations.rules.json +29 -0
- package/rulesets/adr/generated/adr-android-0042-canonical-android-native-mobile-architecture.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0041-canonical-net-c-backend-architecture.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0060-net-multi-tenancy-dual-layer-strategy-ef-core-sql-server.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0061-transactional-event-lifecycle-in-ef-core.rules.json +28 -0
- package/rulesets/adr/generated/adr-dotnet-0062-net-immutable-audit-trail-via-ddl-triggers-delta-capture.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0063-b2b-request-idempotency-middleware-in-asp-net-core.rules.json +28 -0
- package/rulesets/adr/generated/adr-dotnet-0064-net-request-scope-observability-context-propagation.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0065-net-pii-safe-structured-logging-pipeline-serilog.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0066-net-lightweight-http-idempotency-via-imemorycache-idistribut.rules.json +28 -0
- package/rulesets/adr/generated/adr-dotnet-0069-net-grpc-service-setup-protobuf-contracts.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0070-net-api-endpoint-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-dotnet-0071-net-data-access-strategy-ef-core-as-default-orm-dapper-for-o.rules.json +27 -0
- package/rulesets/adr/generated/adr-dotnet-0072-net-aop-cross-cutting-concern-strategy-dispatchproxy-over-pi.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0003-strict-typescript-standards.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0004-frontend-offline-resilience.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0007-observability-with-opentelemetry-loki-and-jaeger.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0008-progressive-multi-module-evolution-with-api-gateway-and-bff-.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0012-advanced-authorization-rbac-abac-strategy.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0021-high-performance-authentication-graph-compilation.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0022-contextual-authentication-and-pluggable-output-projections.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0023-centralized-authorization-core-strategy.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0026-adaptive-mfa-and-passwordless-platform.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0027-dual-protocol-api-strategy-rest-grpc.rules.json +28 -0
- package/rulesets/adr/generated/adr-nodejs-0029-adoption-of-tactical-ddd-primitives-library.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0038-enterprise-error-handling-result-pattern-strategy.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0043-data-access-and-orm-strategy-for-node-js.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0044-frontend-clean-architecture-layer-boundaries-react.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0045-frontend-state-management-zustand-tanstack-query-dual-strate.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0046-prohibition-of-raw-technical-identifiers-in-user-interfaces.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0047-actionable-user-error-contract-and-correlated-diagnostics.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0048-feature-flag-system-scope-and-structured-criteria-model.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0074-monorepo-orchestration-with-nx.rules.json +29 -0
- package/rulesets/adr/generated/adr-nodejs-0075-application-gateway-bff-with-nestjs.rules.json +29 -0
- package/rulesets/architecture/README.es.md +21 -0
- package/rulesets/architecture/README.md +21 -0
- package/rulesets/architecture/opa/progressive-axis.rego +50 -0
- package/rulesets/cli/README.es.md +17 -0
- package/rulesets/cli/README.md +17 -0
- package/rulesets/cli/core-parity.rules.json +61 -0
- package/rulesets/cli/release-readiness.rules.json +77 -0
- package/rulesets/compliance-baseline/README.es.md +26 -0
- package/rulesets/compliance-baseline/README.md +26 -0
- package/rulesets/compliance-baseline/compliance-baseline.rules.json +81 -0
- package/rulesets/contracts/README.es.md +19 -0
- package/rulesets/contracts/README.md +19 -0
- package/rulesets/contracts/evolith-machine-contracts.json +29 -0
- package/rulesets/contracts/fixtures/gate-evidence.success.json +10 -0
- package/rulesets/contracts/fixtures/output-envelope.success.json +23 -0
- package/rulesets/cross-cutting/README.es.md +14 -0
- package/rulesets/cross-cutting/README.md +14 -0
- package/rulesets/cross-cutting/compliance-baseline.rules.json +81 -0
- package/rulesets/cross-cutting/definition-of-done.rules.json +135 -0
- package/rulesets/cross-cutting/engineering-manifesto.rules.json +145 -0
- package/rulesets/cross-cutting/repository-taxonomy.rules.json +172 -0
- package/rulesets/definition-of-done/README.es.md +26 -0
- package/rulesets/definition-of-done/README.md +26 -0
- package/rulesets/definition-of-done/definition-of-done.rules.json +135 -0
- package/rulesets/engineering-manifesto/README.es.md +26 -0
- package/rulesets/engineering-manifesto/README.md +26 -0
- package/rulesets/engineering-manifesto/engineering-manifesto.rules.json +145 -0
- package/rulesets/evidence/README.es.md +12 -0
- package/rulesets/evidence/README.md +12 -0
- package/rulesets/evidence/evidence-manifest.rules.json +48 -0
- package/rulesets/executive-scorecards/executive-scorecards.rules.es.json +213 -0
- package/rulesets/executive-scorecards/executive-scorecards.rules.json +213 -0
- package/rulesets/governance/README.es.md +13 -0
- package/rulesets/governance/README.md +13 -0
- package/rulesets/governance/abac-mcp-access.rules.es.json +41 -0
- package/rulesets/governance/abac-mcp-access.rules.json +41 -0
- package/rulesets/governance/executive-scorecards.rules.es.json +213 -0
- package/rulesets/governance/executive-scorecards.rules.json +213 -0
- package/rulesets/governance/inheritance.rules.json +115 -0
- package/rulesets/governance/knowledge-intake.rules.json +18 -0
- package/rulesets/governance/open-core-boundary.rules.es.json +148 -0
- package/rulesets/governance/open-core-boundary.rules.json +148 -0
- package/rulesets/governance/satellite-contracts.rules.json +183 -0
- package/rulesets/infrastructure/helm-enforcement.rules.json +21 -0
- package/rulesets/infrastructure/opa/helm-enforcement.rego +25 -0
- package/rulesets/infrastructure/opa/helm-enforcement.test.rego +31 -0
- package/rulesets/infrastructure/opa/opa-sidecar-bundle.rego +115 -0
- package/rulesets/infrastructure/opa/opa-sidecar-bundle.test.rego +66 -0
- package/rulesets/infrastructure/opa-sidecar-bundle.rules.json +18 -0
- package/rulesets/mcp/README.es.md +12 -0
- package/rulesets/mcp/README.md +12 -0
- package/rulesets/mcp/protocol-compliance.rules.json +57 -0
- package/rulesets/observability/README.es.md +12 -0
- package/rulesets/observability/README.md +12 -0
- package/rulesets/observability/telemetry-evidence.rules.json +48 -0
- package/rulesets/opa/README.es.md +22 -0
- package/rulesets/opa/README.md +22 -0
- package/rulesets/opa/abac-mcp-tool-access.rego +122 -0
- package/rulesets/opa/abac-mcp-tool-access.test.rego +33 -0
- package/rulesets/opa/anti-corruption-layer.rego +39 -0
- package/rulesets/opa/anti-corruption-layer.test.rego +118 -0
- package/rulesets/opa/ci-cd.rego +41 -0
- package/rulesets/opa/ci-cd.test.rego +23 -0
- package/rulesets/opa/cicd-quality-gates.rego +29 -0
- package/rulesets/opa/cicd-quality-gates.test.rego +54 -0
- package/rulesets/opa/cli-core-parity.rego +17 -0
- package/rulesets/opa/cli-core-parity.test.rego +39 -0
- package/rulesets/opa/cli-readiness.rego +32 -0
- package/rulesets/opa/cli-readiness.test.rego +23 -0
- package/rulesets/opa/cli-release-readiness.rego +21 -0
- package/rulesets/opa/cli-release-readiness.test.rego +46 -0
- package/rulesets/opa/compliance-baseline.rego +95 -0
- package/rulesets/opa/compliance-baseline.test.rego +89 -0
- package/rulesets/opa/dod.rego +42 -0
- package/rulesets/opa/dod.test.rego +250 -0
- package/rulesets/opa/engineering-manifesto.rego +78 -0
- package/rulesets/opa/engineering-manifesto.test.rego +133 -0
- package/rulesets/opa/evidence.rego +64 -0
- package/rulesets/opa/evidence.test.rego +23 -0
- package/rulesets/opa/executive-scorecards.rego +41 -0
- package/rulesets/opa/executive-scorecards.test.rego +60 -0
- package/rulesets/opa/gitflow-branching.rego +41 -0
- package/rulesets/opa/gitflow-branching.test.rego +60 -0
- package/rulesets/opa/governance.rego +39 -0
- package/rulesets/opa/governance.test.rego +23 -0
- package/rulesets/opa/hexagonal-architecture.rego +33 -0
- package/rulesets/opa/hexagonal-architecture.test.rego +57 -0
- package/rulesets/opa/infrastructure/helm-enforcement.rego +33 -0
- package/rulesets/opa/infrastructure/opa-sidecar-bundle.rego +42 -0
- package/rulesets/opa/knowledge-intake.rego +98 -0
- package/rulesets/opa/knowledge-intake.test.rego +50 -0
- package/rulesets/opa/main.rego +147 -0
- package/rulesets/opa/main_test.rego +149 -0
- package/rulesets/opa/mcp.rego +61 -0
- package/rulesets/opa/mcp.test.rego +27 -0
- package/rulesets/opa/multi-runtime.rego +33 -0
- package/rulesets/opa/multi-runtime.test.rego +53 -0
- package/rulesets/opa/multi-tenancy.rego +33 -0
- package/rulesets/opa/multi-tenancy.test.rego +53 -0
- package/rulesets/opa/open-core-boundary.rego +33 -0
- package/rulesets/opa/open-core-boundary.test.rego +60 -0
- package/rulesets/opa/protocol-selection.rego +29 -0
- package/rulesets/opa/protocol-selection.test.rego +46 -0
- package/rulesets/opa/rbac/gate-role-enforcement.rego +112 -0
- package/rulesets/opa/repository-taxonomy.rego +98 -0
- package/rulesets/opa/repository-taxonomy.test.rego +91 -0
- package/rulesets/opa/satellite-contracts.rego +42 -0
- package/rulesets/opa/satellite-contracts.test.rego +70 -0
- package/rulesets/opa/schemas/abac-mcp-tool-access.input.schema.json +21 -0
- package/rulesets/opa/schemas/anti-corruption-layer.input.schema.json +25 -0
- package/rulesets/opa/schemas/ci-cd.input.schema.json +27 -0
- package/rulesets/opa/schemas/cicd-quality-gates.input.schema.json +33 -0
- package/rulesets/opa/schemas/cli-core-parity.input.schema.json +30 -0
- package/rulesets/opa/schemas/cli-readiness.input.schema.json +28 -0
- package/rulesets/opa/schemas/cli-release-readiness.input.schema.json +26 -0
- package/rulesets/opa/schemas/compliance-baseline.input.schema.json +25 -0
- package/rulesets/opa/schemas/dod.input.schema.json +38 -0
- package/rulesets/opa/schemas/engineering-manifesto.input.schema.json +24 -0
- package/rulesets/opa/schemas/evidence.input.schema.json +35 -0
- package/rulesets/opa/schemas/executive-scorecards.input.schema.json +36 -0
- package/rulesets/opa/schemas/gitflow-branching.input.schema.json +36 -0
- package/rulesets/opa/schemas/governance.input.schema.json +19 -0
- package/rulesets/opa/schemas/hexagonal-architecture.input.schema.json +46 -0
- package/rulesets/opa/schemas/knowledge-intake.input.schema.json +57 -0
- package/rulesets/opa/schemas/mcp.input.schema.json +38 -0
- package/rulesets/opa/schemas/multi-runtime.input.schema.json +27 -0
- package/rulesets/opa/schemas/multi-tenancy.input.schema.json +27 -0
- package/rulesets/opa/schemas/open-core-boundary.input.schema.json +36 -0
- package/rulesets/opa/schemas/protocol-selection.input.schema.json +26 -0
- package/rulesets/opa/schemas/repository-taxonomy.input.schema.json +18 -0
- package/rulesets/opa/schemas/satellite-contracts.input.schema.json +38 -0
- package/rulesets/opa/schemas/taxonomy.input.schema.json +27 -0
- package/rulesets/opa/schemas/testing-pyramid.input.schema.json +42 -0
- package/rulesets/opa/schemas/version-pinning.input.schema.json +39 -0
- package/rulesets/opa/sdlc/coverage.rego +49 -0
- package/rulesets/opa/sdlc/coverage.test.rego +29 -0
- package/rulesets/opa/sdlc/pyramid-distribution.rego +31 -0
- package/rulesets/opa/sdlc/pyramid-distribution.test.rego +33 -0
- package/rulesets/opa/taxonomy.rego +51 -0
- package/rulesets/opa/taxonomy.test.rego +28 -0
- package/rulesets/opa/telemetry-evidence.rego +102 -0
- package/rulesets/opa/testing-pyramid.rego +49 -0
- package/rulesets/opa/testing-pyramid.test.rego +81 -0
- package/rulesets/opa/version-pinning.rego +99 -0
- package/rulesets/opa/version-pinning.test.rego +28 -0
- package/rulesets/phase-gates/README.es.md +28 -0
- package/rulesets/phase-gates/README.md +28 -0
- package/rulesets/phase-gates/phase-gates.rules.json +297 -0
- package/rulesets/quality-thresholds/README.es.md +28 -0
- package/rulesets/quality-thresholds/README.md +28 -0
- package/rulesets/quality-thresholds/quality-thresholds.rules.json +96 -0
- package/rulesets/repository-taxonomy/README.es.md +26 -0
- package/rulesets/repository-taxonomy/README.md +26 -0
- package/rulesets/repository-taxonomy/repository-taxonomy.rules.json +172 -0
- package/rulesets/satellite-contracts/README.es.md +27 -0
- package/rulesets/satellite-contracts/README.md +27 -0
- package/rulesets/satellite-contracts/satellite-contracts.rules.json +183 -0
- package/rulesets/schema/README.es.md +39 -0
- package/rulesets/schema/README.md +39 -0
- package/rulesets/schema/adr.schema.json +138 -0
- package/rulesets/schema/agile-backlog.schema.json +91 -0
- package/rulesets/schema/ballpark-estimation.schema.json +109 -0
- package/rulesets/schema/build-vs-compose.schema.json +98 -0
- package/rulesets/schema/cli-impact-analysis.schema.json +114 -0
- package/rulesets/schema/discovery-canvas.schema.json +92 -0
- package/rulesets/schema/evolith-user-story.schema.json +105 -0
- package/rulesets/schema/evolith-yaml.schema.json +191 -0
- package/rulesets/schema/functional-story.schema.json +111 -0
- package/rulesets/schema/gate-evidence.schema.json +85 -0
- package/rulesets/schema/integration-evidence.schema.json +47 -0
- package/rulesets/schema/knowledge-intake.schema.json +67 -0
- package/rulesets/schema/knowledge-projection.schema.json +24 -0
- package/rulesets/schema/maturity-evidence.schema.json +59 -0
- package/rulesets/schema/observability-validation.schema.json +85 -0
- package/rulesets/schema/on-call-handoff.schema.json +91 -0
- package/rulesets/schema/output-envelope.schema.json +102 -0
- package/rulesets/schema/prd.schema.json +117 -0
- package/rulesets/schema/release-notes.schema.json +138 -0
- package/rulesets/schema/rollback-rehearsal.schema.json +73 -0
- package/rulesets/schema/ruleset-sdlc.schema.json +59 -0
- package/rulesets/schema/ruleset-standard.schema.json +73 -0
- package/rulesets/schema/security-scan-report.schema.json +79 -0
- package/rulesets/schema/source-registry.schema.json +51 -0
- package/rulesets/schema/technical-feasibility.schema.json +66 -0
- package/rulesets/schema/technical-story.schema.json +112 -0
- package/rulesets/schema/test-summary-report.schema.json +158 -0
- package/rulesets/schema/topology-composition.schema.json +43 -0
- package/rulesets/schema/topology-manifest.schema.json +421 -0
- package/rulesets/sdlc/README.es.md +12 -0
- package/rulesets/sdlc/README.md +12 -0
- package/rulesets/sdlc/default-workflow.yaml +73 -0
- package/rulesets/sdlc/dependency-pinning.rules.json +183 -0
- package/rulesets/sdlc/phase-gates.rules.json +297 -0
- package/rulesets/sdlc/quality-thresholds.rules.json +96 -0
- package/rulesets/topologies/README.es.md +42 -0
- package/rulesets/topologies/README.md +42 -0
- package/rulesets/topologies/agentic-ai/README.es.md +142 -0
- package/rulesets/topologies/agentic-ai/README.md +142 -0
- package/rulesets/topologies/agentic-ai/adoption.es.md +37 -0
- package/rulesets/topologies/agentic-ai/adoption.md +37 -0
- package/rulesets/topologies/agentic-ai/agent.config.schema.json +100 -0
- package/rulesets/topologies/agentic-ai/agentic-ai.rego +46 -0
- package/rulesets/topologies/agentic-ai/agentic-ai.rules.json +109 -0
- package/rulesets/topologies/agentic-ai/agentic-ai.test.rego +68 -0
- package/rulesets/topologies/agentic-ai/agentic-ai.wasm +0 -0
- package/rulesets/topologies/agentic-ai/cli/cli-flows.es.md +35 -0
- package/rulesets/topologies/agentic-ai/cli/cli-flows.md +45 -0
- package/rulesets/topologies/agentic-ai/evidence.es.md +25 -0
- package/rulesets/topologies/agentic-ai/evidence.md +25 -0
- package/rulesets/topologies/agentic-ai/evolution.es.md +26 -0
- package/rulesets/topologies/agentic-ai/evolution.md +26 -0
- package/rulesets/topologies/agentic-ai/fixtures/invalid-agent.config.json +48 -0
- package/rulesets/topologies/agentic-ai/fixtures/valid-agent.config.json +48 -0
- package/rulesets/topologies/agentic-ai/maturity.es.md +33 -0
- package/rulesets/topologies/agentic-ai/maturity.md +33 -0
- package/rulesets/topologies/agentic-ai/mcp/mcp-manifest.json +100 -0
- package/rulesets/topologies/agentic-ai/openapi/openapi.yaml +187 -0
- package/rulesets/topologies/agentic-ai/operations.es.md +32 -0
- package/rulesets/topologies/agentic-ai/operations.md +32 -0
- package/rulesets/topologies/agentic-ai/parity-fixtures/compliant.json +18 -0
- package/rulesets/topologies/agentic-ai/parity-fixtures/violation.json +22 -0
- package/rulesets/topologies/agentic-ai/patterns.es.md +32 -0
- package/rulesets/topologies/agentic-ai/patterns.md +32 -0
- package/rulesets/topologies/agentic-ai/resilience.es.md +26 -0
- package/rulesets/topologies/agentic-ai/resilience.md +26 -0
- package/rulesets/topologies/agentic-ai/runbooks.es.md +48 -0
- package/rulesets/topologies/agentic-ai/runbooks.md +48 -0
- package/rulesets/topologies/agentic-ai/security.es.md +26 -0
- package/rulesets/topologies/agentic-ai/security.md +26 -0
- package/rulesets/topologies/agentic-ai/topology.manifest.json +127 -0
- package/rulesets/topologies/data-mesh/README.es.md +69 -0
- package/rulesets/topologies/data-mesh/README.md +69 -0
- package/rulesets/topologies/data-mesh/adoption.es.md +95 -0
- package/rulesets/topologies/data-mesh/adoption.md +95 -0
- package/rulesets/topologies/data-mesh/cli/cli-flows.es.md +41 -0
- package/rulesets/topologies/data-mesh/cli/cli-flows.md +53 -0
- package/rulesets/topologies/data-mesh/data-mesh.rego +11 -0
- package/rulesets/topologies/data-mesh/data-mesh.rules.json +100 -0
- package/rulesets/topologies/data-mesh/data-mesh.test.rego +107 -0
- package/rulesets/topologies/data-mesh/data-mesh.wasm +0 -0
- package/rulesets/topologies/data-mesh/evidence.es.md +111 -0
- package/rulesets/topologies/data-mesh/evidence.md +111 -0
- package/rulesets/topologies/data-mesh/evolution.es.md +67 -0
- package/rulesets/topologies/data-mesh/evolution.md +67 -0
- package/rulesets/topologies/data-mesh/fixtures/invalid.topology.config.json +12 -0
- package/rulesets/topologies/data-mesh/fixtures/valid.topology.config.json +12 -0
- package/rulesets/topologies/data-mesh/maturity.es.md +36 -0
- package/rulesets/topologies/data-mesh/maturity.md +36 -0
- package/rulesets/topologies/data-mesh/mcp/mcp-manifest.json +68 -0
- package/rulesets/topologies/data-mesh/openapi/openapi.yaml +186 -0
- package/rulesets/topologies/data-mesh/operations.es.md +63 -0
- package/rulesets/topologies/data-mesh/operations.md +63 -0
- package/rulesets/topologies/data-mesh/parity-fixtures/compliant.json +18 -0
- package/rulesets/topologies/data-mesh/parity-fixtures/violation.json +21 -0
- package/rulesets/topologies/data-mesh/patterns.es.md +67 -0
- package/rulesets/topologies/data-mesh/patterns.md +67 -0
- package/rulesets/topologies/data-mesh/resilience.es.md +64 -0
- package/rulesets/topologies/data-mesh/resilience.md +64 -0
- package/rulesets/topologies/data-mesh/runbooks.es.md +147 -0
- package/rulesets/topologies/data-mesh/runbooks.md +147 -0
- package/rulesets/topologies/data-mesh/security.es.md +66 -0
- package/rulesets/topologies/data-mesh/security.md +66 -0
- package/rulesets/topologies/data-mesh/topology.config.schema.json +30 -0
- package/rulesets/topologies/data-mesh/topology.manifest.json +107 -0
- package/rulesets/topologies/edge-computing/README.es.md +81 -0
- package/rulesets/topologies/edge-computing/README.md +81 -0
- package/rulesets/topologies/edge-computing/adoption.es.md +268 -0
- package/rulesets/topologies/edge-computing/adoption.md +268 -0
- package/rulesets/topologies/edge-computing/cli/cli-flows.es.md +41 -0
- package/rulesets/topologies/edge-computing/cli/cli-flows.md +53 -0
- package/rulesets/topologies/edge-computing/edge-computing.rego +41 -0
- package/rulesets/topologies/edge-computing/edge-computing.rules.json +50 -0
- package/rulesets/topologies/edge-computing/edge-computing.test.rego +33 -0
- package/rulesets/topologies/edge-computing/edge-computing.wasm +0 -0
- package/rulesets/topologies/edge-computing/evidence.es.md +263 -0
- package/rulesets/topologies/edge-computing/evidence.md +263 -0
- package/rulesets/topologies/edge-computing/evolution.es.md +257 -0
- package/rulesets/topologies/edge-computing/evolution.md +257 -0
- package/rulesets/topologies/edge-computing/fixtures/invalid.topology.config.json +6 -0
- package/rulesets/topologies/edge-computing/fixtures/valid.topology.config.json +6 -0
- package/rulesets/topologies/edge-computing/maturity.es.md +36 -0
- package/rulesets/topologies/edge-computing/maturity.md +36 -0
- package/rulesets/topologies/edge-computing/mcp/mcp-manifest.json +72 -0
- package/rulesets/topologies/edge-computing/openapi/openapi.yaml +187 -0
- package/rulesets/topologies/edge-computing/operations.es.md +148 -0
- package/rulesets/topologies/edge-computing/operations.md +148 -0
- package/rulesets/topologies/edge-computing/parity-fixtures/compliant.json +12 -0
- package/rulesets/topologies/edge-computing/parity-fixtures/violation.json +13 -0
- package/rulesets/topologies/edge-computing/patterns.es.md +291 -0
- package/rulesets/topologies/edge-computing/patterns.md +290 -0
- package/rulesets/topologies/edge-computing/resilience.es.md +232 -0
- package/rulesets/topologies/edge-computing/resilience.md +229 -0
- package/rulesets/topologies/edge-computing/runbooks.es.md +405 -0
- package/rulesets/topologies/edge-computing/runbooks.md +405 -0
- package/rulesets/topologies/edge-computing/security.es.md +218 -0
- package/rulesets/topologies/edge-computing/security.md +218 -0
- package/rulesets/topologies/edge-computing/topology.config.schema.json +13 -0
- package/rulesets/topologies/edge-computing/topology.manifest.json +113 -0
- package/rulesets/topologies/event-driven/README.es.md +71 -0
- package/rulesets/topologies/event-driven/README.md +71 -0
- package/rulesets/topologies/event-driven/adoption.es.md +67 -0
- package/rulesets/topologies/event-driven/adoption.md +67 -0
- package/rulesets/topologies/event-driven/cli/cli-flows.es.md +41 -0
- package/rulesets/topologies/event-driven/cli/cli-flows.md +53 -0
- package/rulesets/topologies/event-driven/event-driven.rego +11 -0
- package/rulesets/topologies/event-driven/event-driven.rules.json +100 -0
- package/rulesets/topologies/event-driven/event-driven.test.rego +107 -0
- package/rulesets/topologies/event-driven/event-driven.wasm +0 -0
- package/rulesets/topologies/event-driven/evidence.es.md +69 -0
- package/rulesets/topologies/event-driven/evidence.md +69 -0
- package/rulesets/topologies/event-driven/evolution.es.md +59 -0
- package/rulesets/topologies/event-driven/evolution.md +59 -0
- package/rulesets/topologies/event-driven/fixtures/invalid.topology.config.json +12 -0
- package/rulesets/topologies/event-driven/fixtures/valid.topology.config.json +12 -0
- package/rulesets/topologies/event-driven/maturity.es.md +36 -0
- package/rulesets/topologies/event-driven/maturity.md +36 -0
- package/rulesets/topologies/event-driven/mcp/mcp-manifest.json +68 -0
- package/rulesets/topologies/event-driven/openapi/openapi.yaml +186 -0
- package/rulesets/topologies/event-driven/operations.es.md +67 -0
- package/rulesets/topologies/event-driven/operations.md +67 -0
- package/rulesets/topologies/event-driven/parity-fixtures/compliant.json +18 -0
- package/rulesets/topologies/event-driven/parity-fixtures/violation.json +21 -0
- package/rulesets/topologies/event-driven/patterns.es.md +68 -0
- package/rulesets/topologies/event-driven/patterns.md +68 -0
- package/rulesets/topologies/event-driven/resilience.es.md +65 -0
- package/rulesets/topologies/event-driven/resilience.md +65 -0
- package/rulesets/topologies/event-driven/runbooks.es.md +79 -0
- package/rulesets/topologies/event-driven/runbooks.md +79 -0
- package/rulesets/topologies/event-driven/security.es.md +59 -0
- package/rulesets/topologies/event-driven/security.md +59 -0
- package/rulesets/topologies/event-driven/topology.config.schema.json +30 -0
- package/rulesets/topologies/event-driven/topology.manifest.json +109 -0
- package/rulesets/topologies/progressive-axis/distributed-modules/distributed-modules.rules.es.json +111 -0
- package/rulesets/topologies/progressive-axis/distributed-modules/distributed-modules.rules.json +111 -0
- package/rulesets/topologies/progressive-axis/microservices/microservices.rules.es.json +106 -0
- package/rulesets/topologies/progressive-axis/microservices/microservices.rules.json +106 -0
- package/rulesets/topologies/progressive-axis/modular-monolith/modular-monolith.rules.es.json +148 -0
- package/rulesets/topologies/progressive-axis/modular-monolith/modular-monolith.rules.json +148 -0
- package/rulesets/topologies/serverless/README.es.md +74 -0
- package/rulesets/topologies/serverless/README.md +74 -0
- package/rulesets/topologies/serverless/adoption.es.md +50 -0
- package/rulesets/topologies/serverless/adoption.md +50 -0
- package/rulesets/topologies/serverless/cli/cli-flows.es.md +41 -0
- package/rulesets/topologies/serverless/cli/cli-flows.md +53 -0
- package/rulesets/topologies/serverless/evidence.es.md +66 -0
- package/rulesets/topologies/serverless/evidence.md +66 -0
- package/rulesets/topologies/serverless/evolution.es.md +36 -0
- package/rulesets/topologies/serverless/evolution.md +36 -0
- package/rulesets/topologies/serverless/fixtures/invalid.topology.config.json +6 -0
- package/rulesets/topologies/serverless/fixtures/valid.topology.config.json +6 -0
- package/rulesets/topologies/serverless/maturity.es.md +36 -0
- package/rulesets/topologies/serverless/maturity.md +36 -0
- package/rulesets/topologies/serverless/mcp/mcp-manifest.json +72 -0
- package/rulesets/topologies/serverless/openapi/openapi.yaml +186 -0
- package/rulesets/topologies/serverless/operations.es.md +36 -0
- package/rulesets/topologies/serverless/operations.md +36 -0
- package/rulesets/topologies/serverless/parity-fixtures/compliant.json +13 -0
- package/rulesets/topologies/serverless/parity-fixtures/violation.json +15 -0
- package/rulesets/topologies/serverless/patterns.es.md +36 -0
- package/rulesets/topologies/serverless/patterns.md +36 -0
- package/rulesets/topologies/serverless/resilience.es.md +36 -0
- package/rulesets/topologies/serverless/resilience.md +36 -0
- package/rulesets/topologies/serverless/runbooks.es.md +68 -0
- package/rulesets/topologies/serverless/runbooks.md +68 -0
- package/rulesets/topologies/serverless/security.es.md +36 -0
- package/rulesets/topologies/serverless/security.md +36 -0
- package/rulesets/topologies/serverless/serverless.rego +32 -0
- package/rulesets/topologies/serverless/serverless.rules.json +33 -0
- package/rulesets/topologies/serverless/serverless.test.rego +28 -0
- package/rulesets/topologies/serverless/serverless.wasm +0 -0
- package/rulesets/topologies/serverless/topology.config.schema.json +28 -0
- package/rulesets/topologies/serverless/topology.manifest.json +114 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Guía de Patrones de Computación en el Borde
|
|
2
|
+
|
|
3
|
+
> **Navegación Bilingüe:** [English](./patterns.md) | [Español](./patterns.es.md)
|
|
4
|
+
|
|
5
|
+
**Propietario:** Ingeniería de Plataforma
|
|
6
|
+
**Topología:** Computación en el Borde
|
|
7
|
+
|
|
8
|
+
## Funciones del Borde
|
|
9
|
+
|
|
10
|
+
Las funciones del borde ejecutan código del lado del servidor más cercano al cliente, reduciendo la latencia y mejorando la experiencia del usuario.
|
|
11
|
+
|
|
12
|
+
### Ciclo de Vida de la Función
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Solicitud → Enrutador de Funciones → Función del Borde → Respuesta
|
|
16
|
+
↓
|
|
17
|
+
Inicio en Frío (si es necesario)
|
|
18
|
+
↓
|
|
19
|
+
Inicializar Runtime
|
|
20
|
+
↓
|
|
21
|
+
Ejecutar Handler
|
|
22
|
+
↓
|
|
23
|
+
Devolver Respuesta
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Plantillas de Funciones
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// Función básica del borde
|
|
30
|
+
export default async function handler(request) {
|
|
31
|
+
const { url, method, headers } = request;
|
|
32
|
+
|
|
33
|
+
// Procesar en el borde
|
|
34
|
+
const response = await processRequest(request);
|
|
35
|
+
|
|
36
|
+
return new Response(response.body, {
|
|
37
|
+
status: 200,
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
'X-Edge-Location': process.env.EDGE_LOCATION,
|
|
41
|
+
'X-Edge-Node': process.env.EDGE_NODE_ID
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Optimización de Inicio en Frío
|
|
48
|
+
|
|
49
|
+
| Estrategia | Tiempo de Inicio en Frío | Caso de Uso |
|
|
50
|
+
|------------|-------------------------|-------------|
|
|
51
|
+
| Instancias pre-calentadas | < 50ms | Funciones de alto tráfico |
|
|
52
|
+
| Restauración de instantánea | < 100ms | Funciones de tráfico medio |
|
|
53
|
+
| Inicialización lazy | 200-500ms | Funciones de bajo tráfico |
|
|
54
|
+
| Dependencias empaquetadas | < 100ms | Todas las funciones |
|
|
55
|
+
|
|
56
|
+
## Integración CDN
|
|
57
|
+
|
|
58
|
+
La computación en el borde extiende las capacidades CDN tradicionales con procesamiento de contenido dinámico.
|
|
59
|
+
|
|
60
|
+
### Arquitectura CDN + Borde
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
┌─────────────────────────────────────────────────┐
|
|
64
|
+
│ Capa de Borde CDN │
|
|
65
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
|
|
66
|
+
│ │ Caché │ │ Cómputo del │ │Almacenam.│ │
|
|
67
|
+
│ │ Estático │ │ Borde │ │ del Borde│ │
|
|
68
|
+
│ │ (Activos) │ │ (Funciones) │ │ │ │
|
|
69
|
+
│ └─────────────┘ └─────────────┘ └─────────┘ │
|
|
70
|
+
└─────────────────────────────────────────────────┘
|
|
71
|
+
│
|
|
72
|
+
┌────┴────┐
|
|
73
|
+
│ Origen │
|
|
74
|
+
└─────────┘
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Integración Caché-Cómputo
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
cdn_edge:
|
|
81
|
+
routes:
|
|
82
|
+
- path: "/static/*"
|
|
83
|
+
handler: "cache-serve"
|
|
84
|
+
cache_ttl: 3600s
|
|
85
|
+
- path: "/api/*"
|
|
86
|
+
handler: "edge-function"
|
|
87
|
+
cache_ttl: 0s
|
|
88
|
+
- path: "/dynamic/*"
|
|
89
|
+
handler: "edge-compute"
|
|
90
|
+
cache_ttl: 60s
|
|
91
|
+
stale_while_revalidate: 30s
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Datos Primero Local
|
|
95
|
+
|
|
96
|
+
La arquitectura de datos primero local prioriza el almacenamiento local y la sincronización sobre las bases de datos centralizadas.
|
|
97
|
+
|
|
98
|
+
### Flujo de Datos
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Aplicación → Almacén Local → Sincronización en Segundo Plano → Origen
|
|
102
|
+
↓ (lectura)
|
|
103
|
+
Consulta Local (rápida)
|
|
104
|
+
↓ (escritura)
|
|
105
|
+
Escritura Local → Cola → Sincronización
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Patrones de Almacenamiento Local
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
// Wrapper de IndexedDB para datos primero local
|
|
112
|
+
class LocalFirstDB {
|
|
113
|
+
constructor(dbName) {
|
|
114
|
+
this.db = await openDB(dbName, 1, {
|
|
115
|
+
upgrade(db) {
|
|
116
|
+
db.createObjectStore('documents', { keyPath: 'id' });
|
|
117
|
+
db.createObjectStore('sync-queue', { autoIncrement: true });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async read(id) {
|
|
123
|
+
// Leer del almacén local primero
|
|
124
|
+
const local = await this.db.get('documents', id);
|
|
125
|
+
if (local) return local;
|
|
126
|
+
|
|
127
|
+
// Conmutar a la red si no está en el almacén local
|
|
128
|
+
const remote = await fetchFromOrigin(id);
|
|
129
|
+
await this.db.put('documents', remote);
|
|
130
|
+
return remote;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async write(data) {
|
|
134
|
+
// Escribir localmente primero
|
|
135
|
+
await this.db.put('documents', data);
|
|
136
|
+
|
|
137
|
+
// Encolar para sincronización
|
|
138
|
+
await this.db.add('sync-queue', {
|
|
139
|
+
type: 'write',
|
|
140
|
+
data,
|
|
141
|
+
timestamp: Date.now()
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Service Workers
|
|
148
|
+
|
|
149
|
+
Los service workers habilitan capacidades sin conexión y procesamiento en segundo plano en el borde.
|
|
150
|
+
|
|
151
|
+
### Arquitectura de Service Worker
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
┌─────────────────────────────────────────────┐
|
|
155
|
+
│ Navegador / Runtime del Borde │
|
|
156
|
+
│ ┌─────────────────────────────────────┐ │
|
|
157
|
+
│ │ Service Worker │ │
|
|
158
|
+
│ │ - Intercepción de solicitudes │ │
|
|
159
|
+
│ │ - Gestión de caché │ │
|
|
160
|
+
│ │ - Sincronización en segundo plano │ │
|
|
161
|
+
│ │ - Notificaciones push │ │
|
|
162
|
+
│ └─────────────────────────────────────┘ │
|
|
163
|
+
└─────────────────────────────────────────────┘
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Registro de Service Worker
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
// Registrar service worker
|
|
170
|
+
if ('serviceWorker' in navigator) {
|
|
171
|
+
navigator.serviceWorker.register('/sw.js', {
|
|
172
|
+
scope: '/',
|
|
173
|
+
type: 'module'
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// sw.js
|
|
178
|
+
self.addEventListener('fetch', (event) => {
|
|
179
|
+
event.respondWith(
|
|
180
|
+
caches.match(event.request)
|
|
181
|
+
.then(response => response || fetch(event.request))
|
|
182
|
+
);
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Sincronización Write-Behind
|
|
187
|
+
|
|
188
|
+
La sincronización write-behind reconoce las escrituras localmente y sincroniza asincrónicamente con el origen.
|
|
189
|
+
|
|
190
|
+
### Arquitectura Write-Behind
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
Escritura del Cliente → Almacén Local → Reconocer → Sincronización en Segundo Plano → Origen
|
|
194
|
+
↓
|
|
195
|
+
Registro WAL
|
|
196
|
+
↓
|
|
197
|
+
Detección de Conflictos
|
|
198
|
+
↓
|
|
199
|
+
Estrategia de Resolución
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Implementación
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
class WriteBehindSync {
|
|
206
|
+
constructor(localDB, syncQueue) {
|
|
207
|
+
this.localDB = localDB;
|
|
208
|
+
this.syncQueue = syncQueue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async write(key, value) {
|
|
212
|
+
// Escribir en el almacén local
|
|
213
|
+
await this.localDB.put(key, value);
|
|
214
|
+
|
|
215
|
+
// Agregar al registro WAL
|
|
216
|
+
const walEntry = await this.localDB.addToWAL({
|
|
217
|
+
key,
|
|
218
|
+
value,
|
|
219
|
+
timestamp: Date.now(),
|
|
220
|
+
status: 'pending'
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// Encolar para sincronización en segundo plano
|
|
224
|
+
await this.syncQueue.enqueue({
|
|
225
|
+
type: 'write-behind',
|
|
226
|
+
walEntryId: walEntry.id,
|
|
227
|
+
retryCount: 0
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
return { success: true, walEntryId: walEntry.id };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## CRDTs (Tipos de Datos Replicados sin Conflictos)
|
|
236
|
+
|
|
237
|
+
Los CRDTs permiten la resolución automática de conflictos sin coordinación.
|
|
238
|
+
|
|
239
|
+
### Tipos de CRDT
|
|
240
|
+
|
|
241
|
+
| Tipo | Operación | Caso de Uso |
|
|
242
|
+
|------|-----------|-------------|
|
|
243
|
+
| G-Counter | Incrementar | Conteos de likes, contadores de vistas |
|
|
244
|
+
| PN-Counter | Incrementar/Decrementar | Saldos, conteos de votos |
|
|
245
|
+
| G-Set | Agregar | Listas de etiquetas, listas de seguidores |
|
|
246
|
+
| OR-Set | Agregar/Eliminar | Carritos de compras, listas de usuarios |
|
|
247
|
+
| LWW-Register | Establecer | Preferencias de usuario |
|
|
248
|
+
| MV-Register | Establecer (multi-valor) | Edición colaborativa |
|
|
249
|
+
|
|
250
|
+
### Implementación de CRDT
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
// CRDT G-Counter para conteo distribuido
|
|
254
|
+
class GCounter {
|
|
255
|
+
constructor(nodeId) {
|
|
256
|
+
this.nodeId = nodeId;
|
|
257
|
+
this.counts = new Map();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
increment() {
|
|
261
|
+
const current = this.counts.get(this.nodeId) || 0;
|
|
262
|
+
this.counts.set(this.nodeId, current + 1);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
merge(other) {
|
|
266
|
+
for (const [node, count] of other.counts) {
|
|
267
|
+
const current = this.counts.get(node) || 0;
|
|
268
|
+
this.counts.set(node, Math.max(current, count));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
value() {
|
|
273
|
+
return Array.from(this.counts.values())
|
|
274
|
+
.reduce((sum, count) => sum + count, 0);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Sincronización de CRDT
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Configurar sincronización CRDT para nodos del borde
|
|
283
|
+
edge-cli crdt sync configure \
|
|
284
|
+
--type g-counter \
|
|
285
|
+
--sync-interval 5s \
|
|
286
|
+
--conflict-strategy merge \
|
|
287
|
+
--nodes "edge-node-01,edge-node-02,edge-node-03"
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
[Volver al Perfil de Computación en el Borde](./README.es.md)
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# Edge Computing — Patterns Guide
|
|
2
|
+
|
|
3
|
+
> **Bilingual Navigation:** [English](./patterns.md) | [Español](./patterns.es.md)
|
|
4
|
+
|
|
5
|
+
**Owner:** Platform Engineering
|
|
6
|
+
**Topology:** Edge Computing
|
|
7
|
+
|
|
8
|
+
## Edge Functions
|
|
9
|
+
|
|
10
|
+
Edge functions execute server-side code closest to the client, reducing latency and improving user experience.
|
|
11
|
+
|
|
12
|
+
### Function Lifecycle
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Request → Function Router → Edge Function → Response
|
|
16
|
+
↓
|
|
17
|
+
Cold Start (if needed)
|
|
18
|
+
↓
|
|
19
|
+
Initialize Runtime
|
|
20
|
+
↓
|
|
21
|
+
Execute Handler
|
|
22
|
+
↓
|
|
23
|
+
Return Response
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Function Templates
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// Basic edge function
|
|
30
|
+
export default async function handler(request) {
|
|
31
|
+
const { url, method, headers } = request;
|
|
32
|
+
|
|
33
|
+
// Process at the edge
|
|
34
|
+
const response = await processRequest(request);
|
|
35
|
+
|
|
36
|
+
return new Response(response.body, {
|
|
37
|
+
status: 200,
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
'X-Edge-Location': process.env.EDGE_LOCATION,
|
|
41
|
+
'X-Edge-Node': process.env.EDGE_NODE_ID
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Cold Start Optimization
|
|
48
|
+
|
|
49
|
+
| Strategy | Cold Start Time | Use Case |
|
|
50
|
+
|----------|-----------------|----------|
|
|
51
|
+
| Pre-warmed instances | < 50ms | High-traffic functions |
|
|
52
|
+
| Snapshot restore | < 100ms | Medium-traffic functions |
|
|
53
|
+
| Lazy initialization | 200-500ms | Low-traffic functions |
|
|
54
|
+
| Bundled dependencies | < 100ms | All functions |
|
|
55
|
+
|
|
56
|
+
## CDN Integration
|
|
57
|
+
|
|
58
|
+
Edge computing extends traditional CDN capabilities with dynamic content processing.
|
|
59
|
+
|
|
60
|
+
### CDN + Edge Architecture
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
┌─────────────────────────────────────────────────┐
|
|
64
|
+
│ CDN Edge Layer │
|
|
65
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
|
|
66
|
+
│ │ Static Cache│ │ Edge Compute│ │ Edge │ │
|
|
67
|
+
│ │ (Assets) │ │ (Functions) │ │ Storage │ │
|
|
68
|
+
│ └─────────────┘ └─────────────┘ └─────────┘ │
|
|
69
|
+
└─────────────────────────────────────────────────┘
|
|
70
|
+
│
|
|
71
|
+
┌────┴────┐
|
|
72
|
+
│ Origin │
|
|
73
|
+
└─────────┘
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Cache-Compute Integration
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
cdn_edge:
|
|
80
|
+
routes:
|
|
81
|
+
- path: "/static/*"
|
|
82
|
+
handler: "cache-serve"
|
|
83
|
+
cache_ttl: 3600s
|
|
84
|
+
- path: "/api/*"
|
|
85
|
+
handler: "edge-function"
|
|
86
|
+
cache_ttl: 0s
|
|
87
|
+
- path: "/dynamic/*"
|
|
88
|
+
handler: "edge-compute"
|
|
89
|
+
cache_ttl: 60s
|
|
90
|
+
stale_while_revalidate: 30s
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Local-First Data
|
|
94
|
+
|
|
95
|
+
Local-first data architecture prioritizes local storage and synchronization over centralized databases.
|
|
96
|
+
|
|
97
|
+
### Data Flow
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Application → Local Store → Background Sync → Origin
|
|
101
|
+
↓ (read)
|
|
102
|
+
Local Query (fast)
|
|
103
|
+
↓ (write)
|
|
104
|
+
Local Write → Queue → Sync
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Local Storage Patterns
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
// IndexedDB wrapper for local-first data
|
|
111
|
+
class LocalFirstDB {
|
|
112
|
+
constructor(dbName) {
|
|
113
|
+
this.db = await openDB(dbName, 1, {
|
|
114
|
+
upgrade(db) {
|
|
115
|
+
db.createObjectStore('documents', { keyPath: 'id' });
|
|
116
|
+
db.createObjectStore('sync-queue', { autoIncrement: true });
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async read(id) {
|
|
122
|
+
// Read from local store first
|
|
123
|
+
const local = await this.db.get('documents', id);
|
|
124
|
+
if (local) return local;
|
|
125
|
+
|
|
126
|
+
// Fallback to network if not in local store
|
|
127
|
+
const remote = await fetchFromOrigin(id);
|
|
128
|
+
await this.db.put('documents', remote);
|
|
129
|
+
return remote;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async write(data) {
|
|
133
|
+
// Write locally first
|
|
134
|
+
await this.db.put('documents', data);
|
|
135
|
+
|
|
136
|
+
// Queue for sync
|
|
137
|
+
await this.db.add('sync-queue', {
|
|
138
|
+
type: 'write',
|
|
139
|
+
data,
|
|
140
|
+
timestamp: Date.now()
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Service Workers
|
|
147
|
+
|
|
148
|
+
Service workers enable offline capabilities and background processing at the edge.
|
|
149
|
+
|
|
150
|
+
### Service Worker Architecture
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
┌─────────────────────────────────────────────┐
|
|
154
|
+
│ Browser / Edge Runtime │
|
|
155
|
+
│ ┌─────────────────────────────────────┐ │
|
|
156
|
+
│ │ Service Worker │ │
|
|
157
|
+
│ │ - Request interception │ │
|
|
158
|
+
│ │ - Cache management │ │
|
|
159
|
+
│ │ - Background sync │ │
|
|
160
|
+
│ │ - Push notifications │ │
|
|
161
|
+
│ └─────────────────────────────────────┘ │
|
|
162
|
+
└─────────────────────────────────────────────┘
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Service Worker Registration
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
// Register service worker
|
|
169
|
+
if ('serviceWorker' in navigator) {
|
|
170
|
+
navigator.serviceWorker.register('/sw.js', {
|
|
171
|
+
scope: '/',
|
|
172
|
+
type: 'module'
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// sw.js
|
|
177
|
+
self.addEventListener('fetch', (event) => {
|
|
178
|
+
event.respondWith(
|
|
179
|
+
caches.match(event.request)
|
|
180
|
+
.then(response => response || fetch(event.request))
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Write-Behind Sync
|
|
186
|
+
|
|
187
|
+
Write-behind sync acknowledges writes locally and synchronizes asynchronously to the origin.
|
|
188
|
+
|
|
189
|
+
### Write-Behind Architecture
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Client Write → Local Store → Acknowledge → Background Sync → Origin
|
|
193
|
+
↓
|
|
194
|
+
Write-Ahead Log
|
|
195
|
+
↓
|
|
196
|
+
Conflict Detection
|
|
197
|
+
↓
|
|
198
|
+
Resolution Strategy
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Implementation
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
class WriteBehindSync {
|
|
205
|
+
constructor(localDB, syncQueue) {
|
|
206
|
+
this.localDB = localDB;
|
|
207
|
+
this.syncQueue = syncQueue;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async write(key, value) {
|
|
211
|
+
// Write to local store
|
|
212
|
+
await this.localDB.put(key, value);
|
|
213
|
+
|
|
214
|
+
// Add to write-ahead log
|
|
215
|
+
const walEntry = await this.localDB.addToWAL({
|
|
216
|
+
key,
|
|
217
|
+
value,
|
|
218
|
+
timestamp: Date.now(),
|
|
219
|
+
status: 'pending'
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Queue for background sync
|
|
223
|
+
await this.syncQueue.enqueue({
|
|
224
|
+
type: 'write-behind',
|
|
225
|
+
walEntryId: walEntry.id,
|
|
226
|
+
retryCount: 0
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return { success: true, walEntryId: walEntry.id };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## CRDTs (Conflict-free Replicated Data Types)
|
|
235
|
+
|
|
236
|
+
CRDTs enable automatic conflict resolution without coordination.
|
|
237
|
+
|
|
238
|
+
### CRDT Types
|
|
239
|
+
|
|
240
|
+
| Type | Operation | Use Case |
|
|
241
|
+
|------|-----------|----------|
|
|
242
|
+
| G-Counter | Increment | Like counts, view counters |
|
|
243
|
+
| PN-Counter | Increment/Decrement | Balances, vote counts |
|
|
244
|
+
| G-Set | Add | Tag lists, follower lists |
|
|
245
|
+
| OR-Set | Add/Remove | Shopping carts, user lists |
|
|
246
|
+
| LWW-Register | Set | User preferences |
|
|
247
|
+
| MV-Register | Set (multi-value) | Collaborative editing |
|
|
248
|
+
|
|
249
|
+
### CRDT Implementation
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
// G-Counter CRDT for distributed counting
|
|
253
|
+
class GCounter {
|
|
254
|
+
constructor(nodeId) {
|
|
255
|
+
this.nodeId = nodeId;
|
|
256
|
+
this.counts = new Map();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
increment() {
|
|
260
|
+
const current = this.counts.get(this.nodeId) || 0;
|
|
261
|
+
this.counts.set(this.nodeId, current + 1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
merge(other) {
|
|
265
|
+
for (const [node, count] of other.counts) {
|
|
266
|
+
const current = this.counts.get(node) || 0;
|
|
267
|
+
this.counts.set(node, Math.max(current, count));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
value() {
|
|
272
|
+
return Array.from(this.counts.values())
|
|
273
|
+
.reduce((sum, count) => sum + count, 0);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### CRDT Synchronization
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
# Configure CRDT sync for edge nodes
|
|
282
|
+
edge-cli crdt sync configure \
|
|
283
|
+
--type g-counter \
|
|
284
|
+
--sync-interval 5s \
|
|
285
|
+
--conflict-strategy merge \
|
|
286
|
+
--nodes "edge-node-01,edge-node-02,edge-node-03"
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
[Back to Edge Computing Profile](./README.md)
|