跳到主要内容

rxdb-adapter-miniprogram

实验性的微信 / 抖音 / 支付宝小程序单连接 RxDB adapter。它复用 rxdb-adapter-sqlite-core 的仓库、事务、迁移和变更事件, 用平台的 WASM 入口(WXWebAssembly / TTWebAssembly / 支付宝逻辑层的 WebAssembly)加载同步版 wa-sqlite,并把数据库文件写入平台用户目录 (wx.env.USER_DATA_PATH / tt.getEnvInfoSync().common.USER_DATA_PATH / my.env.USER_DATA_PATH)。

约束​

  • 只支持微信、抖音与支付宝小程序的逻辑层,不是通用“小程序”适配器。抖音与支付宝都只在开发者工具与 iOS 真机上验证过, Android 真机未验证;支付宝还依赖未文档化能力(见「支付宝」)。百度、QQ 不支持。
  • 只支持同步 wa-sqlite.wasm、单 JavaScript realm、单数据库连接。
  • VFS 使用 rollback journal,明确不支持 WAL、Worker、SharedWorker、跨页面并发连接。
  • VFS 会把整个数据库文件缓冲在内存中,当前只适合约 10 MB 内的兼容性验证。
  • 三个平台的文件 API 都没有提供 SQLite 所需的可靠 fsync、文件锁和原子重命名语义,本包不承诺崩溃恢复安全。
  • 内存缓冲与平台配额是两回事。抖音用户目录总共约 10 MB(iOS 实测一次最多写入 9 MiB),库文件、-journal 与回滚余量共用;写满时事务以 SQLITE_FULL 失败,已提交的数据重开仍在(见「宿主契约」)。

使用​

wa-sqlite 的 Emscripten glue 与 wasm 二进制都取自 @subframe7536/sqlite-wasm, 本包把它列为精确版本依赖:glue 只经 ./dist/* 暴露、文件名带内容哈希,用 ^ 放宽会让 loadSubframeModuleFactory() 指向不存在的文件。

当前锁在 1.3.1。1.4.0 的 glue 把 _sqlite3_version 改成读 wasm 导出的 Global,而 iOS 微信的 WXWebAssembly 不导出 Global,真机初始化即报 undefined is not an object;开发者工具模拟器用的是标准 WebAssembly,测不出来。 升级前先过 src/__tests__/subframe-glue-exported-globals.spec.ts:glue 里出现读导出 Global 的代码就红。

宿主应用只需把 wasm 复制进小程序代码包,glue 由 loadSubframeModuleFactory() 自行定位:

@subframe7536/sqlite-wasm/wasm → 代码包内 wa-sqlite/wa-sqlite.wasm

源子路径导出为 SUBFRAME_WASM_SUBPATH,代码包内的目标路径导出为 DEFAULT_WASM_PATH。 glue 与 wasm 是一对,跨构建混用会 LinkError。Taro(Vite)项目不用手抄构建配置,装 @aiao/rxdb-taro 即可(见打包器注意事项)。

async function createDatabase() {
const runtime = await import('@aiao/rxdb-adapter-miniprogram/runtime');
await runtime.prepareMiniProgramRuntime(wx);

const [rxdbPackage, adapterPackage] = await Promise.all([
import('@aiao/rxdb'),
import('@aiao/rxdb-adapter-miniprogram')
]);
const moduleFactory = await adapterPackage.loadSubframeModuleFactory();
const database = new rxdbPackage.RxDB({
dbName: 'todo',
entities: [Todo],
multiInstance: false,
sync: `{ local: { adapter: adapterPackage.ADAPTER_NAME }, type: rxdbPackage.SyncType.None }`
});

database.adapter(
adapterPackage.ADAPTER_NAME,
db =>
new adapterPackage.RxDBAdapterWaSqliteMiniProgram(db, {
moduleFactory,
wasmPath: adapterPackage.DEFAULT_WASM_PATH,
wasmRuntime: WXWebAssembly,
wechat: wx
})
);
return database;
}

必须先等待 /runtime 的 prepareMiniProgramRuntime(wx),再加载任何 RxDB、adapter 主入口或 wa-sqlite glue。它会通过 wx.getRandomValues 预取同步安全随机池,并补齐 structuredClone、 TextEncoder、TextDecoder 和 performance.now。 缺少可信随机源、随机池耗尽或微信调用失败时会立即报错,不会降级为非加密随机数。

随机池默认 DEFAULT_MINI_PROGRAM_RANDOM_POOL_SIZE(64 KiB),剩余量跌到四分之一时会在后台 自动补给下一池,因此正常使用不会耗尽;randomPoolSize 可上调到 wx.getRandomValues 的单次 上限 1 MiB。单次 crypto.getRandomValues 请求超过 randomPoolSize 时直接抛 RangeError, 需要调大池子。已发出的字节会立刻从池里擦除。补给失败会在下一次取随机数时重试,连续失败 3 次后 不再重试;若余量用尽时补给仍未成功,抛出的错误会把微信的失败原因挂在 cause 上。

wx.getRandomValues 需要微信基础库 2.15.0 或更高版本。运行时还必须原生提供 BigInt 与 queueMicrotask。 checkMiniProgramRuntimeCapabilities() 可在连接前显示完整能力矩阵和能力来源。

抖音​

抖音没有 wechat 那样的便利形状,一律经 createDouyinMiniProgramHost(tt, options) 注入 host。Taro 项目可以直接用 @aiao/rxdb-taro/runtime 的 taroMiniProgramRuntime() 按构建平台取微信或抖音的 host 与 WASM 运行时;不用 Taro 时这样写:

// 必须写在非严格模式的代码里(如打包产物的入口文件):抖音页面模块里 globalThis 是 undefined,
// 非严格函数的 this 才是真实全局对象
const runtimeGlobal = (function (this: unknown) {
return this;
})() as MiniProgramRuntimeGlobal;

async function createDatabase() {
const runtime = await import('@aiao/rxdb-adapter-miniprogram/runtime');
const host = runtime.createDouyinMiniProgramHost(tt, { runtimeGlobal });
await runtime.prepareMiniProgramHostRuntime(host);

const [rxdbPackage, adapterPackage] = await Promise.all([
import('@aiao/rxdb'),
import('@aiao/rxdb-adapter-miniprogram')
]);
const moduleFactory = await adapterPackage.loadSubframeModuleFactory();
const database = new rxdbPackage.RxDB({/* 同微信 */});

