7
6

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.

nemAdvent Calendar 2021

Day 23

Symbolブロックチェーンのノードに確実に接続する方法

Last updated at Posted at 2021-12-30

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);
})();

 

7
6
1

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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?