// Run an upstream HTTP server on 127.0.0.1:8001, then request /busy, /wait and // /fast on port 8000. The window keeps drawing while the handlers share turns. استورد أساسي::رايليب; استورد أساسي::ويب; سجل State { frames: ص64, busy: منطقي, fast: منطقي, conflict: منطقي } دالة outbound(ctx: ويب::سياق<نص,State>, saved: ص64) -> ويب::استجابة_خادم { دع snapshot = ويب::التقط_الحالة(ctx); دع request = ويب::أنشئ_طلب("GET", ويب::اقرأ_إعدادات(ctx))::قيمة; دع reply = ويب::اطلب(request, ويب::خيارات_طلب()); إذا لا reply::نجاح { أرجع ويب::استجابة_نصية(502, reply::error::الرمز, "text/plain")::قيمة; } إذا saved لا يطابق 7 { أرجع ويب::أنشئ_استجابة(500, [])::قيمة; } دع published = ويب::استبدل_الحالة_إن_كانت_حالية(ctx, snapshot, snapshot::قيمة)::قيمة; متغير current = ويب::اقرأ_حالة(ctx); current::conflict = لا published; ويب::استبدل_حالة(ctx, current); أرجع ويب::استجابة_نصية(200, "conflict", "text/plain")::قيمة; } دالة handler(req: ويب::طلب_وارد, ctx: ويب::سياق<نص,State>) -> ويب::استجابة_خادم { إذا req::مسار يطابق "/busy" { متغير state = ويب::اقرأ_حالة(ctx); state::busy = صواب; ويب::استبدل_حالة(ctx, state); طالما صواب {} } إذا req::مسار يطابق "/wait" { أرجع outbound(ctx, 7); } متغير current = ويب::اقرأ_حالة(ctx); current::fast = رايليب::هل_النافذة_جاهزة(); ويب::استبدل_حالة(ctx, current); أرجع ويب::استجابة_نصية(200, "fast", "text/plain")::قيمة; } دالة ابدأ_الرئيسية() -> ص64 { دع opened = رايليب::هيئ_نافذة(480, 240, "ASPL HTTP and drawing"); إذا لا opened::نجاح { اطبع(opened::error::الرمز); أرجع 1; } دع pacing = رايليب::اضبط_معدل_الإطارات(60); إذا لا pacing::نجاح { أرجع 9; } متغير server = ويب::إعدادات_خدمة(); server::مستمعون = [ويب::أنشئ_مستمع("127.0.0.1", 8000)::قيمة]; دع routes = ويب::أنشئ_موجه([ ويب::أنشئ_وجهة("GET", "/busy", handler)::قيمة, ويب::أنشئ_وجهة("GET", "/wait", handler)::قيمة, ويب::أنشئ_وجهة("GET", "/fast", handler)::قيمة ])::قيمة; دع started = ويب::ابدأ(server, routes, "http://127.0.0.1:8001/", State {frames: 0, busy: خطأ, fast: خطأ, conflict: خطأ}); إذا لا started::نجاح { اطبع(started::error::الرمز); أرجع 2; } دع owner = started::قيمة; اطبع("ready\n"); متغير budget = ويب::ميزانية_التقدم(); budget::حد_التعليمات = 128; متغير frames: ص32 = 0; طالما frames < 180 و لا رايليب::هل_يجب_إغلاق_النافذة()::قيمة { إذا لا ويب::تقدم(owner, budget)::نجاح { أرجع 3; } إذا لا رايليب::ابدأ_الرسم()::نجاح { أرجع 4; } إذا لا رايليب::امسح_الخلفية(رايليب::أبيض_رايليب)::نجاح { أرجع 10; } متغير state = ويب::التقط_حالة_الجلسة(owner)::value::قيمة; state::frames = state::frames + 1; إذا لا ويب::استبدل_حالة_الجلسة(owner, state)::نجاح { أرجع 5; } إذا لا رايليب::ارسم_مستطيلا(frames, 90, 40, 40, رايليب::أزرق)::نجاح { أرجع 11; } إذا لا رايليب::أنه_الرسم()::نجاح { أرجع 6; } frames = frames + 1; } دع final = ويب::حالة_الجلسة(owner)::قيمة; إذا لا ويب::أغلق_الجلسة(owner)::نجاح { أرجع 7; } إذا لا رايليب::أغلق_النافذة()::نجاح { أرجع 8; } إذا final::busy و final::fast و final::conflict { اطبع("busy fast conflict\n"); } أرجع 0; }