@ asterql/ sync
AsterQL 状态同步每个会话连接一次: 多重轴,
范围订阅的 WebSocket 客户端 @asterql/view-protocol
同步有线词汇,有可穿透的处理器和光标恢复.
安装
npm install @asterql/sync @asterql/view-protocol
使用量
import { SyncClient } from "@asterql/sync";
import { EntityStore } from "@asterql/store";
const client = new SyncClient({
url: "wss://app.example.com/api/sync/socket",
// browser: defaults to globalThis.WebSocket; Node/TUI: pass `ws`
});
const store = new EntityStore();
store.cursors.beginScope("run:run_1", 0);
const unsubscribe = client.subscribe("run:run_1", {
onEnvelope: (envelope) => store.ingest(envelope).result.kind,
since: () => store.cursors.scopeLastSeq("run:run_1"),
onSnapshotRequired: async () => {
// fetch a registered view (Protocol A), seed the store, then
// store.cursors.beginScope("run:run_1", seqFromSnapshot)
},
});
// later
unsubscribe();
语义
- 一个插座,许多瞄准镜,很多商店. 每个
subscribe(scope, handler)拥有该范围摄入: 一个身份范围可以驱动缓存 无效, 而每个运行范围会输入自己的存储, 遍及一个 连接。 订阅按每个范围计算. - 克索尔简历.
sub.since从操作器的since(); 省略 指从现在开始的活(服务器从当前头开始). 重新连接 重新订阅光标中的每个范围, 因此错过信封重放 服务器的分类账. - 差距重放. 处理器返回
"gap"从onEnvelope触发 a 从其光标重放请求; 异常事件从未应用 . - 靴子接头.
scopeError snapshot_required(超过 服务器的再播放视野)调用onSnapshotRequired(); 打电话者之后 重新种子,客户端从新光标重新订阅. - 众生相. 心跳乒乓球(两只错过了套接字循环) 和指数重联后退.
服务器的期望
主机拥有端口:认证在升级握手,
(a) 每一范围的授权,连续封装在可查看分类账中
相接序列号,从 sub.since,发出一粒种子
截图,因为每个范围的第一个分类账条目 所以从-0重播是
决断相. 参考服务器住在周五的地盘
(单位:千美元)packages/server/src/sync-socket.ts) (中文(简体) ).