HyperDurable은 내구성 개체 스텁에서 기본 영구 저장소에 대한 자연스럽고 개체와 유사한 액세스를 가능하게 하는 내구성 개체의 기본 클래스입니다. HyperDurable은 내구성 있는 개체 가져오기 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>
지속형 개체 스토리지에 유지되는 속성 집합입니다.
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 인 개체를 반환합니다.
업스트림 DurableObjectNamespace API에서와 마찬가지로 객체 ID를 생성하고 객체 스텁을 가져오는 데 사용됩니다.
HyperNamespaceProxy.get(id)
에 의해 생성됩니다. 업스트림 API에서처럼 fetch
메소드에 직접 액세스할 수 있습니다. 또한 스텁을 사용하면 속성과 메서드에 간단히 액세스할 수 있습니다.
속성을 얻으려면 await
.
await stub . name ;
속성을 설정하려면 자동 생성된 setter를 await
(새 값 반환).
await stub . setName ( 'Eendje' ) ;
메서드를 호출하려면 메서드를 await
( 참고: 메서드에 반환 값이 없으면 일반적인 undefined
대신 null
반환합니다).
await stub . sayHello ( ) ;
스텁 속성과 메서드는 성공 시 해당 값을 직접 반환합니다. 작업이 실패하면 다음 구조로 HyperError
발생합니다.
{
message : 'Error message' ,
details : 'Error details'
}
이 라이브러리는 Kevin Whitley의 itty-durable에서 많은 영감을 받았습니다.