三年ぶりにWebRTCをGASでシグナリングで頑張るゾイ2

やあ (´・ω・`) ようこそ、セルフまとめへ。 このテキーラはサービスだから、まず飲んで落ち着いて欲しい。 うん、「また」なんだ。済まない。 仏の顔もって言うしね、謝って許してもらおうとも思っていない。 でも、このまとめタイトルを見たとき、君は、きっと言葉では言い表せない 「ときめき」みたいなものを感じてくれたと思う。 殺伐とした世の中で、そういう気持ちを忘れないで欲しい そう思って(という建前で)、このセルフまとめをまとめたんだ。 続きを読む
2
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

「三年ぶりにWebRTCをGASでシグナリングで頑張るゾイ1」をトゥギャりました。 togetter.com/li/1980924

2022-12-02 02:39:40
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

色んな会社の無料提供シグナリング鯖を使わずGASにこだわるのはGASの利用に必要なGoogleアカウントが 1000円で買えるジャンクスマホで完全匿名で入手可能という点やね。SMS認証を噛ましてくる連中やFLOSSで鯖まで公開してないSDKなどはP2Pの特性を全部欲しいマンとしてはアカンよ。

2022-12-02 02:47:05
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

極端な話をすると別にシグナリングは何でも良いのでhttp鯖を何処かに立てられさえすればいい。 ただ、自分はドメイン取ってまで鯖の世話をしたくないしというね。 まあGASに最適化されてるソースは有るので、nodeでポチッとカジュアルに経てた鯖に対応は出来るようにはしたい。

2022-12-02 02:50:59
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

どこぞの誰かがやっていたようにQRコードでシグナリング出来るのが簡単と言えばそう。 でも毎回はやっぱり無理で、何処かに24時間365日口を開けてる鯖が、警察の本人確認が入る電話契約が必要なSMS認証等不要で匿名で契約して使える鯖が欲しい。 となるとGASに行き着く。強烈に性能は悪いが。

2022-12-02 02:53:32
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

それを手に入れたので よいよジャンクな激安スマホを計算ノードやセンサーノード、ストレージ鯖に使って楽しいことが出来る。 それもブラウザ、Android5でも動く最新版Firefoxを使って 何がともあれまずはこれ httpsドメイン取らずにクラウド抜きでスマホのブラウザだけでファイルバックアップをしたい pic.twitter.com/A32cqwsloh

2022-12-02 03:28:26
拡大
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

クラウド・アプリを使わないメリットは ・子供の写真で児童ポルノ判定を受けて勝手に消されたりしない ・刑法175条の埒外 ・物理的に閉じたネットワークをスマホだけで構築可能 ・情報ぶっこ抜くかもしれないスマホアプリ抜きで ・初心者にも優しい初期設定手順 ・アプリより遥かに長い互換性サポート

2022-12-02 03:33:02
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うーむ、やっぱりテストだと実装が足らんなぁ ・接続をデバイス名から引けること→送信先の絞り込みと接続の排除が可能に ・デバイス名にてAllowとDenyを実装 ・デバイス名重複を許容 ・分割送信(10KBずつとか) ・1送信ごとにトランザクショナル(reqとrepでハッシュ)に実施しリトライする

2022-12-03 04:43:03
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

・分割する ・最初にメタデータ(長さ、タイプ、名前、ハッシュ値)を送る ・indexとハッシュ値を付けて送信する ・indexとハッシュ値を合わせた全体ハッシュ値と内容だけのハッシュ値を比較する ・OKなら全体のハッシュ値を戻り値、1か0のバイトをお尻に付けて返す ・二重送信は許容する

2022-12-03 04:48:20
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

受信側で全部断片を受信、くっつけてハッシュ値チェックOKだったら、通常返答の最後の1か0を2とする。 jsはシングルスレッドだから 断片データの送信完了フラグを1変数でビット演算しても大丈夫か。 となると10GBのファイルを送信すると、10KB断片で1Mbit=128kiBあればいいのか。楽勝っしょ。

2022-12-03 04:53:43
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うん?間違えたかな?100,0000bitでしょ?あー2の1000000乗か。 BASE64で全部/で192kiBか。 そこそこ検証には重たいがまあ100分割したらええんちゃうんちゃうん。要は10kbでサイズを揃えればきっと早いはず。

2022-12-04 03:30:53
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うーん dcで送られてきたデータが本当に自分が意図したデータ形式なのかを受信した側が判断しないと駄目か 1byte目をハッシュ値1byte目を持ってきて512bitハッシュ32byteで残りbyteのハッシュ値と一致していたら受信と認める。 で、分割で符号付き32bit=4byteで-1を先頭メタデータとし残りがデータ部と

2022-12-04 04:22:53
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

ArrayBufferの同値比較がなんなのか調べていたら一日が過ぎていたヤバイ。 Uint8Arrayに変換して1個ずつ比較するしか無さ気なのが辛い。いや・・・もうハッシュ取るとか、BASE64にして文字列比較のほうが一周回って早そうな気がするな。jsエンジンの外でやれ感。

2022-12-04 21:03:45
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

結局メタデータとは { type, name, signature, byteLength, count } な感じか。 これに識別index(メタデータは-1)と で、送信メタデータ+indexでハッシュ取って プレフィックス付けたら完成と。 ArrayBufferがジャンボフレームに収まるサイズで送付すると。

2022-12-06 03:54:48
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

予想以上にめんどくさい。 送信して、ファイルのハッシュ値を受け取って 以後のファイル断片受信はこのハッシュ値のマップにいれて、受信済みbitをonにして全件取得が完了したら 断片をつなげてファイルを構成と。 断片は他のファイルと混ざってやってくるし で、問題は受信したよの返事を受け取る方か

2022-12-07 03:22:19
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

①A:dcでBに送る→ ②B:受信する→断片だね→返事しなきゃ→受信データのハッシュを生成→dcでAにハッシュを返事→ ③A:dcで受信→形式的にこれはBに送ったデータだね→ハッシュが送った実績が有るか確認→実績が有るからOKorNGだね→OKなら完了、NGなら再送 という感じかな?

2022-12-07 03:26:28
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

結局そのファイルが何者なのかを考えると ファイルの中身のハッシュ値を見ないといけなくて で、それで細切れ断片を幾つものストリームを同一ブラウザタブで受けながら仕分けないといけない。 で、結局ArrayBufferの同値確認が出来ないので短ければBase64、長けりゃハッシュの比較をするしか無い。

2022-12-08 12:34:47
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

ただ、例えば、複数のストリームから 同じバイナリーだけどファイル名が違うよ?なデータが渡ってきたらどうしたら良いかわからない・・・ いや、まあもう時間差で揃っちゃったからええよ。名前違うの?じゃあその名前でダウンロードできるようにするわ。でええんかな? という事は完了報告が要るな。

2022-12-08 12:39:27
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

ハッシュで引っ張ってきて、完了していて、そこにメタデータがハッシュ値キーで有るなら、完了したよレスポンスを返すのか。 なるほど完了レスポンスの受け口仕様も必要と。 ハッシュ値とコンプリート値で、判定はindexが全体の長さ+1でと。うむ。 これを受け取ったら送信完了したものとして扱う的な。

2022-12-08 12:58:27
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

メタデータの持ち方を1バイナリーに複数許可出来る状態にする必要は有るな。 各メタデータのハッシュ値を取って、その値をキーに保持すると。 既に別のファイル名で受信済みだったらメタデータの送信だけで完了すると。

2022-12-08 13:00:45
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うう、ソースがどんどん伸びるよ。 dcでなんとかしようとすると自作プロトコルになるのは辛い。 ファイル交換だけでも出来るようにするんや・・・ そしたらそのプロトコルでメッセージも送ったらええねんな。 相手が受け取った事が確定する。 そしたら相手先にある任意のファイルをロードできるFSが!

2022-12-09 03:34:40
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うーん、でよく考えたらリクエストとレスポンスが要るんよね。 doRequestとrequestのペア どっちもPromise返す非同期で。 APIパスとデータ(ArrayBuffer)だけで。 で、クライアントと鯖役に分かれて、鯖役はリクエストにレスポンスを返すと。それでアプリが通常のWebアプリで実装が出来る。

2022-12-12 04:05:11
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

P/とかQ/とかtypeの先頭につけたら今自分がどっちの処理をやってるかは分かるわな。dcでデータを受け取ったときにどっちなのかで挙動を買える必要があって、そこさえ満たせば大丈夫。mymetypeこの接頭語は存在しないので混信の心配はない。なお、ファイル名がAPIパスに該当+えいい感じかな?

2022-12-13 17:09:16
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

Promiseのresolveをどっかに保管しておいて、好きなタイミングでawaitの戻り値として返せるのは良いけど クロージャーになっちゃってるから かなりの確立でメモリリークしてるよなぁ のお気持ちはある。 さて、これからテストをしないと行けないんだ・・・テストをね。

2022-12-16 03:26:37
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

docs.yjs.dev もうこいつで良くね?という気がするが ESmodulesにしたいし、GASでシグナリングとか言い始めたら多分だめななんだろうな・・・ 結局トランザクショナルに処理をしようとすると もう一段上にDocを作ってUndoログとRedoログをトランザクショナルに管理という話になるのか。

2022-12-19 22:29:27
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

通信部分だけ欲しいマン 要はローカルにデータが有っても困るマン 的にはドキュメントがメッシュに差分更新しててどう気が済むと言うのはオーバースペックな気はする。 いやまあ、あたかも1マシンののごとく振る舞うは重要なんだけどCUDAみたいに計算協働できないかねぇ。

2022-12-23 02:47:30