11import { EventSource , type ErrorEvent , type EventSourceInit } from "eventsource" ;
22import { Transport , FetchLike } from "../shared/transport.js" ;
33import { JSONRPCMessage , JSONRPCMessageSchema } from "../types.js" ;
4- import { auth , AuthResult , extractResourceMetadataUrl , OAuthClientProvider , UnauthorizedError } from "./auth.js" ;
4+ import { auth , AuthResult , extractWWWAuthenticateParams , OAuthClientProvider , UnauthorizedError } from "./auth.js" ;
55
66export class SseError extends Error {
77 constructor (
@@ -64,6 +64,7 @@ export class SSEClientTransport implements Transport {
6464 private _abortController ?: AbortController ;
6565 private _url : URL ;
6666 private _resourceMetadataUrl ?: URL ;
67+ private _scope ?: string ;
6768 private _eventSourceInit ?: EventSourceInit ;
6869 private _requestInit ?: RequestInit ;
6970 private _authProvider ?: OAuthClientProvider ;
@@ -80,6 +81,7 @@ export class SSEClientTransport implements Transport {
8081 ) {
8182 this . _url = url ;
8283 this . _resourceMetadataUrl = undefined ;
84+ this . _scope = undefined ;
8385 this . _eventSourceInit = opts ?. eventSourceInit ;
8486 this . _requestInit = opts ?. requestInit ;
8587 this . _authProvider = opts ?. authProvider ;
@@ -93,7 +95,12 @@ export class SSEClientTransport implements Transport {
9395
9496 let result : AuthResult ;
9597 try {
96- result = await auth ( this . _authProvider , { serverUrl : this . _url , resourceMetadataUrl : this . _resourceMetadataUrl , fetchFn : this . _fetch } ) ;
98+ result = await auth ( this . _authProvider , {
99+ serverUrl : this . _url ,
100+ resourceMetadataUrl : this . _resourceMetadataUrl ,
101+ scope : this . _scope ,
102+ fetchFn : this . _fetch ,
103+ } ) ;
97104 } catch ( error ) {
98105 this . onerror ?.( error as Error ) ;
99106 throw error ;
@@ -139,7 +146,9 @@ export class SSEClientTransport implements Transport {
139146 } )
140147
141148 if ( response . status === 401 && response . headers . has ( 'www-authenticate' ) ) {
142- this . _resourceMetadataUrl = extractResourceMetadataUrl ( response ) ;
149+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams ( response ) ;
150+ this . _resourceMetadataUrl = resourceMetadataUrl ;
151+ this . _scope = scope ;
143152 }
144153
145154 return response
@@ -218,7 +227,12 @@ export class SSEClientTransport implements Transport {
218227 throw new UnauthorizedError ( "No auth provider" ) ;
219228 }
220229
221- const result = await auth ( this . _authProvider , { serverUrl : this . _url , authorizationCode, resourceMetadataUrl : this . _resourceMetadataUrl , fetchFn : this . _fetch } ) ;
230+ const result = await auth ( this . _authProvider , {
231+ serverUrl : this . _url , authorizationCode,
232+ resourceMetadataUrl : this . _resourceMetadataUrl ,
233+ scope : this . _scope ,
234+ fetchFn : this . _fetch ,
235+ } ) ;
222236 if ( result !== "AUTHORIZED" ) {
223237 throw new UnauthorizedError ( "Failed to authorize" ) ;
224238 }
@@ -250,9 +264,16 @@ export class SSEClientTransport implements Transport {
250264 if ( ! response . ok ) {
251265 if ( response . status === 401 && this . _authProvider ) {
252266
253- this . _resourceMetadataUrl = extractResourceMetadataUrl ( response ) ;
267+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams ( response ) ;
268+ this . _resourceMetadataUrl = resourceMetadataUrl ;
269+ this . _scope = scope ;
254270
255- const result = await auth ( this . _authProvider , { serverUrl : this . _url , resourceMetadataUrl : this . _resourceMetadataUrl , fetchFn : this . _fetch } ) ;
271+ const result = await auth ( this . _authProvider , {
272+ serverUrl : this . _url ,
273+ resourceMetadataUrl : this . _resourceMetadataUrl ,
274+ scope : this . _scope ,
275+ fetchFn : this . _fetch ,
276+ } ) ;
256277 if ( result !== "AUTHORIZED" ) {
257278 throw new UnauthorizedError ( ) ;
258279 }
0 commit comments