RxDB
Defined in: packages/rxdb/src/RxDB.ts:84
RxDB 是个单例对象,负责管理插件、适配器、事件以及上下文等全局功能 全局只能创建一个 RxDB 实例,所有 entity 都通过这个实例进行管理 所有 Entity 的 Class 也只能被注册一次
Constructors
Constructor
new RxDB(options): RxDB;
Defined in: packages/rxdb/src/RxDB.ts:583
Parameters
| Parameter | Type | Description |
|---|---|---|
options | RxDBOptions | RxDB 配置选项 |
Returns
RxDB
Properties
connected$
readonly connected$: Observable<boolean>;
Defined in: packages/rxdb/src/RxDB.ts:390
连接状态 Observable
Remarks
这是全实例聚合信号:任意一个适配器连上就是 true。要等某个具体适配器的表结构就绪,
必须用 RxDB.adapterConnected$ —— 多适配器配置下,远程适配器先连上就会把这里
置 true,此时本地适配器可能还停在 createTables()。
去重后发射:多适配器下每一次单独的连/断都会重算聚合值,但聚合值没变时不该通知订阅者。
entityManager
readonly entityManager: EntityManager;
Defined in: packages/rxdb/src/RxDB.ts:409
entitySync
readonly entitySync: EntitySyncResolver;
Defined in: packages/rxdb/src/RxDB.ts:429
本实例的实体同步配置解析器 —— 「某个实体在这个库里走哪种同步策略」的唯一答案。
Remarks
优先级:syncOverrides 里的实例覆盖 > 实体装饰器 sync > 库级 sync。核心与插件的
同步消费者都必须经它取值,不能自己回读 metadata.sync:同一实体在两个实例里可以走
不同策略,元数据上那一份只是装饰器的声明,不是本库的生效配置。
localAdapter$
readonly localAdapter$: Observable<LocalRxDBAdapter>;
Defined in: packages/rxdb/src/RxDB.ts:356
本地适配器
Remarks
缓存带引用计数:订阅者归零时连同缓冲一起释放。无 refCount 的 shareReplay(1) 会把
首个适配器实例钉在缓冲里直到实例销毁 —— 断连重连后每个仓储都会拿到那个已断开的旧适配器。
释放后重新订阅会走回 RxDB.getAdapter,它自身有 #adapter_map 缓存,不会重复建实例。
distinctUntilChanged 必须排在 filter 之前:断连时 #shutdown() 会把适配器名复位成 '',
只有让这个空值参与去重,重连时同名的适配器才会被认作一次变化并重新求值。反过来先 filter,
空值被吞掉,去重看到的永远是同一个名字,仍在订阅中的实时查询就会一直挂在已断开的适配器上。
reachability
readonly reachability: ReachabilityMonitor;
Defined in: packages/rxdb/src/RxDB.ts:405
远端可达性监视器,与 RxDB.connected$ 并列而不是合并。
Remarks
两者语义不同:connected$ 是适配器生命周期(某个 adapter 的 connect() 完成没有),
而 HTTP 适配器的 connect() 不发任何网络请求 —— 断网时它照样报 connected。
合并会让「适配器已连接但网断了」这个最常见的状态变得不可表达,而那正是
local-first 写入唯一需要区分的状态。
生命周期跟随实例而不是连接纪元:#shutdown() 把实例复位成「可重新 init()」,
但网络并不会因为某个适配器断开而重置。在这里 destroy() 会让复位后的实例拿到一个
永远停在旧状态、report() 也不再生效的监视器。
remoteAdapter$
readonly remoteAdapter$: Observable<RemoteRxDBAdapter>;
Defined in: packages/rxdb/src/RxDB.ts:371
远程适配器
Remarks
缓存语义同 RxDB.localAdapter$。
schemaManager
readonly schemaManager: SchemaManager;
Defined in: packages/rxdb/src/RxDB.ts:407
syncState
readonly syncState: SyncStateHub;
Defined in: packages/rxdb/src/RxDB.ts:419
同步状态汇聚面:网通不通、还有多少没推上去、这会儿在不在推、上一次错在哪、上一次谁判负。
Remarks
三框架的 useSyncState() 直接绑这一份快照。生命周期与 RxDB.reachability 同理 ——
跟随实例而不是连接纪元,#shutdown() 不销毁它:面板要在断连期间继续显示「离线、待推 N 条」,
那正是它最该出声的时候。
Accessors
config
Get Signature
get config(): RxDBOptions;
Defined in: packages/rxdb/src/RxDB.ts:484
Returns
context
Get Signature
get context(): RxDBContext;
Defined in: packages/rxdb/src/RxDB.ts:463
Returns
Set Signature
set context(context): void;
Defined in: packages/rxdb/src/RxDB.ts:467
Parameters
| Parameter | Type |
|---|---|
context | RxDBContext |
Returns
void
firstConnectedAt
Get Signature
get firstConnectedAt(): Date | undefined;
Defined in: packages/rxdb/src/RxDB.ts:476
Returns
Date | undefined
localAdapterIfConnected
Get Signature
get localAdapterIfConnected(): LocalRxDBAdapter | undefined;
Defined in: packages/rxdb/src/RxDB.ts:573
Internal
已连接的本地适配器实例;未配置或尚未连接时为 undefined
Remarks
这条路不抛,与 RxDB.localAdapterSync 的分工只在这一点上:那个服务的是
声明了 inject: ['adapter:local'] 的插件,被调用时依赖必然已就绪,取不到就是调用方
的时序错误,该炸;这个服务的是事件到达时才执行的代码 —— 事件什么时候来不由接收方
决定,一条在断连期间飘到的通知不该变成一次异常。
今天的唯一消费方是能力插件的 CAPABILITY_ENABLED_EVENT 处理器(FR-037):
处理器本身同步把捕获钩子装到本纪元的适配器上——不 await,走
await firstValueFrom(localAdapter$) 会让出一个微任务,而那个缝隙里的写入不留痕迹。
但这只保证处理器自己不让出,不保证处理器何时跑:接收端若正处于一笔打开的事务中, RxDB.dispatchEvent 会把这条非事务事件压进队列,直到那笔事务 COMMIT 才派发, 钩子的安装随之延后一个事务窗口。事件不会丢,而且那笔事务本就开始于能力启用之前—— 它不需要被新装的钩子看见。
读的是调度器为本纪元绑定的那个实例(与 localAdapterSync 同一份来源),不是按名字
重新解析:纪元交替时两者可能指向不同对象,而钩子必须装在当前纪元的那一个上。
Returns
LocalRxDBAdapter | undefined
localAdapterSync
Get Signature
get localAdapterSync(): LocalRxDBAdapter;
Defined in: packages/rxdb/src/RxDB.ts:449
当前已连接的本地适配器实例,同步读取。
Throws
本地适配器未配置或尚未连接时抛错
Remarks
给声明了 inject: ['adapter:local'] 的插件用:install() 被调用时依赖必然已就绪,
再走一次 await firstValueFrom(localAdapter$) 只是把一个确定的值绕成异步的。
与 RxDB.localAdapter$ 的分工:这里读的是调度器为本纪元绑定的那个实例,
而 localAdapter$ 按名字经 RxDB.getAdapter 重新解析。纪元交替时两者可能
指向不同对象,依赖纪元身份的代码(US-015 INV-3)必须用这个。需要跨纪元持续跟踪
适配器变化的响应式代码仍然用 localAdapter$。
未连接时抛错而不是返回 undefined:没有依赖声明就来同步取适配器是调用方的时序
错误,返回空值只会把它推迟到某个更远的地方再炸。
Returns
本地适配器实例
systemContributions
Get Signature
get systemContributions(): readonly RxDBSystemContribution[];
Defined in: packages/rxdb/src/RxDB.ts:502
Internal
已登记的系统贡献,按注册顺序
Remarks
给核心内部那些不在 connect() 链路上、却必须让贡献方插一脚的写入口用——今天只有
version/create-branch.ts:它在自己的事务里建分支,而贡献方的分支级行必须写进同一个
事务(见 RxDBSystemContribution.writeBranchRows)。connect() 自己不走这个 getter,
它在局部变量里持有同一份快照。
返回数组而不是内部的 Map:调用方要的是「挨个过一遍」,拿到 Map 只会让它多知道一件 与它无关的事——贡献是按能力名去重的。
Returns
readonly RxDBSystemContribution[]
systemEntities
Get Signature
get systemEntities(): readonly EntityType[];
Defined in: packages/rxdb/src/RxDB.ts:523
Internal
本库的系统表:核心自带的四张 + 本实例 use() 过的插件贡献的那些
Remarks
建表这一侧的唯一真相,两个消费者共用:SchemaManager.init 把它补进
config.entities,RxDB.#ensureSystemTables 拿它划既有库的系统补建批次。
两处都不能改读模块级的 SYSTEM_ENTITIES——那份是判定用的活视图,只增不减,
见 RxDB.#contributed_system_entities。
顺序即建表顺序,核心四张在前:贡献方的表允许引用 RxDBBranch(分支级行就是这么来的),
反过来不成立。
每次返回新数组:SchemaManager.init() 会往 config.entities 里推东西,拿到内部数组
就等于让它写回这里。
Returns
readonly EntityType[]
version
Get Signature
get version(): string;
Defined in: packages/rxdb/src/RxDB.ts:480
Returns
string
workingTreeCaptureHook
Get Signature
get workingTreeCaptureHook():
| WorkingTreeCaptureHook
| undefined;
Defined in: packages/rxdb/src/RxDB.ts:543
Internal
本库当前生效的工作树捕获钩子;未启用提交能力时为 undefined
Remarks
这条路不抛。 它服务的是核心包里那些拦不住、只能由调用点自己接门禁的写入口
(EntityManager.notifyExternalUpdate() 是第一个,写入口语义矩阵行 11)。那些方法今天在
「没配本地适配器」和「还没连上」的实例上都能调,所以取钩子走非抛的
RxDB.#resolve_adapter_instance,而不是 RxDB.localAdapterSync——后者在这两种
情形下各抛一次,接上门禁就等于给它们凭空加一个「未连接」异常,而 FR-046 要求未启用能力的库
行为逐字节不变。
钩子挂在适配器实例上(RxDBAdapterLocalBase.workingTreeCaptureHook),不在本类里
另存一份:connect() / disconnect() 会换掉实例,存一份就会在换代之后指着上一纪元的运行时。
Returns
| WorkingTreeCaptureHook
| undefined
Methods
adapter()
adapter(adapterName, adapter): this;
Defined in: packages/rxdb/src/RxDB.ts:830
注册 adapter
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | string & object | 适配器名称 |
adapter | AdapterFactory | 适配器工厂函数 |
Returns
this
返回 RxDB 实例,支持链式调用
adapterConnected$()
adapterConnected$(adapterName): Observable<boolean>;
Defined in: packages/rxdb/src/RxDB.ts:1188
指定适配器的连接状态流。
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | string | 适配器名称 |
Returns
Observable<boolean>
该适配器连上(表结构已就绪)时发 true,断开时发 false;去重后发射
Remarks
与聚合的 RxDB.connected$ 的区别是这里认适配器。插件的 install() 要等的是
「我要用的那个适配器建好表了」,用聚合信号会被另一个先连上的适配器提前放行。
置位时机在插件安装之前 —— 引导期的插件正是靠它解除等待,等到插件安装之后就死锁了。
因此它表示的是「表结构可用」,不是「整个 connect() 已完成」。
addEventListener()
addEventListener<T>(type, listener): void;
Defined in: packages/rxdb/src/RxDB.ts:1354
Type Parameters
| Type Parameter |
|---|
T extends keyof RxDBEventMap |
Parameters
| Parameter | Type |
|---|---|
type | T |
listener | EventListener<RxDBEventMap[T]> |
Returns
void
branchMaterializationSource()
branchMaterializationSource(source, scope?): this;
Defined in: packages/rxdb/src/RxDB.ts:812
登记 metadata-only 分支的首次物化来源
Parameters
| Parameter | Type | Description |
|---|---|---|
source | BranchMaterializationSource | 物化来源,见 BranchMaterializationSource |
scope? | LifecycleScope | 传入时,本次登记会随作用域释放而撤销;不传则永久有效 |
Returns
this
Throws
Error 这条连接上已经登记了另一个来源
Remarks
形状与 RxDB.queryCacheOutbox 相同(身份守卫撤销、写槽放在 setup 里),多一道
冲突检查:一条连接至多一个来源。两个来源意味着同一条分支可以被两份互不相识的快照
各物化一次,所以后到的那个当场抛错,而不是静默顶掉前一个;同一个来源重复登记是幂等的。
官方同步插件在每个连接期的 install 里登记:断连时随作用域撤销,重连时重新登记,
重复 use() 由插件去重、走不到第二次登记。业务代码不需要调它。
Example
import { rxDBPluginSync } from '@aiao/rxdb-plugin-sync';
rxdb.use(rxDBPluginSync); // 装配时自动登记
broadcastCapabilityEnabled()
broadcastCapabilityEnabled(capability): void;
Defined in: packages/rxdb/src/RxDB.ts:1350
通知同源的其他连接:某个能力刚在本连接上被启用(FR-037)。
Parameters
| Parameter | Type | Description |
|---|---|---|
capability | string | 能力名,与 RxDBSystemContribution.capability 同值 |
Returns
void
Remarks
能力位只在连接期读一次(见 RxDBSystemContribution.bootstrapExisting), 于是「A 启用、B 早已连上」这一种排列下,B 此后的每一次写都绕开该能力,一条错误都不会有。 本方法就是那条补齐用的通道:启用方发一次,同源的其他连接收到 CAPABILITY_ENABLED_EVENT 后自行接通。
只覆盖同源的 BroadcastChannel 可达范围。 跨进程(Electron 主/渲染、Tauri、Node 多进程)
与 multiInstance: false 的实例收不到 —— 那两种情形由能力插件自己的自愈路径收窄,
见 git show f9528e8f:specs/001-working-tree-commits/threat-model.md §6。
发起方自己收不到这条事件(网关按 clientId 忽略自己发的消息),这是对的:
它在 enable() 里已经同步接通过了,再收一次只会让接通发生两遍。
网关未启用(multiInstance: false)时是无操作,不抛。
connect()
Call Signature
connect<K>(adapterName): Promise<RxDBAdapters[K]>;
Defined in: packages/rxdb/src/RxDB.ts:998
连接适配器
Type Parameters
| Type Parameter |
|---|
K extends never |
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | K | 适配器名称 |
Returns
Promise<RxDBAdapters[K]>
返回连接的适配器实例
Throws
引导期间被 disconnect() / disconnectAll() 中止时抛出(见 RxDB.#connect_epochs)
Call Signature
connect(adapterName): Promise<IRxDBAdapter>;
Defined in: packages/rxdb/src/RxDB.ts:999
连接适配器
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | string & object | 适配器名称 |
Returns
Promise<IRxDBAdapter>
返回连接的适配器实例
Throws
引导期间被 disconnect() / disconnectAll() 中止时抛出(见 RxDB.#connect_epochs)
destroy()
destroy(): Promise<void>;
Defined in: packages/rxdb/src/RxDB.ts:1283
终态销毁:断开全部适配器,再释放跟随实例而不是连接纪元的那部分资源。
Returns
Promise<void>
Remarks
与 RxDB.disconnectAll 分成两个出口,因为两者的复位语义相反。disconnectAll()
走 #shutdown(),把实例复位成「可重新 init()」;而 RxDB.reachability 与
RxDB.syncState 按设计不跟随连接纪元——网络不会因为某个适配器断开而重置,
面板也要在断连期间继续显示「离线、待推 N 条」。于是它们只能在这里释放:
reachability 自己攥着退避定时器和两条长活的 subject;宿主上那对
online / offline 监听自 US-025 D2 起改成按需挂(watch() 引用计数,
目前唯一的持有者是 @aiao/rxdb-plugin-sync 的作用域)。没有终态出口的话,
一个退避中的实例会把定时器连同自己一起吊住,多实例 / HMR / 测试按实例数线性累积。
幂等;不必先调 disconnectAll(),它自己会断干净。销毁后 init() 抛错、
connect() reject(见 RxDB.init),实例不可复用。
Example
// 组件卸载 / 进程退出时
await rxdb.destroy();
disconnect()
disconnect(adapterName): Promise<void>;
Defined in: packages/rxdb/src/RxDB.ts:1207
断开适配器连接
仅断开指定适配器;只有当所有已连接的适配器都已断开时,才执行全局拆卸 (插件、网关、versionManager 与初始化状态)。避免单适配器断开误拆全局资源。
该适配器的 connect() 还在引导中时,本方法会作废它:那条链在下一个 await 边界以
中止错误 reject,而不是在拆完之后把适配器标回已连接。作废是同步的,不等它落地
(理由见 RxDB.#invalidate_connect)。
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | string & object | 适配器名称 |
Returns
Promise<void>
disconnectAll()
disconnectAll(): Promise<void>;
Defined in: packages/rxdb/src/RxDB.ts:1246
断开全部适配器并执行全局拆卸。
与 RxDB.disconnect 同口径:先作废所有在飞的 connect(),它们会以中止错误
reject。不作废的话,它们会在 #shutdown() 之后醒来,把刚清空的已连接集合重新填上。
Returns
Promise<void>
dispatchEvent()
dispatchEvent(event): void;
Defined in: packages/rxdb/src/RxDB.ts:1362
Parameters
| Parameter | Type |
|---|---|
event | RxDBEvent |
Returns
void
getAdapter()
Call Signature
getAdapter<K>(adapterName): Promise<RxDBAdapters[K]>;
Defined in: packages/rxdb/src/RxDB.ts:902
获取适配器实例
Type Parameters
| Type Parameter |
|---|
K extends never |
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | K | 适配器名称 |
Returns
Promise<RxDBAdapters[K]>
返回适配器实例的 Promise
Throws
当适配器未注册时抛出错误
Call Signature
getAdapter(adapterName): Promise<IRxDBAdapter>;
Defined in: packages/rxdb/src/RxDB.ts:903
获取适配器实例
Parameters
| Parameter | Type | Description |
|---|---|---|
adapterName | string & object | 适配器名称 |
Returns
Promise<IRxDBAdapter>
返回适配器实例的 Promise
Throws
当适配器未注册时抛出错误
getBranchMaterializationSource()
getBranchMaterializationSource():
| BranchMaterializationSource
| undefined;
Defined in: packages/rxdb/src/RxDB.ts:988
取已登记的首次物化来源
Returns
| BranchMaterializationSource
| undefined
装了同步插件且处于连接期时是来源本身,否则 undefined
Remarks
undefined 交给工作树插件去抛 branch_not_materialized(source_unavailable)——
点名哪条分支这一层不知道。
getPlugins()
getPlugins(name): readonly IRxDBPlugin[];
Defined in: packages/rxdb/src/RxDB.ts:891
按名字取已注册的插件实例。
Parameters
| Parameter | Type | Description |
|---|---|---|
name | string | 插件的 IRxDBPlugin.name |
Returns
readonly IRxDBPlugin[]
同名候选全集的快照,按 RxDB.use 顺序;没有则为空数组
Remarks
返回数组而不是单个实例:重名允许存在(D4),调用方要自己决定拿哪一个。插件工厂用它
做「我是不是已经装过了」的自检,比在数据库实例上挂自有属性再 hasOwnProperty 探测可靠 ——
那种门面属性是给使用者的,不是给探测用的,重命名门面就会把自检探空。
每次返回新数组:调用方往里推东西不会写回宿主索引。
getQueryCacheEngine()
getQueryCacheEngine():
| QueryCacheEngineFactory
| undefined;
Defined in: packages/rxdb/src/RxDB.ts:962
取已注册的 QueryCache 读引擎工厂
Returns
| QueryCacheEngineFactory
| undefined
装了插件时是工厂本身,否则 undefined
Remarks
undefined 是有意暴露出来的:调用方要自己抛 RxDBMissingPluginError,
而不是在这里代抛 —— connect() 的启动护栏要点名具体哪个实体,这一层不知道。
getQueryCacheOutbox()
getQueryCacheOutbox():
| QueryCacheOutboxProvider
| undefined;
Defined in: packages/rxdb/src/RxDB.ts:975
取已注册的查询出站队列提供者
Returns
| QueryCacheOutboxProvider
| undefined
装了插件时是提供者本身,否则 undefined
Remarks
与 RxDB.getQueryCacheEngine 同理,undefined 交给调用方去抛
RxDBMissingPluginError —— 点名哪个实体这一层不知道。
getRepositoryConfig()
getRepositoryConfig(repositoryName):
| IRepositoryConfig<RepositoryInstance<EntityType>>
| undefined;
Defined in: packages/rxdb/src/RxDB.ts:935
获取 Repository 配置
Parameters
| Parameter | Type | Description |
|---|---|---|
repositoryName | string | Repository 名称 |
Returns
| IRepositoryConfig<RepositoryInstance<EntityType>>
| undefined
Repository 配置对象,如果不存在返回 undefined
getRepositoryNames()
getRepositoryNames(): string[];
Defined in: packages/rxdb/src/RxDB.ts:949
列出当前已注册的 Repository 名称
Returns
string[]
按注册顺序排列的仓储名数组
Remarks
给报错用的。实体声明的 repository 找不到时,只说「没找到」等于让人猜是拼错了
还是插件没装;列出当前有什么,调用方一眼看得出缺的是哪一类。核心自身只注册
Repository,其余全由插件在 install() 里挂上来。
init()
init(): void;
Defined in: packages/rxdb/src/RxDB.ts:623
初始化实例:装配插件、拉起 Schema / Entity / Version 管理器、开网关与事件系统。
幂等:已初始化时直接返回。connect() 会在同步段自行调用它,通常无需手动调用。
Returns
void
Throws
实例正处于 #shutdown() 的拆卸窗口内时抛出。
Remarks
任一管理器初始化抛错都会把初始化标志、插件登记与连接作用域一并回滚,
调用方修好问题后重新 init() 能真正重跑剩余步骤,而不是被半套状态挡住。
invalidateRemoteEntity()
invalidateRemoteEntity(entity, namespace?): void;
Defined in: packages/rxdb/src/RxDB.ts:1326
上报「远端某个实体的数据已变」(US-023)。
供宿主在自己的推送通道(WebSocket / SSE / 轮询)收到变更通知时调用。
使用 SyncType.QueryCache 的仓储会据此丢掉该实体的同步记忆,并重跑所有
依赖它的活查询 —— 重跑会回远端重新取一次权威数据。
Parameters
| Parameter | Type | Default value | Description |
|---|---|---|---|
entity | string | undefined | 实体名,即 @Entity({ name });未注册的名字是无操作,不抛错 |
namespace | string | 'public' | 命名空间,默认 'public'(与 @Entity 的默认值一致) |
Returns
void
Remarks
签名里没有任何位置能承载行数据,这是有意的。 推送通道给的行体不经
fetchMetadata 比对,直接写进本地缓存会让「本地有一份没人验证过的值」
变成常态;本方法只负责让缓存失效,权威值一律由重跑时的拉取决定。
事件不跨标签页转发:每个标签页的宿主各自会收到推送,转发只会让同一次 变更在 N 个标签页里被放大成 N 次远端拉取。
Example
socket.on('changed', ({ entity }) => rxdb.invalidateRemoteEntity(entity));
queryCacheEngine()
queryCacheEngine(factory, scope?): this;
Defined in: packages/rxdb/src/RxDB.ts:747
注册 QueryCache 读引擎工厂
Parameters
| Parameter | Type | Description |
|---|---|---|
factory | QueryCacheEngineFactory | 引擎工厂,见 QueryCacheEngineFactory |
scope? | LifecycleScope | 传入时,本次注册会随作用域释放而撤销;不传则永久有效 |
Returns
this
Remarks
形状逐条对齐 RxDB.repository:撤销按工厂对象身份守卫(释放时槽里已换成
别人的工厂,说明有更晚的注册覆盖了本次,此时什么都不做),且写槽这一步本身放在
acquire() 的 setup 里 —— 作用域已不是 active 时 acquire() 同步抛且不执行
setup,注册于是也不发生,不会留下一条没人能撤销的孤儿登记。
与门面轴的 repository() 的区别只在被登记的东西:那一条决定 getRepository(E) 的
公开面,这一条只填 SyncType.QueryCache 的读实现,不改任何公开面。
Example
import { rxDBPluginQueryCache } from '@aiao/rxdb-plugin-querycache';
rxdb.use(rxDBPluginQueryCache);
queryCacheOutbox()
queryCacheOutbox(provider, scope?): this;
Defined in: packages/rxdb/src/RxDB.ts:778
注册查询出站队列提供者
Parameters
| Parameter | Type | Description |
|---|---|---|
provider | QueryCacheOutboxProvider | 出站队列提供者,见 QueryCacheOutboxProvider |
scope? | LifecycleScope | 传入时,本次注册会随作用域释放而撤销;不传则永久有效 |
Returns
this
Remarks
形状与 RxDB.queryCacheEngine 逐条相同(身份守卫撤销、写槽放在 setup 里)。
分成两个注册口而不是让 sync 插件把两样东西一起交上来:出站队列随 sync 插件走, 读引擎随 querycache 插件走,两个包各自登记各自的那一半,谁都不必认识对方。
Example
import { rxDBPluginSync } from '@aiao/rxdb-plugin-sync';
rxdb.use(rxDBPluginSync);
removeEventListener()
removeEventListener<T>(type, listener): void;
Defined in: packages/rxdb/src/RxDB.ts:1358
Type Parameters
| Type Parameter |
|---|
T extends keyof RxDBEventMap |
Parameters
| Parameter | Type |
|---|---|
type | T |
listener | EventListener<RxDBEventMap[T]> |
Returns
void
repository()
repository<RT>(
repositoryName,
config,
scope?
): this;
Defined in: packages/rxdb/src/RxDB.ts:708
注册 Repository 统一接口,所有 repository 配置存储在 RxDB 中
Type Parameters
| Type Parameter |
|---|
RT extends RepositoryInstance<EntityType> |
Parameters
| Parameter | Type | Description |
|---|---|---|
repositoryName | string | Repository 名称 |
config | IRepositoryConfig<RT> | Repository 配置对象 |
scope? | LifecycleScope | 传入时,本次注册会随作用域释放而撤销;不传则永久有效(与改造前一致) |
Returns
this
Remarks
撤销按配置对象身份守卫:释放时表里已经换成别人的配置,说明有更晚的注册覆盖了本次, 此时什么都不做——否则先装后卸的插件会把后来者的注册一并删掉。
传了 scope 时写表这一步本身就在 setup 里:作用域已不是 active 时
acquire() 同步抛且不执行 setup,注册于是也不发生。写在 acquire() 之外的话,
这条注册会留在表里而没有任何人能撤销它——正是本原语「setup 抛错时这一条不进清单」
要杜绝的那种孤儿。
use()
use<Options>(plugin, options?): RxDB;
Defined in: packages/rxdb/src/RxDB.ts:861
安装插件
init() 之前注册的插件在 init() 时统一安装;
init() 之后注册的插件立即安装,保证与 shutdown 时的 destroy 对称。
停机窗口(disconnect() / disconnectAll() 已开始拆卸、尚未拆完)内调用只登记,
安装推迟到下一次 init()——本纪元正在退场,往里装的东西没有对称的拆卸入口。
见 RxDB.#shutting_down。
安装失败不从这里出去:同步 install() 失败只 console.error,异步或同步失败都会记入
安装 Promise,由后续 connect() 传播 —— 包括同一个适配器的重复 connect():命中缓存
那一路也会补跑一趟安装等待,否则连上之后 use() 的插件失败就永远出不来(use() 同步返回
this,自己没有报错的出口)。
规划期错误则相反,同步从这里抛:依赖成环(RxDBPluginDependencyCycleError)与
依赖歧义(RxDBPluginAmbiguousDependencyError)都在写进注册表之前判,抛出时本次
注册整个不发生。两者都是声明本身不自洽,等到 connect() 再报已经晚了 —— 而且调用方手里
并没有摘除插件的入口,让它落进注册表就等于永久毒化后面每一次 init()。
Type Parameters
| Type Parameter | Default type |
|---|---|
Options | never |
Parameters
| Parameter | Type | Description |
|---|---|---|
plugin | Plugin<Options> | 插件构造函数 |
options? | Options | 插件选项 |
Returns
RxDB
返回 RxDB 实例,支持链式调用
Throws
RxDBPluginDependencyCycleError 加入本插件后依赖图成环
Throws
RxDBPluginAmbiguousDependencyError 某个被注入的插件名有多个候选