All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yy.httpproxy.emitter.Emitter Maven / Gradle / Ivy

The newest version!
package com.yy.httpproxy.emitter;

import org.apache.commons.codec.binary.Base64;
import org.msgpack.MessagePack;
import org.msgpack.packer.Packer;
import org.redisson.api.RTopicReactive;
import org.redisson.api.RedissonReactiveClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import sun.misc.BASE64Encoder;

public class Emitter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    private RedissonReactiveClient redisson;
    //    RTopicReactive rTopic;
    private String prefix = "socket.io#/#";
    private MessagePack msgpack = new MessagePack();

    public Emitter(RedissonReactiveClient redisson) {
        this.redisson = redisson;
//        rTopic = redisson.getTopic("socket.io#emitter", BytesCodec.INSTANCE);
    }


    public void push(String topic, byte[] data) {
        Map dataInfo = new HashMap();
        dataInfo.put("topic", topic);
        if (data != null) {
            dataInfo.put("data", Base64.encodeBase64String(data));
        }
        byte[] packet = msgPack(topic, "push", dataInfo);
        logger.debug("push packet {} {}", topic, new String(packet));
        getTopic(topic).publish(packet);

    }

    private byte[] msgPack(String topic, String event, Map dataInfo) {
        List list = new ArrayList();
        list.add("emitter");

        Map info = new HashMap();
        info.put("nsp", "/");
        info.put("type", 2);
        List dataList = new ArrayList();
        dataList.add(event);
        dataList.add(dataInfo);
        info.put("data", dataList);
        list.add(info);

        Map opts = new HashMap();
        opts.put("rooms", new String[]{topic});
        list.add(opts);

        //
        // Serialize
        //
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Packer packer = msgpack.createPacker(out);
        try {
            packer.write(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] bytes = out.toByteArray();
        return bytes;
    }

    private RTopicReactive getTopic(String pushId) {
        return redisson.getTopic(prefix + pushId + "#", BytesCodec.INSTANCE);
    }

    public void reply(String pushId, String sequenceId, byte[] data) {
        Map dataInfo = new HashMap();
        dataInfo.put("sequenceId", sequenceId);
        dataInfo.put("code", 1);
        if (data != null) {
            dataInfo.put("data", Base64.encodeBase64String(data));
        }
        byte[] packet = msgPack(pushId, "packetProxy", dataInfo);
        logger.debug("reply packet {} {}", pushId, new String(packet));
        getTopic(pushId).publish(packet);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy