2014年12月27日 星期六

Node.js 的精彩應用!整合 bittorrent 與 FUSE 其實不難!

Standard
寫書寫到通訊協定一章,就想起今年來台灣 JSDC 的 Mathias,在台上展示以 Node.js 開發的 Bittorrent 影片下載工具『peerflix』,該工具可以結合 vlc、mplayer 這類的播放器進行 BT 種子的影片播放,相當有趣。此外,他亦展示了使用 VirtualBox 直接開 BT 上的 Ubuntu 安裝ISO 檔的實作。

很多人都說很神、很有趣,但看完後不見得會去了解實作細節。有些人更覺得這是他們無法碰觸的領域,只是當一個神在展示他的神力而已。這樣的情況,讓我感到難過,因為很多這樣的技術細節並不難,除了 bittorrent 本身的演算法本身的實作,或是開發其 Binding 是有困難度之外,其餘的東西根本上都是相當簡單的概念。

我想,這樣並不困難的東西,如果不去解析或了解它,實在是可惜了 JavaScript 至今的發展。

事實上, bittorrent client 的 binding 早有人開發出來並寫成模組。我們只需要使用種子檔案或是 magnet link,就可以透過 binding 去取得檔案資料,甚至是特定段落的資料,就像我們實作 HTTP 續傳那樣簡單,只需指定資料的開始處而已,全都有現成的 API 可使用。

若要播放這些影片內容,只需要建立一個 HTTP Server,再將從 bittorrent 下載完成的影片資料檔,運用 Stream 的技巧導向 HTTP 輸出即可。實作到此,我們就可以透過支援 HTML5 Video 的瀏覽器或是其他支援串流的多媒體播放器,以 HTTP URL 打開影片觀看。

至於 VirtualBox 怎麼去開啟 bittorrent 上的 ISO 檔,然後讀到哪載到哪的技術,其實也不是非常難,運用 Linux/BSD(Mac OS) 上的 FUSE(Filesystem in Userspace)的技術即可達成。雖然這是熟悉系統開發才會知道的技術,但概念與開發上其實並不難,尤其是也有人寫了 Node.js binding,我們可以完全使用 JavaScript 輕易實作。

簡單來說,使用 FUSE,可以讓我們不必觸碰到作業系統核心的驅動程式技術,就可以開發一個自己的檔案系統。然後,我們可以把自己實作的檔案系統掛載到一個本機目錄上。這代表,當其他應用程式使用標準操作、讀取(如 open、read、write 等)這個目錄裡面的檔案時,我們的程式就要接手這些操作要求的工作,你可以想像是其他應用程式跟我們要資料,而這個檔案系統是一個虛擬的介面。

註:熟悉 C/C++ 的人都知道,無論上面檔案操作 API 怎麼包裝,系統底層最終依舊以 open()、read()、write() 等這類 API 進行檔案操作。FUSE 可以讓我們開發程式模擬一個檔案系統,接受其他應用程式的檔案操作要求,並進行處理。

所以,假設我們的程式把 FUSE 接上 ssh、ftp 或是網路硬碟的 Web API,使用者就可以像是在操作本機目錄一樣,操作網路硬碟。

運用這個技術,只要把 ISO 檔以 FUSE 包上一層,當 VirtualBox 來存取這個 ISO 檔時,我們就可以得知 VirtualBox 想要讀取 ISO 檔上哪一段資料,如果被要求的部分尚未從 bittorrent 上抓回來,就立即去抓取,並使 VirtualBox 進行等待(對 VirtualBox 而言,它只會覺得是硬碟讀取速度太慢)。而如果 VirtualBox 是跳著讀取 ISO 檔上的其他部分,也是同樣作法即可完成。

總之,這一切真的不難,只不過有些跨領域而已。:-)