1 poin oleh GN⁺ 3 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Selama 6 bulan terakhir, crates.io memperkenalkan penampil kode sumber untuk memeriksa langsung paket yang dipublikasikan serta sistem akun yang independen dari GitHub, dan memperkuat panduan keamanan serta pengganti pustaka standar
  • Tab Code baru mendukung pencarian file, penyorotan sintaks, dan pemilihan baris yang dapat dibagikan; dengan manifes ZIP dan JSON dari CDN serta permintaan rentang HTTP, hanya file yang diperlukan yang dimuat tanpa membebani server API
  • Sesuai RFC #3946, implementasi nama pengguna khusus crates.io telah dimulai; setelah perubahan nama pengguna dan peninjauan keamanan, ke depannya akan mendukung penyedia autentikasi selain GitHub
  • Frontend telah sepenuhnya dimigrasikan dari Ember.js ke Svelte, sementara pencarian, pencarian dependensi balik, caching CDN, dan pemrosesan indeks Git juga ditingkatkan untuk performa dan stabilitas
  • Peringatan penghentian pemeliharaan dari RustSec dan API pengganti pustaka standar seperti std::sync::LazyLock ditampilkan di halaman paket untuk mendukung audit dependensi dan penghapusan dependensi yang tidak perlu

Penampil kode sumber untuk memeriksa paket yang dipublikasikan

  • Di tab Code baru pada halaman paket, file dari setiap versi yang dipublikasikan dapat dijelajahi di dalam crates.io
    • Yang ditampilkan bukan repositori tertaut, melainkan file yang benar-benar diunduh saat cargo menambahkan dependensi
    • File yang tidak ada di repositori, seperti Cargo.toml ternormalisasi yang dibuat oleh cargo, juga dapat diperiksa sehingga audit dependensi menjadi lebih mudah
  • Penampil mendukung pencarian pohon file, penyorotan sintaks, dan pemilihan baris ala GitHub
    • Dengan mengklik atau menyeret nomor baris, URL yang dapat dibagikan dalam bentuk #L10-L20 akan dibuat
  • Server membuat file ZIP dan manifes JSON yang mendeskripsikan struktur file untuk semua versi yang dipublikasikan
    • Karena file .crate yang digunakan cargo adalah tarball terkompresi gzip yang tidak mendukung akses acak, file tersebut dikemas ulang oleh pekerjaan latar belakang menjadi ZIP yang dapat dijelajahi
    • ZIP dan manifes disediakan melalui CDN statis
    • Frontend mengambil manifes terlebih dahulu, lalu memuat setiap file hanya saat dibutuhkan menggunakan permintaan rentang HTTP
    • Penjelajahan sumber secara praktis tidak menambah beban pada server API crates.io, dan versi lama juga diproses secara massal sehingga rilis lama pun didukung
  • Pustaka rendering untuk penampil kode pada awalnya adalah perender diff, dan penampil perbandingan antarversi yang memanfaatkan infrastruktur yang sama juga sedang dikembangkan
    • Setelah selesai, perubahan persis antara dua versi yang dipublikasikan dapat ditinjau di crates.io

Akun crates.io yang independen dari GitHub

  • Tim crates.io menyetujui RFC #3946 pada akhir Mei
  • Sebelumnya, login GitHub dan identitas crates.io sangat terikat, sehingga nama pengguna juga ditentukan oleh akun GitHub; RFC ini memperkenalkan nama pengguna khusus crates.io yang independen dari akun tertaut
  • Nama pengguna khusus ini adalah prasyarat untuk mendukung login melalui penyedia autentikasi selain GitHub di masa mendatang
  • Implementasi sudah dimulai, tetapi fitur utama yang masih belum selesai dan akan terlihat oleh pengguna adalah perubahan nama pengguna
    • Setelah itu selesai, RFC tambahan dan implementasi terkait login penyedia autentikasi lain akan dilanjutkan
    • Karena berdampak langsung pada autentikasi dan keamanan akun, peluncuran dilakukan perlahan dalam tahap-tahap kecil yang ditinjau dengan hati-hati

