@@ -15,6 +15,8 @@ import {
1515import { parseDerControlListXml } from '../models/derControlList.js' ;
1616import { derControlSchema } from '../models/derControl.js' ;
1717import { z } from 'zod' ;
18+ import { type Logger } from 'pino' ;
19+ import { pinoLogger } from '../../helpers/logger.js' ;
1820
1921export const derProgramListDataSchema = z . array (
2022 z . object ( {
@@ -33,11 +35,15 @@ export class DerProgramListHelper extends EventEmitter<{
3335 private client : SEP2Client ;
3436 private derProgramListPollableResource : DerProgramListPollableResource | null =
3537 null ;
38+ private logger : Logger ;
3639
3740 constructor ( { client } : { client : SEP2Client } ) {
3841 super ( ) ;
3942
4043 this . client = client ;
44+ this . logger = pinoLogger . child ( {
45+ module : 'DerProgramListHelper' ,
46+ } ) ;
4147 }
4248
4349 updateHref ( { href } : { href : string } ) {
@@ -54,41 +60,58 @@ export class DerProgramListHelper extends EventEmitter<{
5460 defaultPollPushRates . functionSetAssignmentsListPoll ,
5561 } ) . on ( 'data' , ( data ) => {
5662 void ( async ( ) => {
57- const result : DerProgramListData = [ ] ;
63+ // this function calls SEP2Client requests directly (without polling)
64+ // it has been observed some CSIP utility servers will randomly error consistently (and exceed the retry limit)
65+ // in this scenario the application will crash since we await DefaultDerControl and DerControlList data
66+ // however we can safely ignore these errors since the data will be requested again on the next poll of DerProgramList
67+ try {
68+ const result : DerProgramListData = [ ] ;
69+
70+ for ( const program of data . derPrograms ) {
71+ const defaultDerControl =
72+ program . defaultDerControlLink
73+ ? parseDefaultDERControlXml (
74+ await this . client . get (
75+ program . defaultDerControlLink
76+ . href ,
77+ ) ,
78+ )
79+ : undefined ;
5880
59- for ( const program of data . derPrograms ) {
60- const defaultDerControl =
61- program . defaultDerControlLink
62- ? parseDefaultDERControlXml (
63- await this . client . get (
64- program . defaultDerControlLink
81+ const derControlList =
82+ program . derControlListLink
83+ ? await getListAll ( {
84+ client : this . client ,
85+ url : program . derControlListLink
6586 . href ,
66- ) ,
67- )
68- : undefined ;
87+ parseXml : parseDerControlListXml ,
88+ addItems : (
89+ allResults ,
90+ result ,
91+ ) => {
92+ allResults . derControls . push (
93+ ...result . derControls ,
94+ ) ;
95+ } ,
96+ getItems : ( result ) =>
97+ result . derControls ,
98+ } )
99+ : undefined ;
69100
70- const derControlList = program . derControlListLink
71- ? await getListAll ( {
72- client : this . client ,
73- url : program . derControlListLink . href ,
74- parseXml : parseDerControlListXml ,
75- addItems : ( allResults , result ) => {
76- allResults . derControls . push (
77- ...result . derControls ,
78- ) ;
79- } ,
80- getItems : ( result ) => result . derControls ,
81- } )
82- : undefined ;
101+ result . push ( {
102+ program,
103+ defaultDerControl,
104+ derControls : derControlList ?. derControls ,
105+ } ) ;
106+ }
83107
84- result . push ( {
85- program,
86- defaultDerControl,
87- derControls : derControlList ?. derControls ,
88- } ) ;
108+ this . emit ( 'data' , result ) ;
109+ } catch ( error ) {
110+ this . logger . error (
111+ error ,
112+ 'Error processing DerProgramList data' ,
113+ ) ;
89114 }
90-
91- this . emit ( 'data' , result ) ;
92115 } ) ( ) ;
93116 } ) ;
94117 }
0 commit comments