Node環境でSkyWayしようと思ったが秒で心が折れた話

やっぱりブラウザで動作させるのがジャスティスなんですよね。



# やりたかったこと

監視カメラみたいなものが作りたかった。


 - Raspberry Pi + USB Camera
 - RPiは撮影した映像を垂れ流すだけで、受信はしない
 - RPiにはGUI不要
 - 垂れ流した映像は、別のマシン上のブラウザで閲覧する想定


こんな感じのことを想定していました。とりあえず、映像送信側のコーディングをしようと思って、SkyWayのJavaScript SDKを使って、コードを書いてみました。

その際、どうせRPiはGUIがなくてもいいので、Node環境上で動作するかやってみました。


# やったこと


テキトーにスクリプトを書いてみた。


```javascript
const Peer = require('skyway-js');
const peer = new Peer({
    key: 'xxxxx',
    debug: 3
});

peer.on('open', function () {
    console.log('opened : ' + peer.id);
});

peer.on('error', function (err) {
    console.log('error : ' + err);
});
```

とりあえずPeerをNewするところまで。これを実行してみた。


```bash
$ node -v
v8.12.0
```


```bash
$ node script.js 
/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:14
})(window, function() {
   ^

ReferenceError: window is not defined
    at Object.<anonymous> (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:14:4)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/pokiiio/Desktop/skyway-test/script.js:3:14)
    at Module._compile (module.js:653:30)
```

はいはい。ブラウザ環境がやっぱり必要そうですよね。

それならば、`browser-env`でブラウザ環境をエミュレートしてみてはどうだろうかと。


```bash
$ npm install browser-env --save
```

よしなにInstallしてみて、スクリプトの先頭で、`require('browser-env')();`を呼ぶ。


```javascript
require('browser-env')();

const Peer = require('skyway-js');
const peer = new Peer({
    key: 'xxxxx',
    debug: 3
});

peer.on('open', function () {
    console.log('opened : ' + peer.id);
});

peer.on('error', function (err) {
    console.log('error : ' + err);
});
```


これでどうじゃ。


```bash
$ node script.js 
SkyWay:  { Error: The domain "null" is not registered to this API key. Please confirm your settings on the SkyWay dashboard https://skyway.io/ds
    at socket_Socket.socket.on.error (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:17016:19)
    at socket_Socket../node_modules/events/events.js.EventEmitter.emit (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:1139:17)
    at Socket._io.on.message (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:13452:16)
    at Socket../node_modules/socket.io-client/node_modules/component-emitter/index.js.Emitter.emit (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7987:20)
    at Socket../node_modules/socket.io-client/lib/socket.js.Socket.onevent (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7205:10)
    at Socket../node_modules/socket.io-client/lib/socket.js.Socket.onpacket (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7163:12)
    at Manager.<anonymous> (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7840:15)
    at Manager../node_modules/socket.io-client/node_modules/component-emitter/index.js.Emitter.emit (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7987:20)
    at Manager../node_modules/socket.io-client/lib/manager.js.Manager.ondecoded (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:6659:8)
    at Decoder.<anonymous> (/Users/pokiiio/Desktop/skyway-test/node_modules/skyway-js/dist/skyway.js:7840:15) type: 'invalid-domain' }
error : Error: The domain "null" is not registered to this API key. Please confirm your settings on the SkyWay dashboard https://skyway.io/ds
```

ほうほう、よくわからんけど、`null`をDashboardの`Available domains`に追加すればいいのね（錯乱）、と思い`null`を追加。


<img width="600" alt="Screen Shot 2018-12-15 at 17.57.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/212109/054b530a-5f7c-c772-dbfc-60c597ae4885.png">


そして再度実行。


```bash
$ node script.js 
SkyWay:  { Error: The domain "null" is not registered to this API key. Please confirm your settings on the SkyWay dashboard https://skyway.io/ds
（以下省略）
```

ダメですよね・・・。
WebRTCですから、Webブラウザじゃないとダメですよね・・・。


ちょっと出直してきます。


# ダメだったけど

サンプルコードがたくさん準備されてるので、まずはそれを動かしつつ、コードを写経してみようと思います。

@n0bisukeさんに、npmモジュールも教えていただいたので、こちらも使ってみようと思います。
https://www.npmjs.com/package/skyway-gateway