@cosense/std/websocketにclassを導入する
目的
余計なタイムラグとseverへの負荷が起こる
初回のGETで取得したpageIdなどを保持したまま、連続で書き込める仕組みを作りたい
イメージ
code:ts
import { isErr, unwrapOk } from "npm:option-t@52/plain_result";
const res = await join(project, title, { sid });
if (isErr(res)) throw res;
{
using page = unwrapOk(res);
await page.insertLine("hoge", 2);
await page.patch((prev) => ...); await page.pin();
console.log(page.lines); // 常に最新のlinesが返ってくる
const off = page.on("lines:changed", function () {
console.log(this.lines); // this === page
});
off(); // unsubscribe
page.on("cursor:moved", console.log);
await page.delete();
// 削除されたらどのmethodも使えなくする
} // 自動的にwebsokectをdisconnectする
リンクの更新なども追跡できるようにするために、2段構えにしてみるか?
code:ts
await using client: CosenseClient = await connect(project, { sid });
// scrapbox.Project.pages と同等のものを返す
// その時点で読み込めたpagesを格納している
console.log(clinet.pages);
{
await using page = client.joinPage(title);
// 各編集操作はawaitしなくてもいい
page.insertLine!("hoge", 2); // ページが削除されるとundefinedになる
// すべての編集操作がpushされるまで待つ
await page.ready;
page.insertLine!("hoge", 3);
page.patch!((prev) => ...); page.pin!();
// 未保存のcommitsの数を取得
console.log(saving ${page.uncommitCount} changes...);
// 保存の進捗を取得する
for await (const i of page.progress) {
// i === 1になったら、それをyieldしてからbreakする
console.log(saving ${i} changes...);
}
console.log(page.lines); // 常に最新のlinesが返ってくる
const off = page.on("lines:changed", function () {
// 行の変更commitがthis.linesに適用されてからcallbackが呼ばれる
console.log(this.lines); // this === page
});
off(); // unsubscribe
page.on("cursor:moved", console.log);
// async iteratorも提供する
for await (const caret of page.on("cursor:moved")) {
console.log(caret);
}
// 未保存の編集を破棄する
page.discardCommits();
// 新しいページに移動したら、その前のpageは自動的にdisposeされる
// 未保存の編集が保存されるのを待ってからdisposeされる
await using page2 = client.joinPage(title2);
await page2.delete();
// ページが削除されたら自動でdisposeする
// このときpage,page2のlistenersはすべてunsubscribeされる
// leave room
}
// リンクの更新のみ、rootで検知する
const off = client.on("links:changed", (links) => {
// ...
});
// 今接続しているroomを返す
// listかpage
const room = client.room;
{
// streamの実装は複雑なので後回し
using stream = client.joinStream();
stream.on()
}
{
// ページが削除されたときも、自動でlistに切り替える
using list = client.joinList();
}
// websocketの接続を閉じる
実装
unstable-websocket/ directoryを新たに作り、その中で実装する
/unstable-websocketとしてexport
まずは型定義だけ作って、API設計を練る