Y 电子
A 类 对 提供者 可以使用YJS、ElectricSQL和Postgres进行实时协作文档编辑。 它支持 意识 并可用于任意 Yjs 数据库 供养者. 见一个完整的例子 这里。 。 。 .
如何运作
使用Yjs和Electric同步共享文档的典型流程如下:
- 开发者将显示形状代理 授权 形状请求
- 客户定义 a 形状 用于同步更改 a Y. 医生
- 开发者会曝光用于处理 Yjs 更新的 [写 API] (# 手写)
- 来啊! Y- Electric 自动在所有连接客户端共享更新
关键特性
基本设置
import * as Y from 'yjs'
import {
ElectricProvider,
LocalStorageResumeStateProvider,
} from '@electric-sql/y-electric'
import { Awareness } from 'y-protocols/awareness'
import { parseToDecoder } from '@electric-sql/y-electric/utils'
const ydoc = new Y.Doc()
const awareness = new Awareness(ydoc)
const resumeStateProvider = new LocalStorageResumeStateProvider('my-doc')
const provider = new ElectricProvider({
doc: ydoc,
documentUpdates: {
shape: {
url: SHAPE_PROXY_URL,
params: {
table: `ydoc_update`,
where: `room = '${room}'`,
},
parser: parseToDecoder,
},
sendUrl: DOC_UPDATES_SEND_URL,
getUpdateFromRow: (row) => row.op,
},
awarenessUpdates: {
shape: {
url: SHAPE_PROXY_URL,
params: {
table: `ydoc_awareness`,
where: `room = '${room}'`,
},
parser: parseToDecoder,
},
sendUrl: AWARENESS_UPDATES_SEND_URL,
protocol: awareness,
getUpdateFromRow: (row) => row.op,
},
resumeState: resumeStateProvider.load(),
})
// Subscribe to resume state changes to persist them
resumeStateProvider.subscribeToResumeState(provider)
处理写入
ElectricSQL是一个读取路径同步引擎. 这意味着您会带回您自己的 API 来处理文件和认知更新 。 查看我们的服务器样本执行 这里很简单!
文件更新
Y-Electric 发送 YJS 文档作为二进制数据更新. 您可以直接将请求的正文保存为字节列入数据库.
-- Schema definition
CREATE TABLE ydoc_updates(
id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
room text NOT NULL,
op bytea NOT NULL
)
-- Save updates into individual rows
INSERT INTO ydoc_updates (room, op) VALUES ($1, $2)`
最新认识
意识协议执行为每个cliendId单独行保存向量时钟:
以下是ydoc 认知的示例性计划定义:
-- Schema definitions
CREATE TABLE ydoc_awareness(
client_id TEXT,
room TEXT,
op BYTEA NOT NULL,
updated TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (client_id, room)
);
-- Save
INSERT INTO ydoc_awareness (room, client_id, op, updated) VALUES ($1, $2, $3, now())
ON CONFLICT (client_id, room) DO UPDATE SET op = $3, updated = now()
建议您可以使用数据库触发器来收集旧客户行, 因为提供者无法在客户端消失时进行可靠性检测:
CREATE OR REPLACE FUNCTION gc_awareness_timeouts()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM ydoc_awareness
WHERE updated < (CURRENT_TIMESTAMP - INTERVAL '30 seconds') AND room = NEW.room;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER gc_awareness_timeouts_trigger
AFTER INSERT OR UPDATE ON ydoc_awareness
FOR EACH ROW
EXECUTE FUNCTION gc_awareness_timeouts();
客户端中的 Schema 映射
在客户端,你需要通过一个 getUpdateFromRow 用更新二进制提取列。 这使得Y-Electric能够与任何后端的策略合作.
储存供应商
Y-电动工程与现有 数据库提供者 以本地存储文档。 在本地保存文档时,我们建议提供 ElectricResumeStateProvider 以保存文档的恢复点,否则整个文档将在新的客户端会话开始后重新发送.