quic
Version:
A QUIC server/client implementation in Node.js.
54 lines • 1.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// **Github:** https://github.com/fidm/quic
//
// **License:** MIT
const dgram_1 = require("dgram");
const symbol_1 = require("./internal/symbol");
const error_1 = require("./internal/error");
const common_1 = require("./internal/common");
const constant_1 = require("./internal/constant");
class SocketState {
constructor() {
this.exclusive = true;
this.destroyed = false;
this.conns = new Map();
}
}
exports.SocketState = SocketState;
function createSocket(family) {
const socket = dgram_1.createSocket(family === 6 ? 'udp6' : 'udp4');
const state = new SocketState();
socket.once('close', () => {
state.destroyed = true;
socket.removeAllListeners();
});
Object.assign(socket, { [symbol_1.kState]: state });
return socket;
}
exports.createSocket = createSocket;
const bufferPool = [];
function sendPacket(socket, packet, remotePort, remoteAddr, callback) {
const byteLen = packet.byteLen();
if (byteLen > constant_1.MaxReceivePacketSize) {
return callback(new error_1.QuicError('packet size too large!'));
}
if (socket[symbol_1.kState].destroyed) {
return callback(new error_1.QuicError('socket destroyed!'));
}
let bufv = bufferPool.shift();
if (bufv == null) {
bufv = new common_1.BufferVisitor(Buffer.alloc(constant_1.MaxReceivePacketSize));
}
else {
bufv.reset();
}
packet.writeTo(bufv);
socket.send(bufv.buf, 0, bufv.end, remotePort, remoteAddr, (err) => {
packet.sentTime = Date.now();
bufferPool.push(bufv);
callback(error_1.QuicError.checkAny(err));
});
}
exports.sendPacket = sendPacket;
//# sourceMappingURL=socket.js.map