HyperDurable adalah kelas dasar untuk Objek Tahan Lama untuk mengaktifkan akses alami seperti objek ke penyimpanan persisten yang mendasari dari stub Objek Tahan Lama. HyperDurable sepenuhnya mengabstraksi API pengambilan Objek Tahan Lama, meningkatkan keterbacaan kode di lapisan logika bisnis.
Dengan Benang:
yarn add @ticketbridge/hyper-durable
Dengan NPM:
npm i @ticketbridge/hyper-durable
Tulis kelas objek tahan lama Anda dengan memperluas kelas dasar HyperDurable
. Di konstruktor, teruskan state
dan env
ke HyperDurable
melalui super()
. HyperDurable
akan memuat semua data yang disimpan sebelumnya ke dalam memori di dalam fetch
, sehingga properti apa pun yang Anda atur di konstruktor setelah memanggil super()
akan ditimpa oleh data yang disimpan sebelumnya.
Di dalam objek tahan lama Anda, akses properti dan metode di memori menggunakan this
. Tidak perlu khawatir tentang persistensi - data kotor tetap ada di akhir setiap permintaan pengambilan.
// RubberDuck.js
import { HyperDurable } from '@ticketbridge/hyper-durable' ;
export class RubberDuck extends HyperDurable {
constructor ( state , env ) {
// Pass state and env to HyperDurable
super ( state , env ) ;
// Anything set here will be overriden by previously persisted data, if any exists
// Therefore, you can safely set default values here
this . name = 'New Duck' ;
this . favoriteFoods = [ ] ;
}
addFavoriteFood ( food ) {
this . favoriteFoods . push ( food ) ;
}
sayHello ( ) {
return `Hello world, my name is ${ this . name } , and I have ${ this . favoriteFoods . length } favorite foods.` ;
}
}
Di pekerja Anda, pertama-tama proksi namespace objek tahan lama Anda dengan proxyHyperDurables
. Mendapatkan stub tidak berubah: buat id Anda dengan metode pilihan Anda dari API namespace (yaitu, newUniqueId
, idFromName
, idFromString
), lalu gunakan get
untuk membuat stub objek.
Setiap operasi stub harus await
, karena semuanya menggunakan API fetch
. Properti dapat dibaca langsung dari rintisan. Properti dapat disetel dengan setter yang dibuat secara otomatis (dalam format set
+ PropName
). Metode dapat dipanggil langsung dari stub.
// worker.js
import { proxyHyperDurables } from '@ticketbridge/hyper-durable' ;
import { RubberDuck } from './RubberDuck' ;
// Export the DO class
export { RubberDuck } ;
export default {
async fetch ( request , env ) {
// Proxy the namespace
const { RUBBERDUCK } = proxyHyperDurables ( env , {
// BINDINGNAME: DurableObjectClass
RUBBERDUCK : RubberDuck
} ) ;
// Obtain a stub
const id = RUBBERDUCK . idFromName ( 'firstDuck' ) ;
const stub = RUBBERDUCK . get ( id ) ;
// Await properties
const name = await stub . name ; // 'New Duck'
// Await setters
const newName = await stub . setName ( 'Special Duck' ) ; // 'Special Duck'
// Await methods
await Promise . all ( [
stub . addFavoriteFood ( 'herring' ) ,
stub . addFavoriteFood ( 'shrimp' )
] ) ;
const greeting = await stub . sayHello ( ) ; // 'Hello world, my name is Special Duck, and I have 2 favorite foods.'
return new Response ( greeting ) ;
}
}
Gunakan sebagai kelas dasar benda tahan lama Anda. Menyertakan beberapa properti dan metode secara default, yang dijelaskan di bawah.
env: Env
env
diteruskan di konstruktor.
state: HyperState
state
diteruskan di konstruktor, ditambah:
state.dirty: Set<string>
Kumpulan properti yang telah diubah di memori tetapi belum dipertahankan.
state.persisted: Set<string>
Kumpulan properti yang disimpan dalam penyimpanan Objek Tahan Lama.
state.tempKey: string
Digunakan untuk melacak kunci properti yang sangat bertingkat (yaitu, saat mengakses this.favoriteFoods[0]
, state.tempKey
adalah favoriteFoods
).
storage: DurableObjectStorage
Penyimpanan Objek yang tahan lama, dari state.storage
.
router: Router
Sebuah itty-router untuk menangani permintaan pengambilan yang masuk.
async initialize()
Inisialisasi pemuatan jika pemuatan belum dimulai.
async load()
Memuat data yang disimpan ke dalam memori.
async persist()
Mempertahankan sifat kotor.
async destroy()
Menghapus semua data di storage
, menghapus state.dirty
dan state.persisted
, dan menghapus semua properti dari memori.
toObject()
Mengembalikan semua data yang bertahan dan kotor sebagai objek.
async fetch(request: Request): Promise<Response>
Menginisialisasi objek (jika belum diinisialisasi sebelumnya), lalu meneruskan permintaan ke router
. Setelah router
menangani permintaan tersebut, data kotor tetap ada.
proxyHyperDurables(env: Env, doBindings: { [key: string]: DOClass })
Gunakan untuk mem-proxy namespace objek tahan lama Anda. Menerima dua parameter: env
dan doBindings
. env
adalah env
pekerja Anda tempat namespace diakses. doBindings
adalah sebuah objek, dimana kuncinya adalah nama yang mengikat dan nilainya adalah kelas objek tahan lama yang terkait dengan pengikatan tersebut. Mengembalikan objek, yang kuncinya adalah nama pengikatan yang diteruskan dan nilainya adalah HyperNamespaceProxy yang terkait.
Gunakan untuk menghasilkan ID objek dan mendapatkan stub objek, seperti di API DurableObjectNamespace hulu.
Diproduksi oleh HyperNamespaceProxy.get(id)
. Metode fetch
dapat diakses secara langsung, seperti pada API upstream. Stub ini juga memungkinkan akses mudah ke properti dan metode.
Untuk mendapatkan properti, await
:
await stub . name ;
Untuk menyetel properti, await
penyetel yang dibuat secara otomatis (mengembalikan nilai baru):
await stub . setName ( 'Eendje' ) ;
Untuk memanggil suatu metode, await
( CATATAN: Jika suatu metode tidak mempunyai nilai kembalian, maka metode tersebut akan mengembalikan null
dan bukannya undefined
seperti biasanya):
await stub . sayHello ( ) ;
Properti dan metode rintisan akan mengembalikan nilainya secara langsung jika berhasil. Jika operasi gagal, HyperError
akan muncul dengan struktur berikut:
{
message : 'Error message' ,
details : 'Error details'
}
Perpustakaan ini sangat terinspirasi oleh itty-durable dari Kevin Whitley.