# @dotrino/store 中文文档

规范地址：https://npmcn.com/package/%40dotrino/store/

版本：0\.14\.3
npm 元数据更新时间：2026-11-05T08:41:11.093Z
中文译文更新时间：2026-11-13T01:22:07.163Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40dotrino/store
原文对照：https://npmcn.com/package/%40dotrino/store/?lang=original
项目主页：https://github.com/imdotrino/dotrino-store#readme
源码仓库：https://github.com/imdotrino/dotrino-store

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：126 kB，13 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2026-06-18T15:21:50.446Z
- 最新版本发布：2026-11-05T08:41:10.684Z
- 近 30 天下载量：2612（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：18（近 12 个月 18 个）

## 中文简介

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

## 安装

```sh
npm install @dotrino/store
```

也可以使用：`pnpm add @dotrino/store`、`yarn add @dotrino/store`、`bun add @dotrino/store`

## README

# @ dotrino/ 仓库

> **生态生存党 [多春诺](https://dotrino.com/)。 。 。 .** (一) 国家妇女委员会(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.

阿尔马森·康帕蒂多(签名) [多春诺](https://github.com/imdotrino)。 。 。 .

错落相去 [多特里诺身份](https://github.com/imdotrino/dotrino-identity): 未框架的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 密码

```js
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.

```js
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. 中国植物物种信息数据库.

```js
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) `ts`y 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`),用活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活.

```js
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` 《经济、社会、文化权利国际公约》.

## 测试

```bash
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`](https://github.com/imdotrino/dotrino-identity#auto-sync-con-google-drive-080) —— 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.

```js
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 合并。 仅作为附录.

《新出口/进口手册》:

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

## 常见问题

### @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 和提交记录判断。

