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
| Parameter | Type | Description |
|---|---|---|
target | WorkingTreeCaptureMountTarget | 被装上挂载点的适配器实例;同时是适配器级写意图声明的作用域键 |
raw | RawWritePrimitives | 未经拦截的五个原语 |
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 Parameter | Description |
|---|---|
T | 通知体的返回类型;放行时原样透传 |
Parameters
| Parameter | Type | Description |
|---|---|---|
entityName | string | 被通知的实体名 |
namespace | string | 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 Parameter | Description |
|---|---|
T | 语句执行体的返回类型;放行时原样透传 |
Parameters
| Parameter | Type | Description |
|---|---|---|
sql | string | 待判定的语句原文 |
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
| Parameter | Type |
|---|---|
host | WorkingTreeWriteHost |
next | () => Observable<void> |
entityName | string |
operation | InterceptedBulkWrite |
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
| Parameter | Type |
|---|---|
host | WorkingTreeWriteHost |
next | MergeChangesNext |
actions | SwitchVersionActions |
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
| Parameter | Type |
|---|---|
host | WorkingTreeWriteHost |
next | (options) => Promise<void> |
options | SwitchBranchOptions |
Returns
Promise<void>
interceptTransaction()
interceptTransaction(
host,
next,
fun,
transactionLog?
): Promise<unknown>;
Defined in: packages/rxdb/src/capture/capture-interceptor.ts:139
挂载点 1:整事务共享一个 unitId 的原子边界
Parameters
| Parameter | Type |
|---|---|
host | WorkingTreeWriteHost |
next | (fun, transactionLog?) => Promise<unknown> |
fun | TransactionFun |
transactionLog? | boolean |
Returns
Promise<unknown>