11import { SplitIO } from '../types' ;
22import { ISegmentsCacheSync , ISplitsCacheSync , IStorageSync } from './types' ;
3- import { setToArray , ISet } from '../utils/lang/sets' ;
3+ import { setToArray } from '../utils/lang/sets' ;
44import { getMatching } from '../utils/key' ;
5+ import { IMembershipsResponse , IMySegmentsResponse } from '../dtos/types' ;
56
67/**
78 * Storage-agnostic adaptation of `loadDataIntoLocalStorage` function
@@ -37,19 +38,26 @@ export function loadData(preloadedData: SplitIO.PreloadedData, storage: { splits
3738 }
3839
3940 if ( matchingKey ) { // add mySegments data (client-side)
40- let mySegmentsData = preloadedData . mySegmentsData && preloadedData . mySegmentsData [ matchingKey ] ;
41- if ( ! mySegmentsData ) {
42- // segmentsData in an object where the property is the segment name and the pertaining value is a stringified object that contains the `added` array of userIds
43- mySegmentsData = Object . keys ( segmentsData ) . filter ( segmentName => {
44- const matchingKeys = segmentsData [ segmentName ] ;
45- return matchingKeys . indexOf ( matchingKey ) > - 1 ;
46- } ) ;
41+ let membershipsData = preloadedData . membershipsData && preloadedData . membershipsData [ matchingKey ] ;
42+ if ( ! membershipsData && segmentsData ) {
43+ membershipsData = {
44+ ms : {
45+ k : Object . keys ( segmentsData ) . filter ( segmentName => {
46+ const segmentKeys = segmentsData [ segmentName ] ;
47+ return segmentKeys . indexOf ( matchingKey ) > - 1 ;
48+ } ) . map ( segmentName => ( { n : segmentName } ) )
49+ }
50+ } ;
4751 }
48- storage . segments . resetSegments ( { k : mySegmentsData . map ( s => ( { n : s } ) ) } ) ;
52+ if ( membershipsData ) {
53+ if ( membershipsData . ms ) storage . segments . resetSegments ( membershipsData . ms ) ;
54+ if ( membershipsData . ls && storage . largeSegments ) storage . largeSegments . resetSegments ( membershipsData . ls ) ;
55+ }
56+
4957 } else { // add segments data (server-side)
50- Object . keys ( segmentsData ) . filter ( segmentName => {
51- const matchingKeys = segmentsData [ segmentName ] ;
52- storage . segments . addToSegment ( segmentName , matchingKeys ) ;
58+ Object . keys ( segmentsData ) . forEach ( segmentName => {
59+ const segmentKeys = segmentsData [ segmentName ] ;
60+ storage . segments . update ( segmentName , segmentKeys , [ ] , - 1 ) ;
5361 } ) ;
5462 }
5563}
@@ -62,22 +70,43 @@ export function getSnapshot(storage: IStorageSync, userKeys?: SplitIO.SplitKey[]
6270 segmentsData : userKeys ?
6371 undefined : // @ts -ignore accessing private prop
6472 Object . keys ( storage . segments . segmentCache ) . reduce ( ( prev , cur ) => { // @ts -ignore accessing private prop
65- prev [ cur ] = setToArray ( storage . segments . segmentCache [ cur ] as ISet < string > ) ;
73+ prev [ cur ] = setToArray ( storage . segments . segmentCache [ cur ] as Set < string > ) ;
6674 return prev ;
6775 } , { } ) ,
68- mySegmentsData : userKeys ?
69- userKeys . reduce < Record < string , string [ ] > > ( ( prev , userKey ) => {
70- prev [ getMatching ( userKey ) ] = storage . shared ?
76+ membershipsData : userKeys ?
77+ userKeys . reduce < Record < string , IMembershipsResponse > > ( ( prev , userKey ) => {
78+ if ( storage . shared ) {
7179 // Client-side segments
7280 // @ts -ignore accessing private prop
73- Object . keys ( storage . shared ( userKey ) . segments . segmentCache ) :
74- // Server-side segments
75- // @ts -ignore accessing private prop
76- Object . keys ( storage . segments . segmentCache ) . reduce < string [ ] > ( ( prev , segmentName ) => { // @ts -ignore accessing private prop
77- return storage . segments . segmentCache [ segmentName ] . has ( userKey ) ?
78- prev . concat ( segmentName ) :
79- prev ;
80- } , [ ] ) ;
81+ const sharedStorage = storage . shared ( userKey ) ;
82+ prev [ getMatching ( userKey ) ] = {
83+ ms : {
84+ // @ts -ignore accessing private prop
85+ k : Object . keys ( sharedStorage . segments . segmentCache ) . map ( segmentName => ( { n : segmentName } ) ) ,
86+ // cn: sharedStorage.segments.getChangeNumber()
87+ } ,
88+ ls : sharedStorage . largeSegments ? {
89+ // @ts -ignore accessing private prop
90+ k : Object . keys ( sharedStorage . largeSegments . segmentCache ) . map ( segmentName => ( { n : segmentName } ) ) ,
91+ // cn: sharedStorage.largeSegments.getChangeNumber()
92+ } : undefined
93+ } ;
94+ } else {
95+ prev [ getMatching ( userKey ) ] = {
96+ ms : {
97+ // Server-side segments
98+ // @ts -ignore accessing private prop
99+ k : Object . keys ( storage . segments . segmentCache ) . reduce < IMySegmentsResponse [ 'k' ] > ( ( prev , segmentName ) => { // @ts -ignore accessing private prop
100+ return storage . segments . segmentCache [ segmentName ] . has ( userKey ) ?
101+ prev ! . concat ( { n : segmentName } ) :
102+ prev ;
103+ } , [ ] )
104+ } ,
105+ ls : {
106+ k : [ ]
107+ }
108+ } ;
109+ }
81110 return prev ;
82111 } , { } ) :
83112 undefined
0 commit comments