Ikagaka / Ghost.js

Ukagaka SHIORI Wrapper
3 stars 1 forks source link

Ikagaka Ghost API 1.0 (WD) #13

Open legokichi opened 9 years ago

legokichi commented 9 years ago

Ikagaka Ghost API 1.0の仕様についての議論スレッドです。

うにゅう@もどき板の意見も拾いますのでGitHubのアカウントをお持ちでない方はそちらもご利用ください。

ご意見お待ちしています。

legokichi commented 9 years ago

ベースウェアにこの栞が対応していることを伝える方法

legokichi commented 9 years ago

Ikagaka Ghost APIよりもIkagaka Shiori API のが適切な名前では

Narazaka commented 9 years ago

現状のGhost.jsには 1.栞を判定し、読み込む互換栞を決定する部分 2.栞と通信する部分 の2つが含まれています。

如何かの動作環境としては現状以下の種類が想定されます。

  1. ブラウザ上 - スレッドはWebWorkerのみ / FSはBrowserFS on IndexedDB / JS栞のみ利用可能
  2. Windows上 - スレッドはchild_process利用可能 / FSはnodeFS利用可能 / オリジナルの栞DLLをネイティブで動作できる
  3. Windows以外のPC上 - スレッドはchild_process利用可能 / FSはnodeFS利用可能 / JS栞のみ利用可能
  4. Cordova上 - スレッドはWebWorkerのみ / FileSystem APIライクなPhoneGap FileAPIあるいはCordovaFileSystem / JS栞のみ利用可能

以上から以下の場合が想定されます。 ・JS栞を使用する場合  ・ネイティブFSを使う場合 - FSはJS栞側で処理するのが効率的(Ghostの引数にFSはいらない)  ・互換FSを使う場合 - FSは栞のload()前に栞が参照するFSに書き込む必要がある(Ghostの引数にFS必須)  ・FSを使わない場合 - JS栞によってはFSを使わないという選択が可能 ・Windows上でDLLを使用する場合  ・ネイティブFSを使う - FSは栞側でのみ処理できる(Ghostの引数にFSはいらない)

判定系は栞と独立で、これら栞の選択とFSの有無判定までをまかせて、必要な場合の中身渡しと栞のロードと通信確保をGhost.js、スレッドの動作は栞側にまかせるというのが妥当な施策だと考えます。 判定系もAPIというかプラグイン仕様的な奴を定める必要があるかと。

Narazaka commented 9 years ago

Windows上でオリジナルの栞DLLをネイティブで動作させるというものは、簡単な方法としては「shioridllproxy.exe的なのに栞パスを渡してexecFileしstdioで通信するようなJS栞」をつかうなどがあります。

Narazaka commented 9 years ago

また将来的にnodeっぽいrequireが実現できるならば、descript.txtにゴースト独自のJS版栞を記述させ、それを読み込むということも考えたい。

Narazaka commented 9 years ago

これも「shiori.dll.jsをサンドボックスっぽいとこでrequireしてloadとか呼ぶようなJS栞」を使うことでいけそうです。 このrequireしてloadとか呼ぶような仕様は如何かの管轄ではなく「そのようなJS栞」の管轄になりますが。

Narazaka commented 9 years ago

FSは必ず渡すが、その中身は実FSか仮想FSかを問わずnode.jsの非同期FSのAPIをみたしたものであることが保障されるとかかな?それと別にこれが実FSなのかどうかとかのフラグを渡すとして。

legokichi commented 9 years ago

閑話休題。自分用メモ。

如何かはオンラインゴースト「Ghost as a Service(GaaS)」を目指したい。 その実現方法としては、

  1. 栞をWeb Serverで動かして、SHIORI over HTTPする。そのオフラインプロキシとして従来の栞を位置づける
  2. 従来の栞を利用して、栞がSHIORI over HTTP投げる の2種類ある。2のが従来のmateria、SSPなどでも動く。
legokichi commented 9 years ago

自分用メモ。

Ikagaka仕様において、各コンポーネントの役割。

legokichi commented 9 years ago

http://twilog.org/duxca/date-150201/nort この辺の議論の末、 new Ghost(fs, path) か new Ghost(NanikaStorage, ...) のどちらかにしよう、arraybufferは良くないという結論になりました

legokichi commented 9 years ago

node-fs互換の利点は学習コストが少ないこと、 NanikaStorageの利点は各種ファイルやディレクトリへの便利API含んでるので実装が楽なこと、バックエンドにfsの他にも使えそうなこと

です

legokichi commented 9 years ago

NanikaStorageが仕様化できればGhostだけでなくNamed APIのShell、Balloonでも使って行こうと考えてます

Narazaka commented 9 years ago

NanikaStorageの仕様化一応やりました。

Narazaka commented 9 years ago

NanikaDirectoryの仕様とあわせて storage.shell(ghostpath, shellpath) .then (directory) => files = directory.asArrayBuffer() とできます。

legokichi commented 9 years ago

NanikaStorageからFS wrapperとして必要そうなものを抽出してみました https://github.com/Ikagaka/Ikagaka.js/wiki/Ikagaka-1.0-API-Specifications#ikagaka-storage-api

legokichi commented 9 years ago

BrowserFS: Buffer返すのキモい FileSystemAPI: そんなものなかった { [path]: ArrayBuffer; }: メモリ食うのでない NanikaStorage: 独自API、けどすでに内部的に実装されてる

ので、BrowserFSをラップしたNanikaStorageが採用される見込みです

legokichi commented 9 years ago

{ [absPath]: (data?:arraybuffer)=> Promise<ArrayBuffer>; }ならすべて解決するのでは

legokichi commented 9 years ago

これまでの候補と私の認識

要件

legokichi commented 9 years ago

私の順序としては

  1. BrowserFS - 結局どの候補つかっても内部的にはBrowserFS使うのでは
  2. NanikaStorage - ノウハウの塊
  3. { [absPath]: (data?:arraybuffer)=> Promise>; } - 現状維持しつつ非同期化
  4. { [absPath]: ArrayBuffer; } - 現状維持
  5. fso - BrowserFSをTree化する必要性があんまりない
  6. FileSystem API - 時期尚早すぎる

です。

Narazaka commented 9 years ago

Ghostにはfsを渡すべきではないか。 directory: { [filePath: string]: ArrayBuffer; }という現状維持案はベースウェア側がファイル保存処理を行っている。 しかしGhostはつまることろSHIORIであり、本来ファイル操作についてはベースウェアは関知しないはずである。 なのでFSに書き戻し可能なオブジェクトを渡し、この責務をベースウェアからはずすべきでは。 load,unloadにネイティブのSHIORIの仕様以外のことをさせているのは分かりづらく気持ち悪い。