44 * This software may be modified and distributed under the terms
55 * of the MIT license. See the LICENSE file for details.
66 */
7- /**
8- * Import RTK slices and api
9- */
7+ import { Micro } from 'effect' ;
108import { CustomLogger , logger as loggerFn , LogLevel } from '@forgerock/sdk-logger' ;
119import { createStorage } from '@forgerock/storage' ;
1210import { isGenericError , createWellknownError } from '@forgerock/sdk-utilities' ;
1311
12+ /**
13+ * Import RTK slices and api
14+ */
1415import {
1516 createClientStore ,
1617 handleChallengePolling ,
@@ -412,7 +413,9 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
412413 } ,
413414
414415 /**
415- * @method : poll - Poll for updates for a polling collector
416+ * @method poll - Perform challenge polling or continue polling
417+ * @param {PollingCollector } collector - the polling collector
418+ * @returns {Promise<PollingStatus | InternalErrorResponse> } - Returns a promise that resolves to a polling status or error
416419 */
417420 poll : async ( collector : PollingCollector ) : Promise < PollingStatus | InternalErrorResponse > => {
418421 try {
@@ -427,19 +430,53 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
427430 } ;
428431 }
429432
433+ const pollChallengeStatus = collector . output . config . pollChallengeStatus ;
430434 const challenge = collector . output . config . challenge ;
431435
432- // Challenge Polling
433- if ( challenge ) {
436+ if ( challenge && pollChallengeStatus === true ) {
437+ // Challenge Polling
434438 return await handleChallengePolling ( {
435439 collector,
436440 challenge,
437441 store,
438442 log,
439443 } ) ;
444+ } else if ( ! challenge && ! pollChallengeStatus ) {
445+ // Continue polling
446+ const retriesLeft = collector . output . config . retriesRemaining ;
447+ const pollInterval = collector . output . config . pollInterval ?? 2000 ; // miliseconds
448+
449+ if ( retriesLeft === undefined ) {
450+ log . error ( 'No retries found on PollingCollector' ) ;
451+ return {
452+ error : {
453+ message : 'No retries found on PollingCollector' ,
454+ type : 'argument_error' ,
455+ } ,
456+ type : 'internal_error' ,
457+ } ;
458+ }
459+
460+ if ( retriesLeft > 0 ) {
461+ const getStatusµ = Micro . sync ( ( ) => 'continue' as PollingStatus ) . pipe (
462+ Micro . delay ( pollInterval ) ,
463+ ) ;
464+ const status : PollingStatus = await Micro . runPromise ( getStatusµ ) ;
465+ return status ;
466+ } else {
467+ // Retries exhausted
468+ return 'timedOut' as PollingStatus ;
469+ }
440470 } else {
441- // TODO: Handle continue polling
442- return 'error' as PollingStatus ;
471+ // Error if polling type can't be determined from configuration
472+ log . error ( 'Invalid polling collector configuration' ) ;
473+ return {
474+ error : {
475+ message : 'Invalid polling collector configuration' ,
476+ type : 'internal_error' ,
477+ } ,
478+ type : 'internal_error' ,
479+ } ;
443480 }
444481 } catch ( err ) {
445482 const errorMessage = err instanceof Error ? err . message : String ( err ) ;
0 commit comments