فاصله‌ی اصفهان و دریا زیاد بود و من در سفرهای شمال یا جنوب، ساعت‌ها در کنار دریا می‌نشستم و غرق می‌شدم در رویا؛ خیال می‌کردم که مثل کارتون‌ها یک بطری از اب می‌رسه به ساحل. و یک غریبه نامه انداخته توش و کمک خواسته؛ یا اصلا نامه نیست و یک نقشه‌ی گنجه و من وارد یک ماجرای هیجان‌انگیز می‌شم.

بعدها بخشی از رویام به واقعیت پیوست. بطری‌هایی رها شده در دریا پیدا می‌کردم. کوکاکولا یا پپسی. خانواده یا کوچیک. بدون نامه. زباله‌هایی که قرن‌ها در طبیعت باقی می‌مونن.

مدتی پیش، در یک شب طولانی و در حالی که با بی‌خوابی دست و پنجه نرم می‌کردم یک بات تلگرامی خنده‌دار نوشتم برای تجربه‌ی این رویا.

قصد هزینه نداشتم و می‌خواستم کل پروژه در دو سه ساعت تموم بشه. پس به Cloudflare Workers فکر کردم و برای دیتابیس هم به Cloudflare KV.

سرویس Workers یک سرویس بر پایه‌ی معماری Serverless هست؛ یعنی شما نیاز به کانفیگ سرور ندارید؛ همچنین سرور ۲۴ ساعته بالا نیست و به شما اختصاص داده نشده؛ فقط زمانی که نیازه و ریکوئستی میاد منابع به شما اختصاص داده می‌شه. در نتیجه کلا ارزون‌تر هم هست برای پروژه‌های شخصی.

کلاد فلیر تا ۱۰۰ هزار ریکوئست در روز رو به صورت رایگان میزبانی می‌کنه و بیش از این باید هزینه‌ی اندکی بپردازید.

همچنین Cloudflare KV یک دیتابیس غیررابطه‌ای key/value هست که به صورت رایگان در ورکرها قابل استفاده هستند.

منطق بات ساده بود. آیدی هر یوزر با استارت بات دردیتابیس اضافه می‌شه و هر زمان کسی نامه‌ای  بنویسه یک آیدی به صورت رندوم انتخاب می‌شه و نامه به اون فرد ارسال می‌شه.

هردوی دیتابیس و ورکرها برای بات کافی بودند. پروژه بعد از دو ساعت منتشر شد. برای چند نفر از دوستانم فرستادم و خوابیدم.

روز بعد بات ۹۰ کاربر داشت و من هیجان‌زده شدم. احساس می‌کردم آدم‌هایی هستیم با رویاهای کودکی مشترک که حالا یک‌جایی پیدا کردیم که این رویا رو زندگی کنیم.

اما دیتابیس KV برای چنین چیزی بهینه نبود. امکان کوئری نداشت و هر بار باید کل دیتابیس رو می‌خوند و بعد رندوم یکی رو انتخاب می‌کرد. ضمن این‌که بعضی‌ها ممکنه بدشانسی بیارند؛ و در زمانی که شانس گرفتن نامه برای هر کس ۱ به ۸۹ـه و ممکنه کمتر هم بشه (با افزایش کاربران)، هیچ‌وقت نامه نگیرند.

یک روز بیشتر روی پروژه کار می‌کنم. به دنبال دیتابیس‌های رابطه‌ای، serverless و رایگان می‌گشتم و CockroachDB رو پیدا کردم. سازندگانش البته این دیتابیس رو برای اسکیل‌های بسیار بالا طراحی کرده‌‌ند و پلن رایگانش برای یک بات تلگرام بیش از اندازه سخاوت‌مندانه‌ست. این سوسک عزیز، تمام نیازهای فعلی و آینده‌ی پروژه روحل می‌کنه و با تمام درایورها Postgres هم سازگاره. پس کار عجیب و غریبی نداریم برای اتصال به این‌جا.

تصمیم دوم استفاده از یک کتابخونه‌ی مخصوص بات تلگرام بود؛ به‌جای کار مستقیم با APIهای تلگرام.

این‌جا Grammy ناجی بود. یک کتابخونه‌ی قوی با داکیومنت‌های خوب برای دیپلوی روی اکثر ارائه‌دهنده‌های زیرساخت serverless. البته به جز کلاد فلیر ورکر!

تصمیم گرفتم اول بات را با Grammy بنویسم و بعد به فکر دیپلوی بیفتم. در نهایت تبدیل بات از صدا زدن خام ای‌پی‌آی‌ها به یک پروژه با معماری بهتر و Grammy یک روز طول کشید.

امکان ارسال ویس اضافه شد و گرافیک بات هم زیباتر شد (کیبوردها و منوها)؛ همچنین حالا یک دیتابیس کامل هم داشتم. امکان ریپورت نامه‌های نامناسب اضافه شد و تحویل نامه از حالت کاملا رندوم خارج شد. حالا کاربرها بر اساس زمان آخرین نامه‌ای که دریافت کردند، مرتب می‌شن و نامه دریافت می‌کنن. اونی که مدت زمان بیشتریه که نامه نگرفته، حالا زودتر نامه می‌گیره و به این ترتیب هیچ‌کس بدون نامه نمی‌مونه. البته همچنان ارسال‌کننده و دریافت‌کننده نامه‌ها ناشناسند. چون کل جذابیت پروژه روی همین بنا شده.

نوبت به دیپلوی رسید و بعد از امتحان کردن Deno تا Azure Function و ور رفتن با Workers به Vercel رسیدم.

مشکل Deno لیمیا ریکوئست بود که باعث می‌شه نامه‌های طولانی رو نتونه پاسخ بده و Azure Functions و ورکرهای Cloudflare هم سر سازگاری نداشتند و من البته تصمیم گرفتم وقت بیشتری صرف نکنم برای دیپلوی.

ورسل یک پلتفرم از تیم پشت NextJSـه که اول برای میزبانی پروژه‌های serverless بر پایه‌ی Next ساخته شده بود اما حالا تقریبا هر پروژه JS بر بستر serverless قابلیت اجرا دارن روش.

به عنوان یک توسعه‌دهنده‌ی Go و کسی که بخش زیادی از عمرش رو به کار با زبان‌های کامپایلری گذرونده تجربه‌ی نوشتن یک پروژه با JS عجیب و گاهی دردناک بود. البته در نهایت پروژه رو با تایپ اسکریپت نوشتم تا یکم از مزایای زبان‌های کامپایلری استفاده کنم.

مهم‌ترین مشکل حالا وصل کردن بات به دیتابیس در پروداکشن بود که به دلیل جدید بودن CockroachDB و اتصال SSL، مجبور شدم مستقیما از پکیج node-postgres استفاده کنم به جای orm های رایج؛ که بد هم نشد.

من فکر می‌کنم این موهبت دنیای ماست؛ این حجم زیاد ابزارها، راحت و ارزان (رایگان) برای تبدیل سریع ایده‌ها و رویاها به چیزی واقعی در دسترسه. و امیدوارم پروژه‌های کوچک دوست‌داشتنی بیشتری ببینیم.

نامه‌های اتفاقی
شبیه انداختن نامه تو بطری و رها کردنش در دریا. یک غریبه نامه‌ت رو می‌خونه و نامه‌هایی از غریبه‌ها دریافت می‌کنی.