// 只换 host 与 wasmRuntime;wasmPath 不传,走 host.defaultWasmPath
database.adapter(
adapterPackage.ADAPTER_NAME,
db => new adapterPackage.RxDBAdapterWaSqliteMiniProgram(db, { moduleFactory, host, wasmRuntime: TTWebAssembly })
);
return database;
}

抖音 host 固定声明三件事,都来自开发者工具与 iOS 真机实测:

  • fileLayout: { kind: 'chunked', chunkBytes: 65536 }:抖音覆盖写已有文件时,旧文件在写成功前仍计入配额, 整文件落盘会让库上限只剩配额的一半,撞配额后回滚也没空间。
  • defaultWasmPath: '/wa-sqlite/wa-sqlite.wasm':抖音按当前页面目录解析相对路径,只有代码包根的绝对路径 在任意页面都能加载。wasm 照样复制到代码包根的 wa-sqlite/wa-sqlite.wasm。
  • 随机源走 tt.getRandomValues,单次上限同样是 1 MiB,基础库按 2.87.0 起算(该版起文档才写明参数约束)。

runtimeGlobal 只管得到 adapter。打进同一份产物的其他代码照样读自由的 globalThis:sqlite-core 依赖的 comlink 在模块顶层执行 'FinalizationRegistry' in globalThis,所在 chunk 一加载就抛 TypeError;RxDB 核心的选主与 BroadcastChannel 也读它。所以整份产物要在构建期把 globalThis 改指入口取到的真实全局对象,做到这一步后 adapter 读到的 globalThis 就是它,不必再传 runtimeGlobal。Taro(Vite)项目装 @aiao/rxdb-taro, 它在抖音构建里做这一步(入口登记真实全局对象到 rxdb-realm.js,其余 chunk 从那里取);其他打包器照它的做法实现。 两者都拿不到真实全局对象时引导直接报「请经 host.runtimeGlobal 注入」,不会猜。

