Live Market Data WebSocket Streaming

After I connect the WebSocket, the preference is sent. But in receive I get Blob Object in which I get type empty. So tell me what mistake I am making.

// send preference //
ws.send(‘[{“actionType”:“ADD”,“modeType”:“FULL”,“scripType”:“OPTION”,“exchangeType”:“NSE”,“scripId”:“42081”}]’);

// receive //
image

@valabhavik the live data response packet that you receive is in bytebuffer format that you need to decode on your side to turn it to human-readable format. Please refer to below doc for sample client-side bytebuffer decoding implementation.
https://developer.paytmmoney.com/docs/api/live-market-data-webSocket-streaming/

@PaytmMoney
@Abhishek61
@ravibeck

I have been trying for the last 5-6 days but I have no idea what I am doing wrong. I have also mailed API Support. But I am not getting ans from any place, please help me.

@valabhavik please send your decoding logic for parsing bytebuffer response. We’ll check.

@Abhishek61 Sir the response I am getting is wrong to me. Because in the response I get I get empty data.type. Because of this, I am not moving forward.

@valabhavik The response object depends on the WebSocket library you are using. Please refer to their docs to understand how to fetch data from the message object

Thank you for your reply, can you explain me in some detail?

I am doing this with javascript but I am getting error in dataView. and Type comes empty.

Hi @valabhavik, We found some issues in the sample client implemented in our docs. Sorry for the inconvenience caused. Please refer to the below updated code

var publicAccessToken = "YOUR_PUBLIC_ACCESS_TOKEN";
url = 'wss://developer-ws.paytmmoney.com/broadcast/user/v1/data?' + `x_jwt_token=${publicAccessToken}`;

var socket = new WebSocket(url);

// Event triggered when user connection has successfully opened
socket.addEventListener('open', function () {
    if (socket.readyState === socket.OPEN) {
        socket.send(JSON.stringify(
            [{
                "actionType": "ADD",
                "modeType": "FULL",
                "scripType": "INDEX",
                "exchangeType": "NSE",
                "scripId": "13"
            },
            {
                "actionType": "ADD",
                "modeType": "LTP",
                "scripType": "INDEX",
                "exchangeType": "BSE",
                "scripId": "51"
            }
            ]
        ));
    }
})

// Event triggered when user connection has closed
socket.addEventListener('close', function (event) {
    console.log("user disconnected");
})

// Event triggered when user connection gets an error
socket.addEventListener('error', function (event) {
    console.log("error");
}) // Event triggered when user connection gets a message from the server
socket.addEventListener("message", function (message) {
    try {
        if (message.data instanceof Blob) {
            processByteMessage(message);
        } else {
            console.log("Message: " + message.data);
        }
    } catch (e) {
        console.log("Error: " + e);
    }
});

