Eks-Cent v4.0.0 ๐Ÿš€

Eks-Cent adalah framework web Ruby modern yang ringan, menggunakan standar Eks Interface. Dirancang untuk kecepatan, keamanan tingkat tinggi, dan fleksibilitas tanpa beban dependensi eksternal yang besar.

Dengan v4.0.0, Eks-Cent kini mendukung fitur arsitektural canggih seperti URL Mapping dan Application Cascading, menjadikannya pilihan utama untuk aplikasi mikro servis maupun web monolitik.


โœจ Fitur Utama v4.0.0

  • ๐Ÿ›ค
    Modern Routing DSL: Pendefinisian rute intuitif dengan parameter dinamis (:name), namespace, dan kontrol eksekusi (halt).
  • ๐Ÿ—บ
    URL Mapping & Cascading: Jalankan beberapa aplikasi independen di bawah satu server berdasarkan sub-jalur (mapping) atau fallback otomatis (cascade).
  • ๐Ÿ”
    Security First: Session terenkripsi HMAC-SHA256, proteksi XSS otomatis, header keamanan bawaan, dan pembatasan parameter (DoS protection).
  • ๐ŸŽจ
    Smart Templating: Integrasi ERB dengan sistem Auto-Layout, injeksi objek (@req, @res), dan helper keamanan (@h).

๐Ÿ“ฆ Instalasi

Tambahkan baris ini ke dalam Gemfile aplikasi Anda:

gem 'eks-cent', '~> 4.0.0'

Lalu jalankan:

bundle install

๐Ÿš€ Memulai Cepat (v4 Style)

Buat file config.eks untuk mendefinisikan aplikasi Anda:

# 1. Global Middlewares
use EksCent::Middleware::Runtime
use EksCent::Middleware::Session
use EksCent::Middleware::Logger

# 2. Pemetaan Aplikasi API
map "/api" do
  api = EksCent::Router.new do
    get '/status' do |req, res|
      res.content_type = 'application/json'
      res.write({ status: 'online', version: EksCent::VERSION }.to_json)
    end
  end
  run api
end

# 3. Aplikasi Web Utama
router = EksCent::Router.new do
  get '/' do |req, res|
    res.write "<h1>Web Utama v#{EksCent::VERSION}</h1>"
  end
end

run router

Jalankan server dengan mode reload:

$ ekscentup -R --port 3000

๐Ÿ›ค Dokumentasi Routing

Anda dapat menggunakan metode HTTP standar (get, post, put, delete, patch, options, any).

router = EksCent::Router.new do
  # Parameter Dinamis
  get '/user/:id' do |req, res|
    id = req.params['id']
    res.write "User ID: #{id}"
  end

  # Namespace untuk pengelompokan
  namespace '/admin' do
    get '/dashboard' do |req, res|
      # Diakses via /admin/dashboard
    end
  end

  # Kontrol Eksekusi dengan halt
  get '/secret' do |req, res|
    halt(res, 403, "Akses ditolak") unless req.session['admin']
    res.write "Data Rahasia"
  end
end

๐Ÿ—บ URL Mapping & Cascade

Gunakan map untuk membagi aplikasi besar menjadi sub-aplikasi independen berdasarkan jalur URL.

# Meminta /blog akan diarahkan ke BlogApp
map "/blog" do
  run BlogApp
end

# Meminta / akan diarahkan ke MainApp
map "/" do
  run MainApp
end

Gunakan cascade jika Anda ingin mencoba beberapa aplikasi secara bergantian hingga ada yang merespons (bukan 404).

๐Ÿ“ฆ Middleware Bawaan

Middleware Deskripsi
Runtime Menambahkan header X-Runtime dengan waktu eksekusi.
MethodOverride Mengizinkan override method HTTP via parameter _method.
Session Manajemen session aman berbasis cookie dengan HMAC-SHA256.
Logger Logging permintaan ke STDOUT atau file log secara real-time.
Static Melayani file statis dari direktori tertentu (default: public).
ShowExceptions Halaman error informatif untuk lingkungan pengembangan.

๐ŸŽจ Templating & Layout

Framework akan otomatis mencari views/layout.erb sebagai pembungkus utama.

<!-- views/layout.erb -->
<html>
  <body>
    <header>Aplikasi Eks-Cent</header>
    <%= @content %> <!-- Konten dirender di sini -->
  </body>
</html>

Objek @req, @res, dan helper @h (escape HTML) selalu tersedia di dalam template secara otomatis.

๐Ÿ›  Panduan API

Request (req)

  • req.params: Query, POST, & Route params.
  • req.session: Sesi terenkripsi R/W.
  • req.path: Jalur URL saat ini.
  • req.user_agent: Info browser pengunjung.

Response (res)

  • res.write(msg): Menambah konten ke body.
  • res.render(name): Render file ERB.
  • res.status = code: Set HTTP status (200, 404).
  • res.redirect(path): Pengalihan URL.

๐Ÿงช Pengujian (Testing)

Gunakan suite pengujian bawaan untuk memastikan stabilitas kode Anda:

require 'test/unit'
require 'eks-cent'

class MyAppTest < Test::Unit::TestCase
  def test_homepage
    app = EksCent.load('config.eks')
    mock = EksCent::MockRequest.new(app)
    res = mock.get('/')
    assert res.ok?
    assert_match "Web Utama", res.body_content
  end
end

๐Ÿ›ก Keamanan & Batasan (Eks Limits)

Anda dapat mengatur batasan melalui variabel lingkungan untuk mencegah serangan DoS pada parser parameter:

  • EKS_QUERY_PARSER_PARAMS_LIMIT: Maksimal parameter (default: 1000).
  • EKS_QUERY_PARSER_DEPTH_LIMIT: Maksimal kedalaman nested params.
  • EKS_MULTIPART_TOTAL_PART_LIMIT: Maksimal bagian dalam form multipart.

๐Ÿ“„ Lisensi

Eks-Cent v4.0.0 didistribusikan di bawah Lisensi MIT.