iOS 抖音没有原生 TextEncoder / TextDecoder,adapter 的 polyfill 要到 prepareMiniProgramHostRuntime 才装。 所以打进产物的代码不能在模块顶层构造编码器,要等第一次用到再建:iOS 真机实测,模块顶层的 new TextEncoder() 让页面加载即报 ReferenceError: Can't find variable: TextEncoder,真机 require 吞掉错误后还会冒出次生的 ... is not a function。@aiao/rxdb、rxdb-adapter-sqlite-core、rxdb-adapter-encrypted、rxdb-plugin-storage、 rxdb-plugin-working-tree 已经全部改成首次使用时创建,各包的 module-load-without-encoding.spec.ts 把住每个发布入口; 业务代码打进同一份产物时守同一条规矩。

支付宝(实验性)​

支付宝依赖四项未文档化能力:逻辑层的标准 WebAssembly、逻辑层的原生 BigInt(模拟器的全局上没有,经 wasm i64 返回值的构造器取回)、Worker 里的 crypto.getRandomValues、找回真实全局对象。 开发者工具与 iOS 真机验证过(US-211 支付宝探针 v7),Android 真机未验证,配额也没撞到过(quota-unobserved), 平台改掉任一项未文档化行为时引导直接报 AlipayUndocumentedCapabilityError,不降级。

代码包要放三样东西。Taro(Vite)项目首选 @aiao/rxdb-taro/vite 的 miniProgramVitePlugins('alipay', appRoot) 发出,它同时负责模拟器里的真实全局对象登记。其他打包器按下表自行拷贝; 仓库里的 esbuild 写法 apps/dev-rxdb-miniprogram-alipay-probe/scripts/build.mjs 只是参考实现,不随任何包发布:

@aiao/rxdb-adapter-miniprogram/alipay-random-worker.js → workers/index.js(预编译 ES5,原样拷贝)
@subframe7536/sqlite-wasm/wasm → wa-sqlite/wa-sqlite.wasm
同一份 wasm 的 base64 文本 → wa-sqlite/wa-sqlite.wasm.base64.txt

app.json 声明 "workers": ["workers/index.js"];mini.project.json 配 "compileOptions": { "transpile": { "script": { "ignore": ["workers/**"] } } },否则 IDE 会给 Worker 换进 跑不起来的 core-js。文本副本是给开发者工具模拟器的:它把代码包文件当 UTF-8 文本读,二进制被改写;wasm 运行时 按锁定版本的指纹先读 .wasm、对不上再读副本,都对不上就抛错。

模拟器逻辑层没有 BigInt,要等 prepareMiniProgramHostRuntime 补上。所以 RxDB 栈(@aiao/rxdb、adapter 主入口、rxjs) 必须留在动态 import() 的 chunk 里,在引导之后才求值:es2018 产物里模块顶层的 BigInt("…") 一求值就抛错。 打包器按引用数把它们拆进页面静态 require 的公共 chunk 时就会出这个问题,Taro 的 manualChunks 正是如此; Taro 示例用 config/lazy-chunk-vite-plugin.ts(demo 自带,不随包发布)把只经动态 import() 可达的模块并进单独的懒加载 chunk。

开发者工具的「真机调试」不用原生引擎,而是用 Boatman(一个 JS 写的 JS 解释器)跑逻辑层。它提升 var 时不看标签语句(label: {…})内部: 这类 var 只有真执行到才登记进函数作用域。没执行到的那次调用里,对同名变量的赋值会写进外层闭包。React 18 的 reconciler 正好踩中(beginWork 在 e:{…} 里 var o,把工厂闭包里的 Symbol.for("react.element") 写成元素对象), 页面渲染时就抛 React #31。预览、体验版与模拟器都是原生引擎,不受影响。Taro 示例用 config/labeled-var-hoist-vite-plugin.ts(demo 自带,不随包发布) 在产物定稿时把这类 var 补声明到函数开头(ES 语义不变),其他应用要在真机调试里跑,同样需要这一步。

