回答 · Node.js · WebSocket
NodeのMapにピナクルWebSocketのsnapshotとdeltaを適用する
回答: subscribe のあと、市場の id(eventId:key)をキーにした Map に snapshot の各 part を入れ、その後各 delta の changes[](upsert/remove)を適用します。完全なクライアント:Python/Nodeガイド。Builder(月額99ユーロ)が必要です。
マージの核心#
import WebSocket from "ws";
const markets = new Map(); // id -> market object
const KEY = process.env.PINNFEED_KEY;
function applyChange(ch) {
if (ch.op === "upsert" || ch.type === "upsert") {
const m = ch.market || ch.value;
markets.set(m.id, m);
} else if (ch.op === "remove" || ch.type === "remove") {
markets.delete(ch.id || ch.marketId);
}
}
const ws = new WebSocket("wss://pinnfeed.io/v1/stream", {
headers: { "x-api-key": KEY },
perMessageDeflate: true,
});
ws.on("open", () => {
ws.send(JSON.stringify({
type: "subscribe",
sports: ["soccer"],
markets: ["moneyline"],
main: true,
}));
});
ws.on("message", (buf) => {
const msg = JSON.parse(buf.toString());
if (msg.type === "ping") return ws.send(JSON.stringify({ type: "pong" }));
if (msg.type === "snapshot" || msg.part != null) {
for (const m of msg.markets || []) markets.set(m.id, m);
}
if (msg.type === "delta" && Array.isArray(msg.changes)) {
for (const ch of msg.changes) applyChange(ch);
}
});
フィールド名はWebSocketドキュメントに従います。有料プラン:3日間のトライアル。カード登録が必要で、解約しない場合は3日目の後に課金されます。
関連:snapshotとdelta · Node再接続 · rawフレーム(Pro)。
18歳以上の方を対象とした教育目的のコンテンツです。予想や利益の約束ではありません。日本では刑法により賭博は原則として禁止されています。
よくある質問#
イベントも同じようにマージしますか?#
はい。home/awayのメタデータが必要ならイベント用の Map を別に持ってください。snapshotとdeltaの両方に載ることがあります。
なぜBuilder?#
Free/HobbyのキーはWebSocketで 403 plan_lacks_ws になります。RESTのポーリングはFreeで動きますが、プッシュにはBuilderまたはProが必要です。