كود يشتغل على السيرفر داخل موقعك: الدوال السحابية في ابني

الدالة السحابية هي ملف كود يعيش داخل موقعك ويشتغل على السيرفر، مو في متصفح الزائر. تناديها الصفحة بسطر واحد: cloud.fn.call باسم الدالة والبيانات. أي منطق ما يصح ينكشف للزائر — قواعد التسعير، التحقق من الطلب، مفتاح API مدفوع — مكانه هنا. وأنت ما تكتبها بيدك: تشرحها بالعربي في المحادثة، وابني يكتبها ويجرّبها ويشغّلها قبل ما يقول لك خلصت.

نُشر في:

ابدأ مجاناً
مطعم الدارالمنيوالفروعتواصل
أكل بيت،
بطعم زمان.
اطلب أونلاينالمنيو
الأطباق الأشهر ٤.٩ · توصيل ٣٠ دقيقة
منسف لحم بلدي٨ د.أ
مشاوي مشكّلة١٢ د.أ
نموذج موقع تبنيه بابني بالعربي

ما الدالة السحابية، ولماذا لا يكفي كود المتصفح

الدالة السحابية ملف اسمه functions/اسم-الدالة.js داخل مشروعك، يشتغل على سيرفر ابني داخل صندوق QuickJS معزول. الصفحة تناديه بسطر واحد: cloud.fn.call بالاسم والبيانات، ويرجع الرد.

الفرق مو تقني بحت، الفرق تجاري. أي كود يشتغل في متصفح الزائر يقدر الزائر يفتحه ويقرأه ويعدّله. يعني لو الخصم محسوب في المتصفح، يقدر يغيّر الرقم. ولو مفتاح API مكتوب في الصفحة، يقدر ينسخه ويستعمله على حسابك أنت.

داخل الدالة تتغيّر الصلاحيات: تقرأ وتكتب في بيانات المشروع بصلاحية المالك عبر ebnii.db، وتفتح المفاتيح المحفوظة على الخادم عبر ebnii.secrets.get، وترسل بريداً لأي عنوان عبر ebnii.email.send، وتعرف من المستخدم الحالي عبر ebnii.auth.user. وكل هذا ما ينزل للمتصفح أبداً.

وعندك جاهز داخل الدالة: ebnii.crypto للتوقيع والتجزئة والمقارنة الآمنة وتوقيع JWT والتحقق منه، وebnii.csv لقراءة وكتابة ملفات CSV بمعيار RFC 4180، وebnii.format للعملة والتاريخ، وebnii.url وebnii.base64 وebnii.basicAuth.

رحلة نداء واحد

من ضغطة الزائر إلى الرد، الطريق كله مرّ على السيرفر مرة واحدة.

زر في صفحتك
الزائر يضغط ويرسل رقم الصنف فقط
cloud.fn.call
نداء باسم الدالة والبيانات
الدالة على السيرفر
تفتح السر، تنادي الـAPI، تتحقق، تكتب في القاعدة
رد للصفحة
السعر النهائي أو رقم الطلب
المفتاح السري ما خرج من السيرفر في أي خطوة، والزائر ما شاف إلا الرد النهائي.

متى تحتاج دالة سحابية فعلياً

مو كل شيء يحتاج سيرفر. هذي الحالات الخمس تحتاجه فعلاً، والباقي يمشي من الصفحة عادي.

قواعد التسعير والخصم

الزائر يرسل رقم الصنف والكمية والكوبون، والسعر النهائي يُحسب على السيرفر. لو حسبته في المتصفح، أي زائر يقدر يبعث قيمة معدّلة ويشتري بسعر ما تعرفه.

التحقق من الطلب قبل تثبيته

المخزون موجود؟ الكمية معقولة؟ الكوبون منتهي؟ الموعد محجوز قبل شوي؟ هذي فحوصات لازم تصير مرة وحدة على السيرفر قبل ما ينكتب الطلب، مو بعده.

نداء API خارجي بمفتاح سري

شركة شحن، مزوّد رسائل، نظام مخزون، أي خدمة مدفوعة بمفتاح. الدالة تفتح المفتاح من ebnii.secrets.get وتنادي عبر ebnii.fetch — حتى ٨ نداءات خارجية في التشغيل الواحد، ومهلة النداء محكومة بمهلة التشغيل نفسها.

رسالة لعنوان ما هو عنوانك ولا عنوان المسجّل

