Skip to content

Commit 5acb8bb

Browse files
authored
Merge pull request #17 from kodado/performance-improvements
Parallelize decoding to improve performance
2 parents 0c0ea57 + da5371b commit 5acb8bb

File tree

2 files changed

+56
-50
lines changed

2 files changed

+56
-50
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@kodado/kodado-js",
3-
"version": "1.0.7",
3+
"version": "1.0.8",
44
"browser": "dist/index.js",
55
"main": "dist_node/index.js",
66
"types": "dist/index.d.ts",

src/api/GraphQLClient.ts

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ export type QueryVariables = {
4141
};
4242

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

Comments
 (0)