chicken_dy/Assets/WX-WASM-SDK/Plugins/UDP.jslib

110 lines
3.2 KiB
Plaintext
Raw Normal View History

2022-08-01 03:47:37 +00:00
var UDPSocketLibrary =
{
$udpSocketManager:
{
/*
* Map of instances
*
* Instance structure:
* {
* url: string,
* ws: WebSocket
* }
*/
instances: {},
/* Last instance ID */
lastId: 0,
/* Event listeners */
onOpen: null,
onMessage: null,
onError: null,
onClose: null,
},
WXCreateUDPSocket: function (server, remotePort, localPort) {
var instanceId = ++udpSocketManager.lastId;
var udpSocket = wx.createUDPSocket();
if (localPort == 0) {
localPort = udpSocket.bind()
} else {
udpSocket.bind(localPort)
}
var instance = {
instanceId: instanceId,
socket: udpSocket,
server: UTF8ToString(server),
remotePort: remotePort,
localPort: localPort,
OnMessage: (function (res) {
if (udpSocketManager.onMessage) {
var dataBuffer = new Uint8Array(res.message);
var buffer = _malloc(dataBuffer.length);
HEAPU8.set(dataBuffer, buffer);
Module.dynCall_viii(udpSocketManager.onMessage, instanceId, buffer, dataBuffer.length);
_free(buffer)
}
}),
OnError: (function (res) {
if (udpSocketManager.onError) {
var msg = res.errMsg;
console.log("udp socket on error " + instanceId + " " + msg);
var length = lengthBytesUTF8(msg) + 1;
var buffer = _malloc(length);
stringToUTF8(msg, buffer, length);
Module.dynCall_vii(udpSocketManager.onError, instanceId, buffer);
_free(buffer)
}
}),
OnClose: (function (res) {
if (udpSocketManager.onClose) {
Module.dynCall_vi(udpSocketManager.onClose, instanceId)
}
})
};
udpSocket.onMessage(instance.OnMessage);
udpSocket.onError(instance.OnError);
udpSocket.onClose(instance.OnClose);
udpSocketManager.instances[instanceId] = instance;
return instanceId
},
WXSendUDPSocket: function (instanceId, bufferPtr, offset, length) {
var instance = udpSocketManager.instances[instanceId];
if (instance && instance.socket) {
instance.socket.send({
address: instance.server,
port: instance.remotePort,
message: buffer.slice(bufferPtr + offset, bufferPtr + length)
})
} else {
console.log("udp socket instance not found " + instanceId)
}
},
WXCloseUDPSocket: function (instanceId) {
var instance = udpSocketManager.instances[instanceId];
if (instance && instance.socket) {
instance.socket.close();
instance.socket = null;
delete udpSocketManager.instances[instanceId]
} else {
console.log("udp socket instance not found " + instanceId)
}
},
WXUDPSocketSetOnMessage: function (callback) {
udpSocketManager.onMessage = callback
},
WXUDPSocketSetOnClose: function (callback) {
udpSocketManager.onClose = callback
},
WXUDPSocketSetOnError: function (callback) {
udpSocketManager.onError = callback
}
};
autoAddDeps(UDPSocketLibrary, '$udpSocketManager');
mergeInto(LibraryManager.library, UDPSocketLibrary);