blob: a34be82361b431f5732f593496c369be11a112c4 [file] [log] [blame]
/**
* @license
* Copyright 2011 The Emscripten Authors
* SPDX-License-Identifier: MIT
*/
var LibraryWget = {
$wget: {
wgetRequests: {},
nextWgetRequestHandle: 0,
getNextWgetRequestHandle: function() {
var handle = wget.nextWgetRequestHandle;
wget.nextWgetRequestHandle++;
return handle;
},
},
emscripten_async_wget__deps: ['$PATH_FS', '$wget', '$callUserCallback', '$Browser',
#if !MINIMAL_RUNTIME
'$runtimeKeepalivePush', '$runtimeKeepalivePop',
#endif
],
emscripten_async_wget__proxy: 'sync',
emscripten_async_wget__sig: 'viiii',
emscripten_async_wget: function(url, file, onload, onerror) {
{{{ runtimeKeepalivePush() }}}
var _url = UTF8ToString(url);
var _file = UTF8ToString(file);
_file = PATH_FS.resolve(_file);
function doCallback(callback) {
if (callback) {
{{{ runtimeKeepalivePop() }}}
callUserCallback(function() {
var stack = stackSave();
{{{ makeDynCall('vi', 'callback') }}}(allocate(intArrayFromString(_file), ALLOC_STACK));
stackRestore(stack);
});
}
}
var destinationDirectory = PATH.dirname(_file);
FS.createPreloadedFile(
destinationDirectory,
PATH.basename(_file),
_url, true, true,
function() {
doCallback(onload);
},
function() {
doCallback(onerror);
},
false, // dontCreateFile
false, // canOwn
function() { // preFinish
// if a file exists there, we overwrite it
try {
FS.unlink(_file);
} catch (e) {}
// if the destination directory does not yet exist, create it
FS.mkdirTree(destinationDirectory);
}
);
},
emscripten_async_wget_data__deps: ['$asyncLoad', 'malloc', 'free', '$callUserCallback',
#if !MINIMAL_RUNTIME
'$runtimeKeepalivePush', '$runtimeKeepalivePop',
#endif
],
emscripten_async_wget_data__proxy: 'sync',
emscripten_async_wget_data__sig: 'viiii',
emscripten_async_wget_data: function(url, arg, onload, onerror) {
{{{ runtimeKeepalivePush() }}}
asyncLoad(UTF8ToString(url), function(byteArray) {
{{{ runtimeKeepalivePop() }}}
callUserCallback(function() {
var buffer = _malloc(byteArray.length);
HEAPU8.set(byteArray, buffer);
{{{ makeDynCall('viii', 'onload') }}}(arg, buffer, byteArray.length);
_free(buffer);
});
}, function() {
if (onerror) {
{{{ runtimeKeepalivePop() }}}
callUserCallback(function() {
{{{ makeDynCall('vi', 'onerror') }}}(arg);
});
}
}, true /* no need for run dependency, this is async but will not do any prepare etc. step */ );
},
emscripten_async_wget2__deps: ['$PATH_FS', '$wget',
#if !MINIMAL_RUNTIME
'$runtimeKeepalivePush', '$runtimeKeepalivePop',
#endif
],
emscripten_async_wget2__proxy: 'sync',
emscripten_async_wget2__sig: 'iiiiiiiii',
emscripten_async_wget2: function(url, file, request, param, arg, onload, onerror, onprogress) {
{{{ runtimeKeepalivePush() }}}
var _url = UTF8ToString(url);
var _file = UTF8ToString(file);
_file = PATH_FS.resolve(_file);
var _request = UTF8ToString(request);
var _param = UTF8ToString(param);
var index = _file.lastIndexOf('/');
var http = new XMLHttpRequest();
http.open(_request, _url, true);
http.responseType = 'arraybuffer';
var handle = wget.getNextWgetRequestHandle();
var destinationDirectory = PATH.dirname(_file);
// LOAD
http.onload = function http_onload(e) {
{{{ runtimeKeepalivePop() }}}
if (http.status >= 200 && http.status < 300) {
// if a file exists there, we overwrite it
try {
FS.unlink(_file);
} catch (e) {}
// if the destination directory does not yet exist, create it
FS.mkdirTree(destinationDirectory);
FS.createDataFile( _file.substr(0, index), _file.substr(index + 1), new Uint8Array(/** @type{ArrayBuffer}*/(http.response)), true, true, false);
if (onload) {
var stack = stackSave();
{{{ makeDynCall('viii', 'onload') }}}(handle, arg, allocate(intArrayFromString(_file), ALLOC_STACK));
stackRestore(stack);
}
} else {
if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status);
}
delete wget.wgetRequests[handle];
};
// ERROR
http.onerror = function http_onerror(e) {
{{{ runtimeKeepalivePop() }}}
if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status);
delete wget.wgetRequests[handle];
};
// PROGRESS
http.onprogress = function http_onprogress(e) {
if (e.lengthComputable || (e.lengthComputable === undefined && e.total != 0)) {
var percentComplete = (e.loaded / e.total)*100;
if (onprogress) {{{ makeDynCall('viii', 'onprogress') }}}(handle, arg, percentComplete);
}
};
// ABORT
http.onabort = function http_onabort(e) {
{{{ runtimeKeepalivePop() }}}
delete wget.wgetRequests[handle];
};
if (_request == "POST") {
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(_param);
} else {
http.send(null);
}
wget.wgetRequests[handle] = http;
return handle;
},
emscripten_async_wget2_data__deps: ['$wget', 'malloc', 'free'],
emscripten_async_wget2_data__proxy: 'sync',
emscripten_async_wget2_data__sig: 'iiiiiiiii',
emscripten_async_wget2_data: function(url, request, param, arg, free, onload, onerror, onprogress) {
var _url = UTF8ToString(url);
var _request = UTF8ToString(request);
var _param = UTF8ToString(param);
var http = new XMLHttpRequest();
http.open(_request, _url, true);
http.responseType = 'arraybuffer';
var handle = wget.getNextWgetRequestHandle();
function onerrorjs() {
if (onerror) {
var statusText = 0;
if (http.statusText) {
var len = lengthBytesUTF8(http.statusText) + 1;
statusText = stackAlloc(len);
stringToUTF8(http.statusText, statusText, len);
}
{{{ makeDynCall('viiii', 'onerror') }}}(handle, arg, http.status, statusText);
}
}
// LOAD
http.onload = function http_onload(e) {
if (http.status >= 200 && http.status < 300 || (http.status === 0 && _url.substr(0,4).toLowerCase() != "http")) {
var byteArray = new Uint8Array(/** @type{ArrayBuffer} */(http.response));
var buffer = _malloc(byteArray.length);
HEAPU8.set(byteArray, buffer);
if (onload) {{{ makeDynCall('viiii', 'onload') }}}(handle, arg, buffer, byteArray.length);
if (free) _free(buffer);
} else {
onerrorjs();
}
delete wget.wgetRequests[handle];
};
// ERROR
http.onerror = function http_onerror(e) {
onerrorjs();
delete wget.wgetRequests[handle];
};
// PROGRESS
http.onprogress = function http_onprogress(e) {
if (onprogress) {{{ makeDynCall('viiii', 'onprogress') }}}(handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0);
};
// ABORT
http.onabort = function http_onabort(e) {
delete wget.wgetRequests[handle];
};
if (_request == "POST") {
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(_param);
} else {
http.send(null);
}
wget.wgetRequests[handle] = http;
return handle;
},
emscripten_async_wget2_abort__deps: ['$wget'],
emscripten_async_wget2_abort__proxy: 'sync',
emscripten_async_wget2_abort__sig: 'vi',
emscripten_async_wget2_abort: function(handle) {
var http = wget.wgetRequests[handle];
if (http) {
http.abort();
}
},
};
mergeInto(LibraryManager.library, LibraryWget);