1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
//! The `BasicAuthProvider` capability.
//!
//! A small, purpose-built capability that hands out credentials to data-path
//! nodes. It is intentionally provider- and execution-model agnostic: the same
//! trait serves active and passive providers across both the shared and local
//! execution models. Consumers depend only on the two methods below, never on
//! how credentials are produced or refreshed.
//!
//! The `#[capability]` proc macro expands the trait into:
//!
//! - A `pub(crate) mod local` containing the `!Send` `BasicAuthProvider` trait variant
//! - A `pub(crate) mod shared` containing the `Send + Sync` `BasicAuthProvider` trait variant
//! - A `SharedAsLocalBasicAuthProvider` adapter
//! - A zero-sized `pub struct BasicAuthProvider` registration handle
//! - `local_entry::<E>` / `shared_entry::<E>` factory bridges
//! - A `KNOWN_CAPABILITIES` distributed-slice entry
use crateBasicAuthCredential;
use crateCapabilityError;
use Stream;
use capability;
use Pin;
use Duration;
/// How close to [`BasicAuthCredential::expires_on`] a credential stops being usable.
///
/// Part of the capability contract rather than either side's private tuning,
/// because both sides have to agree on it:
///
/// - A **provider** must not serve a credential inside this window, and must
/// schedule its refresh far enough ahead of expiry to publish a replacement
/// before the current one enters it. A provider whose refresh lead time is
/// smaller than this margin strands its consumers: the credential it is still
/// serving has already stopped being usable.
/// - A **consumer** must stop sending requests once its cached credential is
/// inside this window, so a request cannot outlive the credential it carries
/// while in flight, in the presence of clock skew between the consumer, the
/// credential issuer and the service.
///
/// Fixed rather than configurable so a provider can validate its own refresh
/// settings against the same value every consumer enforces. It has to cover a
/// request's own duration plus that clock skew; 30s matches the default credential
/// endpoint timeout.
pub const BASIC_AUTH_CREDENTIAL_USABLE_MARGIN: Duration = from_secs;
/// A per-consumer subscription to Basic Auth credential refreshes.
///
/// The item is a plain [`BasicAuthCredential`], not a `Result`: a refresh failure does not
/// terminate the subscription. The stream simply does not emit until the next
/// successful refresh, and failures surface via [`BasicAuthProvider::get_credential`]
/// and telemetry instead. Because the item is [`Clone`], a provider can fan one
/// refreshed credential out to all subscribers via a `watch`/`broadcast` channel.
///
/// Boxed to hide the concrete stream type so providers can back it differently
/// (e.g. a `watch` channel or an `unfold`) without changing the signature. The
/// `Send` bound is intentionally omitted: the subscription is always consumed
/// on the core that created it (thread-per-core), so it need not be `Send`. The
/// `#[capability]` macro emits this signature into both the `local` (`?Send`)
/// and `shared` (`Send + Sync`) trait variants unchanged.
pub type BasicAuthCredentialStream = ;
/// Hands out BasicAuthCredential to data-path nodes.