@columenlabs/lumen-person

中文文档
0.1.219发布于 2026/11/09MITTypeScriptES Module零依赖近 30 天下载 1.4万

Lumen的一所商店:一个持久对象,其SQLite为他持有每个应用程序的表格,每个应用程序的迁移失败,每个应用程序共享一个警报,以及备份,恢复和删除每个应用程序或整个应用程序.

中文使用文档
文档目录6 节
  1. 安装
  2. 商店及其模块
  3. 行预算:没有循环可以花开账户的一天
  4. 规则它保持
  5. 备份、恢复、删除
  6. 从老店里搬入一行

@columenlabs/ lumen- person (中文(简体) )

鲁门的一所商店每人:一个持久对象,其SQLite为他持有每个应用程序的桌子. 每个应用程序都是拥有表格的模块(<module>_*),它的迁移和它的醒悟时间,因此应用程序代码保持相隔,而一个人的数据会加入一个SQL查询,一个备份和一个删除. 没有依赖关系:它运行在工人身上 nodejs_compat (计: AsyncLocalStorage)和任何带有 SQLite 存储的持久对象.

安装

bun add @columenlabs/lumen-person

把它固定在与其他卢门软件包相同的准确版本.

商店及其模块

import { DurableObject } from 'cloudflare:workers';
import { PersonObject, type PersonModule, personModule } from '@columenlabs/lumen-person';

const notes: PersonModule<Env> = {
  name: 'notes',
  migrations: [
    'CREATE TABLE notes_items (id INTEGER PRIMARY KEY, title TEXT NOT NULL, at INTEGER NOT NULL)',
  ],
  async call(ctx, method, args) {
    if (method === 'add') {
      ctx.sql.exec('INSERT INTO notes_items (title, at) VALUES (?, ?)', (args as { title: string }).title, Date.now());
      await ctx.wakeAt(Date.now() + 60_000);
      return { ok: true };
    }
    throw new Error(`no ${method}`);
  },
  async wake(ctx) {
    // small steps: stop by ctx.deadline and ask for the next time
  },
};

export class PersonStore extends DurableObject<Env> {
  private readonly person = new PersonObject(this.ctx, { modules: [notes], extra: this.env });
  call(owner: string, module: string, method: string, args?: unknown) {
    return this.person.call(owner, module, method, args);
  }
  alarm() {
    return this.person.alarm();
  }
}

// In the Worker
const mine = personModule(env.PERSON, email, 'notes');
await mine.call('add', { title: 'Buy saw blades' });

第一个叫人的名字,并声称是商店;一个后来的叫人被拒绝(403).

行预算:没有循环可以花开账户的一天

Cloudflare的自由计划允许一个账户5M持久对象行读取,每天写出100k行,横跨每个对象. 无论是过去还是过去,每个对象中每个 SQL 调用到 UTC 00: 00 为止. 每家店都有定界(budget 在其道具中, RowBudget 内 ./budget 对于任何其他物体:

约束默认过吧
一通电话100克行读取,20克写出下个语句; 调用答案 503
一个醒来200克读取,20克写取同样,对于那个钟声
商店的UTC日600克读取,12克写取在协调世界时00:00之前拨打503
background 每天份额0.6 (中文(简体) )醒来等待第二天(持续到头半小时);电话继续工作

数是光标本身的 rowsRead 财务报告和审定财务报表 rowsWritten克劳德弗莱尔的账单. onLimit 每天听到每个关卡一次(警告那里的人). _object.budget 阅读今天的总数和 _object.brake {level: 'background' | 'stop' | 'ok', until?} 从外面设置一个刹车,当整个账户接近其盖子时;在耗尽的一天里,两个都回答。 一个需要不止一个呼叫预算(一个导入,一个重建)的请求,是一小段时间的背景工作,从不一次请求.

规则它保持

  • 每个模块的迁移失败. 每个模块在第一个呼叫或唤醒时迁移,每个步骤在一个交易中. 一个步骤,在再次尝试之前,只扔出503的模块回答一分钟;所有其他模块都继续工作. 绝不编辑或重排已发布的步骤:添加一个.
  • 每个模块都有一个警报. _wakes 保存每个模块的下一次,商店的警报是最早的. 每个醒了 ctx.deadline (30 s) 默认, wakeMs) 顺道过来设定下一次. 一分钟后再试一次 双倍到一小时.
  • 等待是共享的,工作不是. 当一个电话等待网络(一个接取,一个模型) 其他电话运行。 只有同步工作能维持商店,所以要保持沉重的剖析.
  • 电话就位. 代码运行在一个人的商店里, 呼叫同一人通过 personCall 运行而不是新请求.

