1
1
import { EventSource , type ErrorEvent , type EventSourceInit } from "eventsource" ;
2
2
import { Transport , FetchLike } from "../shared/transport.js" ;
3
3
import { 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" ;
5
5
6
6
export class SseError extends Error {
7
7
constructor (
@@ -64,6 +64,7 @@ export class SSEClientTransport implements Transport {
64
64
private _abortController ?: AbortController ;
65
65
private _url : URL ;
66
66
private _resourceMetadataUrl ?: URL ;
67
+ private _scope ?: string ;
67
68
private _eventSourceInit ?: EventSourceInit ;
68
69
private _requestInit ?: RequestInit ;
69
70
private _authProvider ?: OAuthClientProvider ;
@@ -80,6 +81,7 @@ export class SSEClientTransport implements Transport {
80
81
) {
81
82
this . _url = url ;
82
83
this . _resourceMetadataUrl = undefined ;
84
+ this . _scope = undefined ;
83
85
this . _eventSourceInit = opts ?. eventSourceInit ;
84
86
this . _requestInit = opts ?. requestInit ;
85
87
this . _authProvider = opts ?. authProvider ;
@@ -93,7 +95,12 @@ export class SSEClientTransport implements Transport {
93
95
94
96
let result : AuthResult ;
95
97
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
+ } ) ;
97
104
} catch ( error ) {
98
105
this . onerror ?.( error as Error ) ;
99
106
throw error ;
@@ -139,7 +146,9 @@ export class SSEClientTransport implements Transport {
139
146
} )
140
147
141
148
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 ;
143
152
}
144
153
145
154
return response
@@ -218,7 +227,12 @@ export class SSEClientTransport implements Transport {
218
227
throw new UnauthorizedError ( "No auth provider" ) ;
219
228
}
220
229
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
+ } ) ;
222
236
if ( result !== "AUTHORIZED" ) {
223
237
throw new UnauthorizedError ( "Failed to authorize" ) ;
224
238
}
@@ -250,9 +264,16 @@ export class SSEClientTransport implements Transport {
250
264
if ( ! response . ok ) {
251
265
if ( response . status === 401 && this . _authProvider ) {
252
266
253
- this . _resourceMetadataUrl = extractResourceMetadataUrl ( response ) ;
267
+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams ( response ) ;
268
+ this . _resourceMetadataUrl = resourceMetadataUrl ;
269
+ this . _scope = scope ;
254
270
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
+ } ) ;
256
277
if ( result !== "AUTHORIZED" ) {
257
278
throw new UnauthorizedError ( ) ;
258
279
}
0 commit comments