HyperDurable 是持久性物件的基類,支援從持久性物件存根對底層持久性儲存進行自然的、類似物件的存取。 HyperDurable 完全抽象化了 Durable Object fetch API,提高了業務邏輯層程式碼的可讀性。
用紗線:
yarn add @ticketbridge/hyper-durable
使用 NPM:
npm i @ticketbridge/hyper-durable
透過擴展HyperDurable
基類別來編寫持久性物件類別。在建構子中,透過super()
將state
和env
傳遞給HyperDurable
。 HyperDurable
會將所有先前儲存的資料載入到其fetch
內的記憶體中,因此呼叫super()
後在建構函式中設定的任何屬性都會被任何先前儲存的資料覆蓋。
在持久性物件內,使用this
存取記憶體中的屬性和方法。無需擔心持久性——髒數據在每個獲取請求結束時都會持久化。
// 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.` ;
}
}
在您的工作執行緒中,首先使用proxyHyperDurables
代理您的持久性物件名稱空間。取得存根沒有改變:使用命名空間 API 中您喜歡的方法(即newUniqueId
、 idFromName
、 idFromString
)產生您的 id,然後使用get
建構物件存根。
每個存根作業都必須await
,因為它們都在幕後使用fetch
API。可以直接從存根讀取屬性。屬性可以使用自動產生的 setter 進行設定(格式為set
+ PropName
)。可以直接從存根呼叫方法。
// 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 ) ;
}
}
用作耐用物件的基底類別。預設包含一些屬性和方法,如下所述。
env: Env
env
傳入建構子。
state: HyperState
建構函數中傳遞的state
加上:
state.dirty: Set<string>
已在記憶體中更改但尚未保留的屬性集。
state.persisted: Set<string>
持久性儲存在持久性物件儲存中的一組屬性。
state.tempKey: string
用於追蹤深度嵌套屬性的鍵(即,當訪問this.favoriteFoods[0]
時, state.tempKey
是favoriteFoods
)。
storage: DurableObjectStorage
持久化物件存儲,來自state.storage
。
router: Router
一個 itty-router 來處理傳入的獲取請求。
async initialize()
如果載入尚未開始,則初始化載入。
async load()
將持久性資料載入記憶體。
async persist()
保持骯髒的特性。
async destroy()
刪除storage
中的所有數據,清除state.dirty
和state.persisted
,並從記憶體中刪除所有屬性。
toObject()
將所有持久性資料和髒資料作為物件傳回。
async fetch(request: Request): Promise<Response>
初始化物件(如果之前未初始化),然後將請求傳遞給router
。 router
處理請求後,保留所有髒資料。
proxyHyperDurables(env: Env, doBindings: { [key: string]: DOClass })
用於代理持久性物件名稱空間。接受兩個參數: env
和doBindings
。 env
是存取命名空間的工作執行緒的env
。 doBindings
是一個對象,其中鍵是綁定名稱,值是與這些綁定關聯的持久性物件類別。傳回一個對象,其中鍵是傳遞的綁定名稱,值是關聯的HyperNamespaceProxy 。
用於產生物件 ID 並取得物件存根,就像在上游 DurableObjectNamespace API 中一樣。
由HyperNamespaceProxy.get(id)
產生。可以直接存取fetch
方法,就像在上游 API 中一樣。存根還允許簡單地存取屬性和方法。
要獲得財產, await
:
await stub . name ;
若要設定屬性, await
自動產生的設定器(傳回新值):
await stub . setName ( 'Eendje' ) ;
要呼叫方法, await
它(注意:如果方法沒有傳回值,它將傳回null
而不是通常的undefined
):
await stub . sayHello ( ) ;
如果成功,存根屬性和方法將直接傳回其值。如果操作失敗,將會拋出一個HyperError
,其結構如下:
{
message : 'Error message' ,
details : 'Error details'
}
這個圖書館的靈感來自凱文·惠特利(Kevin Whitley)的“itty-durable”。