blockmine 1.20.0 → 1.22.0
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/.claude/agents/README.md +469 -0
- package/.claude/agents/auth-route-debugger.md +118 -0
- package/.claude/agents/auth-route-tester.md +93 -0
- package/.claude/agents/auto-error-resolver.md +97 -0
- package/.claude/agents/build-optimizer.md +236 -0
- package/.claude/agents/code-architecture-reviewer.md +83 -0
- package/.claude/agents/code-refactor-master.md +94 -0
- package/.claude/agents/cost-optimizer.md +134 -0
- package/.claude/agents/deployment-orchestrator.md +113 -0
- package/.claude/agents/documentation-architect.md +82 -0
- package/.claude/agents/frontend-error-fixer.md +77 -0
- package/.claude/agents/iac-code-generator.md +71 -0
- package/.claude/agents/incident-responder.md +346 -0
- package/.claude/agents/infrastructure-architect.md +31 -0
- package/.claude/agents/kubernetes-specialist.md +56 -0
- package/.claude/agents/migration-planner.md +181 -0
- package/.claude/agents/network-architect.md +196 -0
- package/.claude/agents/plan-reviewer.md +52 -0
- package/.claude/agents/refactor-planner.md +63 -0
- package/.claude/agents/security-scanner.md +102 -0
- package/.claude/agents/web-research-specialist.md +78 -0
- package/.claude/commands/cost-analysis.md +315 -0
- package/.claude/commands/dev-docs-update.md +55 -0
- package/.claude/commands/dev-docs.md +51 -0
- package/.claude/commands/incident-debug.md +247 -0
- package/.claude/commands/infra-plan.md +81 -0
- package/.claude/commands/migration-plan.md +478 -0
- package/.claude/commands/route-research-for-testing.md +37 -0
- package/.claude/commands/security-review.md +66 -0
- package/.claude/hooks/CONFIG.md +448 -0
- package/.claude/hooks/README.md +163 -0
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
- package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
- package/.claude/hooks/add-skill-activation-banners.ts +132 -0
- package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
- package/.claude/hooks/error-handling-reminder.sh +12 -0
- package/.claude/hooks/error-handling-reminder.ts +222 -0
- package/.claude/hooks/k8s-manifest-validator.sh +56 -0
- package/.claude/hooks/package-lock.json +556 -0
- package/.claude/hooks/package.json +16 -0
- package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
- package/.claude/hooks/post-tool-use-tracker.sh +183 -0
- package/.claude/hooks/security-policy-check.sh +247 -0
- package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
- package/.claude/hooks/skill-activation-prompt.sh +10 -0
- package/.claude/hooks/skill-activation-prompt.ts +141 -0
- package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
- package/.claude/hooks/terraform-validator.sh +53 -0
- package/.claude/hooks/test-input.json +7 -0
- package/.claude/hooks/test-skill-activation.ts +427 -0
- package/.claude/hooks/trigger-build-resolver.sh +79 -0
- package/.claude/hooks/tsc-check.sh +173 -0
- package/.claude/hooks/tsconfig.json +19 -0
- package/.claude/settings.json +55 -0
- package/.claude/settings.local.json +28 -3
- package/.claude/skills/README.md +507 -0
- package/.claude/skills/api-engineering/SKILL.md +63 -0
- package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
- package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
- package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
- package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
- package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
- package/.claude/skills/build-engineering/SKILL.md +431 -0
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
- package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
- package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
- package/.claude/skills/build-engineering/resources/build-security.md +95 -0
- package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
- package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
- package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
- package/.claude/skills/cloud-engineering/SKILL.md +675 -0
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
- package/.claude/skills/cybersecurity/SKILL.md +409 -0
- package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
- package/.claude/skills/database-engineering/SKILL.md +61 -0
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
- package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
- package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
- package/.claude/skills/devsecops/SKILL.md +374 -0
- package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
- package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
- package/.claude/skills/devsecops/resources/container-security.md +915 -0
- package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
- package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
- package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
- package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
- package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
- package/.claude/skills/devsecops/resources/security-testing.md +203 -0
- package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
- package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
- package/.claude/skills/documentation-as-code/SKILL.md +323 -0
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
- package/.claude/skills/engineering-management/SKILL.md +356 -0
- package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
- package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
- package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
- package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
- package/.claude/skills/error-tracking/SKILL.md +379 -0
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
- package/.claude/skills/general-it-engineering/SKILL.md +393 -0
- package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
- package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
- package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
- package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
- package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
- package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
- package/.claude/skills/network-engineering/SKILL.md +385 -0
- package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
- package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
- package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
- package/.claude/skills/network-engineering/resources/network-security.md +921 -0
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
- package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
- package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
- package/.claude/skills/observability-engineering/SKILL.md +101 -0
- package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
- package/.claude/skills/platform-engineering/SKILL.md +555 -0
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
- package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
- package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
- package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
- package/.claude/skills/release-engineering/SKILL.md +393 -0
- package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
- package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
- package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
- package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
- package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
- package/.claude/skills/route-tester/SKILL.md +392 -0
- package/.claude/skills/skill-developer/ADVANCED.md +197 -0
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
- package/.claude/skills/skill-developer/SKILL.md +430 -0
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
- package/.claude/skills/skill-rules.json +2940 -0
- package/.claude/skills/sre/SKILL.md +464 -0
- package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
- package/.claude/skills/sre/resources/capacity-planning.md +226 -0
- package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
- package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
- package/.claude/skills/sre/resources/incident-management.md +436 -0
- package/.claude/skills/sre/resources/observability-stack.md +240 -0
- package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
- package/.claude/skills/sre/resources/performance-optimization.md +108 -0
- package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
- package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
- package/.claude/skills/sre/resources/toil-reduction.md +145 -0
- package/.claude/skills/systems-engineering/SKILL.md +648 -0
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
- package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
- package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
- package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
- package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
- package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
- package/.claude/skills/technical-leadership/SKILL.md +728 -0
- package/CHANGELOG.md +90 -39
- package/README.md +94 -0
- package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
- package/backend/jest.config.js +59 -0
- package/backend/package-lock.json +6129 -0
- package/backend/package.json +16 -4
- package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
- package/backend/prisma/schema.prisma +33 -0
- package/backend/src/__tests__/core/DependencyService.test.js +336 -0
- package/backend/src/__tests__/core/UserService.test.js +875 -0
- package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
- package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
- package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
- package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
- package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
- package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
- package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
- package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
- package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
- package/backend/src/__tests__/secretsFilter.test.js +425 -0
- package/backend/src/__tests__/services/BotLifecycleService.test.js +411 -0
- package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
- package/backend/src/__tests__/services/CacheManager.test.js +125 -0
- package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
- package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
- package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
- package/backend/src/__tests__/setup.js +25 -0
- package/backend/src/api/routes/apiKeys.js +181 -0
- package/backend/src/api/routes/bots.js +49 -7
- package/backend/src/api/routes/plugins.js +2 -1
- package/backend/src/api/routes/system.js +174 -0
- package/backend/src/container.js +82 -0
- package/backend/src/core/BotManager.js +142 -871
- package/backend/src/core/BotManager.old.js +1093 -0
- package/backend/src/core/BotProcess.js +1092 -850
- package/backend/src/core/BreakLoopSignal.js +8 -0
- package/backend/src/core/EventGraphManager.js +280 -193
- package/backend/src/core/GraphExecutionEngine.js +321 -928
- package/backend/src/core/MessageQueue.js +27 -6
- package/backend/src/core/NodeRegistry.js +37 -991
- package/backend/src/core/PluginManager.js +62 -12
- package/backend/src/core/PrismaService.js +32 -0
- package/backend/src/core/UserService.js +3 -3
- package/backend/src/core/__tests__/PrismaService.test.js +24 -0
- package/backend/src/core/commands/README.md +305 -0
- package/backend/src/core/commands/dev.js +13 -7
- package/backend/src/core/commands/ping.js +10 -4
- package/backend/src/core/commands/whois.js +63 -0
- package/backend/src/core/config/validation.js +27 -0
- package/backend/src/core/constants/graphTypes.js +21 -0
- package/backend/src/core/node-registries/actions.js +132 -0
- package/backend/src/core/node-registries/arrays.js +137 -0
- package/backend/src/core/node-registries/bot.js +23 -0
- package/backend/src/core/node-registries/data.js +290 -0
- package/backend/src/core/node-registries/debug.js +26 -0
- package/backend/src/core/node-registries/events.js +187 -0
- package/backend/src/core/node-registries/flow.js +139 -0
- package/backend/src/core/node-registries/logic.js +45 -0
- package/backend/src/core/node-registries/math.js +42 -0
- package/backend/src/core/node-registries/objects.js +98 -0
- package/backend/src/core/node-registries/strings.js +153 -0
- package/backend/src/core/node-registries/time.js +113 -0
- package/backend/src/core/node-registries/users.js +79 -0
- package/backend/src/core/nodes/actions/bot_look_at.js +36 -0
- package/backend/src/core/nodes/actions/bot_set_variable.js +32 -0
- package/backend/src/core/nodes/actions/http_request.js +98 -0
- package/backend/src/core/nodes/actions/send_log.js +28 -0
- package/backend/src/core/nodes/actions/send_message.js +32 -0
- package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
- package/backend/src/core/nodes/arrays/add_element.js +23 -0
- package/backend/src/core/nodes/arrays/contains.js +40 -0
- package/backend/src/core/nodes/arrays/find_index.js +23 -0
- package/backend/src/core/nodes/arrays/get_by_index.js +23 -0
- package/backend/src/core/nodes/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/arrays/get_random_element.js +32 -0
- package/backend/src/core/nodes/arrays/remove_by_index.js +30 -0
- package/backend/src/core/nodes/bot/get_position.js +20 -0
- package/backend/src/core/nodes/data/array_literal.js +31 -0
- package/backend/src/core/nodes/data/boolean_literal.js +21 -0
- package/backend/src/core/nodes/data/cast.js +42 -0
- package/backend/src/core/nodes/data/datetime_literal.js +27 -0
- package/backend/src/core/nodes/data/entity_info.js +69 -0
- package/backend/src/core/nodes/data/get_argument.js +23 -0
- package/backend/src/core/nodes/data/get_bot_look.js +14 -0
- package/backend/src/core/nodes/data/get_entity_field.js +18 -0
- package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
- package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
- package/backend/src/core/nodes/data/get_server_players.js +18 -0
- package/backend/src/core/nodes/data/get_user_field.js +40 -0
- package/backend/src/core/nodes/data/get_variable.js +23 -0
- package/backend/src/core/nodes/data/length.js +25 -0
- package/backend/src/core/nodes/data/make_object.js +31 -0
- package/backend/src/core/nodes/data/number_literal.js +21 -0
- package/backend/src/core/nodes/data/string_literal.js +34 -0
- package/backend/src/core/nodes/data/type_check.js +53 -0
- package/backend/src/core/nodes/debug/log.js +16 -0
- package/backend/src/core/nodes/flow/branch.js +15 -0
- package/backend/src/core/nodes/flow/break.js +14 -0
- package/backend/src/core/nodes/flow/delay.js +43 -0
- package/backend/src/core/nodes/flow/for_each.js +39 -0
- package/backend/src/core/nodes/flow/sequence.js +16 -0
- package/backend/src/core/nodes/flow/switch.js +47 -0
- package/backend/src/core/nodes/flow/while.js +64 -0
- package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
- package/backend/src/core/nodes/logic/compare.js +33 -0
- package/backend/src/core/nodes/logic/operation.js +35 -0
- package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/math/operation.js +31 -0
- package/backend/src/core/nodes/math/random_number.js +43 -0
- package/backend/src/core/nodes/objects/create.js +40 -0
- package/backend/src/core/nodes/objects/delete.js +26 -0
- package/backend/src/core/nodes/objects/get.js +23 -0
- package/backend/src/core/nodes/objects/has_key.js +30 -0
- package/backend/src/core/nodes/objects/set.js +27 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
- package/backend/src/core/nodes/strings/concat.js +27 -0
- package/backend/src/core/nodes/strings/contains.js +41 -0
- package/backend/src/core/nodes/strings/ends_with.js +43 -0
- package/backend/src/core/nodes/strings/equals.js +36 -0
- package/backend/src/core/nodes/strings/length.js +36 -0
- package/backend/src/core/nodes/strings/matches.js +39 -0
- package/backend/src/core/nodes/strings/split.js +37 -0
- package/backend/src/core/nodes/strings/starts_with.js +43 -0
- package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
- package/backend/src/core/nodes/time/add.js +33 -0
- package/backend/src/core/nodes/time/compare.js +35 -0
- package/backend/src/core/nodes/time/diff.js +29 -0
- package/backend/src/core/nodes/time/format.js +32 -0
- package/backend/src/core/nodes/time/now.js +18 -0
- package/backend/src/core/nodes/users/check_blacklist.js +37 -0
- package/backend/src/core/nodes/users/get_groups.js +36 -0
- package/backend/src/core/nodes/users/get_permissions.js +36 -0
- package/backend/src/core/nodes/users/set_blacklist.js +37 -0
- package/backend/src/core/services/BotLifecycleService.js +596 -0
- package/backend/src/core/services/BotProcessManager.js +163 -0
- package/backend/src/core/services/CacheManager.js +111 -0
- package/backend/src/core/services/CommandExecutionService.js +351 -0
- package/backend/src/core/services/ResourceMonitorService.js +90 -0
- package/backend/src/core/services/TelemetryService.js +124 -0
- package/backend/src/core/services/ValidationService.js +132 -0
- package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
- package/backend/src/core/services.js +20 -5
- package/backend/src/core/system/CommandContext.js +84 -0
- package/backend/src/core/system/Transport.js +78 -0
- package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
- package/backend/src/core/utils/jsonParser.js +18 -0
- package/backend/src/core/utils/secretsFilter.js +262 -0
- package/backend/src/core/utils/variableParser.js +89 -0
- package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
- package/backend/src/core/validation/nodeSchemas.js +112 -0
- package/backend/src/lib/prisma.js +2 -4
- package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
- package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
- package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
- package/backend/src/real-time/botApi/handlers/index.js +43 -0
- package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
- package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
- package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
- package/backend/src/real-time/botApi/index.js +40 -0
- package/backend/src/real-time/botApi/middleware.js +79 -0
- package/backend/src/real-time/botApi/utils.js +54 -0
- package/backend/src/real-time/socketHandler.js +6 -2
- package/backend/src/repositories/BaseRepository.js +43 -0
- package/backend/src/repositories/BotRepository.js +42 -0
- package/backend/src/repositories/CommandRepository.js +53 -0
- package/backend/src/repositories/EventGraphRepository.js +40 -0
- package/backend/src/repositories/GroupRepository.js +69 -0
- package/backend/src/repositories/PermissionRepository.js +48 -0
- package/backend/src/repositories/PluginRepository.js +42 -0
- package/backend/src/repositories/ServerRepository.js +27 -0
- package/backend/src/repositories/UserRepository.js +48 -0
- package/backend/src/server.js +3 -0
- package/backend/src/test-refactor.js +85 -0
- package/frontend/dist/assets/index-CfTo92bP.css +1 -0
- package/frontend/dist/assets/index-CiFD5X9Z.js +8344 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +1 -5
- package/package.json +2 -1
- package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
- package/frontend/dist/assets/index-CMMutadc.js +0 -8352
- package/nul +0 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
# System Design Principles
|
|
2
|
+
|
|
3
|
+
Fundamental principles and patterns for designing scalable, reliable, maintainable systems.
|
|
4
|
+
|
|
5
|
+
## Core Principles
|
|
6
|
+
|
|
7
|
+
### 1. SOLID Principles (for Architecture)
|
|
8
|
+
|
|
9
|
+
**Single Responsibility**
|
|
10
|
+
Each component/service should have one reason to change.
|
|
11
|
+
```
|
|
12
|
+
❌ Bad: "UserService" handles auth, profile, notifications, billing
|
|
13
|
+
✅ Good: Separate services: AuthService, ProfileService, NotificationService, BillingService
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Open-Closed**
|
|
17
|
+
Open for extension, closed for modification.
|
|
18
|
+
```
|
|
19
|
+
✅ Plugin architecture, event-driven systems, strategy pattern
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Liskov Substitution**
|
|
23
|
+
Implementations should be interchangeable.
|
|
24
|
+
```
|
|
25
|
+
✅ Interface-based design, dependency injection
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Interface Segregation**
|
|
29
|
+
Many specific interfaces > one general interface.
|
|
30
|
+
```
|
|
31
|
+
❌ One large "IUserService" with 50 methods
|
|
32
|
+
✅ IUserAuth, IUserProfile, IUserSettings (focused interfaces)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Dependency Inversion**
|
|
36
|
+
Depend on abstractions, not concretions.
|
|
37
|
+
```typescript
|
|
38
|
+
// ❌ Direct dependency
|
|
39
|
+
class UserController {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.db = new PostgresDB(); // Concrete
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ✅ Dependency injection
|
|
46
|
+
class UserController {
|
|
47
|
+
constructor(private db: IDatabase) {} // Abstract
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### 2. 12-Factor App
|
|
54
|
+
|
|
55
|
+
**I. Codebase:** One codebase, many deploys
|
|
56
|
+
```
|
|
57
|
+
✅ Single repo → Deploy to dev, staging, prod
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**II. Dependencies:** Explicitly declare dependencies
|
|
61
|
+
```yaml
|
|
62
|
+
# package.json
|
|
63
|
+
{
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"express": "4.18.0", # Explicit version
|
|
66
|
+
"prisma": "5.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**III. Config:** Store config in environment
|
|
72
|
+
```typescript
|
|
73
|
+
// ❌ Hardcoded
|
|
74
|
+
const dbUrl = "postgresql://localhost:5432/mydb";
|
|
75
|
+
|
|
76
|
+
// ✅ Environment variable
|
|
77
|
+
const dbUrl = process.env.DATABASE_URL;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**IV. Backing Services:** Treat as attached resources
|
|
81
|
+
```
|
|
82
|
+
Database, cache, queue = swappable resources via URLs
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**V. Build, Release, Run:** Strict separation
|
|
86
|
+
```
|
|
87
|
+
Build → Release (build + config) → Run
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**VI. Processes:** Stateless processes
|
|
91
|
+
```
|
|
92
|
+
✅ Store session in Redis, not in-memory
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**VII. Port Binding:** Export services via port
|
|
96
|
+
```typescript
|
|
97
|
+
app.listen(process.env.PORT || 3000);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**VIII. Concurrency:** Scale via process model
|
|
101
|
+
```
|
|
102
|
+
✅ Horizontal scaling (add more processes)
|
|
103
|
+
❌ Vertical scaling only (bigger server)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**IX. Disposability:** Fast startup, graceful shutdown
|
|
107
|
+
```typescript
|
|
108
|
+
process.on('SIGTERM', async () => {
|
|
109
|
+
await server.close();
|
|
110
|
+
await db.disconnect();
|
|
111
|
+
process.exit(0);
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**X. Dev/Prod Parity:** Keep environments similar
|
|
116
|
+
```
|
|
117
|
+
✅ Docker ensures same environment everywhere
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**XI. Logs:** Treat logs as event streams
|
|
121
|
+
```
|
|
122
|
+
✅ Log to stdout → Aggregation tool (ELK, Loki)
|
|
123
|
+
❌ Log to files directly
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**XII. Admin Processes:** Run admin tasks as one-off processes
|
|
127
|
+
```bash
|
|
128
|
+
# ✅ One-off migration
|
|
129
|
+
npm run migrate
|
|
130
|
+
|
|
131
|
+
# ❌ Built into application
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### 3. CAP Theorem
|
|
137
|
+
|
|
138
|
+
**You can have at most 2 of 3:**
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Consistency (C): All nodes see same data
|
|
142
|
+
Availability (A): System always responds
|
|
143
|
+
Partition Tolerance (P): System works despite network splits
|
|
144
|
+
|
|
145
|
+
Network partitions WILL happen → Must choose: CP or AP
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**CP Systems (Consistency + Partition Tolerance):**
|
|
149
|
+
- MongoDB (default), HBase, Redis
|
|
150
|
+
- Sacrifice: Availability (may reject requests during partition)
|
|
151
|
+
- Use case: Banking (consistency critical)
|
|
152
|
+
|
|
153
|
+
**AP Systems (Availability + Partition Tolerance):**
|
|
154
|
+
- Cassandra, DynamoDB, Couchbase
|
|
155
|
+
- Sacrifice: Consistency (eventual consistency)
|
|
156
|
+
- Use case: Social media (availability critical)
|
|
157
|
+
|
|
158
|
+
**CA Systems (Consistency + Availability):**
|
|
159
|
+
- Traditional RDBMS in single datacenter
|
|
160
|
+
- Sacrifice: Partition Tolerance (not distributed)
|
|
161
|
+
- Reality: Network partitions happen, so CA is theoretical
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### 4. Eventual Consistency
|
|
166
|
+
|
|
167
|
+
**Definition:** System will become consistent given enough time without new updates.
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
User posts comment (writes to primary DB)
|
|
171
|
+
↓
|
|
172
|
+
Replication to replicas (takes 100ms)
|
|
173
|
+
↓
|
|
174
|
+
Read from replica immediately → May not see comment yet
|
|
175
|
+
↓
|
|
176
|
+
Wait 100ms → Comment appears
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Handling in Code:**
|
|
180
|
+
```typescript
|
|
181
|
+
// After write, read from primary (strong consistency)
|
|
182
|
+
await db.comments.create({ data: comment });
|
|
183
|
+
const newComment = await db.$queryRaw`
|
|
184
|
+
SELECT * FROM comments WHERE id = ${comment.id}
|
|
185
|
+
`; // Guaranteed to see the write
|
|
186
|
+
|
|
187
|
+
// Or: Accept eventual consistency
|
|
188
|
+
await db.comments.create({ data: comment });
|
|
189
|
+
// UI shows optimistic update immediately
|
|
190
|
+
// Background sync handles replication
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### 5. Idempotency
|
|
196
|
+
|
|
197
|
+
**Definition:** Operation can be applied multiple times without changing result beyond first application.
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
// ❌ Not idempotent
|
|
201
|
+
function incrementBalance(userId, amount) {
|
|
202
|
+
balance += amount; // Multiple calls = wrong balance
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ✅ Idempotent (with idempotency key)
|
|
206
|
+
function creditAccount(userId, amount, idempotencyKey) {
|
|
207
|
+
if (processedKeys.has(idempotencyKey)) {
|
|
208
|
+
return alreadyProcessed; // Skip duplicate
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
balance += amount;
|
|
212
|
+
processedKeys.add(idempotencyKey);
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**HTTP Idempotency:**
|
|
217
|
+
```
|
|
218
|
+
GET, PUT, DELETE = Idempotent
|
|
219
|
+
POST = NOT idempotent (creates new resource each time)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
### 6. Circuit Breaker Pattern
|
|
225
|
+
|
|
226
|
+
**Prevent cascading failures:**
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
class CircuitBreaker {
|
|
230
|
+
state = 'CLOSED'; // CLOSED, OPEN, HALF_OPEN
|
|
231
|
+
failureCount = 0;
|
|
232
|
+
failureThreshold = 5;
|
|
233
|
+
timeout = 60000; // 1 minute
|
|
234
|
+
|
|
235
|
+
async call(fn) {
|
|
236
|
+
if (this.state === 'OPEN') {
|
|
237
|
+
if (Date.now() > this.nextAttempt) {
|
|
238
|
+
this.state = 'HALF_OPEN'; // Try one request
|
|
239
|
+
} else {
|
|
240
|
+
throw new Error('Circuit breaker OPEN');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const result = await fn();
|
|
246
|
+
this.onSuccess();
|
|
247
|
+
return result;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
this.onFailure();
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
onSuccess() {
|
|
255
|
+
this.failureCount = 0;
|
|
256
|
+
this.state = 'CLOSED';
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
onFailure() {
|
|
260
|
+
this.failureCount++;
|
|
261
|
+
if (this.failureCount >= this.failureThreshold) {
|
|
262
|
+
this.state = 'OPEN';
|
|
263
|
+
this.nextAttempt = Date.now() + this.timeout;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Usage
|
|
269
|
+
const breaker = new CircuitBreaker();
|
|
270
|
+
await breaker.call(() => externalAPI.getData());
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### 7. Bulkhead Pattern
|
|
276
|
+
|
|
277
|
+
**Isolate failures:**
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
Connection pools, thread pools, separate services
|
|
281
|
+
|
|
282
|
+
Example:
|
|
283
|
+
- Search service fails → Doesn't affect checkout
|
|
284
|
+
- Analytics DB slow → Doesn't affect user DB
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
// Separate connection pools
|
|
289
|
+
const userDBPool = new Pool({ max: 20 }); // Critical
|
|
290
|
+
const analyticsDBPool = new Pool({ max: 10 }); // Non-critical
|
|
291
|
+
|
|
292
|
+
// Analytics queries don't starve user queries
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
### 8. Retry with Exponential Backoff
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
async function fetchWithRetry(url, maxRetries = 3) {
|
|
301
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
302
|
+
try {
|
|
303
|
+
return await fetch(url);
|
|
304
|
+
} catch (error) {
|
|
305
|
+
if (i === maxRetries - 1) throw error;
|
|
306
|
+
|
|
307
|
+
// Exponential backoff: 1s, 2s, 4s, 8s
|
|
308
|
+
const delay = Math.pow(2, i) * 1000;
|
|
309
|
+
|
|
310
|
+
// Jitter: Randomize to avoid thundering herd
|
|
311
|
+
const jitter = Math.random() * 1000;
|
|
312
|
+
|
|
313
|
+
await sleep(delay + jitter);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### 9. Saga Pattern (Distributed Transactions)
|
|
322
|
+
|
|
323
|
+
**Problem:** No distributed ACID transactions in microservices
|
|
324
|
+
|
|
325
|
+
**Solution:** Chain of local transactions with compensation
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
Order Saga:
|
|
329
|
+
1. Create Order → Compensate: Cancel Order
|
|
330
|
+
2. Reserve Inventory → Compensate: Release Inventory
|
|
331
|
+
3. Charge Payment → Compensate: Refund Payment
|
|
332
|
+
4. Ship Order → Compensate: Cancel Shipment
|
|
333
|
+
|
|
334
|
+
If step 3 fails:
|
|
335
|
+
← Compensate step 2 (release inventory)
|
|
336
|
+
← Compensate step 1 (cancel order)
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Implementation:**
|
|
340
|
+
```typescript
|
|
341
|
+
async function createOrderSaga(order) {
|
|
342
|
+
const saga = new Saga();
|
|
343
|
+
|
|
344
|
+
try {
|
|
345
|
+
// Step 1
|
|
346
|
+
const orderId = await saga.execute(
|
|
347
|
+
() => orderService.create(order),
|
|
348
|
+
() => orderService.cancel(orderId)
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
// Step 2
|
|
352
|
+
await saga.execute(
|
|
353
|
+
() => inventoryService.reserve(order.items),
|
|
354
|
+
() => inventoryService.release(order.items)
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
// Step 3
|
|
358
|
+
await saga.execute(
|
|
359
|
+
() => paymentService.charge(order.total),
|
|
360
|
+
() => paymentService.refund(order.total)
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
return orderId;
|
|
364
|
+
} catch (error) {
|
|
365
|
+
// Execute compensations in reverse order
|
|
366
|
+
await saga.compensate();
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
### 10. CQRS (Command Query Responsibility Segregation)
|
|
375
|
+
|
|
376
|
+
**Separate read and write models:**
|
|
377
|
+
|
|
378
|
+
```
|
|
379
|
+
Commands (writes):
|
|
380
|
+
→ Optimized for consistency
|
|
381
|
+
→ Normalized schema
|
|
382
|
+
|
|
383
|
+
Queries (reads):
|
|
384
|
+
→ Optimized for performance
|
|
385
|
+
→ Denormalized schema (pre-joined)
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
### 11. Event Sourcing
|
|
391
|
+
|
|
392
|
+
**Store events, not current state:**
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
Traditional:
|
|
396
|
+
User { id: 1, balance: 100 } ← Current state only
|
|
397
|
+
|
|
398
|
+
Event Sourcing:
|
|
399
|
+
UserCreated { id: 1, initialBalance: 0 }
|
|
400
|
+
MoneyDeposited { id: 1, amount: 150 }
|
|
401
|
+
MoneyWithdrawn { id: 1, amount: 50 }
|
|
402
|
+
← Full history, balance = sum(events)
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Benefits:**
|
|
406
|
+
- ✅ Complete audit trail
|
|
407
|
+
- ✅ Temporal queries ("balance on Jan 1st")
|
|
408
|
+
- ✅ Event replay
|
|
409
|
+
|
|
410
|
+
**Drawbacks:**
|
|
411
|
+
- ❌ Complexity
|
|
412
|
+
- ❌ Storage growth
|
|
413
|
+
- ❌ Schema evolution challenges
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## Design Trade-Offs
|
|
418
|
+
|
|
419
|
+
### Consistency vs. Availability
|
|
420
|
+
|
|
421
|
+
| Choice | Pros | Cons | Use Case |
|
|
422
|
+
|--------|------|------|----------|
|
|
423
|
+
| Strong Consistency | No anomalies | Lower availability | Banking |
|
|
424
|
+
| Eventual Consistency | High availability | Read stale data | Social media |
|
|
425
|
+
|
|
426
|
+
### Latency vs. Throughput
|
|
427
|
+
|
|
428
|
+
| Choice | Pros | Cons |
|
|
429
|
+
|--------|------|------|
|
|
430
|
+
| Low Latency | Fast responses | Lower throughput |
|
|
431
|
+
| High Throughput | Process more | Higher latency |
|
|
432
|
+
|
|
433
|
+
### Normalization vs. Denormalization
|
|
434
|
+
|
|
435
|
+
| Choice | Pros | Cons |
|
|
436
|
+
|--------|------|------|
|
|
437
|
+
| Normalized | No duplication, consistency | Slow reads (joins) |
|
|
438
|
+
| Denormalized | Fast reads | Data duplication, consistency risk |
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Scalability Patterns
|
|
443
|
+
|
|
444
|
+
### Horizontal Scaling (Scale Out)
|
|
445
|
+
```
|
|
446
|
+
Add more servers
|
|
447
|
+
✅ Unlimited scaling potential
|
|
448
|
+
❌ Requires stateless design
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Vertical Scaling (Scale Up)
|
|
452
|
+
```
|
|
453
|
+
Bigger server
|
|
454
|
+
✅ Simple (no code changes)
|
|
455
|
+
❌ Hardware limits (max 96 vCPU, 768 GB RAM)
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Sharding (Data Partitioning)
|
|
459
|
+
```
|
|
460
|
+
Split data across multiple databases
|
|
461
|
+
|
|
462
|
+
User sharding:
|
|
463
|
+
users 0-999 → Shard 1
|
|
464
|
+
users 1000-1999 → Shard 2
|
|
465
|
+
users 2000-2999 → Shard 3
|
|
466
|
+
|
|
467
|
+
✅ Scales infinitely
|
|
468
|
+
❌ Cross-shard queries difficult
|
|
469
|
+
❌ Rebalancing complex
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Anti-Patterns
|
|
475
|
+
|
|
476
|
+
❌ **Premature Optimization** - Optimize based on actual metrics, not assumptions
|
|
477
|
+
❌ **Distributed Monolith** - Microservices with tight coupling
|
|
478
|
+
❌ **Over-Engineering** - CQRS+Event Sourcing for simple CRUD
|
|
479
|
+
❌ **Ignoring CAP** - Expecting strong consistency + high availability
|
|
480
|
+
❌ **Magic Numbers** - Hardcoded limits without reasoning
|
|
481
|
+
❌ **No Timeouts** - Hanging requests consume resources forever
|
|
482
|
+
❌ **Synchronous Microservices** - Chains create latency and coupling
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
**Related Resources:**
|
|
487
|
+
- architecture-patterns.md - Microservices, event-driven, CQRS
|
|
488
|
+
- data-architecture.md - Data modeling and storage patterns
|
|
489
|
+
- multi-region-design.md - CAP theorem in practice
|