@@ -9,13 +9,15 @@ import {
99 AuthenticationHandler ,
1010 Client ,
1111 HTTPMessageHandler ,
12+ Middleware ,
1213 ResponseType ,
1314 RetryHandler ,
1415 RetryHandlerOptions ,
1516 TelemetryHandler
1617} from '@microsoft/microsoft-graph-client' ;
1718import * as MicrosoftGraph from '@microsoft/microsoft-graph-types' ;
1819import * as MicrosoftGraphBeta from '@microsoft/microsoft-graph-types-beta' ;
20+ import { MgtBaseComponent } from './components/baseComponent' ;
1921import { IProvider } from './providers/IProvider' ;
2022import { Batch } from './utils/Batch' ;
2123import { prepScopes } from './utils/GraphHelpers' ;
@@ -36,25 +38,38 @@ export class Graph {
3638 */
3739 public client : Client ;
3840
39- constructor ( provider : IProvider ) {
41+ private _provider : IProvider ;
42+
43+ constructor ( provider : IProvider , component ?: MgtBaseComponent ) {
4044 if ( provider ) {
41- const authenticationHandler = new AuthenticationHandler ( provider ) ;
42- const retryHandler = new RetryHandler ( new RetryHandlerOptions ( ) ) ;
43- const telemetryHandler = new TelemetryHandler ( ) ;
44- const sdkVersionMiddleware = new SdkVersionMiddleware ( ) ;
45- const httpMessageHandler = new HTTPMessageHandler ( ) ;
45+ this . _provider = provider ;
4646
47- authenticationHandler . setNext ( retryHandler ) ;
48- retryHandler . setNext ( telemetryHandler ) ;
49- telemetryHandler . setNext ( sdkVersionMiddleware ) ;
50- sdkVersionMiddleware . setNext ( httpMessageHandler ) ;
47+ const middleware : Middleware [ ] = [
48+ new AuthenticationHandler ( provider ) ,
49+ new RetryHandler ( new RetryHandlerOptions ( ) ) ,
50+ new TelemetryHandler ( ) ,
51+ new SdkVersionMiddleware ( component ) ,
52+ new HTTPMessageHandler ( )
53+ ] ;
5154
5255 this . client = Client . initWithMiddleware ( {
53- middleware : authenticationHandler
56+ middleware : this . chainMiddleware ( ... middleware )
5457 } ) ;
5558 }
5659 }
5760
61+ /**
62+ * Returns a new instance of the Graph using the same
63+ * provider and the provided component.
64+ *
65+ * @param {MgtBaseComponent } component
66+ * @returns
67+ * @memberof Graph
68+ */
69+ public forComponent ( component : MgtBaseComponent ) : Graph {
70+ return new Graph ( this . _provider , component ) ;
71+ }
72+
5873 /**
5974 * creates batch request
6075 *
@@ -608,6 +623,19 @@ export class Graph {
608623 . delete ( ) ;
609624 }
610625
626+ private chainMiddleware ( ...middleware : Middleware [ ] ) : Middleware {
627+ const rootMiddleware = middleware [ 0 ] ;
628+ let current = rootMiddleware ;
629+ for ( let i = 1 ; i < middleware . length ; ++ i ) {
630+ const next = middleware [ i ] ;
631+ if ( current . setNext ) {
632+ current . setNext ( next ) ;
633+ }
634+ current = next ;
635+ }
636+ return rootMiddleware ;
637+ }
638+
611639 private blobToBase64 ( blob : Blob ) : Promise < string > {
612640 return new Promise ( ( resolve , reject ) => {
613641 const reader = new FileReader ( ) ;
0 commit comments