Web platformu, geliştiricilere web için ince ayar yapılmış yüksek performanslı uygulamalar oluşturmak için ihtiyaç duydukları araçları gün geçtikçe daha fazla sunuyor. En önemlisi, WebAssembly (Wasm) hızlı ve güçlü web uygulamalarının kapısını araladı. Emscripten gibi teknolojiler ise artık geliştiricilerin denenmiş ve test edilmiş kodları web'de tekrar kullanmaları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.
Storage Foundation API burada 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ştiriciler için bir dizi depolama alanı seçeneği sunar. Bu seçeneklerin her biri, özel kullanım alanları göz önünde bulundurularak tasarlanmıştır.
- 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) bu öneriyle örtüşmez. - 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 noktası, güvenlikle ilgili daha sıkı değerlendirmeleri ve daha yüksek performans maliyetlerini beraberinde getirir.
- 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şken büyüklükteki 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 boşaltabilir.
- 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ülecek bir taahhüt 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)
: Mevcut yürütme bağlamı tarafından kullanım için yeni kapasite (bayt cinsinden) ister. Mevcut kapasitenin kalan miktarıyla çözülen bir promise döndürür.
storageFoundation.releaseCapacity(toBeReleasedCapacity)
: Mevcut yürütme bağlamından belirtilen sayıda baytı serbest bırakır ve kalan kapasiteyle çözümlenen bir taahhüt 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 tanıtıcıları
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 sonuçlanacak bir söz 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üçükse 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)
: Verilen arabelleğin aktarılması sonucu ortaya çıkan bir arabellek üzerinden, verilen uzaklıktaki dosyanın içeriğini okur ve bu arabellek ayrılmış olarak bırakılı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ı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ı. Bir hata oluşursa bu boyut, arabellek boyutundan 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 yazma ve dosyalardan okuma yapabilir, ayrıca değişiklik yaparken istediğiniz kullanılabilir depolama alanını güncelleyebilirsiniz. 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ı şekilde, Storage Foundation API'ye erişim kaynak bağlantılıdır. Diğer bir deyişle, 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 öncelikle istenmesi gerekir. Diğer depolama API'leri gibi kullanıcılar da Storage Foundation API'nin kapladığı alanı tarayıcıları üzerinden 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
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.