ratpack.sse.internal.ServerSentEventEncoder.java Source code

Java tutorial

Introduction

Here is the source code for ratpack.sse.internal.ServerSentEventEncoder.java

Source

/*
 * Copyright 2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ratpack.sse.internal;

import com.google.common.collect.Lists;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufOutputStream;
import ratpack.sse.Event;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import static io.netty.util.CharsetUtil.UTF_8;

public class ServerSentEventEncoder {

    public static final ServerSentEventEncoder INSTANCE = new ServerSentEventEncoder();

    private static final byte[] EVENT_TYPE_PREFIX = "event: ".getBytes(UTF_8);
    private static final byte[] EVENT_DATA_PREFIX = "data: ".getBytes(UTF_8);
    private static final byte[] EVENT_ID_PREFIX = "id: ".getBytes(UTF_8);
    private static final byte[] NEWLINE = "\n".getBytes(UTF_8);

    public ByteBuf encode(Event<?> event, ByteBufAllocator bufferAllocator) throws Exception {
        ByteBuf buffer = bufferAllocator.buffer();

        OutputStream outputStream = new ByteBufOutputStream(buffer);
        Writer writer = new OutputStreamWriter(outputStream, UTF_8);

        String eventType = event.getEvent();
        if (eventType != null) {
            outputStream.write(EVENT_TYPE_PREFIX);
            writer.append(eventType).flush();
            outputStream.write(NEWLINE);
        }

        String eventData = event.getData();
        if (eventData != null) {
            outputStream.write(EVENT_DATA_PREFIX);
            for (Character character : Lists.charactersOf(eventData)) {
                if (character == '\n') {
                    outputStream.write(NEWLINE);
                    outputStream.write(EVENT_DATA_PREFIX);
                } else {
                    writer.append(character).flush();
                }
            }
            outputStream.write(NEWLINE);
        }

        String eventId = event.getId();
        if (eventId != null) {
            outputStream.write(EVENT_ID_PREFIX);
            writer.append(eventId).flush();
            outputStream.write(NEWLINE);
        }

        outputStream.write(NEWLINE);
        writer.flush();
        writer.close();
        return buffer;
    }
}