Boatman 还有一处偏差:成员赋值 o.x = v 调完 setter 会再调一次 getter,拿 getter 的返回值当赋值表达式的值。 实体类里的关系属性要写 declare parent$: …,不能写成 parent$!: … 字段:降级成 this.parent$ = void 0 后,构造时就会经过 原型上的关系 accessor,Boatman 再去读 getter,这时实体状态还没挂上,报 Target has no entity status。@aiao/rxdb 的系统实体已经按这个写法改好。

async function createDatabase() {
const runtime = await import('@aiao/rxdb-adapter-miniprogram/runtime');
const randomWorker = my.createWorker('workers/index.js', { useExperimentalWorker: true });
// 逻辑层没有 WebAssembly 时读自由变量会抛 ReferenceError,先用 typeof 判
const webAssembly = typeof WebAssembly === 'undefined' ? undefined : WebAssembly;
const host = runtime.createAlipayMiniProgramHost(my, { randomWorker, webAssembly });
// 检查 WebAssembly、补 BigInt 与 queueMicrotask、经 Worker 取随机数
await runtime.prepareMiniProgramHostRuntime(host);

const [rxdbPackage, adapterPackage] = await Promise.all([
import('@aiao/rxdb'),
import('@aiao/rxdb-adapter-miniprogram')
]);
const moduleFactory = await adapterPackage.loadSubframeModuleFactory();
// webAssembly 为 undefined 时上面的引导已报 logic-layer-webassembly 缺失,到不了这里
const wasmRuntime = adapterPackage.createAlipayWasmRuntime(my, webAssembly!);
const database = new rxdbPackage.RxDB({/* 同微信 */});
database.adapter(
adapterPackage.ADAPTER_NAME,
db => new adapterPackage.RxDBAdapterWaSqliteMiniProgram(db, { moduleFactory, host, wasmRuntime })
);
return database;
}

支付宝 host 的固定行为:

  • fileLayout: { kind: 'chunked', chunkBytes: 65536 }:只能整文件读写、单文件上限 10 MiB,整文件落盘会让库大小被单文件上限卡死。
  • 同步 FS 失败时返回错误对象而不抛:host 把它转成抛错,错误码 10022 / 10025 / 10028 归一成 VFS 认得的文案,平台原文挂在 cause 上。
  • 读写一律走 base64,每个用户文件前垫 1 字节帧头(模拟器拒绝任何空写入);所以落盘格式与别的平台不同,平台之间本来就不共享数据目录。
  • 不传 runtimeGlobal 时,环境有 globalThis 就用它(iOS 真机),没有(开发者工具模拟器)就经 Object.prototype 上临时定义的 getter 找出来。

宿主契约​

wechat: wx 是 host: createWechatMiniProgramHost(wx) 的便利形状,二者恰好传一个,都传或都不传 直接报错。 对应的配置类型是 WaSqliteMiniProgramOptions(微信形状,仍是 interface,可被 extends)与 WaSqliteMiniProgramHostOptions,adapter 与客户端接收二者的联合 WaSqliteMiniProgramAdapterOptions。 宿主的 requestRandomValues 每次必须返回新分配的 Uint8Array,交出后不再读写:运行时直接把它 当随机池,逐段发出并原地擦零;复用仍在使用的缓冲区会被识别为违约并拒绝。宿主缺少 requestRandomValues 时引导直接失败。传了 databaseRoot 的配置不再要求宿主提供用户数据目录; 空串目录一律按缺失处理。 MiniProgramHost 把平台相关的部分收成一个注入点:平台 id、同步文件系统、用户数据目录、 安全随机源,以及报错里使用的能力名。运行时引导对应 prepareMiniProgramHostRuntime(host), 文件 VFS 对应 createMiniProgramFileVFS(module, { host, databaseName }), wasm 加载对应 loadWaSqliteMiniProgramModule(options, host)(host 必传,报错用它的 wasmRuntimeName)。 所有宿主共享同一张单连接表,同一数据库文件的第二个连接一律拒绝。

