Skip to content

Commit 2d24c52

Browse files
fix(go-feature-flag-web): avoid infinite loop in waitWebsocketFinalStatus
Signed-off-by: Thomas Poignant <[email protected]>
1 parent 647ec79 commit 2d24c52

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

libs/providers/go-feature-flag-web/src/lib/go-feature-flag-web-provider.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,22 @@ describe('GoFeatureFlagWebProvider', () => {
606606
await OpenFeature.close();
607607
});
608608
});
609+
describe('waitWebsocketFinalStatus', () => {
610+
it('should resolve when WebSocket is open', async () => {
611+
const provider = new GoFeatureFlagWebProvider({ endpoint: 'http://localhost:1031' });
612+
const websocket = new WebSocket(websocketEndpoint);
613+
614+
const promise = provider.waitWebsocketFinalStatus(websocket);
615+
await websocketMockServer.connected;
616+
617+
await expect(promise).resolves.toBeUndefined();
618+
});
619+
});
620+
});
621+
it('should reject after maximum retries', async () => {
622+
const provider = new GoFeatureFlagWebProvider({ endpoint: 'http://localhost:1031', maxRetries: 1 });
623+
const websocket = new WebSocket('ws://localhost:1031/ws/v1/flag/change');
624+
await expect(provider.waitWebsocketFinalStatus(websocket)).rejects.toThrow(
625+
'Maximum retries reached while waiting for websocket connection',
626+
);
609627
});

libs/providers/go-feature-flag-web/src/lib/go-feature-flag-web-provider.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,16 @@ export class GoFeatureFlagWebProvider implements Provider {
133133
* @param socket - the websocket you are waiting for
134134
*/
135135
waitWebsocketFinalStatus(socket: WebSocket): Promise<void> {
136-
return new Promise((resolve) => {
136+
return new Promise((resolve, reject) => {
137+
let retries = 0;
137138
const checkConnection = () => {
138139
if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CLOSED) {
139140
return resolve();
140141
}
142+
if (retries >= this._maxRetries) {
143+
return reject(new Error('Maximum retries reached while waiting for websocket connection'));
144+
}
145+
retries++;
141146
// Wait 5 milliseconds before checking again
142147
setTimeout(checkConnection, 5);
143148
};

0 commit comments

Comments
 (0)