ライブラリを要求することは通常 StackOverflow では歓迎されないため、この質問はおそらくクローズされるでしょう。しかし、これは楽しい小さな挑戦です。(完了するまでに約15分かかりました。)
これは実際には処理するのにそれほど大きなタスクではなく、かろうじて 50 行程度です。それがおそらく、これを行う小さなライブラリが見つからない理由です。
function Sender() {
var requests = [],
state = 0; // 0 = closed, 1 = open
ws = new WebSocket();
ws.onopen = function() {
state = 1;
if (requests.length) {
send();
}
};
ws.onerror = function() {
if (ws.readyState !== 1) { // 1 is "OPEN"
close();
}
};
// Let's fill in the requests array if necessary
// IIFE because I don't want to pollute the scope with `req`
(function() {
var req = JSON.parse(localStorage.get('queue'));
if (req.length) {
requests = requests.concat(req);
}
}());
return {
send: function(msg) {
if (state === 0) {
requests.push(msg);
}
else {
send();
}
},
close: function() {
state = 0;
localStorage.set('queue', JSON.stringify(requests));
}
};
function send() {
var done = false;
while (!done) {
if (state === 1) {
ws.send(requests.pop());
if (!requests.length) {
done = true;
}
}
else {
done = true;
}
}
}
}
// Usage example
var sender = Sender();
sender.send('message');
// let's say your "disconnect" button is in a variable
disconnect.addEventListener('click', function() {
sender.close();
}, false);
サーバーは、通常のリクエスト以外は何も処理する必要はありません。必要に応じて、送信するメッセージにタイムスタンプを追加できます。これにより、時間を追跡するのが非常に簡単になります (2 行程度)。