- Initial commit
This commit is contained in:
191
Runtime/Plugins/WebGL/BestHTTP_WebSocket.jslib
Normal file
191
Runtime/Plugins/WebGL/BestHTTP_WebSocket.jslib
Normal file
@ -0,0 +1,191 @@
|
||||
// https://docs.unity3d.com/6000.0/Documentation/Manual/web-interacting-browser-deprecated.html
|
||||
// Deprecated code | Replacement code
|
||||
// -----------------+-----------------
|
||||
// dynCall() | makeDynCall()
|
||||
|
||||
var Lib_BEST_HTTP_WebGL_WS_Bridge =
|
||||
{
|
||||
$ws: {
|
||||
webSocketInstances: {},
|
||||
nextInstanceId : 1,
|
||||
/*UTF8Decoder: new TextDecoder('utf8'),*/
|
||||
|
||||
Set : function(socket) {
|
||||
ws.webSocketInstances[ws.nextInstanceId] = socket;
|
||||
return ws.nextInstanceId++;
|
||||
},
|
||||
|
||||
Get : function(id) {
|
||||
return ws.webSocketInstances[id];
|
||||
},
|
||||
|
||||
Remove: function(id) {
|
||||
delete ws.webSocketInstances[id];
|
||||
},
|
||||
|
||||
_callOnClose: function(onClose, id, code, reason)
|
||||
{
|
||||
var length = lengthBytesUTF8(reason) + 1;
|
||||
var buffer = _malloc(length);
|
||||
|
||||
stringToUTF8Array(reason, HEAPU8, buffer, length);
|
||||
|
||||
{{{ makeDynCall('viii', 'onClose') }}}(id, code, buffer);
|
||||
|
||||
_free(buffer);
|
||||
},
|
||||
|
||||
_callOnError: function(errCallback, id, reason)
|
||||
{
|
||||
var length = lengthBytesUTF8(reason) + 1;
|
||||
var buffer = _malloc(length);
|
||||
|
||||
stringToUTF8Array(reason, HEAPU8, buffer, length);
|
||||
|
||||
{{{ makeDynCall('vii', 'errCallback') }}}(id, buffer);
|
||||
|
||||
_free(buffer);
|
||||
}
|
||||
},
|
||||
|
||||
WS_Create: function(url, protocol, onOpen, onText, onBinary, onError, onClose, allocator)
|
||||
{
|
||||
var urlStr = new URL(UTF8ToString(url)); ///*encodeURI*/(UTF8ToString(url)).replace(/\+/g, '%2B').replace(/%252[fF]/ig, '%2F');
|
||||
var proto = UTF8ToString(protocol);
|
||||
|
||||
console.log('WS_Create(' + urlStr + ', "' + proto + '")');
|
||||
|
||||
var socket = {
|
||||
onError: onError,
|
||||
onClose: onClose
|
||||
};
|
||||
|
||||
if (proto == '')
|
||||
socket.socketImpl = new WebSocket(urlStr);
|
||||
else
|
||||
socket.socketImpl = new WebSocket(urlStr, proto.trim().split(","));
|
||||
|
||||
var id = ws.nextInstanceId;
|
||||
socket.socketImpl.binaryType = "arraybuffer";
|
||||
|
||||
socket.socketImpl.onopen = function(e) {
|
||||
console.log(id + ' WS_Create - onOpen');
|
||||
|
||||
{{{ makeDynCall('vi', 'onOpen') }}}(id);
|
||||
};
|
||||
|
||||
const encoder = new TextEncoder();
|
||||
socket.socketImpl.onmessage = function (e)
|
||||
{
|
||||
// Binary?
|
||||
if (e.data instanceof ArrayBuffer)
|
||||
{
|
||||
var byteArray = new Uint8Array(e.data);
|
||||
const array = {{{ makeDynCall('iii', 'allocator') }}}(id, byteArray.length);
|
||||
|
||||
const numArr = HEAPU8.subarray(array, array + 4);
|
||||
const originalLength = (numArr[0] << 24) | (numArr[1] << 16) | (numArr[2] << 8) | (numArr[3]);
|
||||
HEAPU8.set(byteArray, array);
|
||||
|
||||
{{{ makeDynCall('viiii', 'onBinary') }}}(id, array, originalLength, byteArray.length);
|
||||
}
|
||||
else // Text
|
||||
{
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/encodeInto#buffer_sizing
|
||||
// "If the output allocation (typically within Wasm heap) is expected to be short-lived, it makes sense to allocate s.length * 3 bytes for the output,
|
||||
// in which case the first conversion attempt is guaranteed to convert the whole string."
|
||||
const length = e.data.length * 3;
|
||||
const array = {{{ makeDynCall('iii', 'allocator') }}}(id, length);
|
||||
|
||||
const numArr = HEAPU8.subarray(array, array + 4);
|
||||
const originalLength = (numArr[0] << 24) | (numArr[1] << 16) | (numArr[2] << 8) | (numArr[3]);
|
||||
const ret = encoder.encodeInto(e.data, HEAPU8.subarray(array));
|
||||
|
||||
{{{ makeDynCall('viiii', 'onText') }}}(id, array, originalLength, ret.written);
|
||||
}
|
||||
};
|
||||
socket.socketImpl.onclose = function (e) {
|
||||
console.log(id + ' WS_Create - onClose ' + e.code + ' ' + e.reason);
|
||||
|
||||
ws._callOnClose(onClose, id, e.code, e.reason);
|
||||
};
|
||||
|
||||
return ws.Set(socket);
|
||||
},
|
||||
|
||||
WS_GetState: function (id)
|
||||
{
|
||||
var socket = ws.Get(id);
|
||||
|
||||
if (typeof socket === 'undefined' ||
|
||||
socket == null ||
|
||||
typeof socket.socketImpl === 'undefined' ||
|
||||
socket.socketImpl == null)
|
||||
return 3; // closed
|
||||
|
||||
return socket.socketImpl.readyState;
|
||||
},
|
||||
|
||||
WS_GetBufferedAmount: function (id)
|
||||
{
|
||||
var socket = ws.Get(id);
|
||||
return socket.socketImpl.bufferedAmount;
|
||||
},
|
||||
|
||||
WS_Send_String: function (id, ptr, pos, length)
|
||||
{
|
||||
var socket = ws.Get(id);
|
||||
|
||||
var startPtr = ptr + pos;
|
||||
var endPtr = startPtr + length;
|
||||
|
||||
var UTF8Decoder = new TextDecoder('utf8');
|
||||
var str = UTF8Decoder.decode(HEAPU8.subarray ? HEAPU8.subarray(startPtr, endPtr) : new Uint8Array(HEAPU8.slice(startPtr, endPtr)));
|
||||
|
||||
try
|
||||
{
|
||||
socket.socketImpl.send(str);
|
||||
}
|
||||
catch(e) {
|
||||
ws._callOnError(socket.onError, id, ' ' + e.name + ': ' + e.message);
|
||||
}
|
||||
|
||||
return socket.socketImpl.bufferedAmount;
|
||||
},
|
||||
|
||||
WS_Send_Binary: function(id, ptr, pos, length)
|
||||
{
|
||||
var socket = ws.Get(id);
|
||||
|
||||
try
|
||||
{
|
||||
var buff = HEAPU8.subarray(ptr + pos, ptr + pos + length);
|
||||
socket.socketImpl.send(buff /*HEAPU8.buffer.slice(ptr + pos, ptr + pos + length)*/);
|
||||
}
|
||||
catch(e) {
|
||||
ws._callOnError(socket.onError, id, ' ' + e.name + ': ' + e.message);
|
||||
}
|
||||
|
||||
return socket.socketImpl.bufferedAmount;
|
||||
},
|
||||
|
||||
WS_Close: function (id, code, reason)
|
||||
{
|
||||
var socket = ws.Get(id);
|
||||
var reasonStr = UTF8ToString(reason);
|
||||
|
||||
console.log(id + ' WS_Close(' + code + ', ' + reasonStr + ')');
|
||||
|
||||
socket.socketImpl.close(/*ulong*/code, reasonStr);
|
||||
},
|
||||
|
||||
WS_Release: function(id)
|
||||
{
|
||||
console.log(id + ' WS_Release');
|
||||
|
||||
ws.Remove(id);
|
||||
}
|
||||
};
|
||||
|
||||
autoAddDeps(Lib_BEST_HTTP_WebGL_WS_Bridge, '$ws');
|
||||
mergeInto(LibraryManager.library, Lib_BEST_HTTP_WebGL_WS_Bridge);
|
||||
39
Runtime/Plugins/WebGL/BestHTTP_WebSocket.jslib.meta
Normal file
39
Runtime/Plugins/WebGL/BestHTTP_WebSocket.jslib.meta
Normal file
@ -0,0 +1,39 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8efe6cedf2832a647a33465b85e4f311
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
WebGL: WebGL
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 268757
|
||||
packageName: Best WebSockets
|
||||
packageVersion: 3.0.7
|
||||
assetPath: Packages/com.tivadar.best.websockets/Runtime/Plugins/WebGL/BestHTTP_WebSocket.jslib
|
||||
uploadId: 737284
|
||||
Reference in New Issue
Block a user