#include "nlws_courier.h"
#include "nlws_frame.h"

courier_t* nlws_create_courier (pTHX_ struct lws *wsi) {
    struct lws_ring *ring = lws_ring_create(
        sizeof(frame_t),
        RING_DEPTH,
        nlws_destroy_frame
    );

    if (!ring) {
        croak("lws_ring_create() failed!");
    }

    courier_t* courier;
    Newx(courier, 1, courier_t);

    *courier = (courier_t) {
        .wsi = wsi,
        .pid = getpid(),
        .ring = ring,

        // Everything else is initialized to 0/NULL.
    };

    return courier;
}

void nlws_destroy_courier (pTHX_ courier_t* courier) {
    if (courier->on_text) {
        for (unsigned i=0; i<courier->on_text_count; i++) {
            SvREFCNT_dec(courier->on_text[i]);
        }

        Safefree(courier->on_text);
    }

    if (courier->on_binary) {
        for (unsigned i=0; i<courier->on_binary_count; i++) {
            SvREFCNT_dec(courier->on_binary[i]);
        }

        Safefree(courier->on_binary);
    }

    lws_ring_destroy(courier->ring);

    Safefree(courier);
    //warn("end courier destroy\n");
}