Imbauan keamanan dan panduan pengganti pustaka standar

  • Tab Security yang sudah ada menampilkan imbauan keamanan dari basis data RustSec, dan kini paket yang ditandai RustSec sebagai tidak lagi dipelihara juga menampilkan banner peringatan di bagian atas halaman
    • Dari banner tersebut, pengguna dapat membuka imbauan terkait yang berisi detail dan alternatif yang memungkinkan
  • Pada paket yang fungsinya telah diserap ke pustaka standar, banner “You might not need this dependency” ditampilkan
    • Misalnya, lazy_static dapat diganti dengan std::sync::LazyLock mulai Rust 1.80
    • Di daftar dependensi, paket yang telah digantikan diberi ikon bohlam kecil yang memberikan panduan yang sama
  • Data terkait dikelola di repositori baru rust-lang/std-replacement-data
    • Hanya entri pengganti pustaka standar yang diizinkan
    • Setiap entri harus mengutip API std, core, atau alloc yang telah stabil serta versi Rust terkait
    • Sebelum menambahkan entri, pengelola paket diberi tahu dan diberikan periode untuk menyampaikan pendapat
    • Entri baru dapat diusulkan ke repositori, dan data yang terkumpul juga dapat dimanfaatkan oleh alat lain

Migrasi frontend Svelte selesai

  • Eksperimen memindahkan frontend crates.io dari Ember.js ke Svelte telah berhasil diselesaikan
    • Frontend baru telah mencapai tingkat yang setara dengan fitur lama
    • Setelah pengujian publik pada April, frontend ini dijadikan frontend default pada awal Mei
    • Aplikasi Ember.js telah dihapus dari repositori
  • Karena ini adalah migrasi satu-ke-satu yang memindahkan desain dan fitur lama apa adanya, perubahan dirancang agar tidak terasa oleh pengguna
  • Tim dan kontributor kini dapat menggunakan framework modern sekaligus menurunkan hambatan masuk bagi kontributor baru dan mempercepat iterasi pengembangan; penampil kode sumber adalah salah satu contohnya
  • Ucapan terima kasih disampaikan kepada tim Ember.js yang digunakan crates.io selama bertahun-tahun dan tim Svelte yang mendukung transisi ini

Halaman galat Ferris

  • Ferris di halaman galat crates.io kini mengikuti kursor mouse dengan matanya
  • Halaman galat 404 juga menyediakan interaksi kecil

Performa pencarian dan pencarian dependensi balik

  • Sebelumnya, pencarian berdasarkan relevansi menghitung peringkat semua paket yang cocok dengan kata kunci, sehingga untuk kata kunci pendek atau umum bisa memakan waktu 1–2 detik
    • Kini cakupan perhitungan peringkat dibatasi ke 1.000 paket cocok dengan jumlah unduhan terbaru terbanyak
  • Endpoint dependensi balik tidak lagi menghitung ulang seluruh kumpulan paket dependen pada setiap permintaan
    • Hasil disediakan dari tabel prakomputasi yang disinkronkan oleh trigger basis data
    • Join yang mahal diganti dengan pemindaian indeks terbatas, sehingga kemungkinan timeout turun drastis

Dokumentasi arsitektur dan rendering Markdown

  • ARCHITECTURE.md dirombak menyeluruh dengan fokus pada sistem tingkat tinggi crates.io dan cara sistem-sistem tersebut saling terhubung
    • Proses yang terjadi saat menjalankan cargo publish
    • Alasan unduhan paket biasa tidak melewati server API
    • Cara jumlah unduhan dihitung dari log akses CDN
  • README kini merender daftar definisi, sebuah ekstensi Markdown yang banyak digunakan
    • Perender Markdown comrak sebenarnya sudah mendukung daftar definisi, tetapi ekstensi tersebut belum diaktifkan

Peningkatan efisiensi cache CDN

  • Metadata tag cache ditambahkan ke file yang diunggah ke CDN statis
    • Alih-alih mengirim permintaan invalidasi terpisah untuk setiap URL file, semua file cache dari paket atau rilis tertentu dapat diinvalidasi sekaligus
  • Header respons global Vary: Cookie yang menghambat caching CDN untuk respons API publik dan aset frontend telah dihapus
    • Untuk respons khusus pengguna, Cache-Control: no-store diterapkan sebagai gantinya
    • Hasilnya, rasio cache hit di edge CDN meningkat