function processByteMessage(message) {
    const arrayBufferPromise = message.data.arrayBuffer();
    arrayBufferPromise.then((data) => {
        var l = data.byteLength;
        var dvu = new DataView(data);
        let position = 0;
        while (position != l) {
            var type = dvu.getInt8(position);
            position = position + 1;
            console.log("Mode Type: " + type);
            switch (type) {
                case 64:
                    console.log("IndexLtpPacket");
                    processIndexLtpPacket(dvu);
                    break;
                case 65:
                    console.log("IndexQuotePacket");
                    processIndexQuotePacket(dvu);
                    break;
                case 66:
                    console.log("IndexFullPacket");
                    processIndexFullPacket(dvu);
                    break;
                case 61:
                    console.log("LtpPacket");
                    processLtpPacket(dvu);
                    break;
                case 62:
                    console.log("QuotePacket");
                    processQuotePacket(dvu);
                    break;
                case 63:
                    console.log("FullPacket");
                    processFullPacket(dvu);
                    break;
                default:
                    console.log("Default");
                    break;
            }
        }

        function processLtpPacket(dvu) {
            console.log("last_trade_price: " + dvu.getFloat32(position, true));
            console.log("last_trade_time: " + dvu.getInt32(position + 4, true));
            console.log("security id: " + dvu.getInt32(position + 8, true));
            console.log("traded: " + dvu.getInt8(position + 12, true));
            console.log("Mode: " + dvu.getInt8(position + 13, true));
            console.log("changeAbsolute: " + dvu.getFloat32(position + 14, true));
            console.log("changePercent: " + dvu.getFloat32(position + 18, true));
            position += 22;
        }

        function processIndexLtpPacket(dvu) {
            console.log("last_trade_price: " + dvu.getFloat32(position, true));
            console.log("last_update_time: " + dvu.getInt32(position + 4, true));
            console.log("security id: " + dvu.getInt32(position + 8, true));
            console.log("traded: " + dvu.getInt8(position + 12, true));
            console.log("Mode: " + dvu.getInt8(position + 13, true));
            console.log("changeAbsolute: " + dvu.getFloat32(position + 14, true));
            console.log("changePercent: " + dvu.getFloat32(position + 18, true));
            position += 22;
        }

        function processQuotePacket(dvu) {
            console.log("last_traded_price: " + dvu.getFloat32(position, true));
            console.log("Last_trade_time: " + dvu.getInt32(position + 4, true));
            console.log("security id: " + dvu.getInt32(position + 8, true));
            console.log("traded: " + dvu.getInt8(position + 12, true));
            console.log("Mode: " + dvu.getInt8(position + 13, true));
            console.log("last_traded_quantity " + dvu.getInt32(position + 14, true));
            console.log("average_traded_price: " + dvu.getFloat32(position + 18, true));
            console.log("volume: " + dvu.getInt32(position + 22, true));
            console.log("total_buy_quantity: " + dvu.getInt32(position + 26, true));
            console.log("total_sell_quantity: " + dvu.getInt32(position + 30, true));
            console.log("open: " + dvu.getFloat32(position + 34, true));
            console.log("close: " + dvu.getFloat32(position + 38, true));
            console.log("high: " + dvu.getFloat32(position + 42, true));
            console.log("low: " + dvu.getFloat32(position + 46, true));
            console.log("change_percent: " + dvu.getFloat32(position + 50, true));
            console.log("change_absolute: " + dvu.getFloat32(position + 54, true));
            console.log("52_week_high: " + dvu.getFloat32(position + 58, true));
            console.log("52_week_low: " + dvu.getFloat32(position + 62, true));
            position += 66;
        }

        function processIndexQuotePacket(dvu) {
            console.log("last_trade_price: " + dvu.getFloat32(position, true));
            console.log("security id: " + dvu.getInt32(position + 4, true));
            console.log("traded: " + dvu.getInt8(position + 8, true));
            console.log("Mode: " + dvu.getInt8(position + 9, true));
            console.log("open " + dvu.getFloat32(position + 10, true));
            console.log("close: " + dvu.getFloat32(position + 14, true));
            console.log("high: " + dvu.getFloat32(position + 18, true));
            console.log("low: " + dvu.getFloat32(position + 22, true));
            console.log("change_percent: " + dvu.getFloat32(position + 26, true));
            console.log("change_absolute: " + dvu.getFloat32(position + 30, true));
            console.log("52_week_high: " + dvu.getFloat32(position + 34, true));
            console.log("52_week_low: " + dvu.getFloat32(position + 38, true));
            position += 42;
        }

        function processFullPacket(dvu) {
            depthPosition = position;
            for (let i = 0; i < 5; i++) {
                console.log("DEPTH PACKET  #" + (i + 1));
                console.log("buy_quantity: " + dvu.getInt32(depthPosition, true));
                console.log("sell_quantity: " + dvu.getInt32(depthPosition + 4, true));

                console.log("buy_order: " + dvu.getInt16(depthPosition + 8, true));
                console.log("sell_order: " + dvu.getInt16(depthPosition + 10, true));

                console.log("buy_price: " + dvu.getFloat32(depthPosition + 12, true));
                console.log("sell_price: " + dvu.getFloat32(depthPosition + 16, true));
                console.log("\n");
                depthPosition += 20;
            }

            position += 100;

            console.log("last_traded_price: " + dvu.getFloat32(position, true));
            console.log("last_trade_time: " + dvu.getInt32(position + 4, true));
            console.log("security id: " + dvu.getInt32(position + 8, true));
            console.log("traded: " + dvu.getInt8(position + 12, true));
            console.log("Mode: " + dvu.getInt8(position + 13, true));
            console.log("last_traded_quantity " + dvu.getInt32(position + 14, true));
            console.log("average_traded_price: " + dvu.getFloat32(position + 18, true));
            console.log("volume: " + dvu.getInt32(position + 22, true));
            console.log("total_buy_quantity: " + dvu.getInt32(position + 26, true));
            console.log("total_sell_quantity: " + dvu.getInt32(position + 30, true));
            console.log("open: " + dvu.getFloat32(position + 34, true));
            console.log("close: " + dvu.getFloat32(position + 38, true));
            console.log("high: " + dvu.getFloat32(position + 42, true));
            console.log("low: " + dvu.getFloat32(position + 46, true));
            console.log("change_percent: " + dvu.getFloat32(position + 50, true));
            console.log("change_absolute: " + dvu.getFloat32(position + 54, true));
            console.log("52_week_high: " + dvu.getFloat32(position + 58, true));
            console.log("52_week_low: " + dvu.getFloat32(position + 62, true));
            console.log("oi: " + dvu.getInt32(position + 66, true));
            console.log("change_oi: " + dvu.getInt32(position + 70, true));
            position += 74;
        }

        function processIndexFullPacket(dvu) {
            console.log("last_trade_price: " + dvu.getFloat32(position, true));
            console.log("security id: " + dvu.getInt32(position + 4, true));
            console.log("traded: " + dvu.getInt8(position + 8, true));
            console.log("Mode: " + dvu.getInt8(position + 9, true));
            console.log("open " + dvu.getFloat32(position + 10, true));
            console.log("close: " + dvu.getFloat32(position + 14, true));
            console.log("high: " + dvu.getFloat32(position + 18, true));
            console.log("low: " + dvu.getFloat32(position + 22, true));
            console.log("change_percent: " + dvu.getFloat32(position + 26, true));
            console.log("change_absolute: " + dvu.getFloat32(position + 30, true));
            console.log("last_update_time: " + dvu.getInt32(position + 34, true));
            position += 38;
        }
    });
}