API Reference

이 페이지는 package root에서 공개하는 contract를 빠르게 다시 찾기 위한 index입니다. 동작 예제와 lifecycle 설명은 각 package 문서로 연결합니다.

Prepaint

설치 package: @firsttx/prepaint

Export역할
createFirstTxRootReact root 생성과 Prepaint handoff 연결
boot저장된 snapshot의 boot-time replay
setupCapturesnapshot capture 등록
handoffreplay overlay에서 현재 React UI로 제어권 전달
PrepaintErrorPrepaint 오류 base class
BootError, CaptureError, PrepaintStorageError구체 오류 class
HydrationErrorlegacy consumer 호환을 위해 유지되는 deprecated 오류 class

공개 type과 helper:

ExportContract
HandoffStrategy"has-prepaint" | "cold-start"
CreateFirstTxRootOptionstransition, onCapture, onHandoff, deprecated onHydrationError
PrepaintPolicyroutes, ttlMs, maxSnapshotBytes, includeStyles
convertDOMExceptionDOM storage 오류를 PrepaintStorageError로 변환

Vite subpath @firsttx/prepaint/plugin/vitefirstTxFirstTxPluginOptions를 공개합니다. overlayoverlayRoutes option은 deprecated이며 현재 restore 경로는 overlay를 사용합니다.

상세 설정: Prepaint

Local-First

설치 package: @firsttx/local-first

Export역할
defineModelZod schema, version, initialData, TTL과 merge를 가진 model 정의
StorageIndexedDB storage access
useModelmodel의 external-store snapshot 구독
useSyncedModelmodel snapshot과 server revalidation 연결
useSuspenseSyncedModelSuspense 경계에서 sync 결과 T 반환
FirstTxError, StorageError, ValidationErrorLocal-First 오류 class

ModelOptions<T>schema, version, initialData, ttl, merge를 제공합니다. useModel{ data, status, error, history, patch }, useSyncedModel은 여기에 syncisSyncing을 더합니다.

공개 typeContract
Model<T>patch, replace, getSnapshot, getHistory와 synchronous cached snapshot method
StoredModel<T>IndexedDB에 저장되는 _v, updatedAt, data
ModelHistoryupdatedAt, age, isStale, 현재 항상 falseisConflicted
SyncOptions<T>syncOnMount, onSuccess, onError
SyncedModelResult<T>data, status, patch, sync, isSyncing, error, history
Fetcher<T>, SuspenseFetcher<T>현재 data 또는 null을 받아 Promise<T>를 반환
SuspenseSyncOptions<T>revalidateOnMount, onSuccess, onError
StorageErrorCode"QUOTA_EXCEEDED" | "PERMISSION_DENIED" | "UNKNOWN"

useSuspenseSyncedModel은 memory snapshot에 data가 없을 때 getSyncPromise()으로 IndexedDB를 확인합니다. 이때 저장 data가 발견되면 revalidateOnMount가 background revalidation을 제어합니다. memory snapshot에 이미 data가 있으면 훅은 즉시 반환하고 새 revalidation을 시작하지 않습니다.

StorageError의 주요 property는 code, storageCode, recoverable, storageContext이며 isRecoverable()을 구현합니다.

상세 설정: Local-First

Tx

설치 package: @firsttx/tx

Export역할
startTransactionimperative transaction 생성
useTxoptimistic, request, rollback lifecycle을 React에 연결
DEFAULT_RETRY_CONFIG, RETRY_PRESETSretry 기본값과 preset
TxErrorTx 오류 base class
TransactionTimeoutError, RetryExhaustedErrortimeout과 retry 소진 오류
CompensationFailedError, TransactionStateError보상 실패와 잘못된 상태 호출 오류

TxOptionsid, transition, timeout을 제공합니다. 각 run step은 compensate, retry, signal option을 받을 수 있습니다.

공개 typeContract
TxStatus"pending" | "running" | "committed" | "rolled-back" | "failed"
StepOptionscompensate, retry, signal
RetryConfigmaxAttempts, delayMs, backoff
UseTxConfigoptimistic, rollback, request, transition, retry, callback과 cancelOnUnmount
UseTxResultmutate, mutateAsync, cancel, pending/error/success state와 error

CompensationFailedError는 compensation failurescompletedSteps를 보관하며 rollback을 시작하게 한 원래 step 오류는 보관하지 않습니다.

상세 설정: Tx

Runtime event contract

모든 event는 id, category, type, timestamp, data, priority를 가집니다.

Category대표 type
prepaintcapture, restore, handoff, storage.error
modelinit, load, patch, replace, sync.*, broadcast, broadcast.fallback, broadcast.skipped, validation.error
txstart, step.*, commit, rollback.*, timeout
systembridge 준비와 내부 상태 event

payload field의 최종 관찰 계약은 각 runtime package emitter가 소유합니다. @firsttx/devtools bridge type은 extension을 위한 내부 consumer schema이며 공개 stable API로 간주하지 않습니다.

관찰 방법: DevTools

공통 오류 사용법

각 package의 error base class는 사용자 메시지, debug 정보와 recoverability를 제공합니다.

오류 class고유 공개 property
BootErrorphase, cause
CaptureErrorphase, route, cause
HydrationErrormismatchType, cause
PrepaintStorageErrorstorageCode, operation, cause
StorageErrorstorageCode, recoverable, storageContext
ValidationErrormodelName, zodError
TransactionTimeoutErrortimeoutMs, elapsedMs
RetryExhaustedErrorstepId, attempts, errors
CompensationFailedErrorfailures, completedSteps
TransactionStateErrorcurrentState, attemptedAction, transactionId
ts
import { TxError } from "@firsttx/tx";

try {
  await operation();
} catch (error) {
  if (error instanceof TxError) {
    console.error(error.getDebugInfo());
    if (error.isRecoverable()) {
      showRetryAction();
    }
  }
}

증상별 판단과 수동 복구 범위는 문제 해결에서 확인하세요.