Skip to content

Commit 1742a2d

Browse files
committed
Fix crashing when CSIP server errors for DefaultDerControl and DerControlList
Related to #75
1 parent a99582c commit 1742a2d

File tree

1 file changed

+53
-30
lines changed

1 file changed

+53
-30
lines changed

src/sep2/helpers/derProgramList.ts

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
import { parseDerControlListXml } from '../models/derControlList.js';
1616
import { derControlSchema } from '../models/derControl.js';
1717
import { z } from 'zod';
18+
import { type Logger } from 'pino';
19+
import { pinoLogger } from '../../helpers/logger.js';
1820

1921
export 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

Comments
 (0)