Engine.JSONRequest = class
{
constructor()
{
this.Variables = {};
this.baseURL = EngineSettings.WebRoot + "post.php?";
this.callback = null;
this.lastURL = "";
this.JSONResult = {};
this.requestStartTime = 0;
this.lastProgressTime = 0;
this.retryTimes = 2;
this.showErrors = true;
this.wwwRequest = null;
this.timeoutTime = 15;
this.defaultTimeoutTime = 15;
this.webRequestReturnedText = "";
}
getJSON() { return this.JSONResult; }
makeBuiltRequest(callback, loadingMessage, messageDelay)
{
if (loadingMessage === undefined) loadingMessage = "";
if (messageDelay === undefined) messageDelay = 0;
this.timeoutTime = this.defaultTimeoutTime;
this.requestStartTime = Engine.Utils.getTimer();
this.lastProgressTime = Engine.Utils.getTimer();
this.retryTimes = 2;
this.callback = callback;
this.makeBuiltRequestInternal();
Engine.EnterFrameManagerInstance.add(this, this.checkComplete);
this.loadingBox = null;
if (loadingMessage != "") this.loadingBox = Engine.DialogManagerInstance.showLoadingTextBox(loadingMessage, messageDelay, true, false);
}
makeBuiltRequestInternal()
{
if (this.wwwRequest != null) this.wwwRequest.abort();
var urlParams = "";
this.Variables["timestamp"] = "" + Engine.JSONRequest.calculateTimeStamp();
if (!this.Variables.containsKey("request_id")) this.Variables["request_id"] = "" + Engine.JSONRequest.getIncrementingID();
var defaults = EngineSettings.JSONDefaults;
for(var key in defaults)
{
this.Variables[key] = defaults[key];
}
this.Variables["network_id"] = "" + GameSettings.platform;
for(var key in this.Variables)
{
urlParams += encodeURIComponent(key) + "=" + encodeURIComponent(this.Variables[key]) + "&";
}
if (!this.Variables["call"] || this.Variables["call"] != "saveuserdetails")
{
this.wwwRequest = new Engine.WebRequest();
this.wwwRequest.onProgress = (request, downloaded, downloadLength) => this.onDownloadProgress(request, downloaded, downloadLength);
this.wwwRequest.makeRequest(this.baseURL + urlParams, () => { this.onRequestFinished(this.wwwRequest); } );
}
else
{
this.wwwRequest = new Engine.WebRequest();
this.wwwRequest.onProgress = (request, downloaded, downloadLength) => this.onDownloadProgress(request, downloaded, downloadLength);
this.wwwRequest.makePostRequest(this.baseURL, urlParams, () => { this.onRequestFinished(this.wwwRequest); } );
}
Debug.Log("JSON Request: " + this.baseURL + urlParams);
this.lastParams = urlParams;
}
onDownloadProgress(originalRequest, downloaded, downloadLength)
{
var progressPercent = (downloaded / downloadLength) * 100;
//if (this.progressCallback != null) progressCallback(new WebRequestProgressInfo(downloaded, downloadLength));
//Debug.Log("Progress: " + progressPercent);
this.lastProgressTime = Engine.Utils.getTimer();
}
onRequestFinished(webrequest)
{
this.JSONResult = webrequest.data;
this.completeRequest();
}
retry()
{
this.requestStartTime = Engine.Utils.getTimer();
this.lastProgressTime = Engine.Utils.getTimer();
this.retryTimes--;
this.timeoutTime *= 2;
if (this.loadingBox != null) this.loadingBox.show("Retrying Request");
this.makeBuiltRequestInternal();
}
checkComplete(timeElapsed)
{
//Debug.Log("" + this.Variables["request_id"] + " - " + this.requestTime);
//this.requestTime += timeElapsed;
var totalRequestTime = (Engine.Utils.getTimer() - this.requestStartTime) / 1000;
var timeSinceProgress = (Engine.Utils.getTimer() - this.lastProgressTime) / 1000;
if (!this.complete && timeSinceProgress > this.timeoutTime)
{
if (this.retryTimes > 0)
{
this.retry();
}
else if (this.showErrors)
{
this.JSONResult["failure_reason"] = "Request Timed Out.\nCheck your Internet Connection and Retry.";
this.completeRequest();
}
}
}
completeRequest()
{
Engine.EnterFrameManagerInstance.remove(this);
if (this.loadingBox != null) this.loadingBox.hide();
if (this.callback != null) this.callback(this);
}
static setTimeStamp(serverValue)
{
if (!JSONRequestStatics.TimeStampSet)
{
var now = Math.floor(new Date().getTime() / 1000);
JSONRequestStatics.TimeStampSet = true;
JSONRequestStatics.TimeStampStart = now;
JSONRequestStatics.TimeStampDelta = serverValue;
}
}
static calculateTimeStamp()
{
var now = Math.floor(new Date().getTime() / 1000);
var diff = Math.floor(now - JSONRequestStatics.TimeStampStart);
return diff + JSONRequestStatics.TimeStampDelta;
}
static getIncrementingID()
{
if (!JSONRequestStatics.isIdSet)
{
JSONRequestStatics.uniqueId = Math.floor(Math.random() * 2147483647);
JSONRequestStatics.isIdSet = true;
}
return JSONRequestStatics.uniqueId++;
}
static resetIncrementingID()
{
JSONRequestStatics.uniqueId = Math.floor(Math.random() * 2147483647);
JSONRequestStatics.isIdSet = true;
}
}
var JSONRequestStatics = {
uniqueId:0,
isIdSet: false,
TimeStampSet: false,
TimeStampStart: 0,
TimeStampDelta: 0
};