From e53993eed286bf87fbe880e0a9fb1bddf3e193ae Mon Sep 17 00:00:00 2001 From: sjaanus Date: Thu, 2 Jan 2025 12:20:34 +0200 Subject: [PATCH] feat: diff for delta --- .../client-feature-toggle.controller.ts | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/lib/features/client-feature-toggles/client-feature-toggle.controller.ts b/src/lib/features/client-feature-toggles/client-feature-toggle.controller.ts index b40fb31afbf5..b474b0ee780a 100644 --- a/src/lib/features/client-feature-toggles/client-feature-toggle.controller.ts +++ b/src/lib/features/client-feature-toggles/client-feature-toggle.controller.ts @@ -39,6 +39,8 @@ import { CLIENT_METRICS_NAMEPREFIX, CLIENT_METRICS_TAGS, } from '../../internals'; +import isEqual from 'lodash.isequal'; +import { diff } from 'json-diff'; const version = 2; @@ -180,10 +182,39 @@ export default class FeatureController extends Controller { featuresSize + segmentsSize, ); - await this.clientFeatureToggleService.getClientDelta( - undefined, - query!, + const delta = + await this.clientFeatureToggleService.getClientDelta( + undefined, + query!, + ); + + const sortedToggles = features.sort((a, b) => + a.name.localeCompare(b.name), + ); + const sortedNewToggles = delta?.updated.sort((a, b) => + a.name.localeCompare(b.name), ); + + const deepEqualIgnoreOrder = (obj1, obj2) => { + const sortedObj1 = JSON.parse( + JSON.stringify(obj1, Object.keys(obj1).sort()), + ); + const sortedObj2 = JSON.parse( + JSON.stringify(obj2, Object.keys(obj2).sort()), + ); + return isEqual(sortedObj1, sortedObj2); + }; + + if (!deepEqualIgnoreOrder(sortedToggles, sortedNewToggles)) { + this.logger.warn( + `old features and new features are different. Old count ${ + features.length + }, new count ${delta?.updated.length}, query ${JSON.stringify(query)}, + diff ${JSON.stringify( + diff(sortedToggles, sortedNewToggles), + )}`, + ); + } this.storeFootprint(); } catch (e) { this.logger.error('Delta diff failed', e);