Aksesibilitas dan pemrosesan indeks Git

  • Aksesibilitas crates.io ditingkatkan untuk pengguna pembaca layar
    • Ikon dekoratif disembunyikan dari pohon aksesibilitas
    • Hierarki judul diperbaiki
    • Markup daftar yang benar diterapkan pada daftar
    • Pengujian snapshot ARIA diperkenalkan untuk mencegah regresi masuk tanpa terdeteksi
    • Aksesibilitas akan terus ditingkatkan selama beberapa bulan ke depan
  • Salinan lokal indeks Git milik worker latar belakang diubah menjadi repositori bare dan shallow
    • Sekitar 250 ribu file checkout dan seluruh riwayat commit dihapus dari disk
    • Ini meningkatkan performa pemrosesan di tengah meningkatnya frekuensi publikasi paket
  • Squash indeks berkala kini menggunakan GitHub API, bukan membuat Git pack besar secara lokal
    • Metode pembuatan pack lokal sebelumnya pernah menyebabkan worker produksi kehabisan memori

Kanal umpan balik

1 komentar

 
GN⁺ 3 jam lalu
Komentar di Lobste.rs
  • Senang melihat pekerjaan untuk memisahkan akun crates.io dari GitHub sedang berjalan

    • Dulu saya suka fitur login dengan akun GitHub di berbagai layanan, tetapi sekarang rasanya kurang menarik. Karena Tailscale mendukung penyedia identitas OIDC, saya mengaturnya agar bisa login menggunakan Codeberg dan WebFinger di domain saya
      Untuk login dengan email domain sendiri example@example.com, letakkan file JSON di https://example.com/.well-known/webfinger dengan subject bernilai acct:example@example.com dan href penerbit OpenID Connect bernilai https://codeberg.org
      Di pengaturan Codeberg, buat aplikasi OAuth2 dengan URI pengalihan https://login.tailscale.com/a/oauth_response, lalu masukkan Client ID dan Client Secret yang diterbitkan ke Tailscale. Sepertinya ke depan crates.io juga akan menyediakan cara serupa
  • Saya tidak menyadari bahwa peningkatan crates.io belakangan ini sebesar ini. Biasanya saya mencari di lib.rs terlebih dahulu, tetapi mungkin kebiasaan itu akan segera berubah; perubahan yang paling saya sukai adalah Ferris

    • Saya penasaran berapa banyak dari peningkatan ini yang berkat penerapan agen
  • Perubahan mata Ferris secara fisika kurang masuk akal. Bagian putih pada mata hitam adalah highlight pantulan spekular, dan jika kursor mouse adalah sumber cahaya, itu pun sulit disebut sebagai ekspresi mata yang mengikuti kursor

  • Saat mengaudit dependensi, pertama-tama saya membuat symlink dari ~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ ke ~/cargosrc agar mudah mengakses file yang diunduh Cargo
    Untuk setiap dependensi yang akan diaudit, saya mengkloning repositori Git, melakukan checkout versi target, menghapus file yang sedang dilacak secara lokal, lalu mengirim SIGSTOP ke proses rust-analyzer. Saya menambahkan dependensi ke Cargo.toml proyek, menjalankan cargo fetch, kemudian menyalin isi direktori $dependency-$version yang diunduh ke repositori hasil kloning, melakukan commit, dan meninjau perbedaannya dengan penampil riwayat Git
    Setelah peninjauan selesai, saya menyimpan kombinasi dependensi, versi, dan hash di Cargo.lock ke basis data tepercaya dengan skrip agar versi yang sama tidak perlu diperiksa lagi. Meski prosedurnya tampak rumit, sebagian besar sudah saya otomatisasi sehingga lebih efisien daripada UI web; saya berharap Cargo mendukung prosedur peninjauan seperti ini dari baris perintah. Saya juga penasaran apakah ada plugin yang membantu proses peninjauan itu sendiri, bukan alat seperti cargo-crev

  • Implementasi ketika frontend hanya mengambil manifes lalu memuat tiap file saat diperlukan lewat permintaan rentang HTTP ada di sini, dan menggunakan DecompressionStream bawaan browser