宿主还有四个可选字段,微信都不设,行为与不设时完全一致;抖音 host 设了前三个(见「抖音」),支付宝 host 设了 runtimeGlobal、fileLayout 与 prepareRuntime(见「支付宝」):

字段缺省用途
runtimeGlobal环境里的 globalThis运行时补丁写入、能力预检读取的真实全局对象。环境的 globalThis 不可用(如被页面包装函数遮蔽成 undefined)时由调用方在非严格代码里取到后注入。不是当前 realm 的全局对象时直接报「请经 host.runtimeGlobal 注入」,不回退、不猜;解析逻辑见 resolveMiniProgramRuntimeGlobal(host)
fileLayout{ kind: 'single' }chunked 把逻辑文件 P 存成 P.0、P.1… 定长块,落盘只重写脏块;每个库另占 2×chunkBytes 的回滚余量(<库>.rxdb-reserve),撞配额时让出给回滚,MiniProgramFileVFS.reserveHeld 报告当前是否占着。两种布局互不兼容,声明 chunked 而目录里已有单文件库时直接拒绝,不迁移
defaultWasmPathDEFAULT_WASM_PATH未传 wasmPath 时加载的代码包内路径。相对路径按当前页面目录解析的平台要声明以 / 开头的代码包根路径
prepareRuntime不调用prepareMiniProgramHostRuntime 在平台断言与解析真实全局对象之后、装 polyfill 之前调用,给平台补缺的全局或检测依赖的能力;reject 时引导失败、不申请随机数

getMiniProgramRuntimeSources(runtimeGlobal?) 按同样规则读来源:传了就读它,否则读环境的 globalThis。

用户数据目录写满时,事务以 SQLITE_FULL(13)失败,平台原文经 cause 链透传: RxDBAdapterSqliteError → SQLite 错误 → VFS 错误 → 平台原始错误(errMsg / message)。 单文件布局撞配额后库的状态按「无崩溃恢复」处理。

structuredClone 的 polyfill 只经自由变量引用内置构造函数,不读 self / globalThis, 所以在全局对象被遮蔽的页面模块里克隆类型化数组、包装对象与 Error 同样可用;函数与 symbol 抛 TypeError。

目前登记的平台是 wechat、douyin 与 alipay(MINI_PROGRAM_PLATFORM_IDS)。其他平台 id 在连接前失败,不会回退到 wx: 可行性矩阵判 unsupported 的平台抛 MiniProgramUnsupportedPlatformError(继承 MiniProgramUnknownPlatformError), blockers 与报错文案带出矩阵里的阻断项和判定章节——支付宝 2026-10-04 改判 supported 后这张表为空; 其余抛 MiniProgramUnknownPlatformError。这个契约的存在不代表支持百度或 QQ 小程序; 各平台的可行性结论见 miniprogram-platform-feasibility.md。

打包器注意事项​

glue 是 ESM,内部有 var _scriptName = import.meta.url 和 new URL('wa-sqlite.wasm', import.meta.url)。两处都有麻烦:小程序运行时没有 import.meta, 而后者会被 vite 识别成资产引用,把约 0.7 MB 的 wasm 以 base64 内联进产物(代码包凭空多出约 1 MB)。

这两处分支在显式传 locateFile + instantiateWasm 时永远走不到,所以宿主构建把 glue 里的 import.meta.url 替换成空串即可。Taro(Vite)项目在 config/index.ts 的 plugins 里加一行 '@aiao/rxdb-taro'(微信、抖音),这一步、wasm 发进代码包、抖音的真实全局对象绑定,以及把 Taro 写死的 es6 构建目标抬到 es2020 (Taro 4.3 模板带的 vite 4 在 es6 下改写不了 RxDB 的 BigInt 字面量)都由它完成; 其他 vite 项目用 @aiao/rxdb-taro/vite 的 miniProgramVitePlugins() 自行组装。

本包自身的构建把 @subframe7536/sqlite-wasm 保持在 external,不打进 dist——同理, 一旦打进来 wasm 就会被内联。

