Тот же контракт через WebSocket
Запуск fastdoc-cli с loopback WebSocket, порядок подключения с token, минимальный клиентский цикл и отличия от JSONL.
WebSocket удобен, если shell уже асинхронный и работает на Web-технологиях. Rust сам выбирает свободный loopback-порт и печатает одноразовый bootstrap с token.
cd ~/Desktop/A4-API-first-runnode a4-websocket-demo.mjsПорядок подключения
Заголовок раздела «Порядок подключения»Запустите fastdoc-cli serve –ws 0 как дочерний процесс.
Прочитайте первую строку stdout: host, port, token и schema.
Подключитесь к ws://127.0.0.1:<port>/?token=<token>.
Дождитесь session bootstrap fastdoc.session-serve.v1.
Отправляйте те же JSON-объекты, что и в JSONL.
При закрытии приложения сначала отправьте shutdown, затем закройте сокет и дочерний процесс.
Фактический результат
Заголовок раздела «Фактический результат»1. WebSocket: ws://127.0.0.1:526012. Session protocol: fastdoc.session-serve.v13. Ping: true4. Before: This is a sample word document. It has two pages, but no headers or footers.5. After: WS API DEMO: This is a sample word document. It has two pages, but no headers or footers.6. Saved: /Users/tester/Desktop/A4-API-first-run/api-demo-websocket-result.docx7. Reopened from disk: WS API DEMO: This is a sample word document. It has two pages, but no headers or footers.RESULT: PASSМинимальный клиентский цикл
Заголовок раздела «Минимальный клиентский цикл»const child = spawn(cli, ["serve", "--ws", "0"]);const bootstrap = JSON.parse(await firstLine(child.stdout));const ws = new WebSocket( `ws://${bootstrap.host}:${bootstrap.port}/?token=${bootstrap.token}`);ws.send(JSON.stringify({ id: "p1", cmd: "ping" }));ШАГ 5