من كود الصفحة، البريد يوصل للمالك أو للمستخدم المسجّل على عنوانه هو فقط، وأي عنوان ثاني يُرفض ٤٠٣. رمز التحقق للزائر الجديد أو تأكيد الطلب لعميل ما سجّل: هذا شغل دالة سحابية.

التوقيع والتحقق

ebnii.crypto يعطيك hmac وhash وtimingSafeEqual وrandomHex وuuid وتوقيع JWT بخوارزميتي HS256 وRS256 والتحقق منه. مفيد مع أي مزوّد يطلب توقيع الطلب أو يرسل لك بيانات موقّعة.

كود يشتغل في متصفح الزائر مقابل دالة سحابية

الموضوعدالة سحابية في ابنيكود يشتغل في متصفح الزائر
مكان التنفيذسيرفر ابني، داخل صندوق QuickJS معزولجهاز الزائر ومتصفحه
المفاتيح السريةebnii.secrets.get — القيمة محفوظة على السيرفر وحده وما تنزل للصفحةأي مفتاح في الكود يقدر أي زائر يقرأه
تعديل السعر قبل الإرسالمستحيل — الزائر يرسل رقم الصنف، والسعر يُحسب عندكممكن — القيمة تُبنى في جهازه
قراءة البياناتصلاحية مالك على ebnii.db، تقرأ صفوف كل العملاء لو احتجتمحدودة بمستوى الوصول المضبوط على المجموعة
بريد لأي عنوانمسموح — حتى ٥ رسائل في التشغيل الواحدالمالك أو المستخدم المسجّل نفسه فقط، وغيرهم ٤٠٣
الاتصال بـAPI خارجيebnii.fetch حتى ٨ نداءات في التشغيل، ومهلة النداء تتبع مين شغّل الدالة: حتى ٢٠ ثانية للمالك وأقصر للزائرمقيّد بسياسات المتصفح، والرد والمفتاح مكشوفان
الشغل بدون زائرمهام مؤجلة ومجدولة وويبهوك واردما فيه — الكود يموت مع إغلاق التبويب

الحدود الحقيقية بالأرقام

هذي أرقام مقروءة من الكود، مو تقديرات. تختلف المهلة حسب مين شغّل الدالة.

٢٥ ثانية
مهلة التشغيل للمالك
وللزائر ١٠ ثوانٍ
٨
نداءات خارجية
في كل تشغيل للدالة
٥
رسائل بريد
في كل تشغيل للدالة
١٠٠ ألف بايت
حجم الكود والبيانات الداخلة
والرد حتى ٢ ميغابايت

كيف تركّب دالة سحابية بدون ما تكتب سطر

١

اشرح القاعدة بالعربي

مثال: «لما يطلب العميل، تأكد أن الكمية موجودة بالمخزون، واحسب الشحن من API شركة الشحن، وثبّت الطلب واطلع له رقم». تكلّم بمنطق تجارتك، مو بمصطلحات برمجية.

٢

ابني يقرأ توثيق المزوّد ويجرّب الـAPI فعلياً

عنده أداة تقرأ توثيق الـAPI، وأداة تضرب الطلب على المزوّد الحقيقي بمفتاحك وتقرأ الرد قبل ما يُكتب أي كود. يعني الكود ينكتب على شكل الرد الفعلي، مو على تخمين.

٣

المفتاح يدخل من بطاقة سر داخل المحادثة

لما تحتاج مفتاحاً، يطلع لك حقل إدخال آمن في المحادثة. القيمة تروح للتخزين المشفّر مباشرة وما تمر على النموذج ولا تنطبع في المحادثة.

٤

ابني يشغّل الدالة بنفسه ويقرأ النتيجة

عنده أداة تنفّذ الدالة اللي كتبها وترجع له المخرجات والأخطاء. لو رجع رد غلط، يصلّح ويعيد قبل ما يسلّمك.

٥

انشر الموقع

نداءات الدوال تشتغل مع الموقع المنشور. والمهام المجدولة تحديداً ما تبدأ قبل النشر — هذا مقصود، عشان مشروع تحت التجربة ما يرسل رسائل لعملاء حقيقيين.

شغل يمشي وأنت نايم: ثلاث طرق

الدالة ما لازم ينتظرها زائر. عندك ثلاث طرق تشتغل فيها بدون أحد.

