10
0

index.js 943 B

123456789101112131415161718192021222324252627282930313233
  1. const objectToString = Object.prototype.toString;
  2. const isError = value => objectToString.call(value) === '[object Error]';
  3. const errorMessages = new Set([
  4. 'network error', // Chrome
  5. 'Failed to fetch', // Chrome
  6. 'NetworkError when attempting to fetch resource.', // Firefox
  7. 'The Internet connection appears to be offline.', // Safari 16
  8. 'Load failed', // Safari 17+
  9. 'Network request failed', // `cross-fetch`
  10. 'fetch failed', // Undici (Node.js)
  11. 'terminated', // Undici (Node.js)
  12. ]);
  13. export default function isNetworkError(error) {
  14. const isValid = error
  15. && isError(error)
  16. && error.name === 'TypeError'
  17. && typeof error.message === 'string';
  18. if (!isValid) {
  19. return false;
  20. }
  21. // We do an extra check for Safari 17+ as it has a very generic error message.
  22. // Network errors in Safari have no stack.
  23. if (error.message === 'Load failed') {
  24. return error.stack === undefined;
  25. }
  26. return errorMessages.has(error.message);
  27. }