nodejs-slikenet
Version:
Node.js native addon for SLikeNet networking library with improved thread management architecture
191 lines (165 loc) • 5.43 kB
JavaScript
const EventEmitter = require('events');
const slikenet = require('./build/Release/slikenet');
class SlikeNetPeer extends EventEmitter {
constructor() {
super();
this.peer = slikenet.createPeer();
this.isInitialized = false;
this.isStarted = false;
// Set up event callbacks that will emit events
this.setupEventCallbacks();
}
/**
* Setup event callbacks that emit events
*/
setupEventCallbacks() {
// Connection callback
slikenet.setConnectCallback(this.peer, () => {
console.log('Connected to server');
this.emit('connect');
});
// Disconnection callback
slikenet.setDisconnectCallback(this.peer, () => {
console.log('Disconnected from server');
this.emit('disconnect');
});
}
/**
* Initialize the peer
* @param {number} maxConnections - Maximum number of connections
* @returns {boolean} Success status
*/
initialize(maxConnections = 32) {
if (this.isInitialized) {
console.warn('Peer already initialized');
return true;
}
this.isInitialized = slikenet.initializePeer(this.peer);
return this.isInitialized;
}
/**
* Startup the peer
* @param {number} maxConnections - Maximum number of connections
* @param {number} maxIncomingConnections - Maximum incoming connections
* @returns {boolean} Success status
*/
startup(maxConnections = 32, maxIncomingConnections = 0) {
if (!this.isInitialized) {
console.error('Peer must be initialized first');
return false;
}
if (this.isStarted) {
console.warn('Peer already started');
return true;
}
this.isStarted = slikenet.startupPeer(this.peer, maxConnections, maxIncomingConnections);
return this.isStarted;
}
/**
* Connect to a server
* @param {string} host - Server hostname or IP
* @param {number} port - Server port
* @returns {number} Connection result code
*/
connect(host, port) {
if (!this.isStarted) {
console.error('Peer must be started first');
return -1;
}
return slikenet.connectPeer(this.peer, host, port);
}
/**
* Check if connected
* @returns {boolean} Connection status
*/
isConnected() {
return slikenet.isConnected(this.peer);
}
/**
* Send data
* @param {string|Buffer} data - Data to send
* @returns {boolean} Success status
*/
send(data) {
if (!this.isStarted) {
console.error('Peer must be started first');
return false;
}
return slikenet.sendData(this.peer, data);
}
/**
* Listen for specific packet ID
* @param {number} packetID - Packet ID to listen for
* @param {function} handler - Handler function for the packet
*/
listen(packetID, handler) {
if (typeof packetID !== 'number' || packetID < 0 || packetID > 255) {
throw new Error('packetID must be a number between 0 and 255');
}
if (typeof handler !== 'function') {
throw new Error('handler must be a function');
}
slikenet.listen(this.peer, packetID, handler);
}
/**
* Remove listener for specific packet ID
* @param {number} packetID - Packet ID to remove listener from
* @param {function} handler - Handler function to remove
*/
removeListener(packetID, handler) {
if (typeof packetID !== 'number' || packetID < 0 || packetID > 255) {
throw new Error('packetID must be a number between 0 and 255');
}
slikenet.removeListener(this.peer, packetID, handler);
}
/**
* Remove all listeners
*/
removeAllListeners() {
slikenet.removeAllListeners(this.peer);
}
/**
* Get connection state
* @returns {number} Connection state (0 = disconnected, 1 = connected)
*/
getConnectionState() {
return slikenet.getConnectionState(this.peer);
}
/**
* Get connection statistics
* @returns {string} Statistics string
*/
getStatistics() {
return slikenet.getStatistics(this.peer);
}
/**
* Shutdown the peer
*/
shutdown() {
if (this.isStarted) {
slikenet.shutdownPeer(this.peer);
this.isStarted = false;
}
this.isInitialized = false;
// Remove all event listeners
this.removeAllListeners();
}
}
// Export the class and raw functions
module.exports = {
SlikeNetPeer,
createPeer: slikenet.createPeer,
initializePeer: slikenet.initializePeer,
startupPeer: slikenet.startupPeer,
shutdownPeer: slikenet.shutdownPeer,
connectPeer: slikenet.connectPeer,
isConnected: slikenet.isConnected,
sendData: slikenet.sendData,
listen: slikenet.listen,
removeListener: slikenet.removeListener,
removeAllListeners: slikenet.removeAllListeners,
getStatistics: slikenet.getStatistics,
getConnectionState: slikenet.getConnectionState,
setConnectCallback: slikenet.setConnectCallback,
setDisconnectCallback: slikenet.setDisconnectCallback
};