tapps-agents 3.5.41__py3-none-any.whl → 3.6.0__py3-none-any.whl
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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2337
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.41.dist-info/RECORD +0 -760
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,499 +1,499 @@
|
|
|
1
|
-
# gRPC Best Practices
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
gRPC is a high-performance RPC (Remote Procedure Call) framework that uses HTTP/2 and Protocol Buffers. It's ideal for microservices communication, streaming, and high-performance APIs.
|
|
6
|
-
|
|
7
|
-
## Core Concepts
|
|
8
|
-
|
|
9
|
-
### Protocol Buffers
|
|
10
|
-
|
|
11
|
-
**Define Service:**
|
|
12
|
-
```protobuf
|
|
13
|
-
syntax = "proto3";
|
|
14
|
-
|
|
15
|
-
package user;
|
|
16
|
-
|
|
17
|
-
service UserService {
|
|
18
|
-
rpc GetUser(GetUserRequest) returns (User);
|
|
19
|
-
rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);
|
|
20
|
-
rpc CreateUser(CreateUserRequest) returns (User);
|
|
21
|
-
rpc UpdateUser(UpdateUserRequest) returns (User);
|
|
22
|
-
rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
message User {
|
|
26
|
-
int64 id = 1;
|
|
27
|
-
string name = 2;
|
|
28
|
-
string email = 3;
|
|
29
|
-
string role = 4;
|
|
30
|
-
google.protobuf.Timestamp created_at = 5;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
message GetUserRequest {
|
|
34
|
-
int64 id = 1;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
message ListUsersRequest {
|
|
38
|
-
int32 page = 1;
|
|
39
|
-
int32 limit = 2;
|
|
40
|
-
string filter = 3;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
message ListUsersResponse {
|
|
44
|
-
repeated User users = 1;
|
|
45
|
-
int32 total = 2;
|
|
46
|
-
int32 page = 3;
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### Service Definitions
|
|
51
|
-
|
|
52
|
-
**Unary RPC:**
|
|
53
|
-
```protobuf
|
|
54
|
-
rpc GetUser(GetUserRequest) returns (User);
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**Server Streaming:**
|
|
58
|
-
```protobuf
|
|
59
|
-
rpc ListUsers(ListUsersRequest) returns (stream User);
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Client Streaming:**
|
|
63
|
-
```protobuf
|
|
64
|
-
rpc CreateUsers(stream CreateUserRequest) returns (CreateUsersResponse);
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Bidirectional Streaming:**
|
|
68
|
-
```protobuf
|
|
69
|
-
rpc Chat(stream Message) returns (stream Message);
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Best Practices
|
|
73
|
-
|
|
74
|
-
### 1. Naming Conventions
|
|
75
|
-
|
|
76
|
-
**Service Names:** PascalCase
|
|
77
|
-
```protobuf
|
|
78
|
-
service UserService { ... }
|
|
79
|
-
service OrderService { ... }
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**RPC Names:** PascalCase
|
|
83
|
-
```protobuf
|
|
84
|
-
rpc GetUser(...) returns (...);
|
|
85
|
-
rpc CreateUser(...) returns (...);
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Message Types:** PascalCase
|
|
89
|
-
```protobuf
|
|
90
|
-
message UserRequest { ... }
|
|
91
|
-
message UserResponse { ... }
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**Field Names:** snake_case
|
|
95
|
-
```protobuf
|
|
96
|
-
message User {
|
|
97
|
-
int64 user_id = 1;
|
|
98
|
-
string full_name = 2;
|
|
99
|
-
string email_address = 3;
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 2. Field Numbers
|
|
104
|
-
|
|
105
|
-
**Don't Reuse Numbers:**
|
|
106
|
-
- Field numbers are permanent
|
|
107
|
-
- Once used, can't be reused
|
|
108
|
-
- Mark deprecated fields as reserved
|
|
109
|
-
|
|
110
|
-
**Reserved Fields:**
|
|
111
|
-
```protobuf
|
|
112
|
-
message User {
|
|
113
|
-
reserved 5, 10 to 15;
|
|
114
|
-
reserved "old_field";
|
|
115
|
-
|
|
116
|
-
int64 id = 1;
|
|
117
|
-
string name = 2;
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### 3. Versioning
|
|
122
|
-
|
|
123
|
-
**Package Versioning:**
|
|
124
|
-
```protobuf
|
|
125
|
-
package user.v1;
|
|
126
|
-
|
|
127
|
-
service UserService {
|
|
128
|
-
rpc GetUser(GetUserRequest) returns (User);
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**Add New Fields:**
|
|
133
|
-
```protobuf
|
|
134
|
-
message User {
|
|
135
|
-
int64 id = 1;
|
|
136
|
-
string name = 2;
|
|
137
|
-
string email = 3;
|
|
138
|
-
// New field added
|
|
139
|
-
string phone = 4; // New fields at end
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**Backward Compatibility:**
|
|
144
|
-
- New fields should be optional
|
|
145
|
-
- Don't remove fields (mark reserved)
|
|
146
|
-
- Don't change field numbers
|
|
147
|
-
- Don't change field types
|
|
148
|
-
|
|
149
|
-
### 4. Error Handling
|
|
150
|
-
|
|
151
|
-
**Standard Status Codes:**
|
|
152
|
-
```python
|
|
153
|
-
from grpc import StatusCode
|
|
154
|
-
|
|
155
|
-
# Success
|
|
156
|
-
return user, StatusCode.OK
|
|
157
|
-
|
|
158
|
-
# Not found
|
|
159
|
-
return None, StatusCode.NOT_FOUND
|
|
160
|
-
|
|
161
|
-
# Invalid argument
|
|
162
|
-
return None, StatusCode.INVALID_ARGUMENT
|
|
163
|
-
|
|
164
|
-
# Internal error
|
|
165
|
-
return None, StatusCode.INTERNAL
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**Error Details:**
|
|
169
|
-
```python
|
|
170
|
-
from google.rpc import status_pb2, error_details_pb2
|
|
171
|
-
|
|
172
|
-
def create_error_status(code, message, details=None):
|
|
173
|
-
error_status = status_pb2.Status()
|
|
174
|
-
error_status.code = code
|
|
175
|
-
error_status.message = message
|
|
176
|
-
|
|
177
|
-
if details:
|
|
178
|
-
error_detail = error_details_pb2.ErrorInfo()
|
|
179
|
-
error_detail.reason = details.get("reason")
|
|
180
|
-
error_detail.domain = details.get("domain")
|
|
181
|
-
error_status.details.add().Pack(error_detail)
|
|
182
|
-
|
|
183
|
-
return error_status
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### 5. Streaming
|
|
187
|
-
|
|
188
|
-
**Server Streaming:**
|
|
189
|
-
```python
|
|
190
|
-
def ListUsers(request, context):
|
|
191
|
-
users = db.user.list(request.filter)
|
|
192
|
-
|
|
193
|
-
for user in users:
|
|
194
|
-
yield user_pb2.User(
|
|
195
|
-
id=user.id,
|
|
196
|
-
name=user.name,
|
|
197
|
-
email=user.email
|
|
198
|
-
)
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**Client Streaming:**
|
|
202
|
-
```python
|
|
203
|
-
def CreateUsers(request_iterator, context):
|
|
204
|
-
created_users = []
|
|
205
|
-
|
|
206
|
-
for create_request in request_iterator:
|
|
207
|
-
user = db.user.create(
|
|
208
|
-
name=create_request.name,
|
|
209
|
-
email=create_request.email
|
|
210
|
-
)
|
|
211
|
-
created_users.append(user)
|
|
212
|
-
|
|
213
|
-
return user_pb2.CreateUsersResponse(
|
|
214
|
-
users=created_users,
|
|
215
|
-
count=len(created_users)
|
|
216
|
-
)
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
**Bidirectional Streaming:**
|
|
220
|
-
```python
|
|
221
|
-
def Chat(request_iterator, context):
|
|
222
|
-
for message in request_iterator:
|
|
223
|
-
# Process message
|
|
224
|
-
response = process_message(message)
|
|
225
|
-
|
|
226
|
-
# Send response
|
|
227
|
-
yield response
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
## Implementation Patterns
|
|
231
|
-
|
|
232
|
-
### Server Implementation (Python)
|
|
233
|
-
|
|
234
|
-
**Basic Server:**
|
|
235
|
-
```python
|
|
236
|
-
import grpc
|
|
237
|
-
from concurrent import futures
|
|
238
|
-
import user_pb2
|
|
239
|
-
import user_pb2_grpc
|
|
240
|
-
|
|
241
|
-
class UserService(user_pb2_grpc.UserServiceServicer):
|
|
242
|
-
def GetUser(self, request, context):
|
|
243
|
-
user = db.user.get_by_id(request.id)
|
|
244
|
-
if not user:
|
|
245
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
|
246
|
-
context.set_details('User not found')
|
|
247
|
-
return user_pb2.User()
|
|
248
|
-
|
|
249
|
-
return user_pb2.User(
|
|
250
|
-
id=user.id,
|
|
251
|
-
name=user.name,
|
|
252
|
-
email=user.email
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
def ListUsers(self, request, context):
|
|
256
|
-
users = db.user.list(
|
|
257
|
-
page=request.page,
|
|
258
|
-
limit=request.limit,
|
|
259
|
-
filter=request.filter
|
|
260
|
-
)
|
|
261
|
-
|
|
262
|
-
return user_pb2.ListUsersResponse(
|
|
263
|
-
users=[to_proto(u) for u in users],
|
|
264
|
-
total=len(users),
|
|
265
|
-
page=request.page
|
|
266
|
-
)
|
|
267
|
-
|
|
268
|
-
def serve():
|
|
269
|
-
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
|
270
|
-
user_pb2_grpc.add_UserServiceServicer_to_server(
|
|
271
|
-
UserService(), server
|
|
272
|
-
)
|
|
273
|
-
server.add_insecure_port('[::]:50051')
|
|
274
|
-
server.start()
|
|
275
|
-
server.wait_for_termination()
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### Client Implementation (Python)
|
|
279
|
-
|
|
280
|
-
**Basic Client:**
|
|
281
|
-
```python
|
|
282
|
-
import grpc
|
|
283
|
-
import user_pb2
|
|
284
|
-
import user_pb2_grpc
|
|
285
|
-
|
|
286
|
-
def get_user(user_id):
|
|
287
|
-
with grpc.insecure_channel('localhost:50051') as channel:
|
|
288
|
-
stub = user_pb2_grpc.UserServiceStub(channel)
|
|
289
|
-
request = user_pb2.GetUserRequest(id=user_id)
|
|
290
|
-
|
|
291
|
-
try:
|
|
292
|
-
response = stub.GetUser(request, timeout=10)
|
|
293
|
-
return response
|
|
294
|
-
except grpc.RpcError as e:
|
|
295
|
-
if e.code() == grpc.StatusCode.NOT_FOUND:
|
|
296
|
-
print(f"User {user_id} not found")
|
|
297
|
-
raise
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### Server Implementation (Node.js)
|
|
301
|
-
|
|
302
|
-
```javascript
|
|
303
|
-
const grpc = require('@grpc/grpc-js');
|
|
304
|
-
const protoLoader = require('@grpc/proto-loader');
|
|
305
|
-
|
|
306
|
-
const packageDefinition = protoLoader.loadSync('user.proto');
|
|
307
|
-
const userProto = grpc.loadPackageDefinition(packageDefinition).user;
|
|
308
|
-
|
|
309
|
-
const server = new grpc.Server();
|
|
310
|
-
|
|
311
|
-
server.addService(userProto.UserService.service, {
|
|
312
|
-
getUser: (call, callback) => {
|
|
313
|
-
const user = db.user.getById(call.request.id);
|
|
314
|
-
if (!user) {
|
|
315
|
-
callback({
|
|
316
|
-
code: grpc.status.NOT_FOUND,
|
|
317
|
-
message: 'User not found'
|
|
318
|
-
});
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
callback(null, user);
|
|
322
|
-
},
|
|
323
|
-
|
|
324
|
-
listUsers: (call) => {
|
|
325
|
-
const users = db.user.list(call.request);
|
|
326
|
-
users.forEach(user => call.write(user));
|
|
327
|
-
call.end();
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
|
|
332
|
-
server.start();
|
|
333
|
-
});
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
## Security
|
|
337
|
-
|
|
338
|
-
### TLS/SSL
|
|
339
|
-
|
|
340
|
-
**Server:**
|
|
341
|
-
```python
|
|
342
|
-
# Load credentials
|
|
343
|
-
with open('server.key', 'rb') as f:
|
|
344
|
-
private_key = f.read()
|
|
345
|
-
with open('server.crt', 'rb') as f:
|
|
346
|
-
certificate_chain = f.read()
|
|
347
|
-
|
|
348
|
-
server_credentials = grpc.ssl_server_credentials(
|
|
349
|
-
[(private_key, certificate_chain)]
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
server.add_secure_port('[::]:50051', server_credentials)
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
**Client:**
|
|
356
|
-
```python
|
|
357
|
-
# Load credentials
|
|
358
|
-
with open('ca.crt', 'rb') as f:
|
|
359
|
-
root_certificates = f.read()
|
|
360
|
-
|
|
361
|
-
credentials = grpc.ssl_channel_credentials(root_certificates)
|
|
362
|
-
channel = grpc.secure_channel('myserver:50051', credentials)
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
### Authentication
|
|
366
|
-
|
|
367
|
-
**Token-Based Auth:**
|
|
368
|
-
```python
|
|
369
|
-
def authenticate_client(context):
|
|
370
|
-
metadata = context.invocation_metadata()
|
|
371
|
-
for key, value in metadata:
|
|
372
|
-
if key == 'authorization':
|
|
373
|
-
token = value.replace('Bearer ', '')
|
|
374
|
-
return verify_token(token)
|
|
375
|
-
return None
|
|
376
|
-
|
|
377
|
-
class UserService(user_pb2_grpc.UserServiceServicer):
|
|
378
|
-
def GetUser(self, request, context):
|
|
379
|
-
user = authenticate_client(context)
|
|
380
|
-
if not user:
|
|
381
|
-
context.set_code(grpc.StatusCode.UNAUTHENTICATED)
|
|
382
|
-
context.set_details('Invalid token')
|
|
383
|
-
return user_pb2.User()
|
|
384
|
-
# Continue with request
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
## Performance Optimization
|
|
388
|
-
|
|
389
|
-
### Connection Pooling
|
|
390
|
-
|
|
391
|
-
**Reuse Channels:**
|
|
392
|
-
```python
|
|
393
|
-
class GRPCClient:
|
|
394
|
-
def __init__(self, address):
|
|
395
|
-
self.channel = grpc.secure_channel(
|
|
396
|
-
address,
|
|
397
|
-
grpc.ssl_channel_credentials()
|
|
398
|
-
)
|
|
399
|
-
self.stub = user_pb2_grpc.UserServiceStub(self.channel)
|
|
400
|
-
|
|
401
|
-
def get_user(self, user_id):
|
|
402
|
-
return self.stub.GetUser(
|
|
403
|
-
user_pb2.GetUserRequest(id=user_id)
|
|
404
|
-
)
|
|
405
|
-
|
|
406
|
-
def close(self):
|
|
407
|
-
self.channel.close()
|
|
408
|
-
|
|
409
|
-
# Reuse client instance
|
|
410
|
-
client = GRPCClient('myserver:50051')
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### Compression
|
|
414
|
-
|
|
415
|
-
**Enable Compression:**
|
|
416
|
-
```python
|
|
417
|
-
channel = grpc.insecure_channel(
|
|
418
|
-
'localhost:50051',
|
|
419
|
-
options=[
|
|
420
|
-
('grpc.default_compression_algorithm', grpc.Compression.Gzip)
|
|
421
|
-
]
|
|
422
|
-
)
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
### Timeouts
|
|
426
|
-
|
|
427
|
-
**Set Timeouts:**
|
|
428
|
-
```python
|
|
429
|
-
response = stub.GetUser(request, timeout=5.0) # 5 seconds
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
### Keepalive
|
|
433
|
-
|
|
434
|
-
**Keep Connections Alive:**
|
|
435
|
-
```python
|
|
436
|
-
channel = grpc.insecure_channel(
|
|
437
|
-
'localhost:50051',
|
|
438
|
-
options=[
|
|
439
|
-
('grpc.keepalive_time_ms', 30000),
|
|
440
|
-
('grpc.keepalive_timeout_ms', 5000),
|
|
441
|
-
('grpc.keepalive_permit_without_calls', True),
|
|
442
|
-
('grpc.http2.max_pings_without_data', 0),
|
|
443
|
-
]
|
|
444
|
-
)
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
## Interceptors
|
|
448
|
-
|
|
449
|
-
### Server Interceptor
|
|
450
|
-
|
|
451
|
-
**Logging:**
|
|
452
|
-
```python
|
|
453
|
-
class LoggingInterceptor(grpc.ServerInterceptor):
|
|
454
|
-
def intercept_service(self, continuation, handler_call_details):
|
|
455
|
-
print(f"Calling: {handler_call_details.method}")
|
|
456
|
-
start_time = time.time()
|
|
457
|
-
|
|
458
|
-
def logging_wrapper(behavior, request_streaming, response_streaming):
|
|
459
|
-
def new_behavior(request_or_iterator, servicer_context):
|
|
460
|
-
response = behavior(request_or_iterator, servicer_context)
|
|
461
|
-
duration = time.time() - start_time
|
|
462
|
-
print(f"Completed in {duration:.2f}s")
|
|
463
|
-
return response
|
|
464
|
-
return new_behavior
|
|
465
|
-
|
|
466
|
-
return continuation(handler_call_details).replace(
|
|
467
|
-
unary_unary=logging_wrapper
|
|
468
|
-
)
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
### Client Interceptor
|
|
472
|
-
|
|
473
|
-
**Retry:**
|
|
474
|
-
```python
|
|
475
|
-
class RetryInterceptor(grpc.UnaryUnaryClientInterceptor):
|
|
476
|
-
def intercept_unary_unary(self, continuation, client_call_details, request):
|
|
477
|
-
for attempt in range(3):
|
|
478
|
-
try:
|
|
479
|
-
return continuation(client_call_details, request)
|
|
480
|
-
except grpc.RpcError as e:
|
|
481
|
-
if e.code() == grpc.StatusCode.UNAVAILABLE and attempt < 2:
|
|
482
|
-
time.sleep(2 ** attempt)
|
|
483
|
-
continue
|
|
484
|
-
raise
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
## Best Practices Summary
|
|
488
|
-
|
|
489
|
-
1. **Follow naming conventions:** Service/RPC PascalCase, fields snake_case
|
|
490
|
-
2. **Never reuse field numbers:** Mark deprecated as reserved
|
|
491
|
-
3. **Version carefully:** Use package versioning
|
|
492
|
-
4. **Handle errors properly:** Use standard status codes
|
|
493
|
-
5. **Use streaming appropriately:** For large datasets or real-time
|
|
494
|
-
6. **Secure connections:** Use TLS/SSL
|
|
495
|
-
7. **Authenticate requests:** Token-based or mTLS
|
|
496
|
-
8. **Optimize performance:** Connection pooling, compression
|
|
497
|
-
9. **Set timeouts:** Prevent hanging requests
|
|
498
|
-
10. **Use interceptors:** For cross-cutting concerns
|
|
499
|
-
|
|
1
|
+
# gRPC Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
gRPC is a high-performance RPC (Remote Procedure Call) framework that uses HTTP/2 and Protocol Buffers. It's ideal for microservices communication, streaming, and high-performance APIs.
|
|
6
|
+
|
|
7
|
+
## Core Concepts
|
|
8
|
+
|
|
9
|
+
### Protocol Buffers
|
|
10
|
+
|
|
11
|
+
**Define Service:**
|
|
12
|
+
```protobuf
|
|
13
|
+
syntax = "proto3";
|
|
14
|
+
|
|
15
|
+
package user;
|
|
16
|
+
|
|
17
|
+
service UserService {
|
|
18
|
+
rpc GetUser(GetUserRequest) returns (User);
|
|
19
|
+
rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);
|
|
20
|
+
rpc CreateUser(CreateUserRequest) returns (User);
|
|
21
|
+
rpc UpdateUser(UpdateUserRequest) returns (User);
|
|
22
|
+
rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
message User {
|
|
26
|
+
int64 id = 1;
|
|
27
|
+
string name = 2;
|
|
28
|
+
string email = 3;
|
|
29
|
+
string role = 4;
|
|
30
|
+
google.protobuf.Timestamp created_at = 5;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
message GetUserRequest {
|
|
34
|
+
int64 id = 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
message ListUsersRequest {
|
|
38
|
+
int32 page = 1;
|
|
39
|
+
int32 limit = 2;
|
|
40
|
+
string filter = 3;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
message ListUsersResponse {
|
|
44
|
+
repeated User users = 1;
|
|
45
|
+
int32 total = 2;
|
|
46
|
+
int32 page = 3;
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Service Definitions
|
|
51
|
+
|
|
52
|
+
**Unary RPC:**
|
|
53
|
+
```protobuf
|
|
54
|
+
rpc GetUser(GetUserRequest) returns (User);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Server Streaming:**
|
|
58
|
+
```protobuf
|
|
59
|
+
rpc ListUsers(ListUsersRequest) returns (stream User);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Client Streaming:**
|
|
63
|
+
```protobuf
|
|
64
|
+
rpc CreateUsers(stream CreateUserRequest) returns (CreateUsersResponse);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Bidirectional Streaming:**
|
|
68
|
+
```protobuf
|
|
69
|
+
rpc Chat(stream Message) returns (stream Message);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Best Practices
|
|
73
|
+
|
|
74
|
+
### 1. Naming Conventions
|
|
75
|
+
|
|
76
|
+
**Service Names:** PascalCase
|
|
77
|
+
```protobuf
|
|
78
|
+
service UserService { ... }
|
|
79
|
+
service OrderService { ... }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**RPC Names:** PascalCase
|
|
83
|
+
```protobuf
|
|
84
|
+
rpc GetUser(...) returns (...);
|
|
85
|
+
rpc CreateUser(...) returns (...);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Message Types:** PascalCase
|
|
89
|
+
```protobuf
|
|
90
|
+
message UserRequest { ... }
|
|
91
|
+
message UserResponse { ... }
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Field Names:** snake_case
|
|
95
|
+
```protobuf
|
|
96
|
+
message User {
|
|
97
|
+
int64 user_id = 1;
|
|
98
|
+
string full_name = 2;
|
|
99
|
+
string email_address = 3;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 2. Field Numbers
|
|
104
|
+
|
|
105
|
+
**Don't Reuse Numbers:**
|
|
106
|
+
- Field numbers are permanent
|
|
107
|
+
- Once used, can't be reused
|
|
108
|
+
- Mark deprecated fields as reserved
|
|
109
|
+
|
|
110
|
+
**Reserved Fields:**
|
|
111
|
+
```protobuf
|
|
112
|
+
message User {
|
|
113
|
+
reserved 5, 10 to 15;
|
|
114
|
+
reserved "old_field";
|
|
115
|
+
|
|
116
|
+
int64 id = 1;
|
|
117
|
+
string name = 2;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3. Versioning
|
|
122
|
+
|
|
123
|
+
**Package Versioning:**
|
|
124
|
+
```protobuf
|
|
125
|
+
package user.v1;
|
|
126
|
+
|
|
127
|
+
service UserService {
|
|
128
|
+
rpc GetUser(GetUserRequest) returns (User);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Add New Fields:**
|
|
133
|
+
```protobuf
|
|
134
|
+
message User {
|
|
135
|
+
int64 id = 1;
|
|
136
|
+
string name = 2;
|
|
137
|
+
string email = 3;
|
|
138
|
+
// New field added
|
|
139
|
+
string phone = 4; // New fields at end
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Backward Compatibility:**
|
|
144
|
+
- New fields should be optional
|
|
145
|
+
- Don't remove fields (mark reserved)
|
|
146
|
+
- Don't change field numbers
|
|
147
|
+
- Don't change field types
|
|
148
|
+
|
|
149
|
+
### 4. Error Handling
|
|
150
|
+
|
|
151
|
+
**Standard Status Codes:**
|
|
152
|
+
```python
|
|
153
|
+
from grpc import StatusCode
|
|
154
|
+
|
|
155
|
+
# Success
|
|
156
|
+
return user, StatusCode.OK
|
|
157
|
+
|
|
158
|
+
# Not found
|
|
159
|
+
return None, StatusCode.NOT_FOUND
|
|
160
|
+
|
|
161
|
+
# Invalid argument
|
|
162
|
+
return None, StatusCode.INVALID_ARGUMENT
|
|
163
|
+
|
|
164
|
+
# Internal error
|
|
165
|
+
return None, StatusCode.INTERNAL
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Error Details:**
|
|
169
|
+
```python
|
|
170
|
+
from google.rpc import status_pb2, error_details_pb2
|
|
171
|
+
|
|
172
|
+
def create_error_status(code, message, details=None):
|
|
173
|
+
error_status = status_pb2.Status()
|
|
174
|
+
error_status.code = code
|
|
175
|
+
error_status.message = message
|
|
176
|
+
|
|
177
|
+
if details:
|
|
178
|
+
error_detail = error_details_pb2.ErrorInfo()
|
|
179
|
+
error_detail.reason = details.get("reason")
|
|
180
|
+
error_detail.domain = details.get("domain")
|
|
181
|
+
error_status.details.add().Pack(error_detail)
|
|
182
|
+
|
|
183
|
+
return error_status
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 5. Streaming
|
|
187
|
+
|
|
188
|
+
**Server Streaming:**
|
|
189
|
+
```python
|
|
190
|
+
def ListUsers(request, context):
|
|
191
|
+
users = db.user.list(request.filter)
|
|
192
|
+
|
|
193
|
+
for user in users:
|
|
194
|
+
yield user_pb2.User(
|
|
195
|
+
id=user.id,
|
|
196
|
+
name=user.name,
|
|
197
|
+
email=user.email
|
|
198
|
+
)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Client Streaming:**
|
|
202
|
+
```python
|
|
203
|
+
def CreateUsers(request_iterator, context):
|
|
204
|
+
created_users = []
|
|
205
|
+
|
|
206
|
+
for create_request in request_iterator:
|
|
207
|
+
user = db.user.create(
|
|
208
|
+
name=create_request.name,
|
|
209
|
+
email=create_request.email
|
|
210
|
+
)
|
|
211
|
+
created_users.append(user)
|
|
212
|
+
|
|
213
|
+
return user_pb2.CreateUsersResponse(
|
|
214
|
+
users=created_users,
|
|
215
|
+
count=len(created_users)
|
|
216
|
+
)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Bidirectional Streaming:**
|
|
220
|
+
```python
|
|
221
|
+
def Chat(request_iterator, context):
|
|
222
|
+
for message in request_iterator:
|
|
223
|
+
# Process message
|
|
224
|
+
response = process_message(message)
|
|
225
|
+
|
|
226
|
+
# Send response
|
|
227
|
+
yield response
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Implementation Patterns
|
|
231
|
+
|
|
232
|
+
### Server Implementation (Python)
|
|
233
|
+
|
|
234
|
+
**Basic Server:**
|
|
235
|
+
```python
|
|
236
|
+
import grpc
|
|
237
|
+
from concurrent import futures
|
|
238
|
+
import user_pb2
|
|
239
|
+
import user_pb2_grpc
|
|
240
|
+
|
|
241
|
+
class UserService(user_pb2_grpc.UserServiceServicer):
|
|
242
|
+
def GetUser(self, request, context):
|
|
243
|
+
user = db.user.get_by_id(request.id)
|
|
244
|
+
if not user:
|
|
245
|
+
context.set_code(grpc.StatusCode.NOT_FOUND)
|
|
246
|
+
context.set_details('User not found')
|
|
247
|
+
return user_pb2.User()
|
|
248
|
+
|
|
249
|
+
return user_pb2.User(
|
|
250
|
+
id=user.id,
|
|
251
|
+
name=user.name,
|
|
252
|
+
email=user.email
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
def ListUsers(self, request, context):
|
|
256
|
+
users = db.user.list(
|
|
257
|
+
page=request.page,
|
|
258
|
+
limit=request.limit,
|
|
259
|
+
filter=request.filter
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
return user_pb2.ListUsersResponse(
|
|
263
|
+
users=[to_proto(u) for u in users],
|
|
264
|
+
total=len(users),
|
|
265
|
+
page=request.page
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
def serve():
|
|
269
|
+
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
|
270
|
+
user_pb2_grpc.add_UserServiceServicer_to_server(
|
|
271
|
+
UserService(), server
|
|
272
|
+
)
|
|
273
|
+
server.add_insecure_port('[::]:50051')
|
|
274
|
+
server.start()
|
|
275
|
+
server.wait_for_termination()
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Client Implementation (Python)
|
|
279
|
+
|
|
280
|
+
**Basic Client:**
|
|
281
|
+
```python
|
|
282
|
+
import grpc
|
|
283
|
+
import user_pb2
|
|
284
|
+
import user_pb2_grpc
|
|
285
|
+
|
|
286
|
+
def get_user(user_id):
|
|
287
|
+
with grpc.insecure_channel('localhost:50051') as channel:
|
|
288
|
+
stub = user_pb2_grpc.UserServiceStub(channel)
|
|
289
|
+
request = user_pb2.GetUserRequest(id=user_id)
|
|
290
|
+
|
|
291
|
+
try:
|
|
292
|
+
response = stub.GetUser(request, timeout=10)
|
|
293
|
+
return response
|
|
294
|
+
except grpc.RpcError as e:
|
|
295
|
+
if e.code() == grpc.StatusCode.NOT_FOUND:
|
|
296
|
+
print(f"User {user_id} not found")
|
|
297
|
+
raise
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Server Implementation (Node.js)
|
|
301
|
+
|
|
302
|
+
```javascript
|
|
303
|
+
const grpc = require('@grpc/grpc-js');
|
|
304
|
+
const protoLoader = require('@grpc/proto-loader');
|
|
305
|
+
|
|
306
|
+
const packageDefinition = protoLoader.loadSync('user.proto');
|
|
307
|
+
const userProto = grpc.loadPackageDefinition(packageDefinition).user;
|
|
308
|
+
|
|
309
|
+
const server = new grpc.Server();
|
|
310
|
+
|
|
311
|
+
server.addService(userProto.UserService.service, {
|
|
312
|
+
getUser: (call, callback) => {
|
|
313
|
+
const user = db.user.getById(call.request.id);
|
|
314
|
+
if (!user) {
|
|
315
|
+
callback({
|
|
316
|
+
code: grpc.status.NOT_FOUND,
|
|
317
|
+
message: 'User not found'
|
|
318
|
+
});
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
callback(null, user);
|
|
322
|
+
},
|
|
323
|
+
|
|
324
|
+
listUsers: (call) => {
|
|
325
|
+
const users = db.user.list(call.request);
|
|
326
|
+
users.forEach(user => call.write(user));
|
|
327
|
+
call.end();
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
|
|
332
|
+
server.start();
|
|
333
|
+
});
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Security
|
|
337
|
+
|
|
338
|
+
### TLS/SSL
|
|
339
|
+
|
|
340
|
+
**Server:**
|
|
341
|
+
```python
|
|
342
|
+
# Load credentials
|
|
343
|
+
with open('server.key', 'rb') as f:
|
|
344
|
+
private_key = f.read()
|
|
345
|
+
with open('server.crt', 'rb') as f:
|
|
346
|
+
certificate_chain = f.read()
|
|
347
|
+
|
|
348
|
+
server_credentials = grpc.ssl_server_credentials(
|
|
349
|
+
[(private_key, certificate_chain)]
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
server.add_secure_port('[::]:50051', server_credentials)
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Client:**
|
|
356
|
+
```python
|
|
357
|
+
# Load credentials
|
|
358
|
+
with open('ca.crt', 'rb') as f:
|
|
359
|
+
root_certificates = f.read()
|
|
360
|
+
|
|
361
|
+
credentials = grpc.ssl_channel_credentials(root_certificates)
|
|
362
|
+
channel = grpc.secure_channel('myserver:50051', credentials)
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Authentication
|
|
366
|
+
|
|
367
|
+
**Token-Based Auth:**
|
|
368
|
+
```python
|
|
369
|
+
def authenticate_client(context):
|
|
370
|
+
metadata = context.invocation_metadata()
|
|
371
|
+
for key, value in metadata:
|
|
372
|
+
if key == 'authorization':
|
|
373
|
+
token = value.replace('Bearer ', '')
|
|
374
|
+
return verify_token(token)
|
|
375
|
+
return None
|
|
376
|
+
|
|
377
|
+
class UserService(user_pb2_grpc.UserServiceServicer):
|
|
378
|
+
def GetUser(self, request, context):
|
|
379
|
+
user = authenticate_client(context)
|
|
380
|
+
if not user:
|
|
381
|
+
context.set_code(grpc.StatusCode.UNAUTHENTICATED)
|
|
382
|
+
context.set_details('Invalid token')
|
|
383
|
+
return user_pb2.User()
|
|
384
|
+
# Continue with request
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Performance Optimization
|
|
388
|
+
|
|
389
|
+
### Connection Pooling
|
|
390
|
+
|
|
391
|
+
**Reuse Channels:**
|
|
392
|
+
```python
|
|
393
|
+
class GRPCClient:
|
|
394
|
+
def __init__(self, address):
|
|
395
|
+
self.channel = grpc.secure_channel(
|
|
396
|
+
address,
|
|
397
|
+
grpc.ssl_channel_credentials()
|
|
398
|
+
)
|
|
399
|
+
self.stub = user_pb2_grpc.UserServiceStub(self.channel)
|
|
400
|
+
|
|
401
|
+
def get_user(self, user_id):
|
|
402
|
+
return self.stub.GetUser(
|
|
403
|
+
user_pb2.GetUserRequest(id=user_id)
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
def close(self):
|
|
407
|
+
self.channel.close()
|
|
408
|
+
|
|
409
|
+
# Reuse client instance
|
|
410
|
+
client = GRPCClient('myserver:50051')
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Compression
|
|
414
|
+
|
|
415
|
+
**Enable Compression:**
|
|
416
|
+
```python
|
|
417
|
+
channel = grpc.insecure_channel(
|
|
418
|
+
'localhost:50051',
|
|
419
|
+
options=[
|
|
420
|
+
('grpc.default_compression_algorithm', grpc.Compression.Gzip)
|
|
421
|
+
]
|
|
422
|
+
)
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Timeouts
|
|
426
|
+
|
|
427
|
+
**Set Timeouts:**
|
|
428
|
+
```python
|
|
429
|
+
response = stub.GetUser(request, timeout=5.0) # 5 seconds
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Keepalive
|
|
433
|
+
|
|
434
|
+
**Keep Connections Alive:**
|
|
435
|
+
```python
|
|
436
|
+
channel = grpc.insecure_channel(
|
|
437
|
+
'localhost:50051',
|
|
438
|
+
options=[
|
|
439
|
+
('grpc.keepalive_time_ms', 30000),
|
|
440
|
+
('grpc.keepalive_timeout_ms', 5000),
|
|
441
|
+
('grpc.keepalive_permit_without_calls', True),
|
|
442
|
+
('grpc.http2.max_pings_without_data', 0),
|
|
443
|
+
]
|
|
444
|
+
)
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
## Interceptors
|
|
448
|
+
|
|
449
|
+
### Server Interceptor
|
|
450
|
+
|
|
451
|
+
**Logging:**
|
|
452
|
+
```python
|
|
453
|
+
class LoggingInterceptor(grpc.ServerInterceptor):
|
|
454
|
+
def intercept_service(self, continuation, handler_call_details):
|
|
455
|
+
print(f"Calling: {handler_call_details.method}")
|
|
456
|
+
start_time = time.time()
|
|
457
|
+
|
|
458
|
+
def logging_wrapper(behavior, request_streaming, response_streaming):
|
|
459
|
+
def new_behavior(request_or_iterator, servicer_context):
|
|
460
|
+
response = behavior(request_or_iterator, servicer_context)
|
|
461
|
+
duration = time.time() - start_time
|
|
462
|
+
print(f"Completed in {duration:.2f}s")
|
|
463
|
+
return response
|
|
464
|
+
return new_behavior
|
|
465
|
+
|
|
466
|
+
return continuation(handler_call_details).replace(
|
|
467
|
+
unary_unary=logging_wrapper
|
|
468
|
+
)
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Client Interceptor
|
|
472
|
+
|
|
473
|
+
**Retry:**
|
|
474
|
+
```python
|
|
475
|
+
class RetryInterceptor(grpc.UnaryUnaryClientInterceptor):
|
|
476
|
+
def intercept_unary_unary(self, continuation, client_call_details, request):
|
|
477
|
+
for attempt in range(3):
|
|
478
|
+
try:
|
|
479
|
+
return continuation(client_call_details, request)
|
|
480
|
+
except grpc.RpcError as e:
|
|
481
|
+
if e.code() == grpc.StatusCode.UNAVAILABLE and attempt < 2:
|
|
482
|
+
time.sleep(2 ** attempt)
|
|
483
|
+
continue
|
|
484
|
+
raise
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## Best Practices Summary
|
|
488
|
+
|
|
489
|
+
1. **Follow naming conventions:** Service/RPC PascalCase, fields snake_case
|
|
490
|
+
2. **Never reuse field numbers:** Mark deprecated as reserved
|
|
491
|
+
3. **Version carefully:** Use package versioning
|
|
492
|
+
4. **Handle errors properly:** Use standard status codes
|
|
493
|
+
5. **Use streaming appropriately:** For large datasets or real-time
|
|
494
|
+
6. **Secure connections:** Use TLS/SSL
|
|
495
|
+
7. **Authenticate requests:** Token-based or mTLS
|
|
496
|
+
8. **Optimize performance:** Connection pooling, compression
|
|
497
|
+
9. **Set timeouts:** Prevent hanging requests
|
|
498
|
+
10. **Use interceptors:** For cross-cutting concerns
|
|
499
|
+
|