function Donna(options) {
// Merge options and defaults
options = typeof options === "undefined" ? {} : options;
this.config = _.cloneDeep(Donna.prototype.defaultOptions);
_.merge(this.config, new Config());
_.merge(this.config, options);
this.init();
return this;
}n/a
function InputEntity(params) {
// senseTypes, dataTypes, data, context
this.senseTypes = params.senseTypes || [];
this.dataTypes = params.dataTypes || [];
this.data = params.data || {};
this.context = params.context || {};
}n/a
function IntentEntity(params) {
this.setInput(params.input || null);
this.setIntent(params.intent || null);
this.setEntities(params.entities || {});
this.setConfidence(params.confidence || 0.0);
}n/a
function OutputEntity(params) {
this.setIntent(params.intent || null);
this.setSources(params.sources || []);
this.setDataTypes(params.dataTypes || []);
this.setData(params.data || {});
}n/a
createInputEntity = function () {
return new F(arguments);
}...
// Speech to Input (Speech recognition)
// donna.registerSense(function(donna) {
//
// });
var inputEntityFromWit = function(donna, resp) {
// Create InputEntity instance
var input = donna.createInputEntity({
senseTypes: [],
dataTypes: [],
data: {},
context: {}
});
return input;
...createIntentEntity = function () {
return new F(arguments);
}...
"value": "New York"
}
]
},
"confidence": 1
}
*/
var intent = donna.createIntentEntity({
input: input,
intent: outcome.intent,
entities: outcome.entities,
confidence: outcome.confidence
});
return intent;
};
...createOutputEntity = function () {
return new F(arguments);
}n/a
function InputRouter(donna) {
this.donna = donna;
donna.logger.info("InputRouter constructor");
// Initialize Event Emitters
this.dataTypesEmitter = new EventEmitter();
this.InputEntity = donna.constructor.InputEntity;
}n/a
function IntentRouter(donna) {
this.donna = donna;
donna.logger.verbose("IntentRouter constructor");
// Initialize Event Emitter
this.emitter = new EventEmitter();
this.IntentEntity = donna.constructor.IntentEntity;
}...
for (var i = 0, len=outcomes.length; i<len; i++) {
var outcome = outcomes[i];
// Normalize to Intent entity
var intent = intentEntityFromWit(donna, input, outcome);
// Save intent
intents.push(intent);
// Send intent
donna.intent(intent);
}
// Return
return cb(null, intents);
}
});
});
...function OutputRouter(donna) {
this.donna = donna;
donna.logger.info("OutputRouter constructor");
// Initialize Event Emitters
this.emitter = new EventEmitter();
this.OutputEntity = donna.constructor.OutputEntity;
}n/a
function InputEntity(params) {
// senseTypes, dataTypes, data, context
this.senseTypes = params.senseTypes || [];
this.dataTypes = params.dataTypes || [];
this.data = params.data || {};
this.context = params.context || {};
}n/a
getContext = function () {
return this.context;
}n/a
getData = function () {
return this.data;
}...
var err = new Error('Wit.ai is not setup.'+
'Could not find access token.');
donna.logger.warn(err);
return cb(err);
}
// Get textual form of input
var data = input.getData();
// Data Types are unique and each have their own
// specific object format.
// In this case, a 'text' data type is a simple
// object with the field 'text'.
var text = data.text; // Extract text format from data
...getDataTypes = function () {
return this.dataTypes;
}...
// Check if input is instance of InputEntity
if (input instanceof this.InputEntity) {
donna.logger.debug(
"Is instance of InputEntity");
// Bind to all data types
var dataTypes = input.getDataTypes() || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
this.dataTypesEmitter.emit(dt, this.donna, input,
function() {
// TODO: handle this callback
...getSenseTypes = function () {
return this.senseTypes;
}n/a
function IntentEntity(params) {
this.setInput(params.input || null);
this.setIntent(params.intent || null);
this.setEntities(params.entities || {});
this.setConfidence(params.confidence || 0.0);
}n/a
getConfidence = function () {
return this.confidence;
}n/a
getContext = function () {
return this.input.getContext();
}n/a
getEntities = function () {
return this.entities;
}n/a
getInput = function () {
return this.input;
}n/a
getIntent = function () {
return this.intent;
}...
// Check if intentEntity is instance of IntentEntity
if (intentEntity instanceof this.IntentEntity) {
this.donna.logger.debug(
"Is instance of IntentEntity");
// Is instance of IntentEntity
var intent = intentEntity.getIntent();
this.donna.logger.debug("Intent:", intent);
var handlers = this.emitter.listeners(intent);
if (handlers.length > 0) {
this.emitter.emit(intent, this.donna, intentEntity,
function(err) {
...setConfidence = function (newConfidence) {
return this.confidence = newConfidence;
}n/a
setEntities = function (entities) {
return this.entities = entities;
}n/a
setInput = function (newInput) {
return this.input = newInput;
}n/a
setIntent = function (newIntent) {
return this.intent = newIntent;
}n/a
function OutputEntity(params) {
this.setIntent(params.intent || null);
this.setSources(params.sources || []);
this.setDataTypes(params.dataTypes || []);
this.setData(params.data || {});
}n/a
getData = function () {
return this.data;
}...
var err = new Error('Wit.ai is not setup.'+
'Could not find access token.');
donna.logger.warn(err);
return cb(err);
}
// Get textual form of input
var data = input.getData();
// Data Types are unique and each have their own
// specific object format.
// In this case, a 'text' data type is a simple
// object with the field 'text'.
var text = data.text; // Extract text format from data
...getDataTypes = function () {
return this.dataTypes;
}...
// Check if input is instance of InputEntity
if (input instanceof this.InputEntity) {
donna.logger.debug(
"Is instance of InputEntity");
// Bind to all data types
var dataTypes = input.getDataTypes() || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
this.dataTypesEmitter.emit(dt, this.donna, input,
function() {
// TODO: handle this callback
...getIntent = function () {
return this.intent;
}...
// Check if intentEntity is instance of IntentEntity
if (intentEntity instanceof this.IntentEntity) {
this.donna.logger.debug(
"Is instance of IntentEntity");
// Is instance of IntentEntity
var intent = intentEntity.getIntent();
this.donna.logger.debug("Intent:", intent);
var handlers = this.emitter.listeners(intent);
if (handlers.length > 0) {
this.emitter.emit(intent, this.donna, intentEntity,
function(err) {
...getSources = function () {
return this.sources;
}n/a
setData = function (newData) {
return this.data = newData;
}n/a
setDataTypes = function (newDataTypes) {
return this.dataTypes = newDataTypes;
}n/a
setIntent = function (newIntent) {
return this.intent = newIntent;
}n/a
setSources = function (newSources) {
return this.sources = newSources;
}n/a
function InputRouter(donna) {
this.donna = donna;
donna.logger.info("InputRouter constructor");
// Initialize Event Emitters
this.dataTypesEmitter = new EventEmitter();
this.InputEntity = donna.constructor.InputEntity;
}n/a
process = function (input) {
var deferred = Q.defer();
var donna = this.donna;
try {
donna.logger.verbose("InputRouter::process :",
input);
// Check if input is instance of InputEntity
if (input instanceof this.InputEntity) {
donna.logger.debug(
"Is instance of InputEntity");
// Bind to all data types
var dataTypes = input.getDataTypes() || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
this.dataTypesEmitter.emit(dt, this.donna, input,
function() {
// TODO: handle this callback
donna.logger.debug(arguments);
});
}
deferred.resolve();
} else {
var err = new Error("No data types provided for Intent Extractor.");
deferred.reject(err);
}
} else {
var err = new Error(
"Must be instance of InputEntity.");
donna.logger.error(err);
deferred.reject(err);
}
} catch (error) {
deferred.reject(error);
}
return deferred.promise;
}n/a
register = function (meta, handler) {
var deferred = Q.defer();
this.donna.logger.debug('InputRouter::register', meta);
// Check for required fields
if (meta.name && meta.description && meta.dataTypes) {
this.donna.logger.debug('Intent Extractor passes validation');
} else {
deferred.reject(new Error("Missing required field"));
return deferred.promise;
}
// Bind to all data types
var dataTypes = meta.dataTypes || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
this.dataTypesEmitter.on(dt, handler);
}
deferred.resolve();
} else {
var err = new Error("No data types provided for Intent Extractor.");
deferred.reject(err);
}
return deferred.promise;
}n/a
function IntentRouter(donna) {
this.donna = donna;
donna.logger.verbose("IntentRouter constructor");
// Initialize Event Emitter
this.emitter = new EventEmitter();
this.IntentEntity = donna.constructor.IntentEntity;
}...
for (var i = 0, len=outcomes.length; i<len; i++) {
var outcome = outcomes[i];
// Normalize to Intent entity
var intent = intentEntityFromWit(donna, input, outcome);
// Save intent
intents.push(intent);
// Send intent
donna.intent(intent);
}
// Return
return cb(null, intents);
}
});
});
...process = function (intentEntity) {
var deferred = Q.defer();
try {
this.donna.logger.verbose("IntentRouter::process :",
intentEntity);
// Check if intentEntity is instance of IntentEntity
if (intentEntity instanceof this.IntentEntity) {
this.donna.logger.debug(
"Is instance of IntentEntity");
// Is instance of IntentEntity
var intent = intentEntity.getIntent();
this.donna.logger.debug("Intent:", intent);
var handlers = this.emitter.listeners(intent);
if (handlers.length > 0) {
this.emitter.emit(intent, this.donna, intentEntity,
function(err) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve();
}
});
} else {
var err = new Error("No intent handler for '" +
intent + "'");
deferred.reject(err);
}
} else {
var err = new Error(
"Must be instance of IntentEnity.");
this.donna.logger.error(err);
deferred.reject(err);
}
} catch (error) {
deferred.reject(error);
}
return deferred.promise;
}n/a
register = function (intent, handler, cb) {
this.emitter.on(intent, handler);
cb();
}n/a
function OutputRouter(donna) {
this.donna = donna;
donna.logger.info("OutputRouter constructor");
// Initialize Event Emitters
this.emitter = new EventEmitter();
this.OutputEntity = donna.constructor.OutputEntity;
}n/a
process = function (outputEntity, context) {
var deferred = Q.defer();
var donna = this.donna;
try {
donna.logger.verbose("OutputRouter::process :",
outputEntity);
// Check if outputEntity is instance of OutputEntity
if (outputEntity instanceof this.OutputEntity) {
donna.logger.debug(
"Is instance of OutputEntity");
// Send to all data types
var dataTypes = outputEntity.getDataTypes() || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
var eventName = "data-type::"+dt;
donna.logger.debug('Output to event name:', eventName);
donna.logger.debug('# of Listeners:', this.emitter.listeners().length);
this.emitter.emit(eventName, this.donna, outputEntity,
function() {
// TODO: handle this callback
donna.logger.debug(arguments);
});
}
deferred.resolve();
} else {
var err = new Error("No data types provided for Intent Extractor.");
deferred.reject(err);
}
} else {
var err = new Error(
"Must be instance of OutputEntity.");
donna.logger.error(err);
deferred.reject(err);
}
} catch (error) {
deferred.reject(error);
}
return deferred.promise;
}n/a
register = function (meta, handler) {
var deferred = Q.defer();
var donna = this.donna;
donna.logger.debug('OutputRouter::register', meta);
// Check for required fields
if (meta.name && meta.description && meta.dataTypes) {
donna.logger.debug('Intent Extractor passes validation');
} else {
var err = new Error("Missing required field");
donna.logger.error(err);
deferred.reject(err);
return deferred.promise;
}
// Bind to all data types
var dataTypes = meta.dataTypes || [];
var len = dataTypes.length;
if (len > 0) {
for (var d = 0; d < len; d++) {
var dt = dataTypes[d];
var eventName = "data-type::"+dt;
donna.logger.debug('Output handler bind to event name:', eventName);
this.emitter.on(eventName, handler);
}
deferred.resolve();
} else {
var err = new Error("No data types provided for Intent Extractor.");
deferred.reject(err);
}
return deferred.promise;
}n/a