ظاهر کلی برنامه بدین صورت است:
![ظاهر برنامه](https://quera.ir/qbox/view/agiyfLLfQb/retry_server.gif)
# پروژه اولیه
پروژه اولیه را از
[این لینک](/contest/assignments/35059/download_problem_initial_project/125885/)
دانلود کنید.
<details class="green">
<summary>
ساختار پروژه
</summary>
```
retry
├── public
│ ├── favicon.ico
│ └── index.html
├── server
│ └── server.js
├── src
│ ├── __tests__
│ │ └── sample.test.js
│ ├── App.js
│ ├── index.css
│ └── index.js
├── package-lock.json
└── package.json
```
</details>
<details class="brown">
<summary>
راهاندازی پروژه
</summary>
**برای اجرای پروژه، باید `NodeJS` و `npm` را از قبل نصب کرده باشید.**
- ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
- در پوشهی `retry` ، دستور `npm install` را برای نصب نیازمندیها اجرا کنید.
- در همین پوشه، دستور `npm start` را برای راهاندازی پروژه اجرا کنید.
- پس از انجام موفق این مراحل، با مراجعه به آدرس `http://localhost:3000/`
میتوانید نتیجه را ببینید.
</details>
<details class="brown">
<summary>
راهاندازی سرور
</summary>
- در پوشهی `retry` ، دستور `npm install` را برای نصب نیازمندیها اجرا کنید.
- در همین پوشه، دستور `npm run server` را برای راهاندازی سرور پروژه اجرا کنید.
</details>
# جزئیات
به ما آدرسی از سرور داده شده است و از ما خواسته شده که سالم بودن این آدرس را چک کنیم. برای اینکار تصمیم گرفتیم که درخواستهای مختلف با فاصله زمانی مختلف به آدرس داده شده ارسال کنیم.
مواردی که باید در این سوال به آنها دقت کنید:
- بلافاصله بعد از لود شدن صفحه، ارسال درخواستها شروع میشود و اولین درخواست فرستاده میشود. بعد از آن درخواستها با تاخیر فرستاده میشوند. تاخیر بین درخواستها از `firstRetryDelay` (که کامپوننت به عنوان پراپرتی میگیرد) شروع میشود و هر بار به اندازه همان `firstRetryDelay` به آن اضافه میشود.
- آدرس که درخواستها به آن ارسال میشود به عنوان پراپرتی با نام `url` دریافت میشود. (برای اینکه این آدرس کار کند، باید سرور طبق توضیحات بالا راهاندازی شود)
- اگر درخواستی موفقیت آمیز بود (status برابر ۲۰۰ باشد)، درخواست دیگری بعد از تاخیر ارسال میشود.
- اگر درخواستی ناموفق بود (status برابر ۵۰۰ باشد)، نتیجه نمایش داده میشود. فرمت نتیجه بعد از ناموفق بودن درخواست: (که <attemptCount> همان تعداد تلاشها تا این درخواست با شمردن این درخواست است)
```
Failed after <attemptCount> attempts.
```
- ماکسیمم تعداد درخواستها به تعداد `maxAttempts` که از پراپرتی گرفته میشود. اگر بعد از ماکسیمم تعداد درخواست، همهی تلاشها موفقیت آمیز بود، نتیجه نمایش داده میشود. فرمت نتیجه بعد از موفق بودن همهی درخواستها:
```
Success after <attemptCount> attempts.
```
- المان `#message` برای نشان دادن پیشرفت درخواستها است. بعد از اتمام هردرخواست پیامی با فرمت زیر نمایش داده میشود:
```
Attempt <previousAttempt> done. Retrying in <nextDelay> milliseconds...
```
و فقط موقع اولین درخواست پیامی که نوشته میشود:
```
First Attempt...
```
# نکات
- همهی درخواستها از نوع *GET* هستند و باید با *fetch* انجام شوند.
- شما تنها مجاز به اعمال تغییرات در فایل `src/App.js` هستید.
- برای ارسال پاسخ میتوانید فقط فایل `App.js` را بدون _zip_ کردن ارسال کنید یا کل پروژه را _zip_ کرده و ارسال کنید. دقت کنید که پوشهی
_node_modules_ در فایل ارسالی نباشد.