FTS5​

@subframe7536/sqlite-wasm 的构建开启了 ENABLE_FTS5,所以小程序侧可以建 FTS5 虚拟表, rxdb_fts_bigram 也随基类一起注册(中文需要它切 bigram,否则整段只成一个 token)。 集成测试 src/__tests__/fts5.integration.spec.ts 用真实 wasm + 微信文件 VFS 覆盖了中英文 MATCH 与断开重连后索引仍在。

两点仍未放行:真机(微信基础库)上的表现尚无实测,@aiao/rxdb-plugin-search 的后端注册表也 仍把 wa-sqlite-miniprogram 标为 unverified。

建表时列名不能与表名相同——FTS5 声明 vtab 时会额外加一列与表同名,撞名即重复列,而它不写 *pzErr,只会报不透明的 vtable constructor failed: <table>。

小程序 wa-sqlite adapter(微信、抖音与支付宝,实验性)。

提供小程序运行 RxDB 所需的全套基础设施:WASM 加载、同步文件 VFS、 运行时 polyfill(TextEncoder/TextDecoder/structuredClone/crypto)、 以及同步回调加固。

Classes​

ClassDescription
AlipayUndocumentedCapabilityError连接时发现支付宝宿主依赖的某项无文档能力不可用。
MiniProgramUnknownPlatformError传入的平台 id 不在 MINI_PROGRAM_PLATFORM_IDS 中。
MiniProgramUnsupportedPlatformError传入的平台 id 被可行性矩阵判为 unsupported。
RxDBAdapterWaSqliteMiniProgram微信小程序单连接 wa-sqlite adapter。
WaSqliteMiniProgramClient小程序专用 wa-sqlite 客户端(宿主由 wechat 或 host 注入)。

Interfaces​

InterfaceDescription
AlipayMiniProgramHostOptionscreateAlipayMiniProgramHost 的参数。
AlipayRandomWorkermy.createWorker('workers/index.js', { useExperimentalWorker: true }) 返回的 Worker;消息是普通对象。
AlipayStandardWasmApi逻辑层的标准 WebAssembly 子集。
DouyinMiniProgramHostOptionscreateDouyinMiniProgramHost 的可选参数。
MiniProgramAlipayApi支付宝宿主需要的全局 my 成员。
MiniProgramAlipayRawFileSystem支付宝同步文件系统的原始形态:每个方法都返回结果对象,失败不抛。
MiniProgramDouyinApiadapter 需要的抖音运行时能力(全局 tt)。
MiniProgramFileSystemManager微信小程序同步文件系统的最小契约。
MiniProgramFileVFS小程序同步文件 VFS 句柄。
MiniProgramFileVFSOptions平台无关的小程序文件 VFS 配置。
MiniProgramHost平台无关的小程序宿主:同步文件、用户数据目录、安全随机源与平台 id。
MiniProgramHostCapabilityNameshost 能力在预检与报错里显示的名称,带平台前缀(如 wx.getFileSystemManager)。
MiniProgramRuntimeCapability小程序运行 RxDB 所需的一项能力。
MiniProgramWasmInstanceWXWebAssembly.instantiate 返回的最小实例结构。
MiniProgramWasmRuntime小程序平台提供的 WASM 运行时(微信 WXWebAssembly、抖音 TTWebAssembly)。
MiniProgramWechatApiadapter 需要的微信运行时能力。
WaSqliteEmscriptenModulewa-sqlite Emscripten 模块中由 adapter 与 VFS 直接使用的字段。
WaSqliteMiniProgramBaseOptions与宿主注入方式无关的 adapter 配置。
WaSqliteMiniProgramHostOptions以平台无关的 MiniProgramHost 注入宿主的 adapter 配置。
WaSqliteMiniProgramOptions微信小程序版 wa-sqlite adapter 配置(微信便利形状)。
WaSqliteModuleFactoryOptions传给小程序版 wa-sqlite glue 的初始化参数。
WechatFileVFSOptions微信文件 VFS 配置。

Type Aliases​

