* Strips the non-serializable BearerTokenProvider callbacks from the singular * and named provider configs before they cross the RPC boundary, replacing each * with a `hasBearerTokenProvider: true` wire flag. The callback closes over its * own token scope/audience, so nothing scope-relate
(
provider: ProviderConfig | undefined,
providers: NamedProviderConfig[] | undefined
)
| 180 | * for session-side registration. |
| 181 | */ |
| 182 | function extractBearerTokenProviders( |
| 183 | provider: ProviderConfig | undefined, |
| 184 | providers: NamedProviderConfig[] | undefined |
| 185 | ): { |
| 186 | wireProvider: WireProviderConfig | undefined; |
| 187 | wireProviders: WireNamedProviderConfig[] | undefined; |
| 188 | callbacks: Map<string, BearerTokenProvider>; |
| 189 | } { |
| 190 | const callbacks = new Map<string, BearerTokenProvider>(); |
| 191 | |
| 192 | let wireProvider: WireProviderConfig | undefined = provider; |
| 193 | if (provider?.bearerTokenProvider) { |
| 194 | const { bearerTokenProvider, ...rest } = provider; |
| 195 | callbacks.set(DEFAULT_PROVIDER_NAME, bearerTokenProvider); |
| 196 | wireProvider = { |
| 197 | ...rest, |
| 198 | hasBearerTokenProvider: true, |
| 199 | }; |
| 200 | } |
| 201 | |
| 202 | let wireProviders: WireNamedProviderConfig[] | undefined = providers; |
| 203 | if (providers?.some((p) => p.bearerTokenProvider)) { |
| 204 | wireProviders = providers.map((p) => { |
| 205 | if (!p.bearerTokenProvider) return p; |
| 206 | const { bearerTokenProvider, ...rest } = p; |
| 207 | callbacks.set(p.name, bearerTokenProvider); |
| 208 | return { |
| 209 | ...rest, |
| 210 | hasBearerTokenProvider: true, |
| 211 | }; |
| 212 | }); |
| 213 | } |
| 214 | |
| 215 | return { wireProvider, wireProviders, callbacks }; |
| 216 | } |
| 217 | |
| 218 | /** |
| 219 | * Convert MCP server configs from public API format (workingDirectory) to |
no test coverage detected
searching dependent graphs…