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”。