Type AliasDescription
AlipayUndocumentedCapability支付宝宿主依赖的一项无文档能力。
MiniProgramFileLayout数据库文件在宿主文件系统上的存储布局。
MiniProgramHostSelection宿主注入方式:微信便利形状 wechat,或平台无关的 host,二者恰好其一。
MiniProgramPlatformId已登记的小程序平台 id。
MiniProgramRuntimeCapabilityOptions运行时预检需要的配置:模块工厂、WASM 运行时、宿主,以及可选的数据库目录。
MiniProgramRuntimeGlobal运行时补丁写入、能力预检读取的全局对象。
MiniProgramWasmHost加载 wasm 用到的宿主字段。
ReceiveWasmInstanceEmscripten 自定义实例化回调。
WaSqliteMiniProgramAdapterOptionsadapter 与客户端接收的配置:wechat 与 host 二选一。
WaSqliteMiniProgramRepositoryConstructor小程序 adapter 可替换的仓库构造器。
WaSqliteModuleFactorywa-sqlite Emscripten glue 导出的模块工厂,由 loadSubframeModuleFactory() 提供。
WechatFileVFS微信同步文件 VFS 句柄。

Variables​

VariableDescription
ADAPTER_NAMEadapter 名称。
ALIPAY_UNDOCUMENTED_CAPABILITIES支付宝宿主依赖的无文档能力,与矩阵 YAML 里 alipay 的 undocumented 逐项一致(单测核对)。
ALIPAY_WASM_TEXT_COPY_SUFFIX代码包里 wasm 的 base64 文本副本的后缀:wa-sqlite/wa-sqlite.wasm 的副本是 wa-sqlite/wa-sqlite.wasm.base64.txt。
DEFAULT_WASM_PATH默认代码包内 wasm 路径。
MINI_PROGRAM_PLATFORM_IDS已登记的小程序平台 id。
SUBFRAME_WASM_SUBPATH@subframe7536/sqlite-wasm 暴露 wasm 二进制的公共子路径,供打包器复制进代码包。

Functions​

FunctionDescription
assertMiniProgramPlatformId判定平台 id,不需要宿主:已登记的放行,未登记的直接抛错。宿主路径(resolveMiniProgramHost、 运行时预检、VFS)用的是同一个判定,所以报错逐字一致。
assertMiniProgramRuntimeCapabilities缺少硬依赖时在加载 WASM 前给出完整能力清单。
checkMiniProgramRuntimeCapabilities检查小程序逻辑层运行完整 RxDB/wa-sqlite 所需的能力。
createAlipayMiniProgramHost把支付宝全局 my 适配成宿主。
createAlipayWasmRuntime支付宝逻辑层的 wasm 运行时:按 readAlipayCodePackageWasm 取字节,交给标准 WebAssembly.instantiate。
createDouyinMiniProgramHost把抖音全局 tt 适配成 MiniProgramHost。
createMiniProgramFileVFS创建单连接、回滚日志模式的小程序同步文件 VFS。
createWaSqliteMiniProgramClient创建并初始化小程序专用 wa-sqlite 客户端。
createWechatFileVFS创建单连接、回滚日志模式的微信同步文件 VFS;createMiniProgramFileVFS 的微信封装。
createWechatMiniProgramHost把微信全局 wx 适配成 MiniProgramHost。
isMiniProgramPlatformId判断值是否为已登记的平台 id。
loadSubframeModuleFactory载入 @subframe7536/sqlite-wasm 的同步 wa-sqlite 模块工厂。
loadWaSqliteMiniProgramModule使用小程序 WASM 运行时加载同步 wa-sqlite Emscripten 模块。
resolveMiniProgramHost从 { wechat } 或 { host } 解析出唯一的宿主,并校验平台 id。
resolveMiniProgramRuntimeGlobal解析宿主的真实全局对象:host.runtimeGlobal 优先,否则用环境里的 globalThis。

References​

RxDBAdapterWaSqliteMiniprogram​

Renames and re-exports RxDBAdapterWaSqliteMiniProgram


WaSqliteMiniprogramOptions​

Renames and re-exports WaSqliteMiniProgramOptions