Тот же контракт через WebSocket
Запуск fastdoc-cli с WebSocket на локальном адресе, порядок подключения с пропуском, минимальный клиентский цикл и отличия от обмена строками JSON.
WebSocket удобен, если оболочка вашего продукта уже асинхронная и построена на веб-технологиях. Ядро само выбирает свободный локальный порт и печатает одну строку с адресом подключения и разовым пропуском.
cd ~/Desktop/A4-API-first-runnode a4-websocket-demo.mjscd $HOME\Desktop\A4-API-first-runnode a4-websocket-demo.mjscd ~/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>, подставив значения из этой строки. - Дождитесь приветствия сеанса со схемой
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}`);await new Promise(resolve => ws.addEventListener("open", resolve, { once: true }));
ws.send(JSON.stringify({ id: "p1", cmd: "ping" }));