feat: add b-route send adapter shell

This commit is contained in:
zhaoyilun
2026-07-10 20:40:18 +08:00
parent b08b0e01bd
commit 713917d929
5 changed files with 178 additions and 7 deletions

View File

@@ -0,0 +1,81 @@
package tools
import (
"context"
"fmt"
"strings"
)
type BRouteSendAdapterConfig struct {
SidecarPath string
TimeoutSeconds int
Mode string
}
type bRouteSendMessageConnector struct {
config BRouteSendAdapterConfig
}
func NewBRouteSendMessageConnector(config BRouteSendAdapterConfig) SendMessageConnector {
config.Mode = strings.TrimSpace(strings.ToLower(config.Mode))
if config.Mode == "" {
config.Mode = "disabled"
}
return bRouteSendMessageConnector{config: config}
}
func (c bRouteSendMessageConnector) ExecuteSendMessage(_ context.Context, request SendMessageConnectorRequest) (SendMessageConnectorResult, error) {
switch c.config.Mode {
case "disabled":
result := SendMessageConnectorResult{
Accepted: false,
Status: "blocked",
ErrorCode: "broute_mode_blocked",
ErrorMessage: "B-route send adapter is disabled",
ConnectorMode: "broute-disabled",
}
return result, fmt.Errorf(result.ErrorMessage)
case "dry_run_contract":
if err := validateBRouteSendMessageRequest(request); err != nil {
return SendMessageConnectorResult{
Accepted: false,
Status: "failed",
ErrorCode: "broute_invalid_request",
ErrorMessage: err.Error(),
ConnectorMode: "broute-dry-run-contract",
}, nil
}
return SendMessageConnectorResult{
Accepted: false,
Status: "blocked",
ErrorCode: "broute_dry_run_only",
ErrorMessage: "B-route adapter dry_run_contract mode validates request shape only and does not start a sidecar",
ConnectorMode: "broute-dry-run-contract",
}, nil
default:
result := SendMessageConnectorResult{
Accepted: false,
Status: "blocked",
ErrorCode: "broute_mode_blocked",
ErrorMessage: "B-route send adapter mode is not enabled: " + c.config.Mode,
ConnectorMode: "broute-disabled",
}
return result, fmt.Errorf(result.ErrorMessage)
}
}
func validateBRouteSendMessageRequest(request SendMessageConnectorRequest) error {
if strings.TrimSpace(request.TargetRef) == "" {
return fmt.Errorf("target_ref is required")
}
if strings.TrimSpace(request.ContentSHA256) == "" {
return fmt.Errorf("content_sha256 is required")
}
if strings.TrimSpace(request.IdempotencyKeySHA256) == "" {
return fmt.Errorf("idempotency_key_sha256 is required")
}
if request.ExecutionMode != sendMessageProductionMode {
return fmt.Errorf("execution_mode must be production")
}
return nil
}