الطريقةكيف تنطلقالحدودمثال عملي
مهمة مؤجلةebnii.jobs.enqueue بعدد ثوانٍ تأخير١٠ في التشغيل الواحد، ٥٠٠ في اليوم، ٢٠٠ معلّقة، حمولة ١٦ ألف بايت، إعادة محاولة ٣ مرات بتباعدبعد تثبيت الطلب بساعة، تذكير للعميل يؤكد العنوان
مهمة مجدولةتُعرَّف في ملف functions/_jobs.json: كل ١٥ أو ٣٠ دقيقة، أو كل ساعة، أو يومي، أو أسبوعي — مع ساعة محددة ويوم في الأسبوع ومنطقة زمنيةحتى ١٠ مهام مجدولة للموقع، وما تشتغل قبل النشر، وebnii.auth.user ترجع فارغة لأن ما فيه مستخدمتقرير مبيعات أمس على بريدك ٧:٠٠ صباحاً بتوقيت الرياض
ويبهوك واردعنوان جاهز على نطاق موقعك ينتهي بـ hook واسم الدالة، والملف لازم ينتهي اسمه بـ webhook وإلا يبقى خاصاًالتحقق من التوقيع مفروض من المنصة، والدالة تستقبل الجسم الخام والترويسات وتعيد رمز الحالة والجسمشركة الشحن تحدّث حالة الشحنة، فتتحدث حالة الطلب في موقعك تلقائياً
التأخير في المهمة المؤجلة حد أدنى مو وعد بالثانية: المشغّل يمرّ كل دقيقة ويلتقط المستحق.

أسئلة شائعة

هل لازم أكون مبرمجاً عشان أستعمل الدوال السحابية؟

لا. تشرح القاعدة بالعربي في المحادثة وابني يكتب الدالة. الفرق الوحيد أنك لازم تكون واضحاً في المنطق: وش الشروط، وش يصير لو الشرط ما تحقق، ومين يستقبل النتيجة. كل ما كان الوصف دقيقاً، كان الكود أدق.

وين يُخزَّن مفتاح الـAPI ومين يقدر يشوفه؟

يُخزَّن على سيرفر ابني وحده، وتقرأه الدالة وقت التشغيل عبر ebnii.secrets.get. ما ينزل للمتصفح ولا ينكتب داخل ملفات موقعك. ولما تدخله من بطاقة السر في المحادثة، القيمة ما تمر على النموذج ولا تظهر في نص المحادثة.

الدالة تقدر تشتغل خمس دقائق؟

لا. المهلة ١٠ ثوانٍ لما يشغّلها زائر و٢٥ ثانية لما تشغّلها أنت كمالك. الشغل الطويل يتقسّم: الدالة الأولى تستقبل وترد بسرعة، وتضيف مهمة مؤجلة تكمل الباقي. المهام المؤجلة تُعاد ٣ مرات بتباعد لو فشلت.

أقدر أستقبل إشعارات من شركة شحن أو من مزوّد خارجي؟

نعم، عبر ويبهوك وارد. تحصل على عنوان على نطاق موقعك، وتعطيه للمزوّد، والدالة تستقبل الجسم الخام والترويسات وترجع رمز الحالة اللي يطلبه. شرط واحد لازم تعرفه: اسم ملف الدالة يجب أن ينتهي بـ webhook وإلا يبقى المسار خاصاً ولا يُنادى من الخارج.

وش الفرق بين الدالة السحابية وقاعدة البيانات في موقعي؟

قاعدة البيانات مكان تخزين الصفوف، والدالة مكان اتخاذ القرار. الصفحة تقدر تكتب وتقرأ من القاعدة مباشرة ضمن مستوى الوصول المسموح، لكن لما يكون القرار يعتمد على شيء ما يصح يُترك للمتصفح — سعر، مخزون، مفتاح، بريد لعنوان غريب — ينتقل القرار للدالة.

لو تعطلت الدالة بعد النشر، كيف أعرف؟

لوحة صحة الموقع داخل محرر ابني تجمع أعطال الدوال السحابية الحقيقية وتعرضها مجمّعة، وتخفي الأخطاء الأقدم من الكود اللي صلّحها، وما تعد الرفض المقصود عطلاً. تفتح اللوحة وتشوف إذا كان في عطل فعلي وتطلب إصلاحه في نفس المحادثة.

اقرأ أيضاً

ويبهوك وارد لموقعكالمهام المجدولة: شغل يمشي بدون أحدربط API خارجي بموقعكحسابات المستخدمين في موقعكربط شركة شحن بموقعك

خلّ القرار يصير عندك، مو عند متصفح الزائر

اشرح القاعدة بالعربي — التسعير، التحقق، الربط بمزوّد خارجي — وابني يكتب الدالة ويجرّبها ويشغّلها قبل ما يسلّمك.

ابدأ مجاناً