@dotrino/store

中文文档
0.14.3发布于 2026/11/05MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 2612

多特里诺生态基金会(fault iframe + post Message)

中文使用文档
文档目录12 节
  1. 阿尔马塞纳米恩托:索引DB(dede v. 3.0)
  2. Por qué un subdominio discriptione( 分出分出分出分出分出分出分出分出分出分出分出分…
  3. API 密码
  4. Abrir el almacén: el saludo (desde 0.9.0) (英语)
  5. Hilos 独行侠: local.* (德:0.14.1)
  6. 请检查access-date=中的日期值 (帮助) Un almacén por perfil: connect({ …
  7. 韦达河畔雷斯帕多(德克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克…
  8. 加兰蒂亚斯
  9. 部署
  10. 司马
  11. 测试
  12. 自动同步Con Google Drive (0.2.0+) (中文(简体) )

@ dotrino/ 仓库

生态生存党 多春诺。 。 。 . (一) 国家妇女委员会(Dotrino es an ecosistema de plicaciones en la privacidad de los datos: tuya, y s las decisions sobre ella también—— qué comparates, con quién, cuándo y por qué)。 罪恶的Auncios, 罪的饼干, 罪的rastreo de Datos, 罪的vender tu identidad a nadie.

阿尔马森·康帕蒂多(签名) 多春诺。 。 。 .

错落相去 多特里诺身份: 未框架的ocultio servido desde store.dotrino.com (原始内容存档于2018-03-26) (中文(简体) ). mantiene los datos en su propio almacenamiento. Cualquier app del Ecosistema (网络信使, extensión Chrome, futura app móvil PWA) que cargue este iframe en el mismo navegador compate los mismos hilos.

阿尔马塞纳米恩托:索引DB(dede v. 3.0)

保险库的后端 索引数据库 (警卫) localStorage:

  • 配额 según el disco (cientos de MB a GB), en vez del techo de ~5 MB de (英语: localStorage. Desaparece el riesgo de evicción del más viejo al llenarse el buckle compatido del origen. 中国植物物种信息数据库.
  • 跳跃 navigator.storage.persist() - 阿尔马切纳米恩托 持久性/ 无法证实 (最佳成绩).
  • 米格拉西翁自动化 乌纳·索拉·韦兹: si hay datos en el localStorage 中间cc.store.threads.v1), se copian a IndexedDB en el primer arranque. (原始内容存档于2018-09-25).
  • Si IndexedDB no está desponsibility (p. ej. modo privado), cae a (中文(简体) ) localStorage 第2段,第5段.
  • 100%本地:没有要求。 (单位:千美元) 同步 将Google Drive分开
  • getStats() 报告a backend, (中文(简体) ), usage, (中文(简体) ), quota 尔 persisted。 。 。 .

Por qué un subdominio discriptione( 分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出

  • (原始内容存档于2018-09-25) (英语). Los mensajes son volven mucho major que las claves/ contactos. (原始内容存档于2018-10-25) (英语). Mantenerlos fuera del vault de identidad evita saturer se almacenamiento.
  • 红花花 tie(学名:Cada origen tiene su propaia cument.)为uota科花ne属下的一个种. subdominios distintos = ailar 和 sumar 配额.
  • 允许使用 " 犯罪 " (más estable).

API 密码

import { Store } from '@dotrino/store'

const store = await Store.connect()  // singleton — carga el iframe oculto

// El threadKey lo decide la app (típicamente la pubkey del contacto)
await store.appendMessage(contactPubkey, {
  dir: 'out',
  text: 'hola',
  ts: Date.now()
  // id se autogenera si no lo pasas
})

const entries = await store.listThread(contactPubkey, { limit: 50 })

const summaries = await store.getThreadSummaries()
// → { [pubkey]: { lastEntry, count } }   para sidebar de conversaciones

await store.removeThread(contactPubkey)
await store.clearAll()                    // borrar todo el almacén

const stats = await store.getStats()
// → { totalBytes, threadCount, threads: { [k]: { count, bytes } },
//     backend: 'indexeddb', usage, quota, persisted }

Abrir el almacén: el saludo (desde 0.9.0) (英语)

Store.connect() 车 车 车 车 车 车 车 ready. . . . . 索拉韦兹, cargar la página: si se pierde, o si la página tarda más que el tope, quien esperaba se queda sin almacén y la app enseña “没有 se pudo abrir tu almacén'。 卡比奥:

  • 阿尔客户端 预贡, además de escuchar. 米特拉斯·埃斯佩拉·曼达 { _ccs: true, type: 'hello' } 离子笼 helloEveryMs (500ms por fecto) y la página 比赛a ready关闭 ready (原始内容存档于2018-09-26). perdido deja de ser definitivo.
  • (原始内容存档于2018-09-26) (英语). Abrir tine su propio tope数字 : connectTimeoutMs (20 s), 离岸线timeoutMs, 8 s). Abrir es cargar una página por la red; una petición no. 中国植物物种信息数据库.
  • 不,不,不,不,不,不,不. Hasta 0.8.0 la prioesa rechazada se quedaba carbetada en el singleton, as que cualquier retento-el botón “Reintentar' que enseñan las apps- devolvía el mismo polison intentar nada. 互联网档案馆的存檔,存档日期2013-12-02. 阿霍拉·法尔托·德蒙塔·法尔特(签名) connect() {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}请说一下.
  • El 错误骰子 qué pasó数字 : Store did not respond within 20000ms (https://store.dotrino.com/ never loaded)。 。 。 .

Hilos 独行侠: local.* (德:0.14.1)

无名小卒 local. se guarda igual que cualquier otro (IndexedDB, 阿塔多语) a perfil), pero (中文(简体) ) 没有bóveda: ne se sube, ne se baja, ni deja nada pendente en el punto (英语: (原始内容存档于2018-10-12). del respaldo. es para lo que cambia mucho y no perce respaldo: dónde quedó tu personaje en un 互联网档案馆的存檔,存档日期2013-12-02 juego, un s光标, un borrador de segundos 。 。 。 Cada escritura de unhilo 正常销售 a la bóveda 1,5 s (原始内容存档于2013-10-12). después; con la posición de un juego eso es una sincronización tras cada paso.

import { Store, LOCAL_PREFIX } from '@dotrino/store'   // LOCAL_PREFIX === 'local.'
await store.appendMessage('local.gridgame.position', { id: 'pos', ts: Date.now(), pos })

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}哦! {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}哦 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}嘿! {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}嘿.

请检查access-date=中的日期值 (帮助) Un almacén por perfil: connect({ identity }) (减:0.1.0)

密码 identity (减) @dotrino/identity(原始内容存档于2013-10-12). el almacén se ata al perfil 动作cada perfil del aparato tyne sus propios hilos, y si el perfil está emparejado con una bóveda, el almacén se respalda en ella. 中国植物物种信息数据库.

const store = await Store.connect({ identity })
store.profileId   // 'p2419686e' — o null si se conectó sin identidad
  • Llegar 阻止你 没有deja罪过. 阿尔马塞恩 as un singleton por página, y la moneda de <dotrino-support> 树干 罪恶 (原始内容存档于2013-10-12). identidad al monts para contar la apertura; slele legar antes que la app. hasta 0.9.0, la app que después pedía (英语: connect({ identity }) {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}再犯 罪过 罪过 罪过 罪过, 辛宁错误(原始内容存档于2018-09-26). al espacio común de todos los perfiles del aparato. 阿霍拉·阿尔马肯·阿比耶托 收养a (原始内容存档于2018-10-21). la identidad antes devolverse.
  • Otro perfil se rechaza. 中国植物物种信息数据库. I el almacén ya está atado a unfil and lega una identidad de otro, (法语: i el almacén ya está atado atado a un fil and lega una identidad de otro, connect 朗萨康 code: 'store-identity-mismatch'。 。 。 .
  • 罪恶无所事事. 连连带裤都没有, connect 朗萨康 code: 'store-no-profile'. Antes se caía al espacio por defecto en silencio. 中国植物物种信息数据库.

韦达河畔雷斯帕多(德克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克

埃斯帕雷哈多·科多斯(签名)dotrino-vault ^ 0.115.0),又作"克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克 哈斯塔·0.1.0 阿尔马肯·曼达巴 待办事宜 en unmensaje, el proxio corta los mensajes en 1 MB, y pasado es tamaño el respaldo dejaba de legar con el error tragado en un catch 瓦西奥 阿罗拉:

  • 给纳维加多的Siempre做笔记. 回答 " 立即 " 和 " 罪状 " 无埃斯佩拉 一个bóveda.
  • (原始内容存档于2019-10-21). Lo escrito sube por detrás,以 tandas de menos de 1 MB 为标准。 没有潜入,克达 en pending 继续.
  • (原始内容存档于2013-10-10). Ponesse al día comparara una huella por hilo i 单曲 trabaja los que dideren: baja el índice (id y) tsy pide únicamente las entradas que faltan en cada lado. 中国植物物种信息数据库. (原始内容存档于2018-03-25) (英语). Al volver a la spemaña (tras un minuto) y Cada 5 minutos con la spemaña a la vista.
  • 洛斯·波拉多斯·德让·拉皮达{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}因为我们没有被打倒 拉皮达警卫队 ts de lo borrado: una edición afterior sí entra. 中国植物物种信息数据库. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我叫奥维达 180分.
  • Nada vija 飞地数字 : identity.vaultStore (原始内容存档于2018-06-21) (英语). cifra con la clave de contenido del perfily, si el aparato aún no la tinne, falla con no-content-key (单位:千美元)@dotrino/identity • 0.91.0) (中文(简体) ).
  • (原始内容存档于2018-09-21) (英语). Las reglas viven en un solo sitio数字 : store/core.js (出口 @dotrino/store/core),用活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活.
const store = await Store.connect({ identity, maxPerThread: 50000 })

store.vault
// → { state: 'off' | 'syncing' | 'synced' | 'error',
//     reason: 'no-identity' | 'not-paired' | 'revoked' | null,
//     error: { code, message } | null,   // no-content-key · vault-no-reply · vault-outdated …
//     lastSyncAt, pending, tooLarge }
store.vaultBacked          // true si está al día y sin nada pendiente

store.on('vault', (s) => { if (s.state === 'synced' && s.changed.length) recargar(s.changed) })
await store.vaultSync()    // «Sincronizar ahora»: lanza con `code` si no se pudo

maxPerThread 阴道 connect y no después: se aplica (法语) 蚂蚁 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}"无所事事".

Límites que se saben : (原始内容存档于2013-10-12)

  • (原始内容存档于2018-06-25) (英语). Una entrada de más de ~550 KB no Cabe por el proxio ni sola: no se respalda and aparace en tooLarge。 。 。 .
  • (原始内容存档于2018-09-25). Unparato apagado más de 180 días puede resucitar lo que se borró mientras tanto.
  • importThreads(..., 'replace') 没有 " lapidas de lo que desaparece " .
  • 乌纳·雷斯克瑞图拉·康埃尔 错误 ts y otro contenido no cambia la huella: reescribir tiene que subir (英语) ts (单位:千美元)appendMessage 罪恶 ts 卢蓬独奏.

加兰蒂亚斯

  • 每条线盖:1000名叛逃者,可配置的俘虏 setMaxPerThread(n) 欧 connect({ maxPerThread }) (哈斯达50000). (原始内容存档于2018-10-21) (英语). El más antiguo se descarta al añadir uno nuevo si pasa el cap.
  • 排出全球时间 QuotaExceededError(原始内容存档于2013-10-12). : solo como red de seguridad (con indexedDB es prácticamente inalcanzable). Descarta el 20% más antiguo a través de todos los hilos y retenta hasta 8 ves. 中国植物物种信息数据库.
  • 不准出售:dunica se hace取来,没有干草服务,没有干草分析(salvo el synce occional a tu Drive, off por fecto).

部署

GitHub 动作 dapliega a store.dotrino.com (原始内容存档于2017-03-26) (英语). cuando cambia algo en store/El bund del iframe es estático (HTML + JS, 积罪).

司马

索引数据库 cc-store — 对象存储 kv 关键 threads.v1数字 :

value: JSON { [threadKey: string]: ThreadEntry[] }

Por perfil, las claves levan su id: 猪笼草: threads.<perfil>.v1, (中文(简体) ), opens.<perfil>.v1 尔 tombs.<perfil>.v1 (拉皮达斯: { [threadKey]: { [id]: [ts, at] } }) (中文(简体) ).

商店;独家商店 id 尔 ts 《经济、社会、文化权利国际公约》.

测试

npm install
npm test        # Playwright: sirve el vault y ejercita los handlers vía postMessage
                # (IndexedDB real: append/list/dedup, persistencia, migración, stats…)

自动同步Con Google Drive (0.2.0+) (中文(简体) )

备份 cifrado y 同步 多处置器 de los hilos contra appDataFolder de Google Drive (英语). 模拟和API que @dotrino/identity —— los mensajes se cifran con AES-256-GCM (clave extractionada por PBKDF2 600,000 irer de la passext) antes de subirse, así que Google solo ve bytes opacos.

await store.syncConnect(clientId)              // OAuth popup (scope: drive.appdata)
await store.syncUnlock('mi-passphrase')        // ≥12 chars
store.onSync(ev => console.log(ev.status))    // syncing | synced | offline | conflict | error
await store.syncNow()                          // forzar pull+push

合并: 乌尼翁·波尔 id最后的写作家 por ts,奥尔德纳升起, plica maxPerThread después del 合并。 仅作为附录.

《新出口/进口手册》:

const { threads } = await store.exportThreads()
await store.importThreads(threads, 'merge')   // o 'replace'

版本与发布记录

@dotrino/store 共发布 18 个版本,首次发布于 2026/06/18;过去 12 个月发布了 18 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.14.3latest2026/11/058 天前
0.14.22026/11/058 天前
0.14.12026/11/058 天前
0.13.02026/10/2816 天前
0.12.42026/10/1727 天前
0.12.32026/10/091 个月前

关于 @dotrino/store 的常见问题

@dotrino/store 是什么?

多特里诺生态基金会(fault iframe + post Message)

如何安装 @dotrino/store?

在项目目录运行 npm install @dotrino/store,或使用 pnpm add / yarn add / bun add。

@dotrino/store 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dotrino/store 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@dotrino/store 可以商用吗?

@dotrino/store 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dotrino/store 的下载量有多少?

根据 npm 官方下载统计,@dotrino/store 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,612 次,日均约 87 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dotrino/store 还在维护吗?

最新版本 0.14.3 发布于 2026/11/05(8 天前);至今共发布 18 个版本,其中过去 12 个月发布了 18 个;首次发布于 2026/06/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。