scrapbox-storage
api/pages/:projectname/:pagetitleをIndexed DBに入れて、即使えるようにしたやつ
https://github.com/takker99/scrapbox-storage
API reference
選択範囲に似ているリンクを入力補完するUserScriptのstorage.tsを分離・改造したもの
用途
選択範囲に似ているリンクを入力補完するUserScriptのソースにつかう
takker-workflow@0.0.1/next-action-viewerのソースに使う
読み込みを待たなくて済む
他にもあったはずなんだけど思い出せない
実装
選択範囲に似ているリンクを入力補完するUserScriptから分離する
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)で調べる
X-serviceworker-cachedを読む
低頻度でapi/projectsを叩いてremoteの更新状況を確認する
手動更新
常にnetwork-firstで取得する
更新周り
cache更新よりnetwork更新を優先する?
✅scrapbox.ioのcacheからtakker99/ScrapBubbleのデータを読み込むと同じ方針にするなら、cacheの読み込みに時間がかかったらnetwork更新を優先することになる
interface
https://github.com/takker99/scrapbox-select-suggestion/blob/0.10.3/storage.ts と同じものにする
load
データ取得
呼び出したprojectsは更新対象に登録される
subscribe
リンクデータ更新で呼び出されるlistenerを登録する
戻り値の函数で解除
checkUpdatecheck
手動更新
formatencode/decode
DB用に圧縮したデータを、object形式でわかりやすく変換する
実装したいこと
api/projectsに任意個数のprojectIdを渡せるようにする
現状だと414 URI Too Longが発生する可能性がある
リアルタイム更新?
ScrapboxのWebSocketから更新を購読する
api/pages/:projectname/:pagetitleも提供したい
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で、一意なキーにしにくい
https://github.com/takker99/scrapbox-storage/pull/64
✅️本番DBに戻す
https://github.com/takker99/scrapbox-storage/pull/63
✅️deno outdatedのGitHub Actionsを入れる
2024-11-29
01:18:30 https://github.com/takker99/scrapbox-storage/pull/65
01:08:55 https://github.com/takker99/scrapbox-storage/pull/64
00:52:56 https://github.com/takker99/scrapbox-storage/pull/63
DB nameを本番用に戻し忘れてた
00:49:28 https://github.com/takker99/scrapbox-storage/pull/62
00:09:09 更新情報がないときはemitChangeしない
00:23:53 実装完了。問題なさげ
2024-11-28
23:46 jsr移行時のデータ構造変更で、バグが有ることがわかった
データ更新周りのバグは少し前に直した
今BroadcastChannelが期待通り働いていないことに気づいた
2024-11-28 23:55:24 messageが別のタブに送信される条件がわからないtakker.icon
chromeだと、タブがinactiveになっているとmessageが送信されない?
windowを並列に開いてもだめそう
00:01:00 適当なサイトで試したらうまく動いた
タブが隠れていても関係ない
Mapなど、複雑なobjectも転送できる
ということは、takker.iconのコード側の問題かtakker.icon
正常にpostMessageされているか確かめよう
00:03:24 単にsubscribeを実行してないだけだった
そりゃ通知されないぜ
2024-08-02
jsrに移行した
2023-09-04
12:36:24 mod.tsからsetDebugModeをexportした
https://github.com/takker99/scrapbox-storage/pull/13
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を別ファイルに分離した
https://github.com/takker99/scrapbox-storage/pull/10
2023-08-15
17:34:33 https://github.com/takker99/scrapbox-storage/pull/4
機能毎にファイルを分けて整理した
自動更新はまだ実装していない
とりあえずここでreleaseしようと思う
2023-08-14
02:03:29 https://github.com/takker99/scrapbox-storage/pull/2
01:41:37 https://github.com/takker99/scrapbox-storage/pull/1
2023-08-13
08:46:48 名前を「scrapbox-links-db」から「scrapbox-storage」に変更
一般名すぎるかな
まあいいや
code: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-14
#2023-08-13 08:46:47
#2023-07-28 14:04:32