index.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import { HttpStatusCode } from "axios";
  2. export interface ApiErrorResponse {
  3. code: string;
  4. message: string;
  5. }
  6. export class ApiError extends Error {
  7. httpStatusCode: number;
  8. errCode: string;
  9. constructor(message: string, errCode: string, httpStatus: number) {
  10. super(message);
  11. this.name = "ApiError";
  12. this.errCode = errCode;
  13. this.httpStatusCode = httpStatus;
  14. }
  15. }
  16. export function isApiErrorResponse(object: any): object is ApiErrorResponse {
  17. return object && "code" in object && "message" in object;
  18. }
  19. export const CustomError = {
  20. VIDEO_PLAYBACK_FAILED: "video playback failed",
  21. ETAG_MISSING: "no header/etag present in response body",
  22. KEY_MISSING: "encrypted key missing from localStorage",
  23. FAILED_TO_LOAD_WEB_WORKER: "failed to load web worker",
  24. UNSUPPORTED_FILE_FORMAT: "unsupported file format",
  25. FILE_TOO_LARGE: "file too large",
  26. SUBSCRIPTION_EXPIRED: "subscription expired",
  27. STORAGE_QUOTA_EXCEEDED: "storage quota exceeded",
  28. SESSION_EXPIRED: "session expired",
  29. INVALID_MIME_TYPE: (type: string) => `invalid mime type -${type}`,
  30. SIGNUP_FAILED: "signup failed",
  31. FAV_COLLECTION_MISSING: "favorite collection missing",
  32. INVALID_COLLECTION_OPERATION: "invalid collection operation",
  33. TO_MOVE_FILES_FROM_MULTIPLE_COLLECTIONS:
  34. "to move files from multiple collections",
  35. REQUEST_CANCELLED: "request canceled",
  36. REQUEST_FAILED: "request failed",
  37. TOKEN_EXPIRED: "token expired",
  38. TOKEN_MISSING: "token missing",
  39. TOO_MANY_REQUESTS: "too many requests",
  40. BAD_REQUEST: "bad request",
  41. SUBSCRIPTION_NEEDED: "subscription not present",
  42. NOT_FOUND: "not found ",
  43. NO_METADATA: "no metadata",
  44. FILE_ID_NOT_FOUND: "file with id not found",
  45. WEAK_DEVICE: "password decryption failed on the device",
  46. INCORRECT_PASSWORD: "incorrect password",
  47. UPLOAD_CANCELLED: "upload cancelled",
  48. REQUEST_TIMEOUT: "request taking too long",
  49. HIDDEN_COLLECTION_SYNC_FILE_ATTEMPTED:
  50. "hidden collection sync file attempted",
  51. UNKNOWN_ERROR: "Something went wrong, please try again",
  52. WINDOWS_NATIVE_IMAGE_PROCESSING_NOT_SUPPORTED:
  53. "Windows native image processing is not supported",
  54. NETWORK_ERROR: "Network Error",
  55. NOT_FILE_OWNER: "not file owner",
  56. UPDATE_EXPORTED_RECORD_FAILED: "update file exported record failed",
  57. EXPORT_STOPPED: "export stopped",
  58. NO_EXPORT_FOLDER_SELECTED: "no export folder selected",
  59. EXPORT_FOLDER_DOES_NOT_EXIST: "export folder does not exist",
  60. AUTH_KEY_NOT_FOUND: "auth key not found",
  61. EXIF_DATA_NOT_FOUND: "exif data not found",
  62. SELECT_FOLDER_ABORTED: "select folder aborted",
  63. PROCESSING_FAILED: "processing failed",
  64. EXPORT_RECORD_JSON_PARSING_FAILED: "export record json parsing failed",
  65. TWO_FACTOR_ENABLED: "two factor enabled",
  66. PASSKEYS_TWO_FACTOR_ENABLED: "passkeys two factor enabled",
  67. CLIENT_ERROR: "client error",
  68. ServerError: "server error",
  69. FILE_NOT_FOUND: "file not found",
  70. UNSUPPORTED_PLATFORM: "Unsupported platform",
  71. UPDATE_URL_FILE_ID_MISMATCH: "update url file id mismatch",
  72. URL_ALREADY_SET: "url already set",
  73. FILE_CONVERSION_FAILED: "file conversion failed",
  74. };
  75. export function handleUploadError(error: any): Error {
  76. const parsedError = parseUploadErrorCodes(error);
  77. // breaking errors
  78. switch (parsedError.message) {
  79. case CustomError.SUBSCRIPTION_EXPIRED:
  80. case CustomError.STORAGE_QUOTA_EXCEEDED:
  81. case CustomError.SESSION_EXPIRED:
  82. case CustomError.UPLOAD_CANCELLED:
  83. throw parsedError;
  84. }
  85. return parsedError;
  86. }
  87. export function parseUploadErrorCodes(error: any) {
  88. let parsedMessage = null;
  89. if (error instanceof ApiError) {
  90. switch (error.httpStatusCode) {
  91. case HttpStatusCode.PaymentRequired:
  92. parsedMessage = CustomError.SUBSCRIPTION_EXPIRED;
  93. break;
  94. case HttpStatusCode.UpgradeRequired:
  95. parsedMessage = CustomError.STORAGE_QUOTA_EXCEEDED;
  96. break;
  97. case HttpStatusCode.Unauthorized:
  98. parsedMessage = CustomError.SESSION_EXPIRED;
  99. break;
  100. case HttpStatusCode.PayloadTooLarge:
  101. parsedMessage = CustomError.FILE_TOO_LARGE;
  102. break;
  103. default:
  104. parsedMessage = `${CustomError.UNKNOWN_ERROR} statusCode:${error.httpStatusCode}`;
  105. }
  106. } else {
  107. parsedMessage = error.message;
  108. }
  109. return new Error(parsedMessage);
  110. }
  111. export const parseSharingErrorCodes = (error: any) => {
  112. let parsedMessage = null;
  113. if (error instanceof ApiError) {
  114. switch (error.httpStatusCode) {
  115. case HttpStatusCode.BadRequest:
  116. parsedMessage = CustomError.BAD_REQUEST;
  117. break;
  118. case HttpStatusCode.PaymentRequired:
  119. parsedMessage = CustomError.SUBSCRIPTION_NEEDED;
  120. break;
  121. case HttpStatusCode.NotFound:
  122. parsedMessage = CustomError.NOT_FOUND;
  123. break;
  124. case HttpStatusCode.Unauthorized:
  125. case HttpStatusCode.Gone:
  126. parsedMessage = CustomError.TOKEN_EXPIRED;
  127. break;
  128. case HttpStatusCode.TooManyRequests:
  129. parsedMessage = CustomError.TOO_MANY_REQUESTS;
  130. break;
  131. default:
  132. parsedMessage = `${CustomError.UNKNOWN_ERROR} statusCode:${error.httpStatusCode}`;
  133. }
  134. } else {
  135. parsedMessage = error.message;
  136. }
  137. return new Error(parsedMessage);
  138. };