2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OCIでObjectStorageからReadableStreamを使用して大容量データをダウンロードするNode.js簡易Webサーバの作成

Posted at

概要

OCIのObjectStorageにあるデータをNode.JSのOCI SDKを使用して取得するサンプルを紹介します。
本稿では例として大容量動画データをHLS形式でObjectStorageに保存し、
ReadableStreamと再起処理を使用してクライアントにObjectStorageデータを返却する簡易Webサーバを作成しました。

準備

HLS形式データの保存とデータ配信

こちらの記事にある通り、Digital Media Servicesを使用することで動画コンテンツの作成&配信までおこなえます。
一方、SaaS観点では、より柔軟に配信Webサーバ側で、

  • 独自の認証機能を付与したり
  • または各データ配信単位で細かい追加処理(データ加工やAPI連携など)

を実施したいケースがあります。
配信部分を独自実装することで、より柔軟なサーバ実装が可能となり、
ブレークポイント指定して容易にローカル環境で都度デバッグが行えることも魅力です。

本稿では、検証用にNode.jsで動く簡易なWebサーバを作成しました。
Digital Media Servicesとの連携では、OCI Media Flowを使用してObjectStorageに動画コンテンツを保存し、
データ配信部分を今回作成した検証用Webサーバを使用します。
作成したサンプルではnodeコマンドでlocalhost:8080にてサーバを起動し、
クライアントアプリケーションからは対象のファイル(m3u8ファイル等)を指定します。

サーバ起動
    node .\HttpServer.js
クライアントからアクセス
    play("http://localhost:8080/master.m3u8");          

Node.js版OCI SDKの取得

Node.jsをinstall後、
ローカルの開発環境でDLする場合も基本的には下記コマンドを対象フォルダ内で実行するのみでnode_modeuleフォルダに格納されます。

サーバ起動
    npm install oci-sdk

実装

ソースはこちらにアップしました。

HLS形式での動画配信では、インデックスファイルのm3u8ファイル内において、同一ファイルに対してバイトレンジを指定して複数リクエストに分割して取得する記述があります。
例えば下記のように1リクエストごとにhttpヘッダでバイトレンジを指定し、サーバ側はその該当部分のデータを返却します。

HTTPヘッダでバイトレンジの指定
    Range: bytes=847-4979123

そのため、本検証用WebサーバにおいてもRangeヘッダを解釈し、該当部分のバイト配列のみを返却する実装をしています。
また動画コンテンツのサイズの大きいデータはストリーム形式でデータが取得されるため、再帰処理も必要となります。

おわりに

Node.jsを使用してObjectStorageから大容量データをReadableStreamで処理して返却する簡易Webサーバを作成しました。
localhostで動かせるため、ブレークポイントを設置してデバッグも容易にできるため、開発時に重宝します。
またlocalhostだけでなく、本サンプルをベースに加工して、OCIのコンピュートインスタンスに載せることも可能です。
参考になれば幸いです。:grinning:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?