@@ -19,6 +19,14 @@ export const isErrorConstructor = <ErrorType extends Error>(
1919} ;
2020
2121export class EmmettError extends Error {
22+ public static readonly Codes = {
23+ ValidationError : 400 ,
24+ IllegalStateError : 403 ,
25+ NotFoundError : 404 ,
26+ ConcurrencyError : 412 ,
27+ InternalServerError : 500 ,
28+ } ;
29+
2230 public errorCode : number ;
2331
2432 constructor (
@@ -29,7 +37,7 @@ export class EmmettError extends Error {
2937 ? options . errorCode
3038 : isNumber ( options )
3139 ? options
32- : 500 ;
40+ : EmmettError . Codes . InternalServerError ;
3341 const message =
3442 options && typeof options === 'object' && 'message' in options
3543 ? options . message
@@ -57,10 +65,24 @@ export class EmmettError extends Error {
5765 error . errorCode !== undefined &&
5866 error . errorCode !== null
5967 ? error . errorCode
60- : 500 ,
68+ : EmmettError . Codes . InternalServerError ,
6169 message : error . message ?? 'An unknown error occurred' ,
6270 } ) ;
6371 }
72+
73+ public static isInstanceOf < ErrorType extends EmmettError > (
74+ error : unknown ,
75+ errorCode : ( typeof EmmettError . Codes ) [ keyof typeof EmmettError . Codes ] ,
76+ ) : error is ErrorType {
77+ return (
78+ error !== undefined &&
79+ error !== null &&
80+ typeof error === 'object' &&
81+ 'errorCode' in error &&
82+ isNumber ( error . errorCode ) &&
83+ error . errorCode === errorCode
84+ ) ;
85+ }
6486}
6587
6688export class ConcurrencyError extends EmmettError {
@@ -70,7 +92,7 @@ export class ConcurrencyError extends EmmettError {
7092 message ?: string ,
7193 ) {
7294 super ( {
73- errorCode : 412 ,
95+ errorCode : EmmettError . Codes . ConcurrencyError ,
7496 message :
7597 message ??
7698 `Expected version ${ expected . toString ( ) } does not match current ${ current ?. toString ( ) } ` ,
@@ -81,10 +103,12 @@ export class ConcurrencyError extends EmmettError {
81103 }
82104}
83105
106+ // TODO: Make it derive from ConcurrencyError to avoid code duplication
107+ // Or add additional type to distinguinsh both errors
84108export class ConcurrencyInMemoryDatabaseError extends EmmettError {
85109 constructor ( message ?: string ) {
86110 super ( {
87- errorCode : 412 ,
111+ errorCode : EmmettError . Codes . ConcurrencyError ,
88112 message : message ?? `Expected document state does not match current one!` ,
89113 } ) ;
90114
@@ -96,7 +120,7 @@ export class ConcurrencyInMemoryDatabaseError extends EmmettError {
96120export class ValidationError extends EmmettError {
97121 constructor ( message ?: string ) {
98122 super ( {
99- errorCode : 400 ,
123+ errorCode : EmmettError . Codes . ValidationError ,
100124 message : message ?? `Validation Error ocurred during Emmett processing` ,
101125 } ) ;
102126
@@ -108,7 +132,7 @@ export class ValidationError extends EmmettError {
108132export class IllegalStateError extends EmmettError {
109133 constructor ( message ?: string ) {
110134 super ( {
111- errorCode : 403 ,
135+ errorCode : EmmettError . Codes . IllegalStateError ,
112136 message : message ?? `Illegal State ocurred during Emmett processing` ,
113137 } ) ;
114138
@@ -120,7 +144,7 @@ export class IllegalStateError extends EmmettError {
120144export class NotFoundError extends EmmettError {
121145 constructor ( options ?: { id : string ; type : string ; message ?: string } ) {
122146 super ( {
123- errorCode : 404 ,
147+ errorCode : EmmettError . Codes . NotFoundError ,
124148 message :
125149 options ?. message ??
126150 ( options ?. id
0 commit comments