generated at
scrapbox-storage
api/pages/:projectname/:pagetitleIndexed DBに入れて、即使えるようにしたやつ
選択範囲に似ているリンクを入力補完するUserScript storage.ts を分離・改造したもの

用途
読み込みを待たなくて済む
他にもあったはずなんだけど思い出せない

実装
DB構造は変えない
リンク数とかの統計は消す。結局使わなかった
各ページのリンク一覧を入れようかは検討中
データサイズが増えるので、多分入れない
入れるもの
title
空ページの場合、どのタイトルを採用するかはscrapbox.ioに準拠する
hasIcon
updated
updated < 0 で空ページを表す
linksLc
まあいれてもいいか
入れないもの
titleLc
このscriptではリンクの同一性確認が不要
もし必要なら、このscriptを使用する側で作成する
機能
データ読み込み
networkからは更新しない
もしcacheにより新しいデータがあれば、読み込んでおく
自動更新
指定されたprojectsのリンクを定期的に更新する
間隔
from cache
データ読込時に随時行う
すでに読み込み中なら飛ばす
from network
project更新確認→リンクデータ取得の順
cache firstで更新する
loadごとにCache (DOM)で調べる
低頻度でapi/projectsを叩いてremoteの更新状況を確認する
手動更新
常にnetwork-firstで取得する
更新周り
cache更新よりnetwork更新を優先する?
✅scrapbox.ioのcacheからtakker99/ScrapBubbleのデータを読み込むと同じ方針にするなら、cacheの読み込みに時間がかかったらnetwork更新を優先することになる

interface
load
データ取得
呼び出したprojectsは更新対象に登録される
subscribe
リンクデータ更新で呼び出されるlistenerを登録する
戻り値の函数で解除
checkUpdate check
手動更新
format encode / decode
DB用に圧縮したデータを、object形式でわかりやすく変換する

実装したいこと
api/projectsに任意個数の projectId を渡せるようにする
現状だと414 URI Too Longが発生する可能性がある
リアルタイム更新?
ScrapboxのWebSocketから更新を購読する
Indexed DBはつかわなくていい
responseを合体するなど、linkのような加工が不要なので
都度cacheから読み込むだけで十分
lines:changedを監視してリアルタイム更新させる?
commitId などの更新がむずい
script側で作ったresponseは isTrusted: false を組み込んでおくか
websocket経由でやるには、コードを書くのに時間がかかりそう
intefaces
Pages.load
pageを取得する
loadのタイミング毎にcache APIで問い合わせる
fetchは強制reloadされない限り叩かない
Pages.subscribe
更新される度に呼び出す
更新したら、MessageChannelで他のタブにresponseを直接配信する
各タブは、各タブで load されたpageのresponseのみ取り込む
他は無視する

2024-11-29 やること
✅️ .values() を減らす
✅️/*@__PURE__*/を入れる
✅️api/projects/:projectnameのDBのkeyをproject idにする
project nameはcase insensitiveで、一意なキーにしにくい
✅️本番DBに戻す

2024-11-29
DB nameを本番用に戻し忘れてた
00:09:09 更新情報がないときは emitChange しない
00:23:53 実装完了。問題なさげ
2024-11-28
23:46 jsr移行時のデータ構造変更で、バグが有ることがわかった
データ更新周りのバグは少し前に直した
BroadcastChannelが期待通り働いていないことに気づいた
2024-11-28 23:55:24 messageが別のタブに送信される条件がわからないtakker
chromeだと、タブがinactiveになっているとmessageが送信されない?
windowを並列に開いてもだめそう
00:01:00 適当なサイトで試したらうまく動いた
タブが隠れていても関係ない
Map など、複雑なobjectも転送できる
ということは、takkerのコード側の問題かtakker
正常にpostMessageされているか確かめよう
00:03:24 単に subscribe を実行してないだけだった
そりゃ通知されないぜ

2024-08-02
jsrに移行した
2023-09-04
12:36:24 mod.ts から setDebugMode をexportした
11:40:13 api/pages/:projectname/search/titlesの型定義変更に対応
11:33:18 cacheから読み込む機能も作ろうとしたけど、どうしようかな
api/pages/:projectname/search/titlesが全部読み込まれる前に実行された場合だと、途中でエラーが発生するはず
全部読み込めなかったら更新を中断するようプログラムしたいが……やってる暇あるかな?
コードを見て、すぐできそうか判断しよう
12:00:45 すこしrefactoringはしたけど……すぐにはできなさそうだな
今度にしよう
11:13:05 subscribe を別ファイルに分離した
2023-08-15
機能毎にファイルを分けて整理した
自動更新はまだ実装していない
とりあえずここでreleaseしようと思う
2023-08-14
2023-08-13
08:46:48 名前を「scrapbox-links-db」から「scrapbox-storage」に変更
一般名すぎるかな
まあいいや

mod.ts
export * from "jsr:@takker/cosense-storage@0.1";

#2024-05-24 07:57:53
#2023-09-04 11:40:33
#2023-08-15 17:36:00
#2023-08-13 08:46:47
#2023-07-28 14:04:32