##// END OF EJS Templates
added provided and configure methods to the fluent container configuration, added applyConfig method to the container
added provided and configure methods to the fluent container configuration, added applyConfig method to the container

File last commit:

r63:fb1f84f91895 default
r142:be7edf08a115 v1.4.0-rc3 default
Show More
Session.js
211 lines | 7.2 KiB | application/javascript | JavascriptGenshiLexer
define([
"dojo/_base/declare",
"dojo/request",
"./Destination",
"dojo/Evented",
"dojo/Deferred",
"../log/_LogMixin"
], function (declare, request, Destination, Evented, Deferred, _LogMixin) {
var cls = declare(
[Evented, _LogMixin], {
_id: null,
_baseUrl: null,
_destinations: null,
_timeout: 100000,
_clients: null,
_started: null,
_starting: false,
constructor: function (baseUrl, options) {
if (!baseUrl)
throw new Error("baseUrl is required");
options = options || {};
this._baseUrl = baseUrl.replace(/\/*$/, "");
this._destinations = {};
this._pending = [];
this._clients = {};
if (options.timeout)
this._timeout = options.timeout;
this._started = new Deferred();
},
start: function () {
if (this._starting)
return this._started;
this._starting = true;
var me = this;
me.log("START");
request(this._baseUrl, {
method: "POST",
handleAs: "json"
}).then(function (result) {
me._id = result;
me._emitConnected();
me._poll();
me._started.resolve(me);
}, function (error) {
me._emitError(error);
me._started.reject(me);
});
return me._started.promise;
},
createClient: function (options) {
if (!options || !options.destination || !options.mode)
throw new Error("Invalid argument");
var me = this;
return me._started
.then(function () {
var url = me._makeUrl(me._id);
me.log(
"CREATE mode=${0}, destination=${1}",
options.mode,
options.destination);
return request(url, {
method: "POST",
data: {
mode: options.mode,
destination: options.destination
},
handleAs: 'json'
})
.then(function (id) {
me.log(
"CLIENT id=${0}, mode=${1}, destination=${2}",
id,
options.mode,
options.destination);
me._clients[id] = options.client ?
options.client :
function () {
me.warn(
"The client id=${0}, mode=${1}, destination=${2} isn't accepting mesages",
id,
options.mode,
options.destination);
};
return id;
});
});
},
deleteClient: function (options) {
if (!options || !options.clientId)
throw new Error("Invalid argument");
var me = this,
id = options.clientId;
return me._started.then(function () {
var url = me._makeUrl(me._id, options.clientId);
me.log("DELETE CLIENT ${0}", options.clientId);
return request(url, {
method: "DELETE",
handleAs: 'json'
}).then(function () {
me.log("CLIENT DELETED ${0}", options.clientId);
me._clients[id] = undefined;
});
});
},
_poll: function () {
var me = this,
url = this._makeUrl(this._id);
me.log("POLL timeout=${0}", me._timeout);
request(url, {
method: "GET",
handleAs: "json",
query: {
timeout: me._timeout
}
}).then(function (response) {
me._handlePoll(response);
me._poll();
}, function (err) {
me.error("POLL faield with ${0}", err);
me._emitError(err);
});
},
_handlePoll: function (response) {
if (!response) {
this.log("POLL response undefined, looks like a bug");
return;
}
if (!response.results || !response.results.length) {
this.log("POLL response is empty");
return;
}
var results = response.results;
this.log("POLL got ${0} results", results.length);
for (var i = 0; i < results.length; i++) {
var result = results[i];
var client = this._clients[result.clientId];
if (!client) {
// TODO this could happen due to client isn't
// registered yet
this.error("Unknown client ${0}", result.clientId);
continue;
}
client.call(this, result);
}
},
_emitError: function (err) {
this.emit("error", err);
},
_emitConnected: function () {
var me = this;
me.log("CONNECTED");
me.emit("connected");
},
_makeUrl: function () {
var parts = [this._baseUrl];
for (var i = 0; i < arguments.length; i++)
parts.push(arguments[i].replace(/\/*$/, ""));
return parts.join('/');
},
queue: function (name) {
return this._getDestination("queue://" + name);
},
topic: function (name) {
return this._getDestination("topic://" + name);
},
_getDestination: function (uri) {
if (uri in this._destinations)
return this._destinations[uri];
var dest = new Destination(this, uri);
this._destinations[uri] = dest;
return dest;
},
toString: function () {
return ["[", "SESSION ", this._id, "]"].join(" ");
}
});
cls.connect = function (url, options) {
var session = new cls(url, options);
return session.start();
};
return cls;
});