Kenapa Gue membuat Library KV sendiri?

Pada proyek baru gue, ketemu pola yang sama dalam fitur sessions dan cache. Keduanya menyimpan data dalam bentuk Key Value. Maka dari itu, gue bikin Library KV sendiri.

Berbeda dengan data relasi yang menghubungkan berbagai data, KV hanya menyimpan key dan value. Contohnya sessions menyimpan data user berdasarkan session id yang dibuat. Begitu juga dengan Cache yang memiliki umur (time to live).

Di package manager npm sudah ada library kv yang sukses seperti Keyv. Tapi gue coba membuat sendiri karena tidak ingin bergantung pada library lain. Hasil dari library gue seperti ini

  const kv = new KV(
    new StorageMem(),
  );
  kv.use(new KVPluginNamespace('np1'))

  await kv.set('key1', 'val1')

  const res = await kv.get('key1')

  assertEquals(!!res, true)
  assertEquals(res?.key, 'np1:key1')
  assertEquals(res?.value, 'val1')

  await kv.delete('key1')
  const res_deleted = await kv.get('key1')
  console.log(res_deleted)
  assertEquals(!!res_deleted, false)

KV punya gue punya beberapa fitur:

  • Plugin: bisa dikembangkan sesuai kebutuhan.
  • Storage Adapter: Terdapat pilihan storage seperit Postgresql, Memory. Storage lainnya akan ditambahkan.
  • API KV: pakai get dan set dengan mudah.
  • Time-to-live: untuk kasus cache perlu fitur kadaluarsa.

Library KV ini memberikan pemahaman mendalam tentang KV dan membuat unit terkecil dengan baik dan benar. Gue belajar banyak disini dengan baca referensi kode-kode projek lainnya, terinspirasi dari keyv.

Pembuatan plugin dapat menggunakan class Plugin seperti ini, plugin hash nama key.

export class KVPluginHashKey implements Plugin {
  name: string = 'KVPluginHashKey'
  #algo = 'sha256'
  constructor(algo?: string) {
    this.#algo = algo ?? this.#algo;
  }
  transformKey(key: string) {
    return createHash(this.#algo).update(key).digest('hex')
  }
}

Konsep Plugin ini sangat sederhana, KV ini juga bisa implementasi encryption dan decryption pada kasus-kasus tertentu.

Library ini ga mencoba mengganti dan menandingi library terbuka lainnya, tetapi library ini dibuat menggunakan Typescript-first dan cocok untuk kode modern yang jalan diatas Deno, dan Bun.

Alasan lain kenapa membuat library lebih baik dibandingkan menggunakan library lain adalah mengurangi potensi masalah supply-chain karena semua dalam kontrol, selain itu memberikan gue pelajaran tentang sistem unit kecil yang harus berjalan ekspektasi.

Sekian dari gue, terima kasih.

Add a comment

Subscribe now!