view Platforms/Wasm/WasmWebService.js @ 700:059e1fd05fd6 refactor-viewport-controller

Introduced the ViewportController that sits between the application and the Scene2D to handle the trackers and measuring tools. This is a work in progress. The Scene2D is no longer an observable. Message sending is managed by the ViewportController. Move some refs to shared and weak to prevent lifetime issues.
author Benjamin Golinvaux <bgo@osimis.io>
date Sun, 19 May 2019 16:26:17 +0200
parents 1b9973905e15
children 861c080ef47b
line wrap: on
line source

mergeInto(LibraryManager.library, {
  WasmWebService_GetAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) {
    // Directly use XMLHttpRequest (no jQuery) to retrieve the raw binary data
    // http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
    var xhr = new XMLHttpRequest();
    var url_ = UTF8ToString(url);
    var headersInJsonString_ = UTF8ToString(headersInJsonString);

    xhr.open('GET', url_, true);
    xhr.responseType = 'arraybuffer';
    xhr.timeout = timeoutInSeconds * 1000;
    var headers = JSON.parse(headersInJsonString_);
    for (var key in headers) {
      xhr.setRequestHeader(key, headers[key]);
    }
    //console.log(xhr); 
    xhr.onreadystatechange = function() {
      if (this.readyState == XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
          var s = xhr.getAllResponseHeaders();
          var headers = _malloc(s.length + 1);
          stringToUTF8(s, headers, s.length + 1);
          
          // TODO - Is "new Uint8Array()" necessary? This copies the
          // answer to the WebAssembly stack, hence necessitating
          // increasing the TOTAL_STACK parameter of Emscripten
          window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response),
                                       this.response.byteLength, headers, payload);
        } else {
          window.WasmWebService_NotifyError(callableFailure, url_, payload);
        }
      }
    }
    
    xhr.send();
  },

  WasmWebService_ScheduleLaterCachedSuccessNotification: function (brol) {
    setTimeout(function() {
      window.WasmWebService_NotifyCachedSuccess(brol);
    }, 0);
  },

  WasmWebService_PostAsync: function(callableSuccess, callableFailure, url, headersInJsonString, body, bodySize, payload, timeoutInSeconds) {
    var xhr = new XMLHttpRequest();
    var url_ = UTF8ToString(url);
    var headersInJsonString_ = UTF8ToString(headersInJsonString);
    xhr.open('POST', url_, true);
    xhr.timeout = timeoutInSeconds * 1000;
    xhr.responseType = 'arraybuffer';
    xhr.setRequestHeader('Content-type', 'application/octet-stream');

    var headers = JSON.parse(headersInJsonString_);
    for (var key in headers) {
      xhr.setRequestHeader(key, headers[key]);
    }
    
    xhr.onreadystatechange = function() {
      if (this.readyState == XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
          var s = xhr.getAllResponseHeaders();
          var headers = _malloc(s.length + 1);
          stringToUTF8(s, headers, s.length + 1);

          window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response),
                                       this.response.byteLength, headers, payload);
        } else {
          window.WasmWebService_NotifyError(callableFailure, url_, payload);
        }
      }
    }

    xhr.send(new Uint8ClampedArray(HEAPU8.buffer, body, bodySize));
  },

  WasmWebService_DeleteAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) {
    var xhr = new XMLHttpRequest();
    var url_ = UTF8ToString(url);
    var headersInJsonString_ = UTF8ToString(headersInJsonString);
    xhr.open('DELETE', url_, true);
    xhr.timeout = timeoutInSeconds * 1000;
    xhr.responseType = 'arraybuffer';
    xhr.setRequestHeader('Content-type', 'application/octet-stream');
  
    var headers = JSON.parse(headersInJsonString_);
    for (var key in headers) {
      xhr.setRequestHeader(key, headers[key]);
    }
    
    xhr.onreadystatechange = function() {
      if (this.readyState == XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
          var s = xhr.getAllResponseHeaders();
          var headers = _malloc(s.length + 1);
          stringToUTF8(s, headers, s.length + 1);

          window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response),
                                       this.response.byteLength, headers, payload);
        } else {
          window.WasmWebService_NotifyError(callableFailure, url_, payload);
        }
      }
    }
  
    xhr.send();
  }
  
});