@elysiumjs/ariadne

中文文档
0.4.1发布于 2026/11/12Apache-2.0TypeScriptES Module近 30 天下载 2809

Elysium.js框架的多步流,有可回放的步骤和服务器侧状态.

此软件包已被标记为弃用

has moved into @elysiumjs/olympus: import from @elysiumjs/olympus/ariadne.

中文使用文档
文档目录4 节
  1. 安装
  2. 宣布一个流
  3. 流动
  4. 存储

@elysiumjs/ariadne (英语)

多步骤流动 极乐世界 应用,例如有密码检查或退票的注册. 一个流的状态会停留在服务器的步数之间,每个步数都会运行一次:重复的步数id重放所存储的答案.

安装

bun add @elysiumjs/ariadne

宣布一个流

一个流是控制器。 每个步骤都是 POST 它的路线,所以 @Http.*() 参数装饰器在任何路线上都一样的一步上工作.

import type { Static } from '@elysiumjs/core';

import { Flow } from '@elysiumjs/ariadne';
import { BadRequestError, Http, t } from '@elysiumjs/core';

type SignUp = { email?: string; attempts: number };

const EmailBody = t.Object({ email: t.String({ format: 'email' }) });
const CodeBody = t.Object({ code: t.String() });

@Flow.controller('sign-up', { ttl: 900, owner: 'guest' })
export class SignUpFlow {
    constructor(
        private readonly codes: CodeService,
        private readonly users: UserService
    ) {}

    @Flow.initial()
    public initial(): SignUp {
        return { attempts: 0 };
    }

    @Flow.step({ next: ['code'], back: ['email'] })
    public async email(
        @Http.body(EmailBody) { email }: Static<typeof EmailBody>,
        @Flow.state() state: SignUp
    ) {
        await this.codes.send(email);
        return Flow.advance({ ...state, email }, { sentTo: email });
    }

    @Flow.step()
    public async code(
        @Http.body(CodeBody) { code }: Static<typeof CodeBody>,
        @Flow.state() state: SignUp
    ) {
        if (!(await this.codes.check(state.email!, code))) {
            const attempts = state.attempts + 1;
            return Flow.refuse({ ...state, attempts }, new BadRequestError('Wrong code.'), {
                end: attempts >= 3
            });
        }
        return { userId: await this.users.create(state.email!) };
    }
}
  • next 列出可能遵循该步骤的步骤,或该步骤所产生的状态的函数。 流量在不给出步骤时会结束,这就是默认.
  • back 列出客户可能从那里再次提交的较早步骤,以及 onRewind(state, ctx) 运行在再次提交的步骤状态.
  • ttl 流动在它的最后一步, 几秒钟后,会活多久。 它可能是从配置中读取它的一个函数,每次一个流量开始或一个步骤被承诺时都称为.
  • start 列出首先接受的步骤,并默认为第一个宣布的步骤. name 命名一个步骤,以取代它的方法.
  • @Flow.initial() 标记第一步之前建立状态的方法。 没有它,国家开始是 {}。 。 。 .
  • @Flow.state() 注入状态,和 @Flow.context() 流动,它的钥匙, 步骤的id和所有者.
  • Flow.advance(state, answer) 向前移动。 一个还原其他东西的步骤会回答它并保持状态.
  • 步骤可能返回 a Result (或一个 AsyncResult:一个经过一次就算它的价值,一个失败的人以其错误拒绝一步,就像返回或抛出 DomainError。 。 。 .
  • Flow.refuse(state, error) 拒绝该步骤但保持其状态,如计数尝试。 与 { end: true },该流量被删除.
  • 扔出一无所犯步骤,客户端可以重试同一步骤的ID.
  • 呈文将维持其步骤 lease 秒(默认为30个)在运行时,步骤运行在商店当时持有的状态上,因此试图让比赛看到对方的拒绝. 重试一个超过租赁期的呈文 将步子再次延伸 所以步子可能更长 lease。 。 。 .

其他选择 @Http.controller() 适用于 @Flow.controller(),以及路由装饰者到 @Flow.step()。 护卫、 速率限制、 拦截器和过滤器像任何控制器一样装饰一流.

流动

import { AriadneModule } from '@elysiumjs/ariadne';
import { RedisFlowStore } from '@elysiumjs/ariadne-redis';
import { Application, Module } from '@elysiumjs/core';

@Module.register({ controllers: [SignUpFlow, ChangeEmailFlow] })
class AccountModule extends Module {}

@Application.register({
    modules: [
        AriadneModule.with({ store: new RedisFlowStore({ connection: () => Redis.connection() }) }),
        AccountModule
    ]
})
class App extends Application {}

下方的流程答案 path,默认为 /flows/{name}数字 :

路线页眉答复
POST /flows/{flow}201 (韩语) { flowKey, owner?, nextSteps, backSteps }
GET /flows/{flow}x-flow-key{ flowKey, step, nextSteps, backSteps, answer }
POST /flows/{flow}/{step}x-flow-key, (中文(简体) ), x-flow-step{ answer, nextSteps, backSteps }
  • x-flow-step 是提交文件的id,客户端选择并再次发送以重试.
  • A 类 guest 属于 owner 符号在起始时响应 。 以后打来电话送来 x-flow-owner 头曰.
  • A 类 user 流程属于已签名的用户,所以其控制器需要一个守护,例如 @Auth() 从他们. user 在模块选项中从上下文读取用户 ID。 默认是 currentUser,哪个 @Auth() 设置:当用户是字符串时,用户本身(没有加载器的会话守护),否则其 id,否则 sub (JWT索赔).

这些路线回答了问题:

  • 410 当流量到期,或已完成;
  • 409作为一步,流动现在不接受(与 nextSteps, (中文(简体) ), backSteps 和最后一个 answer)),在另一条流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流流flow-step-in-progress(三);
  • 403,当调用者不拥有流量,401,对于没有用户的用户流量; 4;
  • 422) 对于一个不符合步子的图谋的身体.
  • 申请400份,不用 x-flow-key 或者说 x-flow-step。 。 。 .

