@nxgt / janus-kit
@nxgt/janus 一通电话:
PostgreSQL的用户和权限
@nxgt/janus-drizzle 或者在MongoDB中
@nxgt/janus-mongo,会话和一次性令牌
复述,通过 @nxgt/janus-redis遥测,健康检查
最后。
import { janus, scryptHasher } from '@nxgt/janus';
import { defineModel, permissions } from '@nxgt/janus/permissions';
import { connectKit, defineConfig } from '@nxgt/janus-kit/drizzle';
import { z } from 'zod';
export const kit = await connectKit(
defineConfig({
postgres: { url: process.env.JANUS_DATABASE_URL! }, // Janus's own database
redis: { url: process.env.REDIS_URL! }, // optional: sessions and tokens
telemetry: true, // optional: @nxgt/janus-telemetry
auth: (adapters) =>
janus({
user: z.object({ email: z.email(), name: z.string() }),
password: { login: 'email' },
hasher: scryptHasher(),
...adapters, // { store, relations }
}),
access: ({ relations, auth }) =>
permissions({
model: defineModel({
subjects: auth.types,
types: {
document: {
related: { owners: ['user'], viewers: ['user'] },
permits: { view: ['owners', 'viewers'] },
},
},
}),
store: relations,
}),
}),
);
const current = await kit.auth.authenticate(request); // null when signed out
if (current) await kit.access.can(current.user, 'view', { type: 'document', id: 'd1' });
const health = await kit.ping(); // { ok, postgres, redis } — never throws
await kit.close();
你还在写 janus() 和 permissions(),在两个函数中,所以
它们推断的每个类型都是在你写它们的地方推断出来的: kit.auth.signIn
获取您的登录字段, kit.access.can 你的权限。工具包交给他们
存储,打开和关闭连接,并在启动时检查什么
否则第一次登录就会失败。
0. x。 一个小版本仍然可能改变表面;更新日志告诉我们该怎么做。
安装
bun add @nxgt/janus-kit @nxgt/janus @nxgt/redis zod
bun add @nxgt/janus-drizzle @nxgt/drizzle drizzle-orm # for @nxgt/janus-kit/drizzle
bun add @nxgt/janus-mongo @nxgt/mongo mongodb # for @nxgt/janus-kit/mongo
bun add @nxgt/janus-telemetry @nxgt/telemetry # only for telemetry: true
bun add -d @types/bun # the kit's types name Bun's RedisOptions
所需的对等体,无论子路径:
@nxgt/janus;@nxgt/redis>=0.3.1 <1,zod这是它所需要的,即使有 数据库中的会话:工具包的类型命名其连接;typescript6或7。
同行的 @nxgt/janus-kit/drizzle -可选的 package.json,所以。
另一个子路径上的应用程序不安装它们,但这是必需的
一:
@nxgt/janus-drizzle:您的模式文件导入defineJanusTables从它 要创建表,必须与工具包的store查询相同的定义;@nxgt/drizzle>=0.6.1 <1和drizzle-orm1.0(从1.0.0-rc.4), PostgreSQL。
同行的 @nxgt/janus-kit/mongo,可选方式相同:
@nxgt/janus-mongo:syncMongoAdapter创建集合和 Kit的store必须查询相同的定义;@nxgt/mongo>=0.17.0 <1和mongodb7.
这个 @nxgt/* 在每个CI上测试楼层,而不是声明楼层:在楼层作业中
运行,套件的mongo规格和类型检查运行 @nxgt/mongo 0.17.0,
它的整个套件和类型检查 @nxgt/redis 0.3.1, @nxgt/drizzle 0.6.1
和 @nxgt/telemetry 0.2.1.
@nxgt/janus-telemetry 是否可选对等体,仅在何时加载 telemetry 是
true;它需要 @nxgt/telemetry >=0.2.1 <1 作为自己的同伴。 @nxgt/janus-redis 是一个依赖项:您的代码永远不会导入它。
它继续运行 包子 只有:工具包打开PostgreSQL在Bun的 SQL 和复述,
在包的 RedisClient. 它需要PostgreSQL 15或更高版本,或MongoDB
副本集,以及Redis 7.0或更高版本。就像 @nxgt/janus,它期望 "moduleResolution": "bundler".
子路径
一个工具包,每个数据库一个子路径。 这个包裹有 没有根条目,所以
导入将数据库命名为: import … from '@nxgt/janus-kit' 失败与
TS2307. 复述、遥测 ping 和 close 子路径是相同的吗
你使用。
| 子路径 | 数据库 | 数据库键 | 什么 connectKit 支票 |
|---|---|---|---|
@nxgt/janus-kit/drizzle | PostgreSQL,通过 @nxgt/janus-drizzle | postgres | 雅努斯的五张表是存在的 |
@nxgt/janus-kit/mongo | MongoDB,通过 @nxgt/janus-mongo | mongo | Janus的四个集合及其索引存在;其他任何不同都是警告 |
在MongoDB上,上面的例子只改变了第一行:
import { connectKit, defineConfig } from '@nxgt/janus-kit/mongo';
export const kit = await connectKit(
defineConfig({
mongo: { url: process.env.JANUS_MONGO_URL! }, // mongodb://…/janus — the path names the database
redis: { url: process.env.REDIS_URL! },
auth: (adapters) => janus({ /* … */ ...adapters }),
}),
);
kit.db; // the Db; (await kit.ping()).mongo
API
两个子路径导出相同的名称;它们的不同之处在于数据库键和
什么 db 是多少。
| 出口 | 它是什么? |
|---|---|
defineConfig(config) | 检查配置并回答,冻结。它不连接任何东西,也不读取任何环境变量。怎么扔了一个 TypeError 这里是应用程序开始的地方。 |
connectKit(config) | 再次检查配置,打开数据库和Redis,检查Janus的表或集合,构建 auth 和 access,并回答了问题。失败,并伴有 Error 命名要做什么- a TypeError 对于它无法读取的URL -关闭它打开的内容。 |
Kit | 什么 connectKit 答案: auth; access 当配置; db例如,Drizzle实例或MongoDB Db; redis,连接或 undefined; ping(options?); close();和 [Symbol.asyncDispose]. |
KitConfig, RedisConfig, PostgresConfig 从 /drizzle 或者 MongoConfig 从 /mongo | 配置的类型。 |
Adapters, AccessWiring | 什么 auth 和 access 给出: { store, relations }, { relations, auth }. |
Health, PingResult | 什么 ping 答案: { ok, postgres, redis? } 或者 { ok, mongo, redis? },每个 { ok: true, latencyMs } 或者 { ok: false, error }. |
配置
| 关键 | ||
|---|---|---|
postgres | 上需要 /drizzle | { url } 在Janus数据库中,a postgres:// 或者 postgresql:// URL,工具包打开和关闭它;或 { db }你打开的Drizzle实例 从来没有关闭 靠工具箱。 tables:当表在自己的PostgreSQL模式中时,你的模式文件导出什么。 |
mongo | 上需要 /mongo | { url, clientOptions? } 在Janus数据库中,a mongodb:// 或者 mongodb+srv:// URL,其路径命名工具包打开时使用的数据库 serverSelectionTimeoutMS: 5_000 和关闭;或 { db },一个 Db 你打开, 从来没有关闭 靠工具箱。 |
redis | 可选 | { url, prefix?, clientOptions? },这是工具箱打开的地方 enableOfflineQueue: false 和关闭;或 { connection, prefix? },它永远不会关闭。如果没有,会话和令牌将留在数据库中。 |
telemetry | 可选 | true 包装 auth 与 instrumentJanus 和 access 与 instrumentPermissions. |
auth | 要求 | (adapters) => janus({ …, ...adapters }). |
access | 可选 | ({ relations, auth }) => permissions({ model, store: relations }). 缺席,工具包没有 access, kit.access 不编译。 |
adapters 是 { store, relations }:来自数据库的用户、会话和
当连接时,从Redis中获取令牌,以及关系存储,因此删除用户
删除所有命名它们的元组。 配置指南
有每个钥匙的详细信息。
陷阱
- 雅努斯的表格来自你的迁移。
connectKit检查所有 其中五个已经存在,但拒绝以其他方式开始,并指名道姓。创建它们 drizzle-kit,从defineJanusTables(),因为@nxgt/janus-drizzle的指导 所示。 - 在他们自己的PostgreSQL模式中,pass
postgres.tables. 没有它, 工具包查找,商店查询,users在连接中search_path:public,其中您的应用程序可能有users它的 自己的。 - Janus的收藏来自
syncMongoAdapter,部署步骤。connectKit将它们与@nxgt/janus-mongo的定义,写作 什么都没有。丢失的集合或索引拒绝启动:MongoDB会 在第一次写入时创建一个缺失集合 没有唯一索引 在登录. 一个验证器、一个选项或一个索引的选项只有警告不同 (JANUS_KIT_COLLECTIONS_DRIFTED),因此回滚仍然开始。 kit.auth.collectExpired()答案UNSUPPORTED在/mongo:一个TTL 索引删除失效的会话和令牌。在PostgreSQL上安排它 只有,它删除了这两个。- 路径中没有数据库的MongoDB URL使用
test,司机的。 违约。在URL中命名Janus的数据库:mongodb://…/janus. - 如果MongoDB在5秒后没有回答,则会失败测量的;测量的
装备的
serverSelectionTimeoutMS在美国,司机的工资是30美元。一个请求 在复制集期间,选举可以失败而不是等待;通过clientOptions: { serverSelectionTimeoutMS }等待更长时间。 - Redis在启动时关闭,大约需要31秒才能失败测量:
Bun的客户端重新尝试它的第一个连接。在运行时,工具包
enableOfflineQueue: false使中断立即失败。 - 你交什么,你就交什么。 一、
db或者一个connection从 配置是开放的kit.close(). @nxgt/mongo每个URL共享一个客户端,因为@nxgt/redis下面: 用其他选项连接到Janus的MongoDB URL被拒绝。@nxgt/redis每个URL共享一个客户端。 如果您的应用程序连接 到相同的Redis URL,connectRedis拒绝的 第二。给Janus一个自己的URL,比如另一个数据库号,或者 通过{ connection }.
文档
类型安全,计数
16个貌似合理的错误被编译器拒绝了,每个错误都有一个
@ts-expect-error 箱子:10英寸 test/types/kit.ts在PostgreSQL上,
kit.access在没有配置的工具包上access;- 用户类型
auth没有; - 模型不具备的权限;
- 两个
postgres.url和postgres.db; - 两个
redis.url和redis.connection; redis.clientOptions旁边一个connection已经打开,postgres.schema而不是里面的表格;- 没有的配置
auth; postgres既无url也不db;telemetry作为一个字符串,作为一个环境变量读;
6英寸 test/types/mongo.ts, over MongoDB:
kit.access在没有配置的工具包上access;ping()的postgres在MongoDB工具包上,它回答mongo;- 两个
mongo.url和mongo.db; mongo.clientOptions旁边一个Db其客户端已经打开;- 这个
postgres给MongoDB工具包的关键; mongo既无url也不db.
执照
麻省理工学院