ChromeOS向けSFTP File Systemの構造

もう1年前の話になりますが、ChromebookやChromboxからSFTP経由でファイルを直接やり取りするためのアプリ「SFTP File System」を開発、公開して、現在に至っています。ChromeOSはWindowsのエクスプローラやmacのfinderのようなファイラである「Files.app」を持っています。そして、Chrome AppsやChromeウェブブラウザ上のウェブアプリからは、HTML5 FileSystem APIchrome.fileSystem APIを経由して、ディレクトリやファイルにアクセスすることが可能になっています。

sftp_1.png

SFTP File Systemアプリは、chrome.fileSystemProvider APIの実装を提供し、HTML5 File System APIやchrome.fileSystem APIに接続されます。つまり、Files.appアプリや、数多くのChrome Appsから、SFTPプロトコルを使ったリモートファイルアクセスが可能になるのです。

このSFTP File Systemアプリの構造を、頑張ってドキュメントに書き起こしてみました。

Code Structure - SFTP File System - GitHub

SFTP、つまりSSH2プロトコルを最初自分で実装しようと思ったのですが、さすがにそれは辛く(JavaScriptで素数計算するのがきつかった)、libssh2というC言語で書かれたライブラリを使うことにしました。SFTP File SystemはChrome Appsであり、その中ではCやC++で書かれたコード(からビルドされたネイティブコード)をNative Client Libraryというネイティブモジュールを使うことができます。JavaScriptレイヤーとNaClモジュールとの通信は、Pepper APIで可能になります。

code_structure_1.png

NaClモジュールの中では、libssh2を使ってSFTP Serverとの通信処理を行うのですが、通信に使われるソケットは自分で開く必要があります。NaClでは、nacl_ioというPOSIX準拠のSocket APIの実装が提供されているので、普通にsocket(2)やselect(2)などが利用可能です。Pepper APIで呼び出されたメインスレッドではnacl_ioで通信できない、などの制約があるのですが、それもpthreadを使って回避しています。

code_structure_1.png

そのほかにも、各レイヤー、各クラスがどのような責務を担ってて、それらがどう連携して動作しているかわかるようにしてみたつもりです。ぜひ一度ざっと眺めてみて「あー、Chrome AppsってC++と組み合わせてこんなことできるんだー、へー」って思ってみてください。

このエントリーをはてなブックマークに追加

関連記事

スマートスピーカーはもう終わったデバイス?

QMK FirmwareとRaspberry Pi PicoでSPLIT_USB_DETECTを使わない方法

40%キーボードに慣れるためにやったこと

Lunakey PicoでQMK Firmwareを動かしてみました

Googleアシスタント向け会話型アクションが1年後にシャットダウンされます