Symbolブロックチェーンでノードに確実に接続する方法を紹介します。
ランダムで選択したノードに対し、接続に失敗すれば別のノードへの接続を試みます。
同時にWebSocketでlistenerクラスを確立し、切断されれば再接続を試みます。
ライブラリインポート
ブラウザの開発者コンソールから以下のスクリプトを実行して検証環境を構築します。
(script = document.createElement('script')).src = 'https://xembook.github.io/xembook/xembook_config.js';
document.getElementsByTagName('head')[0].appendChild(script);
(script = document.createElement('script')).src = 'https://code.jquery.com/jquery-3.3.1.min.js';
document.getElementsByTagName('head')[0].appendChild(script);
(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-1.0.3.js';
document.getElementsByTagName('head')[0].appendChild(script);
jQueryを利用します。ajaxにタイムアウト機能があるので有効活用します。
ノードリストはxembookリポジトリのxembook_config.jsに定義しています。
ノード接続
以下のスクリプトでノード接続とリスナーの確立を行います。
var nodelist = NODES;
var listener;
sym = require("/node_modules/symbol-sdk");
function connectNode(nodes,d){
const node = nodes[Math.floor(Math.random() * nodes.length)] ;
$.ajax({url: node + "/node/health" ,type: 'GET',timeout: 1000})
.then(res => {
console.log(res);
if(res.status.apiNode == "up" && res.status.db == "up"){
console.log(node);
return d.resolve(node);
}
return connectNode(nodes,d);
})
.catch(res =>connectNode(nodes,d));
return d.promise();
}
async function createRepo(d2,nodes){
const d = $.Deferred();
const node = await connectNode(nodes,d);
const repo = new sym.RepositoryFactoryHttp(node);
const nsRepo = repo.createNamespaceRepository();
try{
if(listener === undefined){
const wsEndpoint = node.replace('http', 'ws') + "/ws";
listenerKeepOpening(wsEndpoint,nsRepo);
}
d2.resolve(repo);
}catch(error){
console.log(error);
createRepo(d2,nodes);
}
return d2.promise();
}
isWebsocketSupported = false;
function listenerKeepOpening(wsEndpoint,nsRepo){
listener = new sym.Listener(wsEndpoint,nsRepo,WebSocket);
// await listener.open();
listener.open().then(() => {
isWebsocketSupported = true;
console.log(wsEndpoint);
listener.newBlock();
});
listener.webSocket.onclose = async function(){
console.log("listener onclose");
if(!isWebsocketSupported){
console.log("websocket no supported.")
}else{
listenerKeepOpening(wsEndpoint,nsRepo);
}
}
}
var repo;
(async() =>{
const d2 = $.Deferred();
repo = await createRepo(d2,nodelist);
})();