Skip to content

Commit 60e115e

Browse files
authored
feat: expose error cause via error object (#34)
* feat: expose error cause via error object * chore: format error message * feat: setup tests for error cause
1 parent 13b5725 commit 60e115e

File tree

11 files changed

+257
-32
lines changed

11 files changed

+257
-32
lines changed

src/client/app.ts

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,9 @@ export class App extends Lister {
450450
const responseObject = response.toObject();
451451

452452
if (responseObject.status?.code !== StatusCode.SUCCESS) {
453-
throw new Error(responseObject.status?.description);
453+
throw new Error(responseObject.status?.description, {
454+
cause: responseObject,
455+
});
454456
}
455457

456458
console.info("\nDataset created\n%s", responseObject.status.description);
@@ -492,7 +494,9 @@ export class App extends Lister {
492494
responseObject.status?.code !== StatusCode.SUCCESS ||
493495
!responseObject.model
494496
) {
495-
throw new Error(responseObject.status?.description);
497+
throw new Error(responseObject.status?.description, {
498+
cause: responseObject,
499+
});
496500
}
497501
console.info("\nModel created\n%s", responseObject.status.description);
498502
return responseObject.model;
@@ -527,7 +531,9 @@ export class App extends Lister {
527531
const response = await this.grpcRequest(postModules, request);
528532
const responseObject = response.toObject();
529533
if (responseObject.status?.code !== StatusCode.SUCCESS) {
530-
throw new Error(responseObject.status?.description);
534+
throw new Error(responseObject.status?.description, {
535+
cause: responseObject,
536+
});
531537
}
532538
console.info("\nModule created\n%s", responseObject.status.description);
533539
return responseObject.modulesList?.[0];
@@ -661,7 +667,9 @@ export class App extends Lister {
661667
const response = await this.grpcRequest(postWorkflows, request);
662668
const responseObject = response.toObject();
663669
if (responseObject.status?.code !== StatusCode.SUCCESS) {
664-
throw new Error(responseObject.status?.description);
670+
throw new Error(responseObject.status?.description, {
671+
cause: responseObject,
672+
});
665673
}
666674
console.info("\nWorkflow created\n%s", responseObject.status?.description);
667675

@@ -715,7 +723,9 @@ export class App extends Lister {
715723
const response = await this.grpcRequest(getModel, request);
716724
const responseObject = response.toObject();
717725
if (responseObject.status?.code !== StatusCode.SUCCESS) {
718-
throw new Error(responseObject.status?.description);
726+
throw new Error(responseObject.status?.description, {
727+
cause: responseObject,
728+
});
719729
}
720730
return responseObject.model;
721731
}
@@ -743,7 +753,9 @@ export class App extends Lister {
743753
const response = await this.grpcRequest(getWorkflow, request);
744754
const responseObject = response.toObject();
745755
if (responseObject.status?.code !== StatusCode.SUCCESS) {
746-
throw new Error(responseObject.status?.description);
756+
throw new Error(responseObject.status?.description, {
757+
cause: responseObject,
758+
});
747759
}
748760
return responseObject.workflow;
749761
}
@@ -771,7 +783,9 @@ export class App extends Lister {
771783
const response = await this.grpcRequest(getDataset, request);
772784
const responseObject = response.toObject();
773785
if (responseObject.status?.code !== StatusCode.SUCCESS) {
774-
throw new Error(responseObject.status?.description);
786+
throw new Error(responseObject.status?.description, {
787+
cause: responseObject,
788+
});
775789
}
776790
return responseObject.dataset;
777791
}
@@ -794,7 +808,9 @@ export class App extends Lister {
794808
const response = await this.grpcRequest(deleteDatasets, request);
795809
const responseObject = response.toObject();
796810
if (responseObject.status?.code !== StatusCode.SUCCESS) {
797-
throw new Error(responseObject.status?.description);
811+
throw new Error(responseObject.status?.description, {
812+
cause: responseObject,
813+
});
798814
}
799815
console.info("\nDataset Deleted\n%s", responseObject.status?.description);
800816
}
@@ -817,7 +833,9 @@ export class App extends Lister {
817833
const response = await this.grpcRequest(deleteModels, request);
818834
const responseObject = response.toObject();
819835
if (responseObject.status?.code !== StatusCode.SUCCESS) {
820-
throw new Error(responseObject.status?.description);
836+
throw new Error(responseObject.status?.description, {
837+
cause: responseObject,
838+
});
821839
}
822840
console.info("\nModel Deleted\n%s", responseObject.status?.description);
823841
}
@@ -840,7 +858,9 @@ export class App extends Lister {
840858
const response = await this.grpcRequest(deleteWorkflows, request);
841859
const responseObject = response.toObject();
842860
if (responseObject.status?.code !== StatusCode.SUCCESS) {
843-
throw new Error(responseObject.status?.description);
861+
throw new Error(responseObject.status?.description, {
862+
cause: responseObject,
863+
});
844864
}
845865
console.info("\nWorkflow Deleted\n%s", responseObject.status?.description);
846866
}
@@ -863,7 +883,9 @@ export class App extends Lister {
863883
const response = await this.grpcRequest(deleteModules, request);
864884
const responseObject = response.toObject();
865885
if (responseObject.status?.code !== StatusCode.SUCCESS) {
866-
throw new Error(responseObject.status?.description);
886+
throw new Error(responseObject.status?.description, {
887+
cause: responseObject,
888+
});
867889
}
868890
console.info("\nModule Deleted\n%s", responseObject.status?.description);
869891
}

src/client/dataset.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ export class Dataset extends Lister {
8181
const response = await this.grpcRequest(postDatasetVersions, request);
8282
const responseObject = response.toObject();
8383
if (responseObject.status?.code !== StatusCode.SUCCESS) {
84-
throw new Error(responseObject.status?.description);
84+
throw new Error(responseObject.status?.description, {
85+
cause: responseObject,
86+
});
8587
}
8688
console.info("\nDataset Version created\n%s", response.getStatus());
8789

@@ -101,7 +103,9 @@ export class Dataset extends Lister {
101103
const response = await this.grpcRequest(deleteDatasetVersions, request);
102104
const responseObject = response.toObject();
103105
if (responseObject.status?.code !== StatusCode.SUCCESS) {
104-
throw new Error(responseObject.status?.description);
106+
throw new Error(responseObject.status?.description, {
107+
cause: responseObject,
108+
});
105109
}
106110
console.info("\nDataset Version Deleted\n%s", response.getStatus());
107111
}

src/client/input.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,9 @@ export class Input extends Lister {
830830
}
831831
throw new Error(
832832
`Inputs upload failed with response ${responseObject.status?.description}`,
833+
{
834+
cause: responseObject,
835+
},
833836
);
834837
} else {
835838
if (showLog) {

src/client/lister.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ export class Lister extends BaseClient {
5353

5454
// Check response status
5555
if (responseObject.status?.code !== StatusCode.SUCCESS) {
56-
throw new Error(`Listing failed with response ${response}`);
56+
throw new Error(
57+
`Listing failed with response ${responseObject.status?.description}`,
58+
{
59+
cause: responseObject,
60+
},
61+
);
5762
}
5863

5964
const dataListEntries = Object.entries(responseObject).find(
@@ -114,7 +119,12 @@ export class Lister extends BaseClient {
114119

115120
// Check response status
116121
if (responseObject.status?.code !== StatusCode.SUCCESS) {
117-
throw new Error(`Listing failed with response ${response}`);
122+
throw new Error(
123+
`Listing failed with response ${responseObject.status?.description}`,
124+
{
125+
cause: responseObject,
126+
},
127+
);
118128
}
119129

120130
return response;

src/client/model.ts

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,10 @@ export class Model extends Lister {
254254

255255
if (responseObject.status?.code !== StatusCode.SUCCESS) {
256256
throw new Error(
257-
`Failed to get model: ${responseObject.status} : ${responseObject.status?.description}`,
257+
`Failed to get model: ${responseObject.status?.code} : ${responseObject.status?.description}`,
258+
{
259+
cause: responseObject,
260+
},
258261
);
259262
}
260263

@@ -309,7 +312,9 @@ export class Model extends Lister {
309312
const responseObject = response.toObject();
310313

311314
if (responseObject.status?.code !== StatusCode.SUCCESS) {
312-
throw new Error(responseObject.status?.toString());
315+
throw new Error(responseObject.status?.description, {
316+
cause: responseObject,
317+
});
313318
}
314319

315320
const templates = responseToTemplates(
@@ -378,7 +383,9 @@ export class Model extends Lister {
378383
const responseObject = response.toObject();
379384

380385
if (responseObject.status?.code !== StatusCode.SUCCESS) {
381-
throw new Error(responseObject.status?.toString());
386+
throw new Error(responseObject.status?.description, {
387+
cause: responseObject,
388+
});
382389
}
383390

384391
const params = responseToModelParams(
@@ -479,7 +486,9 @@ export class Model extends Lister {
479486
const responseObject = response.toObject();
480487

481488
if (responseObject.status?.code !== StatusCode.SUCCESS) {
482-
throw new Error(responseObject.status?.toString());
489+
throw new Error(responseObject.status?.description, {
490+
cause: responseObject,
491+
});
483492
}
484493
const paramInfo = responseToParamInfo(
485494
responseObject,
@@ -522,7 +531,9 @@ export class Model extends Lister {
522531
const responseObject = response.toObject();
523532

524533
if (responseObject.status?.code !== StatusCode.SUCCESS) {
525-
throw new Error(responseObject.status?.toString());
534+
throw new Error(responseObject.status?.description, {
535+
cause: responseObject,
536+
});
526537
}
527538
}
528539

@@ -559,7 +570,9 @@ export class Model extends Lister {
559570
const responseObject = response.toObject();
560571

561572
if (responseObject.status?.code !== StatusCode.SUCCESS) {
562-
throw new Error(responseObject.status?.description);
573+
throw new Error(responseObject.status?.description, {
574+
cause: responseObject,
575+
});
563576
}
564577

565578
return responseObject.model;
@@ -810,6 +823,9 @@ export class Model extends Lister {
810823
reject(
811824
new Error(
812825
`Model Predict failed with response ${JSON.stringify(responseObject.status)}`,
826+
{
827+
cause: responseObject,
828+
},
813829
),
814830
);
815831
} else {
@@ -818,7 +834,9 @@ export class Model extends Lister {
818834
})
819835
.catch((error) => {
820836
reject(
821-
new Error(`Model Predict failed with error: ${error.message}`),
837+
new Error(`Model Predict failed with error: ${error.message}`, {
838+
cause: error.cause,
839+
}),
822840
);
823841
});
824842
};
@@ -877,7 +895,10 @@ export class Model extends Lister {
877895
resolveNext?.();
878896
} else {
879897
error = new Error(
880-
`Model Predict failed with response ${JSON.stringify(dataObject.status)}`,
898+
`Model Predict failed with response ${dataObject.status?.description}`,
899+
{
900+
cause: dataObject,
901+
},
881902
);
882903
resolveNext?.();
883904
}
@@ -948,7 +969,10 @@ export class Model extends Lister {
948969
queue.push(dataObject);
949970
} else {
950971
error = new Error(
951-
`Model Predict failed with response ${JSON.stringify(dataObject.status)}`,
972+
`Model Predict failed with response ${dataObject.status?.description}`,
973+
{
974+
cause: dataObject,
975+
},
952976
);
953977
}
954978
resolveNext?.();

src/client/search.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ export class Search extends Lister {
267267
} else {
268268
throw new Error(
269269
`Listing failed with response ${responseObject.status?.description}`,
270+
{
271+
cause: responseObject,
272+
},
270273
);
271274
}
272275
}

src/client/user.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ export class User extends Lister {
170170
if (responseObject.status?.code !== StatusCode.SUCCESS) {
171171
throw new Error(
172172
`Failed to create app: ${responseObject.status?.description}`,
173+
{
174+
cause: responseObject,
175+
},
173176
);
174177
}
175178

@@ -216,6 +219,9 @@ export class User extends Lister {
216219
if (responseObject.status?.code !== StatusCode.SUCCESS) {
217220
throw new Error(
218221
`Failed to create runner: ${responseObject.status?.description}`,
222+
{
223+
cause: responseObject,
224+
},
219225
);
220226
}
221227
console.info("\nRunner created\n%s", responseObject.status.description);
@@ -247,6 +253,9 @@ export class User extends Lister {
247253
if (responseObject.status?.code !== StatusCode.SUCCESS) {
248254
throw new Error(
249255
`Failed to retrieve app: ${responseObject.status?.description}`,
256+
{
257+
cause: responseObject,
258+
},
250259
);
251260
}
252261
return responseObject["app"];
@@ -277,6 +286,9 @@ export class User extends Lister {
277286
if (responseObject.status?.code !== StatusCode.SUCCESS) {
278287
throw new Error(
279288
`Failed to retrieve runner: ${responseObject.status?.description}`,
289+
{
290+
cause: responseObject,
291+
},
280292
);
281293
}
282294
return responseObject.runner;
@@ -302,7 +314,9 @@ export class User extends Lister {
302314
const response = await this.grpcRequest(deleteApp, request);
303315
const responseObject = response.toObject();
304316
if (responseObject.status?.code !== StatusCode.SUCCESS) {
305-
throw new Error(responseObject.status?.description);
317+
throw new Error(responseObject.status?.description, {
318+
cause: responseObject,
319+
});
306320
}
307321
console.info("\nApp Deleted\n%s", responseObject.status.description);
308322
}
@@ -325,7 +339,9 @@ export class User extends Lister {
325339
const response = await this.grpcRequest(deleteRunners, request);
326340
const responseObject = response.toObject();
327341
if (responseObject.status?.code !== StatusCode.SUCCESS) {
328-
throw new Error(responseObject.status?.description);
342+
throw new Error(responseObject.status?.description, {
343+
cause: responseObject,
344+
});
329345
}
330346
console.info("\nRunner Deleted\n%s", responseObject.status.description);
331347
}

src/client/workflow.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ export class Workflow extends Lister {
135135
reject(
136136
new Error(
137137
`Workflow Predict failed with response ${responseObject.status?.description}`,
138+
{
139+
cause: responseObject,
140+
},
138141
),
139142
);
140143
} else {
@@ -143,7 +146,9 @@ export class Workflow extends Lister {
143146
})
144147
.catch((error) => {
145148
reject(
146-
new Error(`Model Predict failed with error: ${error.message}`),
149+
new Error(`Model Predict failed with error: ${error.message}`, {
150+
cause: error.cause,
151+
}),
147152
);
148153
});
149154
};
@@ -273,7 +278,10 @@ export class Workflow extends Lister {
273278
const responseObject = response.toObject();
274279
if (responseObject.status?.code !== StatusCode.SUCCESS) {
275280
throw new Error(
276-
`Workflow Export failed with response ${response.getStatus()?.toString()}`,
281+
`Workflow Export failed with response ${responseObject.status?.description}`,
282+
{
283+
cause: responseObject,
284+
},
277285
);
278286
}
279287

0 commit comments

Comments
 (0)