@@ -41,7 +41,10 @@ export type QueryVariables = {
4141} ;
4242
4343export class GraphQLClient {
44- constructor ( private endpoint : string , private auth : AuthClient ) { }
44+ constructor (
45+ private endpoint : string ,
46+ private auth : AuthClient
47+ ) { }
4548
4649 private createSelection ( value : string ) {
4750 return {
@@ -91,6 +94,53 @@ export class GraphQLClient {
9194 }
9295 }
9396
97+ private async decodeArray ( items : any , query : any , i : number ) {
98+ if ( ! this . auth . user ) return ;
99+
100+ if (
101+ items [ i ] . users &&
102+ items [ i ] . users [ 0 ] . username &&
103+ items [ i ] . users [ 0 ] . publicKey
104+ ) {
105+ for ( const user of items [ i ] . users ) {
106+ this . addPublicKey ( user ) ;
107+ }
108+ }
109+
110+ const resolvedItem = items [ i ] . item
111+ ? await decryptItem ( items [ i ] , this . auth . user , query )
112+ : undefined ;
113+ const subqueries = query . selectionSet . selections . filter (
114+ ( subQ : any ) => subQ . name . value === "items" || subQ . name . value === "files"
115+ ) ;
116+
117+ if ( ! subqueries . length ) {
118+ items [ i ] = resolvedItem ? { ...items [ i ] , item : resolvedItem } : items [ i ] ;
119+ return ;
120+ }
121+
122+ const subqueryObject : any = { } ;
123+
124+ for ( const subquery of subqueries ) {
125+ const name = subquery . alias ? subquery . alias . value : subquery . name . value ;
126+
127+ subqueryObject [ name ] = await this . deepDecode ( items [ i ] [ name ] , subquery ) ;
128+ }
129+
130+ if ( resolvedItem ) {
131+ items [ i ] = {
132+ ...items [ i ] ,
133+ item : resolvedItem ,
134+ ...subqueryObject ,
135+ } ;
136+ } else {
137+ items [ i ] = {
138+ ...items [ i ] ,
139+ ...subqueryObject ,
140+ } ;
141+ }
142+ }
143+
94144 private async deepDecode ( items : any , query : any ) : Promise < any > {
95145 if ( ! this . auth . user ) return ;
96146 if ( ! items ) return ;
@@ -128,55 +178,11 @@ export class GraphQLClient {
128178 return { ...items , item : resolvedItem , ...subqueryObject } ;
129179 }
130180
131- for ( let i = 0 ; i < items . length ; i ++ ) {
132- if (
133- items [ i ] . users &&
134- items [ i ] . users [ 0 ] . username &&
135- items [ i ] . users [ 0 ] . publicKey
136- ) {
137- for ( const user of items [ i ] . users ) {
138- this . addPublicKey ( user ) ;
139- }
140- }
141-
142- const resolvedItem = items [ i ] . item
143- ? await decryptItem ( items [ i ] , this . auth . user , query )
144- : undefined ;
145- const subqueries = query . selectionSet . selections . filter (
146- ( subQ : any ) =>
147- subQ . name . value === "items" || subQ . name . value === "files"
148- ) ;
149-
150- if ( ! subqueries . length ) {
151- items [ i ] = resolvedItem
152- ? { ...items [ i ] , item : resolvedItem }
153- : items [ i ] ;
154- continue ;
155- }
156-
157- const subqueryObject : any = { } ;
158-
159- for ( const subquery of subqueries ) {
160- const name = subquery . alias
161- ? subquery . alias . value
162- : subquery . name . value ;
163-
164- subqueryObject [ name ] = await this . deepDecode ( items [ i ] [ name ] , subquery ) ;
165- }
181+ const decodePromises = items . map ( ( _ , i : number ) =>
182+ this . decodeArray ( items , query , i )
183+ ) ;
166184
167- if ( resolvedItem ) {
168- items [ i ] = {
169- ...items [ i ] ,
170- item : resolvedItem ,
171- ...subqueryObject ,
172- } ;
173- } else {
174- items [ i ] = {
175- ...items [ i ] ,
176- ...subqueryObject ,
177- } ;
178- }
179- }
185+ await Promise . all ( decodePromises ) ;
180186
181187 return items ;
182188 }
0 commit comments