Token state storage contract (async repository port), shared value objects and the in-memory adapter for moon-token
| 包 | 装什么 |
|---|---|
| port | TokenStore(async trait)、PermissionProvider、意图补丁 FamilyPatch、键位 KeySpace、值对象(Duration / Device / SessionStatus / ConcurrentPolicy / RenewalMode / MatchMode)、错误词汇表 TokenError、六种记录的线格式编解码 |
| memory | MemoryStore——v1 唯一交付的后端(惰性过期两档、族清扫、sweep) |
| — | 时钟槽 set_clock / now_ms(可注入,时效类用例靠它) |
moon add mldong/moon-token # 核心已依赖本包,通常无需单独加
# 只想要契约/内存适配器(例如你在写自己的应用层)时:
moon add mldong/moon-token-storefn store() -> @mem.MemoryStore {
@mem.MemoryStore::new("user")
}
async fn put_and_read() -> String? raise {
let s = store()
let record = @port.SessionRecord::make("u1", @port.Device::of("pc"), 1000L, 9_000L)
s.set("user:T:tok-1", record.encode(), 9_000L)
match s.get("user:T:tok-1") {
None => None
Some(payload) => (@port.SessionRecord::decode(payload)).map(r => r.login_id)
}
}
async test "写入的会话记录能原样解回来" {
assert_eq(put_and_read(), Some("u1"))
}pub(open) trait TokenStore {
async fn get(Self, String) -> String? raise TokenError
async fn set(Self, String, String, Int64) -> Unit raise TokenError
async fn del(Self, Array[String]) -> Unit raise TokenError
async fn get_and_del(Self, String) -> String? raise TokenError
async fn apply(Self, FamilyPatch) -> Unit raise TokenError
async fn sweep(Self, Int64) -> Int raise TokenError
}{realm}:T:{token} 会话记录 线格式 v=1:k=v|k=v,键与值都转义
{realm}:A:{login_id} 反查族 成员各自是编码后的记录,';' 连接,带 version
{realm}:R:{refresh} refresh 绑定 login_id + device + 绑定的 access
{realm}:S:{login_id} 账号会话 跨该账号所有 token 共享的属性表
{realm}:D:{login_id} 封禁 until + reasontest "线格式扛得住分隔符、等号与中文" {
let payload = @port.encode_record([("login", "张三|带竖线"), ("reason", "a=b&c;d")])
match @port.decode_record(payload) {
None => fail("往返失败")
Some(fields) => {
assert_eq(fields["login"], "张三|带竖线")
assert_eq(fields["reason"], "a=b&c;d")
}
}
}test "注入即生效,还原即回真" {
let cell = 1_000L
@port.set_clock(Some(fn() { cell }))
assert_eq(@port.now_ms(), 1000L)
@port.set_clock(None)
assert_true(@port.now_ms() > 1_700_000_000_000L)
}Install
Download zipToken state storage contract (async repository port), shared value objects and the in-memory adapter for moon-token