HyperDurable は、Durable Object スタブから基礎となる永続ストレージへの自然なオブジェクトのようなアクセスを可能にする Durable Object の基本クラスです。 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
を使用してオブジェクト スタブを構築します。
すべてのスタブ操作は内部でfetch
API を使用するため、 await
必要があります。プロパティはスタブから直接読み取ることができます。プロパティは、自動生成されたセッター ( 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>
Durable Object Storage に保持されるプロパティのセット。
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
2 つのパラメータを受け入れます。 env
名前空間がアクセスされるワーカーのenv
です。 doBindings
はオブジェクトであり、キーはバインディング名、値はそれらのバインディングに関連付けられた永続オブジェクト クラスです。オブジェクトを返します。キーは渡されたバインディング名、値は関連付けられたHyperNamespaceProxyです。
アップストリームの DurableObjectNamespace API と同様に、オブジェクト ID を生成し、オブジェクト スタブを取得するために使用します。
HyperNamespaceProxy.get(id)
によって生成されます。アップストリーム API と同様に、 fetch
メソッドに直接アクセスできます。スタブを使用すると、プロパティやメソッドに簡単にアクセスできます。
プロパティを取得するには、それをawait
。
await stub . name ;
プロパティを設定するには、自動生成されたセッターawait
(新しい値を返します)。
await stub . setName ( 'Eendje' ) ;
メソッドを呼び出すには、 await
(注:メソッドに戻り値がない場合、通常のundefined
の代わりにnull
が返されます)。
await stub . sayHello ( ) ;
スタブのプロパティとメソッドは、成功した場合に値を直接返します。操作が失敗すると、次の構造のHyperError
がスローされます。
{
message : 'Error message' ,
details : 'Error details'
}
このライブラリは、Kevin Whitley の itty-durable から多大な影響を受けています。