@asterql/sync

中文文档
0.5.0发布于 2026/07/09MITTypeScriptES Module近 30 天下载 1996

Multiplexed scope-subscribed sync client: one connection, server event envelopes, cursor resume.

原始使用文档
文档目录4 节
  1. Install
  2. Usage
  3. Semantics
  4. Server expectations

@asterql/sync

One connection per session for AsterQL state sync: a multiplexed, scope-subscribed WebSocket client speaking the @asterql/view-protocol sync wire vocabulary, with per-scope handlers and cursor resume.

Install

npm install @asterql/sync @asterql/view-protocol

Usage

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();

Semantics

  • One socket, many scopes, many stores. Each subscribe(scope, handler) owns that scope's ingestion: an identity scope can drive cache invalidation while each run scope feeds its own store, all over one connection. Subscriptions are reference-counted per scope.
  • Cursor resume. sub.since comes from the handler's since(); omitted means live-from-now (the server starts at its current head). Reconnects resubscribe every scope from its cursor, so missed envelopes replay from the server's ledger.
  • Gap replay. A handler returning "gap" from onEnvelope triggers a replay request from its cursor; out-of-order events are never applied.
  • Bootstrap handoff. scopeError snapshot_required (cursor beyond the server's replay horizon) calls onSnapshotRequired(); after the caller re-seeds, the client resubscribes from the new cursor.
  • Liveness. Heartbeat ping/pong (two missed pongs recycle the socket) and exponential reconnect backoff.

Server expectations

The host owns the endpoint: authenticate at the upgrade handshake, authorize per scope, persist envelopes in per-scope ledgers with contiguous sequence numbers, replay from sub.since, and emit a seed snapshot as each scope's first ledger entry so replay-from-0 is deterministic. The reference server lives in Fridayland (packages/server/src/sync-socket.ts).

版本与发布记录

@asterql/sync 共发布 4 个版本,首次发布于 2026/06/11;过去 12 个月发布了 4 个版本。

版本发布日期距今
0.5.0latest2026/07/093 个月前
0.4.02026/06/304 个月前
0.3.12026/06/114 个月前
0.3.02026/06/114 个月前

关于 @asterql/sync 的常见问题

@asterql/sync 是什么?

Multiplexed scope-subscribed sync client: one connection, server event envelopes, cursor resume.

如何安装 @asterql/sync?

在项目目录运行 npm install @asterql/sync,或使用 pnpm add / yarn add / bun add。

@asterql/sync 支持 TypeScript 吗?

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

@asterql/sync 支持 ESM 还是 CommonJS?

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

@asterql/sync 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@asterql/sync 可以商用吗?

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

@asterql/sync 的下载量有多少?

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

@asterql/sync 还在维护吗?

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