summaryrefslogtreecommitdiffstats
path: root/templates/html5/app/Frontend/services
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-05-04 20:03:34 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2018-10-15 18:22:20 +0200
commit489f592ccb0b124e709ff26e16da1f745b029032 (patch)
tree90659c16502c079962ec24a73a8c6032380f63fc /templates/html5/app/Frontend/services
parent6a98f8143634a9d6e41457657634d209cc303cf0 (diff)
Use optional pattern argument to search under subdirs
Change-Id: Ic24dee22f0e8353cc7bc9fb6a4698d4d7d762412 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'templates/html5/app/Frontend/services')
0 files changed, 0 insertions, 0 deletions
36' href='#n136'>136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
(function (){'use strict';

  // some default values
  // note that how default values are defined/used may change
  var defaults = {
      token: '123456789',
      api: '/api'
    };

  var CALL = 2;
  var RETOK = 3;
  var RETERR = 4;
  var EVENT = 5;

  var PROTO1 = "x-afb-ws-json1";

  // Definition of the Angular module
  var AfbClientModule = angular.module('AfbClient', []);

  // The instanciation of the module
  AfbClientModule.factory('AfbClient', [ '$location', function ($location) {
    var refid = $location.host();
    var params = $location.search();
    return clients[refid] || (client[refid] = new AfbContext(refid, params));
  }]);

  // prototype for handling context by uuid and token
  function AfbContext(refid, params) {
    this.refid = refid;
    this.api = params.api || defaults.api;
    this.uhttp = params.uhttp || this.api+'/';
    this.uws = params.uws || this.api;
    this.token = params.token || defaults.token;
    this.uuid = params.uuid;
    this.ws = null;
  }

  // prototype of functions linked to AfbContext object
  AfbContext.prototype = {
    // call using websockets
    call: function(method, query) { return getws(this).call(method, query); },

    // call using get
    get: function(method, query) { return $http.get(this.uhttp+method, mixtu(this, query)); },

    // call using post
    post: function(method, query) { return $http.post(this.uhttp+method, mixtu(this, query)); }
  };

  // get the current websocket
  function getws(ctxt) {
    return ctxt.ws || (ctxt.ws = new AfbWebSocket(ctxt));
  }

  // inserts the current token in the answer
  function mixtu(ctxt, query) {
    return ("token" in query) ? query : angular.extend({token:ctxt.token},query);
  }

  // prototype for websocket
  function AfbWebSocket(ctxt) {
    var protos = [ PROTO1 ];
    this.context = ctxt;
    var url = "ws:" + ctxt.refid + ctxt.uws;
    var q = ctxt.uuid ? ("?x-afb-uuid=" + ctxt.uuid) : "";
    if (ctxt.token)
      q = (q ? (q + "&") : "?") + ("x-afb-token=" + ctxt.token);
    this.pendings = {};
    this.awaitens = {};
    this.counter = 0;
    this.ws = new WebSocket(url + q, protos);
    this.ws.onopen = onopen.bind(this);
    this.ws.onerror = onerror.bind(this);
    this.ws.onclose = onclose.bind(this);
    this.ws.onmessage = onmessage.bind(this);
    this.onopen = onopen;
    this.onabort = onabort;
  }

  AfbWebSocket.prototype = {
    call: function(method, query) {
        return new Promise((function(resolve, reject){
          var id = String(this.counter = 4095 & (this.counter + 1));
          while (id in this.pendings) id = String(this.counter = 4095 & (this.counter + 1));
          this.pendings[id] = [ resolve, reject ];
          var arr = [CALL, id, method, request ];
          var tok = this.context.token; if (tok) arr.push(tok);
          this.ws.send(angular.toJson(arr, 0));
        }).bind(this));
      },
    addEvent: function (name, handler) {
        (this.awaitens[name] || (this.awaitens[name] = [])).push(handler);
      },
    removeEvent: function (name, handler) {
        var a = this.awaitens[name];
        if (a) {
          var i = a.indexOf(handler);
          if (i >= 0) a.splice(i, 1);
        }
      }

  };

  function onmessage(ev) {
    var obj = angular.fromJson(ev.data);
    var id = obj[1];
    var ans = obj[2];
    if (obj[3])
      this.context.token = obj[3];
    switch (obj[0]) {
    case RETOK:  reply(this.pendings, id, ans, 0); break; 
    case RETERR: reply(this.pendings, id, ans, 1); break; 
    case EVENT:   fire(this.awaitens, id, ans);    break; 

    }
  }

  function fire(awaitens, name, data) {
    var a = awaitens[name];
    if (a) a.forEach(function(handler){handler(data);});
    var i = name.indexOf("/");
    if (i >= 0) {
      a = awaitens[name.substring(0,i)];
      if (a) a.forEach(function(handler){handler(data);});
    }
    a = awaitens["*"];
    if (a) a.forEach(function(handler){handler(data);});
  }

  function reply(pendings, id, ans, offset) {
    if (id in pendings) {
      var p = pendings[id];
      delete pendings[id];
      var f = p[offset];
      if (f) f(ans);
    }
  }




/*






	AFB_websocket = function(onopen, onabort) {
	}

	function onerror(event) {
		var f = this.onabort;
		if (f) {
			delete this.onopen;
			delete this.onabort;
			f && f(this);
		}
		this.onerror && this.onerror(this);
	}

	function onopen(event) {
		var f = this.onopen;
		delete this.onopen;
		delete this.onabort;
		f && f(this);
	}

	function onclose(event) {
		for (var id in this.pendings) {
			var ferr = this.pendings[id].onerror;
			ferr && ferr(null, this);
		}
		this.pendings = {};
		this.onclose && this.onclose();
	}

	function close() {
		this.ws.close();
	}

	function call(method, request) {
	}

*/

/*
  // Factory is a singleton and share its context within all instances.
  AfbClientModule.factory('AppCall', function ($http, AppConfig, $log) {
    var myCalls = {
      get : function(plugin, action, query, callback) {
        if (!query.token) query.token = AppConfig.session.token; // add token to provided query
        $http.get('/api/' + plugin + '/' + action , {params: query}).then (callback, callback);
      }
    };
    return myCalls;
  });
*/





})();