备份、恢复、删除

商店自己的模块 _object (或 personModule(...).own(method) 一个模块:

方法对
dump每个模块存储的表格(封存值仍被封存),每个模块的迁移级别
dumpModule {module}一个模块的表格
loadModule {module, dump, prefix?}从垃圾堆替换一个模块的表格。 与 prefix,没有它命名的表格(items装入 <module>_items,所以行移动 从一个更古老的商店
load从整个垃圾堆替换每个模块的表格
wipeModule {module}一个模块的表格及其醒悟
wipe删除整个商店( 每个表格、 密钥和提醒)
counts每个表格行、迁移水平和迁移失败的任何模块

从老店里搬入一行

将自己的可持久对象移动到个人商店的应用程序一次一个页面,所以没有步骤将两个商店都拖了很长时间:

  • 旧店的答案 exportRows(sql, table, after): 在划线书签后行, 最多500行, 大约4 MB一页( 至少一行, 所以大块仍然移动), 字节为 {b64}。 。 。 .
  • 模块的"醒"每页写入 importRows(sql, table, page) 内部 ctx.transaction保存书签,要求再次醒来。 行保留了他们的划线符,所以一个页面发送了两次更改什么.
  • 当每张桌子交叉时, rowStats 两侧(每张表格的行数和最高行数)必须在应用程序从新商店读取之前匹配. 停止旧店的提醒, 并在移动时写作 ; 其数据差异的表格会再次出现 .
  • 一个老店,把很多人的行放在一个桌子上, 动动每个人的部分: exportRows(sql, table, after, { where: { sql: 'scope = ?', args: [email] } }) 财务报告和审定财务报表 rowStats(sql, tables, where) 使用相同的过滤器.

及时恢复ctx.storage.getBookmarkForTime)恢复了整个商店,每个模块一次. 取而代之,从垃圾堆中恢复一个模块,并将PITR保留给整个商店.

虚拟表格(一个来自 @columenlabs/lumen-ai是因为 findSql)没有被复制:它们的触发器作为行负载填充,然后重建运行.

版本与发布记录

@columenlabs/lumen-person 共发布 76 个版本,首次发布于 2026/10/28;过去 12 个月发布了 76 个版本。

版本发布日期距今
0.1.219latest2026/11/091 天前
0.1.2182026/11/091 天前
0.1.2172026/11/091 天前
0.1.2162026/11/091 天前
0.1.2152026/11/091 天前
0.1.2142026/11/091 天前

关于 @columenlabs/lumen-person 的常见问题

@columenlabs/lumen-person 是什么?

Lumen的一所商店:一个持久对象,其SQLite为他持有每个应用程序的表格,每个应用程序的迁移失败,每个应用程序共享一个警报,以及备份,恢复和删除每个应用程序或整个应用程序.

如何安装 @columenlabs/lumen-person?

在项目目录运行 npm install @columenlabs/lumen-person,或使用 pnpm add / yarn add / bun add。

@columenlabs/lumen-person 支持 TypeScript 吗?

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

@columenlabs/lumen-person 支持 ESM 还是 CommonJS?

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

@columenlabs/lumen-person 可以商用吗?

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

@columenlabs/lumen-person 的下载量有多少?

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

@columenlabs/lumen-person 还在维护吗?

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