@@ -18,18 +18,12 @@ import * as ended from 'is-stream-ended';
1818import { PassThrough , Transform } from 'stream' ;
1919
2020import { APICaller } from '../apiCaller' ;
21- import {
22- GaxCall ,
23- APICallback ,
24- SimpleCallbackFunction ,
25- RequestType ,
26- } from '../apitypes' ;
21+ import { GaxCall , APICallback , RequestType , ResultTuple } from '../apitypes' ;
2722import { Descriptor } from '../descriptor' ;
2823import { CallSettings } from '../gax' ;
2924import { NormalApiCaller } from '../normalCalls/normalApiCaller' ;
3025
3126import { PagedApiCaller } from './pagedApiCaller' ;
32- import * as call from '../call' ;
3327
3428export interface ResponseType {
3529 [ index : string ] : string ;
@@ -38,12 +32,10 @@ export interface ResponseType {
3832 * A descriptor for methods that support pagination.
3933 */
4034export class PageDescriptor implements Descriptor {
41- resolveParams : Function ;
4235 requestPageTokenField : string ;
4336 responsePageTokenField : string ;
4437 requestPageSizeField ?: string ;
4538 resourceField : string ;
46- cache : Array < { } > ;
4739
4840 constructor (
4941 requestPageTokenField : string ,
@@ -53,8 +45,6 @@ export class PageDescriptor implements Descriptor {
5345 this . requestPageTokenField = requestPageTokenField ;
5446 this . responsePageTokenField = responsePageTokenField ;
5547 this . resourceField = resourceField ;
56- this . resolveParams = ( ) => { } ;
57- this . cache = [ ] ;
5848 }
5949
6050 /**
@@ -122,93 +112,49 @@ export class PageDescriptor implements Descriptor {
122112 asyncIterate (
123113 apiCall : GaxCall ,
124114 request : RequestType ,
125- options : CallSettings
115+ options ? : CallSettings
126116 ) : AsyncIterable < { } | undefined > {
127- const iterable = this . createIterator ( ) ;
128- const funcPromise =
129- typeof apiCall === 'function' ? Promise . resolve ( apiCall ) : apiCall ;
130- funcPromise
131- . then ( ( func : GaxCall ) => {
132- this . makeCall ( request , func , options ) ;
133- } )
134- . catch ( error => {
135- throw new Error ( error ) ;
136- } ) ;
117+ options = Object . assign ( { } , options , { autoPaginate : false } ) ;
118+ const iterable = this . createIterator ( apiCall , request , options ) ;
137119 return iterable ;
138120 }
139121
140- createIterator ( ) : AsyncIterable < { } | undefined > {
141- // eslint-disable-next-line @typescript-eslint/no-this-alias
142- const self = this ;
122+ createIterator (
123+ apiCall : GaxCall ,
124+ request : RequestType ,
125+ options : CallSettings
126+ ) : AsyncIterable < { } | undefined > {
143127 const asyncIterable = {
144128 [ Symbol . asyncIterator ] ( ) {
145- const paramPromise : Promise < [
146- RequestType ,
147- SimpleCallbackFunction
148- ] > = new Promise ( resolve => {
149- self . resolveParams = resolve ;
150- } ) ;
151- let nextPageRequest : RequestType | null = { } ;
152- let firstCall = true ;
129+ let nextPageRequest : RequestType | null | undefined = request ;
130+ const cache : { } [ ] = [ ] ;
153131 return {
154132 async next ( ) {
155- const ongoingCall = new call . OngoingCallPromise ( ) ;
156- const [ request , func ] = await paramPromise ;
157- if ( self . cache . length > 0 ) {
133+ if ( cache . length > 0 ) {
158134 return Promise . resolve ( {
159135 done : false ,
160- value : self . cache . shift ( ) ,
136+ value : cache . shift ( ) ,
161137 } ) ;
162138 }
163- if ( ! firstCall && ! nextPageRequest ) {
164- return Promise . resolve ( { done : true , value : undefined } ) ;
139+ if ( nextPageRequest ) {
140+ let result : { } | [ ResponseType ] | null ;
141+ [ result , nextPageRequest ] = ( await apiCall (
142+ nextPageRequest ! ,
143+ options
144+ ) ) as ResultTuple ;
145+ cache . push ( ...( result as ResponseType [ ] ) ) ;
165146 }
166- nextPageRequest = await self . getNextPageRequest (
167- func ,
168- firstCall ? request : nextPageRequest ! ,
169- ongoingCall
170- ) ;
171- firstCall = false ;
172- if ( self . cache . length === 0 ) {
173- nextPageRequest = null ;
147+ if ( cache . length === 0 ) {
174148 return Promise . resolve ( { done : true , value : undefined } ) ;
175149 }
176- return Promise . resolve ( { done : false , value : self . cache . shift ( ) } ) ;
150+ return Promise . resolve ( { done : false , value : cache . shift ( ) } ) ;
177151 } ,
178152 } ;
179153 } ,
180154 } ;
181155 return asyncIterable ;
182156 }
183157
184- async getNextPageRequest (
185- func : SimpleCallbackFunction ,
186- request : RequestType ,
187- ongoingCall : call . OngoingCallPromise
188- ) : Promise < RequestType | null > {
189- ongoingCall . call ( func , request ) ;
190- let nextPageRequest = null ;
191- const [ response ] = await ongoingCall . promise ;
192- const pageToken = ( response as ResponseType ) [ this . responsePageTokenField ] ;
193- if ( pageToken ) {
194- nextPageRequest = Object . assign ( { } , request ) ;
195- nextPageRequest [ this . requestPageTokenField ] = pageToken ;
196- }
197- const responses = ( response as ResponseType ) [ this . resourceField ] ;
198- this . cache . push ( ...responses ) ;
199- return nextPageRequest ;
200- }
201-
202- makeCall ( request : RequestType , func : GaxCall , settings : CallSettings ) {
203- if ( settings . pageToken ) {
204- request [ this . requestPageTokenField ] = settings . pageToken ;
205- }
206- if ( settings . pageSize ) {
207- request [ this . requestPageSizeField ! ] = settings . pageSize ;
208- }
209- this . resolveParams ( [ request , func ] ) ;
210- }
211-
212158 getApiCaller ( settings : CallSettings ) : APICaller {
213159 if ( ! settings . autoPaginate ) {
214160 return new NormalApiCaller ( ) ;
0 commit comments