examples/live-notes Public
import assert from "node:assert/strict";import { test } from "node:test";import { parseClientMessage } from "../src/protocol.ts";test("parses insert and delete messages", () => { assert.deepEqual(parseClientMessage('{"type":"op","base":3,"op":{"type":"insert","pos":1,"text":"a"}}'), { type: "op", base: 3, op: { type: "insert", pos: 1, text: "a" }, }); assert.deepEqual(parseClientMessage('{"type":"op","base":0,"op":{"type":"delete","pos":0,"count":2}}'), { type: "op", base: 0, op: { type: "delete", pos: 0, count: 2 }, });});test("drops fields it does not know", () => { const msg = parseClientMessage('{"type":"op","base":0,"extra":1,"op":{"type":"insert","pos":0,"text":"a","color":"red"}}'); assert.deepEqual(msg, { type: "op", base: 0, op: { type: "insert", pos: 0, text: "a" } });});test("rejects anything malformed", () => { for (const raw of [ "", "null", "[]", '{"type":"hello"}', '{"type":"op","base":-1,"op":{"type":"insert","pos":0,"text":"a"}}', '{"type":"op","base":0,"op":{"type":"insert","pos":0.5,"text":"a"}}', '{"type":"op","base":0,"op":{"type":"insert","pos":0,"text":5}}', '{"type":"op","base":0,"op":{"type":"delete","pos":0}}', '{"type":"op","base":"1","op":{"type":"delete","pos":0,"count":1}}', ]) { assert.equal(parseClientMessage(raw), null, raw); }});