跳到主要内容

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​

ParameterTypeDescription
optionsRxDBOptionsRxDB 配置选项

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​

RxDBOptions


context​

Get Signature​

get context(): RxDBContext;

Defined in: packages/rxdb/src/RxDB.ts:463

Returns​

RxDBContext

Set Signature​

set context(context): void;

Defined in: packages/rxdb/src/RxDB.ts:467

Parameters​
ParameterType
contextRxDBContext
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​

LocalRxDBAdapter

本地适配器实例


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​

ParameterTypeDescription
adapterNamestring & object适配器名称
adapterAdapterFactory适配器工厂函数

Returns​

this

返回 RxDB 实例,支持链式调用


adapterConnected$()​

adapterConnected$(adapterName): Observable<boolean>;

Defined in: packages/rxdb/src/RxDB.ts:1188

指定适配器的连接状态流。

Parameters​

ParameterTypeDescription
adapterNamestring适配器名称

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​

ParameterType
typeT
listenerEventListener<RxDBEventMap[T]>

Returns​

void


branchMaterializationSource()​

branchMaterializationSource(source, scope?): this;

Defined in: packages/rxdb/src/RxDB.ts:812

登记 metadata-only 分支的首次物化来源

Parameters​

ParameterTypeDescription
sourceBranchMaterializationSource物化来源,见 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​

ParameterTypeDescription
capabilitystring能力名,与 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​
ParameterTypeDescription
adapterNameK适配器名称
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​
ParameterTypeDescription
adapterNamestring & 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​

ParameterTypeDescription
adapterNamestring & 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​

ParameterType
eventRxDBEvent

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​
ParameterTypeDescription
adapterNameK适配器名称
Returns​

Promise<RxDBAdapters[K]>

返回适配器实例的 Promise

Throws​

当适配器未注册时抛出错误

Call Signature​

getAdapter(adapterName): Promise<IRxDBAdapter>;

Defined in: packages/rxdb/src/RxDB.ts:903

获取适配器实例

Parameters​
ParameterTypeDescription
adapterNamestring & 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​

ParameterTypeDescription
namestring插件的 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​

ParameterTypeDescription
repositoryNamestringRepository 名称

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​

ParameterTypeDefault valueDescription
entitystringundefined实体名,即 @Entity({ name });未注册的名字是无操作,不抛错
namespacestring'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​

ParameterTypeDescription
factoryQueryCacheEngineFactory引擎工厂,见 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​

ParameterTypeDescription
providerQueryCacheOutboxProvider出站队列提供者,见 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​

ParameterType
typeT
listenerEventListener<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​

ParameterTypeDescription
repositoryNamestringRepository 名称
configIRepositoryConfig<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 ParameterDefault type
Optionsnever

Parameters​

ParameterTypeDescription
pluginPlugin<Options>插件构造函数
options?Options插件选项

Returns​

RxDB

返回 RxDB 实例,支持链式调用

Throws​

RxDBPluginDependencyCycleError 加入本插件后依赖图成环

Throws​

RxDBPluginAmbiguousDependencyError 某个被注入的插件名有多个候选