@@ -13,79 +13,85 @@ import (
1313
1414const (
1515 // outgoing headers
16- HeaderDatabase = "x-ydb-database"
17- HeaderTicket = "x-ydb-auth-ticket"
18- HeaderVersion = "x-ydb-sdk-build-info"
19- HeaderRequestType = "x-ydb-request-type"
20- HeaderTraceID = "x-ydb-trace-id"
21- HeaderUserAgent = "x-ydb-user-agent"
16+ HeaderDatabase = "x-ydb-database"
17+ HeaderTicket = "x-ydb-auth-ticket"
18+ HeaderVersion = "x-ydb-sdk-build-info"
19+ HeaderRequestType = "x-ydb-request-type"
20+ HeaderTraceID = "x-ydb-trace-id"
21+ HeaderUserAgent = "x-ydb-user-agent"
22+ HeaderClientCapabilities = "x-ydb-client-capabilities"
23+
24+ // outgoing hints
25+ HintSessionBalancer = "session-balancer"
2226
2327 // incomming headers
2428 HeaderServerHints = "x-ydb-server-hints"
2529
26- // hints
30+ // incoming hints
2731 HintSessionClose = "session-close"
2832)
2933
3034type Meta interface {
31- Meta (ctx context.Context ) (context.Context , error )
32-
33- WithDatabase (database string ) Meta
34- WithCredentials (creds credentials.Credentials ) Meta
35- WithUserAgent (userAgent string ) Meta
36-
37- Database () string
38- UserAgent () string
35+ Context (ctx context.Context ) (context.Context , error )
3936}
4037
4138func New (
4239 database string ,
4340 credentials credentials.Credentials ,
4441 trace trace.Driver ,
45- requestsType string ,
46- userAgent string ,
42+ opts ... Option ,
4743) Meta {
48- return & meta {
49- trace : trace ,
50- credentials : credentials ,
51- database : database ,
52- requestsType : requestsType ,
53- userAgent : userAgent ,
44+ m := & meta {
45+ trace : trace ,
46+ credentials : credentials ,
47+ database : database ,
5448 }
49+ for _ , o := range opts {
50+ o (m )
51+ }
52+ return m
5553}
5654
57- type meta struct {
58- trace trace.Driver
59- credentials credentials.Credentials
60- database string
61- requestsType string
62- userAgent string
63- }
55+ type Option func (m * meta )
6456
65- func (m * meta ) Database () string {
66- return m .database
57+ func WithUserAgentOption (userAgent string ) Option {
58+ return func (m * meta ) {
59+ m .userAgent = userAgent
60+ }
6761}
6862
69- func (m * meta ) UserAgent () string {
70- return m .userAgent
63+ func WithRequestTypeOption (requestType string ) Option {
64+ return func (m * meta ) {
65+ m .requestsType = requestType
66+ }
7167}
7268
73- func ( m * meta ) WithDatabase ( database string ) Meta {
74- mm := * m
75- mm . database = database
76- return & mm
69+ func AllowOption ( feature string ) Option {
70+ return func ( m * meta ) {
71+ m . capabilities = append ( m . capabilities , feature )
72+ }
7773}
7874
79- func (m * meta ) WithCredentials (creds credentials.Credentials ) Meta {
80- mm := * m
81- mm .credentials = creds
82- return & mm
75+ func ForbidOption (feature string ) Option {
76+ return func (m * meta ) {
77+ n := 0
78+ for _ , capability := range m .capabilities {
79+ if capability != feature {
80+ m .capabilities [n ] = capability
81+ n ++
82+ }
83+ }
84+ m .capabilities = m .capabilities [:n ]
85+ }
8386}
8487
85- func (m * meta ) WithUserAgent (userAgent string ) Meta {
86- mm := * m
87- mm .userAgent = userAgent
88- return & mm
88+ type meta struct {
89+ trace trace.Driver
90+ credentials credentials.Credentials
91+ database string
92+ requestsType string
93+ userAgent string
94+ capabilities []string
8995}
9096
9197func (m * meta ) meta (ctx context.Context ) (_ metadata.MD , err error ) {
@@ -114,15 +120,19 @@ func (m *meta) meta(ctx context.Context) (_ metadata.MD, err error) {
114120 }
115121 }
116122
123+ if len (m .capabilities ) > 0 {
124+ md .Append (HeaderClientCapabilities , m .capabilities ... )
125+ }
126+
117127 if m .credentials == nil {
118128 return md , nil
119129 }
120130
121131 var token string
122132
123- getCredentialsDone := trace .DriverOnGetCredentials (m .trace , & ctx )
133+ done := trace .DriverOnGetCredentials (m .trace , & ctx )
124134 defer func () {
125- getCredentialsDone (token , err )
135+ done (token , err )
126136 }()
127137
128138 token , err = m .credentials .Token (ctx )
@@ -138,7 +148,7 @@ func (m *meta) meta(ctx context.Context) (_ metadata.MD, err error) {
138148 return md , nil
139149}
140150
141- func (m * meta ) Meta (ctx context.Context ) (_ context.Context , err error ) {
151+ func (m * meta ) Context (ctx context.Context ) (_ context.Context , err error ) {
142152 md , err := m .meta (ctx )
143153 if err != nil {
144154 return ctx , xerrors .WithStackTrace (err )
0 commit comments