跳到主要内容

WorkingTreeCaptureHook

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:123

捕获运行时接管四个挂载点的转交口

Remarks​

每个方法都收一个 next——还没被调用的原语。于是「先判定 / 先取水位线,再执行业务写」 在类型上就是唯一写法,gateBulkWrite 所要求的「返回 Observable 之前同步拒绝」也才有地方 落实:interceptBulkWrite 的返回类型是裸的 Observable<void>,它拿到的 next 可以一次都不调用。

每个方法还都收一个 host——本次调用的实际 this。挂载点装在实例上,而同一个实例会经 executor 门面被再次调用(executor.mergeChanges 就是 adapter.mergeChanges.call(facade, …));把 host 丢掉就等于把事务内的调用改写成事务外的 调用,后果是自锁而不是报错。

Methods​

bindMountTarget()​

bindMountTarget(target, raw): void;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:136

认领安装宿主与它那份未拦截原语;installWorkingTreeCapture 之后立刻调用一次

Parameters​

ParameterTypeDescription
targetWorkingTreeCaptureMountTarget被装上挂载点的适配器实例;同时是适配器级写意图声明的作用域键
rawRawWritePrimitives未经拦截的五个原语

Returns​

void

Remarks​

两样东西都只有安装方知道,而两样运行时都要:target 是 declareTrustedWrite 用的作用域身份——挂载点 2 / 3 的调用方把意图声明在适配器上, 运行时得拿同一个对象才查得到;raw 则是捕获自己发写的唯一安全入口, 走被拦截的那份会立刻递归回挂载点自己。


gateExternalNotify()​

gateExternalNotify<T>(
entityName,
namespace,
notify
): T;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:205

转交门 2:一次 notifyExternalUpdate()(写入口语义矩阵行 11)

Type Parameters​

Type ParameterDescription
T通知体的返回类型;放行时原样透传

Parameters​

ParameterTypeDescription
entityNamestring被通知的实体名
namespacestring | undefined已知时直接用;rxdb 即系统表
notify() => T还没被调用的通知体

Returns​

T

notify() 的返回值本身

Throws​

目标是版本化业务实体时抛出;此时一条事件都不会派发

Remarks​

与 gateRawWrite 同一个理由挂在这张契约上:核心的 notifyExternalUpdate() 拦得住 自己,却回答不了「这个实体归哪一类」——那要问域,而域是捕获的。核心因此只交出实体身份, 把「归哪类、这一类在行 11 上是放是拒」整段留给运行时。

门包着通知体,不是通知之后补的一句断言:拿到的是还没被调用的回调,「先判定」于是在 类型上就是唯一写法;写成先派发再检查的话,拒绝也阻止不了事件已经发出去。


gateRawWrite()​

gateRawWrite<T>(sql, execute): Promise<T>;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:185

转交门 1:一条 raw 写语句(adapter-contract.md §2 的 4 步判定)

Type Parameters​

Type ParameterDescription
T语句执行体的返回类型;放行时原样透传

Parameters​

ParameterTypeDescription
sqlstring待判定的语句原文
execute() => T | Promise<T>还没被调用的执行体

Returns​

Promise<T>

execute() 的返回值本身

Throws​

目标落在版本化业务表且不满足任何放行条件时抛出;此时 execute 一次都不会被调用

Remarks​

rawQuery?() 是适配器接口上的可选方法,核心包没法像四个挂载点那样替适配器包住它, 判定只能由各适配器自己的实现调用 gateRawWrite。而那个函数在核心里只剩一句分派: 能力位为假直接放行,为真转交到这里。判定实现一个字都不在核心——它认的是语句词法、 表名的六种物理形态与受信意图,三样都随捕获规则变。


interceptBulkWrite()​

interceptBulkWrite(
host,
next,
entityName,
operation
): Observable<void>;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:163

挂载点 4:upsertMany / deleteByIds 的门禁

Parameters​

ParameterType
hostWorkingTreeWriteHost
next() => Observable<void>
entityNamestring
operationInterceptedBulkWrite

Returns​

Observable<void>


interceptMergeChanges()​

interceptMergeChanges(
host,
next,
actions,
localChanges?,
disableTriggers?
): Promise<number | void>;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:147

挂载点 2:本地 mergeChanges(远端同名重载不在此列,它在 RxDBAdapterRemoteBase 上)

Parameters​

ParameterType
hostWorkingTreeWriteHost
nextMergeChangesNext
actionsSwitchVersionActions
localChanges?Omit<RxDBChange, "id">[]
disableTriggers?boolean

Returns​

Promise<number | void>


interceptSwitchBranch()​

interceptSwitchBranch(
host,
next,
options
): Promise<void>;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:156

挂载点 3:分支物化 / redo 失效 / undo-redo 应用

Parameters​

ParameterType
hostWorkingTreeWriteHost
next(options) => Promise<void>
optionsSwitchBranchOptions

Returns​

Promise<void>


interceptTransaction()​

interceptTransaction(
host,
next,
fun,
transactionLog?
): Promise<unknown>;

Defined in: packages/rxdb/src/capture/capture-interceptor.ts:139

挂载点 1:整事务共享一个 unitId 的原子边界

Parameters​

ParameterType
hostWorkingTreeWriteHost
next(fun, transactionLog?) => Promise<unknown>
funTransactionFun
transactionLog?boolean

Returns​

Promise<unknown>