Web platformu, geliştiricilere web için hassas ayarlı, yüksek performanslı uygulamalar oluşturmak üzere ihtiyaç duydukları araçları giderek daha fazla sunuyor. Özellikle WebAssembly (Wasm), hızlı ve güçlü web uygulamalarına kapı açtı. Emscripten gibi teknolojiler ise geliştiricilerin web'de denenmiş ve test edilmiş kodları yeniden kullanmasına olanak tanıyor. Geliştiricilerin bu potansiyelden gerçekten yararlanabilmesi için depolama konusunda da aynı güce ve esnekliğe sahip olması gerekir.
Bu noktada Storage Foundation API devreye girer. Storage Foundation API, web için yüksek performanslı veritabanları uygulama ve büyük geçici dosyaları sorunsuz bir şekilde yönetme gibi çok istenen yeni kullanım alanlarının kilidini açan yeni, hızlı ve tarafsız bir depolama API'sidir. Bu yeni arayüz sayesinde geliştiriciler web'e "kendi depolama alanlarını" getirebilir ve web ile platforma özgü kod arasındaki özellik boşluğunu azaltabilir.
Storage Foundation API, çok temel bir dosya sistemine benzeyecek şekilde tasarlanmıştır. Böylece geliştiricilere, daha üst düzey bileşenler oluşturabilecekleri genel, basit ve yüksek performanslı temel öğeler sunarak esneklik sağlar. Uygulamalar, ihtiyaçlarına en uygun araçtan yararlanarak kullanılabilirlik, performans ve güvenilirlik arasında doğru dengeyi bulabilir.
Web'in neden başka bir depolama API'sine ihtiyacı var?
Web platformu, geliştiricilere her biri belirli kullanım alanları göz önünde bulundurularak oluşturulmuş çeşitli depolama alanı seçenekleri sunar.
- Bu seçeneklerden bazıları, yalnızca çok küçük miktarlarda veri depolanmasına izin verdiğinden (ör. çerezler) veya
sessionStorage
velocalStorage
mekanizmalarından oluşan Web Storage API ile bu önerinin örtüşmediği açıktır. - Dosya ve Dizin Girişleri API'si veya WebSQL gibi diğer seçeneklerin desteği çeşitli nedenlerle zaten sonlandırıldı.
- File System Access API'nin benzer bir API yüzeyi vardır ancak bu API'nin amacı, istemcinin dosya sistemiyle arayüz oluşturmak ve kaynağın hatta tarayıcının sahipliğinin dışında olabilecek verilere erişim sağlamaktır. Bu farklı odak, daha katı güvenlik önlemleri ve daha yüksek performans maliyetleri ile birlikte gelir.
- IndexedDB API, Storage Foundation API'nin bazı kullanım alanları için arka uç olarak kullanılabilir. Örneğin, Emscripten, IndexedDB tabanlı kalıcı bir dosya sistemi olan IDBFS'yi içerir. Ancak IndexedDB temel olarak bir anahtar/değer deposu olduğundan önemli performans sınırlamalarına sahiptir. Ayrıca, bir dosyanın alt bölümlerine doğrudan erişmek IndexedDB'de daha da zor ve yavaştır.
- Son olarak, CacheStorage arayüzü yaygın olarak desteklenir ve web uygulaması kaynakları gibi büyük boyutlu verileri depolamak için ayarlanmıştır ancak değerler değiştirilemez.
Storage Foundation API, uygulamanın kaynağında tanımlanan, değiştirilebilir büyük dosyaların yüksek performanslı depolanmasına olanak tanıyarak önceki depolama seçeneklerinin tüm boşluklarını kapatma girişimidir.
Storage Foundation API için önerilen kullanım alanları
Bu API'yi kullanabilecek sitelere örnek olarak şunlar verilebilir:
- Büyük miktarlarda video, ses veya resim verisi kullanan üretkenlik ya da yaratıcılık uygulamaları. Bu tür uygulamalar, segmentleri bellekte tutmak yerine diske aktarabilir.
- Wasm'den erişilebilen kalıcı bir dosya sistemine dayanan ve IDBFS'nin garanti edebileceğinden daha fazla performansa ihtiyaç duyan uygulamalar.
Storage Foundation API nedir?
API'nin iki ana bölümü vardır:
- Dosya ve dosya yollarıyla etkileşim kurmak için temel işlevler sağlayan dosya sistemi çağrıları.
- Mevcut bir dosyaya okuma ve yazma erişimi sağlayan dosya tutamaçları.
Dosya sistemi çağrıları
Storage Foundation API, window
nesnesinde bulunan ve çeşitli işlevler içeren yeni bir nesne (storageFoundation
) sunar:
storageFoundation.open(name)
: Mevcutsa belirtilen ada sahip dosyayı açar, yoksa yeni bir dosya oluşturur. Açılan dosyayla çözülen bir promise döndürür.
storageFoundation.delete(name)
: Belirtilen ada sahip dosyayı kaldırır. Dosya silindiğinde çözülen bir promise döndürür.storageFoundation.rename(oldName, newName)
: Dosyayı eski adından yeni ada atomik olarak yeniden adlandırır. Dosya yeniden adlandırıldığında çözülen bir promise döndürür.storageFoundation.getAll()
: Mevcut tüm dosya adlarının bir dizisiyle çözülen bir promise döndürür.storageFoundation.requestCapacity(requestedCapacity)
: Geçerli yürütme bağlamı tarafından kullanılmak üzere yeni kapasite (bayt cinsinden) ister. Mevcut kapasitenin kalan miktarıyla çözülen bir promise döndürür.
storageFoundation.releaseCapacity(toBeReleasedCapacity)
: Geçerli yürütme bağlamından belirtilen bayt sayısını serbest bırakır ve kalan kapasiteyle çözülen bir promise döndürür.storageFoundation.getRemainingCapacity()
: Geçerli yürütme bağlamında kullanılabilen kapasiteyle çözülen bir promise döndürür.
Dosya imleçleri
Dosyalarla çalışma aşağıdaki işlevler aracılığıyla gerçekleşir:
NativeIOFile.close()
: Bir dosyayı kapatır ve işlem tamamlandığında çözülen bir promise döndürür.NativeIOFile.flush()
: Bir dosyanın bellekteki durumunu depolama cihazıyla senkronize eder (yani temizler) ve işlem tamamlandığında çözülen bir promise döndürür.
NativeIOFile.getLength()
: Dosyanın bayt cinsinden uzunluğunu döndüren bir promise döndürür.NativeIOFile.setLength(length)
: Dosyanın bayt cinsinden uzunluğunu ayarlar ve işlem tamamlandığında çözülen bir promise döndürür. Yeni uzunluk mevcut uzunluktan kısaysa baytlar dosyanın sonundan itibaren kaldırılır. Aksi takdirde dosya, sıfır değerli baytlarla uzatılır.NativeIOFile.read(buffer, offset)
: Belirtilen arabelleğin aktarılmasıyla elde edilen bir arabellek aracılığıyla, dosyanın belirtilen ofsetindeki içeriğini okur ve ardından arabelleği ayrılmış halde bırakır. Aktarılan arabelleği ve başarıyla okunan bayt sayısını içeren birNativeIOReadResult
döndürür.NativeIOReadResult
, iki girişten oluşan bir nesnedir:buffer
:read()
'e iletilen arabelleğin aktarılmasının sonucu olan birArrayBufferView
. Kaynak arabellekle aynı türde ve uzunluktadır.readBytes
:buffer
alanına başarıyla okunan bayt sayısı. Hata meydana gelirse veya okuma aralığı dosyanın sonunu aşarsa bu değer arabellek boyutundan daha küçük olabilir. Okuma aralığı dosyanın sonunun ötesine geçerse sıfıra ayarlanır.
NativeIOFile.write(buffer, offset)
: Belirtilen arabelleğin içeriğini, belirtilen ofset değerinde dosyaya yazar. Arabellek, herhangi bir veri yazılmadan önce aktarılır ve bu nedenle ayrılmış olarak bırakılır. Aktarılan arabelleği ve başarıyla yazılan bayt sayısını içeren birNativeIOWriteResult
döndürür. Yazma aralığı uzunluğunu aşarsa dosya uzatılır.NativeIOWriteResult
, iki girişten oluşan bir nesnedir:buffer
:write()
'e iletilen arabelleğin aktarılmasının sonucu olan birArrayBufferView
. Kaynak arabellekle aynı türde ve uzunluktadır.writtenBytes
:buffer
alanına başarıyla yazılan bayt sayısı. Hata oluştuğunda bu değer, arabelleğe alma boyutundan daha küçük olabilir.
Eksiksiz örnekler
Yukarıda açıklanan kavramları daha net hale getirmek için Storage Foundation dosyalarının yaşam döngüsünün farklı aşamalarında size yol gösterecek iki örnek verilmiştir.
Açma, yazma, okuma, kapatma
// Open a file (creating it if needed).
const file = await storageFoundation.open('test_file');
try {
// Request 100 bytes of capacity for this context.
await storageFoundation.requestCapacity(100);
const writeBuffer = new Uint8Array([64, 65, 66]);
// Write the buffer at offset 0. After this operation, `result.buffer`
// contains the transferred buffer and `result.writtenBytes` is 3,
// the number of bytes written. `writeBuffer` is left detached.
let result = await file.write(writeBuffer, 0);
const readBuffer = new Uint8Array(3);
// Read at offset 1. `result.buffer` contains the transferred buffer,
// `result.readBytes` is 2, the number of bytes read. `readBuffer` is left
// detached.
result = await file.read(readBuffer, 1);
// `Uint8Array(3) [65, 66, 0]`
console.log(result.buffer);
} finally {
file.close();
}
Açma, listeleme, silme
// Open three different files (creating them if needed).
await storageFoundation.open('sunrise');
await storageFoundation.open('noon');
await storageFoundation.open('sunset');
// List all existing files.
// `["sunset", "sunrise", "noon"]`
await storageFoundation.getAll();
// Delete one of the three files.
await storageFoundation.delete('noon');
// List all remaining existing files.
// `["sunrise", "noon"]`
await storageFoundation.getAll();
Demo
Aşağıdaki yerleşik Storage Foundation API demosunu deneyebilirsiniz. Dosya oluşturabilir, yeniden adlandırabilir, dosyalara veri yazabilir ve dosyalardan veri okuyabilir, ayrıca yaptığınız değişikliklerle birlikte güncelleme isteğinde bulunduğunuz kullanılabilir depolama alanını görebilirsiniz. Demo'nun kaynak kodunu Glitch'te bulabilirsiniz.
Güvenlik ve izinler
Chromium ekibi, Storage Foundation API'yi tasarlarken ve uygularken kullanıcı kontrolü, şeffaflık ve ergonomi gibi Güçlü Web Platformu Özelliklerine Erişimi Kontrol Etme başlıklı makalede tanımlanan temel ilkeleri kullandı.
Web'deki diğer modern depolama API'leriyle aynı kalıbı izleyen Storage Foundation API'ye erişim, kaynağa bağlıdır. Yani bir kaynak yalnızca kendi oluşturduğu verilere erişebilir. Ayrıca güvenli bağlamlarla sınırlıdır.
Kullanıcı denetimi
Depolama alanı kotası, disk alanına erişimi dağıtmak ve kötüye kullanımı önlemek için kullanılır. Kullanmak istediğiniz belleğin önce istenmesi gerekir. Diğer depolama alanı API'leri gibi, kullanıcılar tarayıcılarını kullanarak Storage Foundation API'nin kapladığı alanı temizleyebilir.
Faydalı bağlantılar
- Herkese açık açıklama
- Storage Foundation API demosu | Storage Foundation API demo kaynağı
- Chromium izleme hatası
- ChromeStatus.com girişi
- Blink Bileşeni:
Blink>Storage>NativeIO
- TAG İncelemesi
- Prototip oluşturma amacı
- WebKit ileti dizisi
- Mozilla ileti dizisi
Teşekkür ederiz
Storage Foundation API, Emanuel Krivoy ve Richard Stotz tarafından tanımlanıp uygulanmıştır. Bu makale Pete LePage ve Joe Medley tarafından incelenmiştir.
Unsplash'tan Markus Spiske tarafından sağlanan hero resim.