Rebasely Beta: data may be purged

examples/live-notes Public

TypeScript · 37 lines · 1.3 KiB · at 6e3dc76

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