回答 · Node · 再接続
ピナクルのオッズWebSocketをNode.jsで再接続する
回答: closeのときmin(delay*2, 30000) + jitterミリ秒待ってから新しいソケットを開き、subscribeを送り直し、新しいsnapshotから状態を再構築します(part === 1でマップを空にします)。サーバーのpingには必ず{"type":"pong"}で応答してください。応答しないと約60秒で切断されます。Builderプラン(月額99ユーロ)が必要です。基準となるファイル:PythonとNodeのガイドのstream.mjs。
再接続のパターン#
// Example — npm install ws; export PINNFEED_KEY=...
import WebSocket from 'ws';
const WS_URL = process.env.PINNFEED_WS || 'wss://pinnfeed.io/v1/stream';
const KEY = process.env.PINNFEED_KEY;
const events = new Map();
const markets = new Map();
function connect(delay = 1000) {
const ws = new WebSocket(WS_URL, { headers: { 'x-api-key': KEY } });
ws.on('open', () => {
delay = 1000;
ws.send(JSON.stringify({
type: 'subscribe',
sports: ['soccer', 'tennis'],
markets: ['moneyline'],
main: true,
specials: false,
}));
});
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
if (msg.type === 'ping') return ws.send('{"type":"pong"}');
if (msg.type === 'snapshot') {
if (msg.part === 1) { events.clear(); markets.clear(); }
msg.events.forEach((e) => events.set(e.id, e));
msg.markets.forEach((m) => markets.set(m.id, m));
if (msg.final) console.log(`book ready: ${events.size} events, ${markets.size} markets`);
}
// apply deltas the same way as in the full stream.mjs
});
ws.on('close', (code) => {
const wait = Math.min(delay * 2, 30000);
console.log(`closed (${code}); reconnecting in ${wait / 1000}s`);
setTimeout(() => connect(wait), wait + Math.random() * 1000);
});
}
connect();
クローズコード1001(server_shutdown)はデプロイを意味します。バックオフ付きで再接続してください(WebSocketドキュメント)。一斉再接続を避けるためにジッターが重要です。
プラン#
Builder:3日間のトライアルがあります。カード登録が必要で、解約しない場合は3日目の後に課金されます。 関連:Pythonの例、snapshotとdelta。
18歳以上の方を対象とした教育目的のコンテンツです。予想や利益の約束ではありません。日本では刑法により賭博は原則として禁止されています。
よくある質問#
再接続のたびに同じMapを使い回すべきですか?#
snapshotの最初のパート(part === 1)で空にしてください。そうしないと、新しいsnapshotに含まれない市場が残ってしまいます。
Hobbyでストリームに再接続できますか?#
HobbyにはWebSocketがありません。再接続のロジックが動く前に403 plan_lacks_wsが返ります。