存储

  • MemoryFlowStore,用于测试和单进程应用.
  • RedisFlowStore 联 合 国 @elysiumjs/ariadne-redis他们的主张和承诺是Lua剧本 EVAL厄普斯塔什也运行着.
  • durableFlowStore 联 合 国 @elysiumjs/ariadne-workers云花板工人的活性物质.

成品流使其最后的回放时间可长达10分钟. 然后只有它的主人和结束时间留下, 对于它的TTL, 以便一个迟到的呼叫得知流结束。 自定义存储工具 FlowStore,并可以跟踪 FlowRules 像其他人一样回答.

版本与发布记录

@elysiumjs/ariadne 共发布 15 个版本,首次发布于 2026/11/07;过去 12 个月发布了 15 个版本。

版本发布日期距今
0.4.1latest2026/11/122 天前
0.4.02026/11/112 天前
0.3.32026/11/113 天前
0.3.22026/11/113 天前
0.3.12026/11/103 天前
0.3.02026/11/094 天前

关于 @elysiumjs/ariadne 的常见问题

@elysiumjs/ariadne 是什么?

Elysium.js框架的多步流,有可回放的步骤和服务器侧状态.注意:该包已被作者标记为弃用——has moved into @elysiumjs/olympus: import from @elysiumjs/olympus/ariadne.

如何安装 @elysiumjs/ariadne?

在项目目录运行 npm install @elysiumjs/ariadne,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@elysiumjs/core(^0.24.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@elysiumjs/ariadne 支持 TypeScript 吗?

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

@elysiumjs/ariadne 支持 ESM 还是 CommonJS?

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

@elysiumjs/ariadne 可以商用吗?

@elysiumjs/ariadne 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@elysiumjs/ariadne 的下载量有多少?

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

@elysiumjs/ariadne 还在维护吗?

最新版本 0.4.1 发布于 2026/11/12(2 天前);至今共发布 15 个版本,其中过去 12 个月发布了 15 个;首次发布于 2026/11/07。作者已将其标记为弃用,新项目建议寻找替代方案。