zedai-voice
Version:
Siri-like voice banking SDK for React Native - Complete voice-powered fintech solution with wake word detection and beautiful UI
214 lines (210 loc) • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _Constants = require("../utils/Constants");
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // src/core/ConfigManager.js
var ConfigManager = /*#__PURE__*/function () {
function ConfigManager() {
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, ConfigManager);
this.config = this.validateAndNormalizeConfig(config);
}
return _createClass(ConfigManager, [{
key: "validateAndNormalizeConfig",
value: function validateAndNormalizeConfig(config) {
var _config$security, _config$security2, _config$security3, _config$audio, _config$audio2, _config$audio3, _config$audio4, _config$audio5;
var errors = [];
// Required fields validation
if (!config.bankName || typeof config.bankName !== 'string') {
errors.push('bankName is required and must be a string');
}
if (!config.openai || !config.openai.apiKey) {
errors.push('openai.apiKey is required');
}
if (!config.apiEndpoints || !config.apiEndpoints.verifyAccount || !config.apiEndpoints.transfer) {
errors.push('apiEndpoints.verifyAccount and apiEndpoints.transfer are required');
}
if (!config.webhookUrl || typeof config.webhookUrl !== 'string') {
errors.push('webhookUrl is required and must be a string');
}
if (!config.apiKey || typeof config.apiKey !== 'string') {
errors.push('apiKey is required and must be a string');
}
if (errors.length > 0) {
throw new Error("Configuration validation failed: ".concat(errors.join(', ')));
}
// Return normalized config with defaults
return {
bankName: config.bankName,
wakeWord: config.wakeWord || 'hey assistant',
openai: {
apiKey: config.openai.apiKey,
whisperModel: config.openai.whisperModel || 'whisper-1',
gptModel: config.openai.gptModel || 'gpt-4',
maxTokens: config.openai.maxTokens || 150,
temperature: config.openai.temperature || 0.1
},
apiEndpoints: {
verifyAccount: config.apiEndpoints.verifyAccount,
transfer: config.apiEndpoints.transfer
},
webhookUrl: config.webhookUrl,
apiKey: config.apiKey,
security: {
encryptionKey: ((_config$security = config.security) === null || _config$security === void 0 ? void 0 : _config$security.encryptionKey) || this.generateEncryptionKey(),
timeout: ((_config$security2 = config.security) === null || _config$security2 === void 0 ? void 0 : _config$security2.timeout) || 30000,
maxRetries: ((_config$security3 = config.security) === null || _config$security3 === void 0 ? void 0 : _config$security3.maxRetries) || 3
},
audio: {
sampleRate: ((_config$audio = config.audio) === null || _config$audio === void 0 ? void 0 : _config$audio.sampleRate) || 16000,
channels: ((_config$audio2 = config.audio) === null || _config$audio2 === void 0 ? void 0 : _config$audio2.channels) || 1,
bitsPerSample: ((_config$audio3 = config.audio) === null || _config$audio3 === void 0 ? void 0 : _config$audio3.bitsPerSample) || 16,
maxRecordingTime: ((_config$audio4 = config.audio) === null || _config$audio4 === void 0 ? void 0 : _config$audio4.maxRecordingTime) || 30000,
minRecordingTime: ((_config$audio5 = config.audio) === null || _config$audio5 === void 0 ? void 0 : _config$audio5.minRecordingTime) || 500
},
responses: _objectSpread(_objectSpread({}, this.getDefaultResponses()), config.responses)
};
}
}, {
key: "generateEncryptionKey",
value: function generateEncryptionKey() {
// Generate a random 32-character encryption key
return Array.from(crypto.getRandomValues(new Uint8Array(16))).map(function (b) {
return b.toString(16).padStart(2, '0');
}).join('');
}
}, {
key: "getDefaultResponses",
value: function getDefaultResponses() {
var _this$config;
return {
greeting: "Hello! I'm your ".concat(((_this$config = this.config) === null || _this$config === void 0 ? void 0 : _this$config.bankName) || 'banking', " voice assistant. You can say things like 'transfer money' or 'send 5000 to account 1234567890 at GTBank'."),
transferInitiated: "I'll help you transfer money. Please provide the account number, bank name, and amount.",
accountVerified: "I found {accountName} at {bankName}. Is this correct?",
accountNotFound: "I couldn't find an account with that information. Please check the account number and bank name.",
confirmationReceived: "Great! Please enter your PIN to complete the transfer.",
transferSuccessful: "Transfer successful! {amount} has been sent to {accountName} at {bankName}.",
transferFailed: "Transfer failed: {error}. Please try again.",
invalidAmount: "Please provide a valid amount to transfer.",
invalidAccount: "Please provide a valid account number.",
invalidBank: "Please provide a valid bank name.",
cancelled: "Transfer cancelled. Is there anything else I can help you with?",
help: "I can help you transfer money to other accounts. Just say 'transfer money' or provide the details directly.",
unknownCommand: "I didn't understand that. You can say 'transfer money' or 'help' for assistance.",
audioError: "I'm having trouble hearing you. Please try again.",
networkError: "I'm having network issues. Please check your connection and try again.",
timeout: "This is taking too long. Let's start over.",
pinPrompt: "Please enter your PIN to complete the transfer."
};
}
}, {
key: "getConfig",
value: function getConfig() {
return this.config;
}
}, {
key: "updateConfig",
value: function updateConfig(newConfig) {
var mergedConfig = _objectSpread(_objectSpread({}, this.config), newConfig);
this.config = this.validateAndNormalizeConfig(mergedConfig);
return this.config;
}
}, {
key: "getBankName",
value: function getBankName() {
return this.config.bankName;
}
}, {
key: "getWakeWord",
value: function getWakeWord() {
return this.config.wakeWord;
}
}, {
key: "getOpenAIConfig",
value: function getOpenAIConfig() {
return this.config.openai;
}
}, {
key: "getAPIEndpoints",
value: function getAPIEndpoints() {
return this.config.apiEndpoints;
}
}, {
key: "getWebhookUrl",
value: function getWebhookUrl() {
return this.config.webhookUrl;
}
}, {
key: "getAPIKey",
value: function getAPIKey() {
return this.config.apiKey;
}
}, {
key: "getSecurityConfig",
value: function getSecurityConfig() {
return this.config.security;
}
}, {
key: "getAudioConfig",
value: function getAudioConfig() {
return this.config.audio;
}
}, {
key: "getResponse",
value: function getResponse(key) {
var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var response = this.config.responses[key] || '';
// Replace variables in response
Object.keys(variables).forEach(function (variable) {
response = response.replace("{".concat(variable, "}"), variables[variable]);
});
return response;
}
}, {
key: "validateAPIEndpoint",
value: function validateAPIEndpoint(endpoint) {
try {
new URL(endpoint);
return true;
} catch (error) {
return false;
}
}
}, {
key: "validateWebhookUrl",
value: function validateWebhookUrl(url) {
try {
var parsed = new URL(url);
return parsed.protocol === 'https:' || parsed.protocol === 'http:';
} catch (error) {
return false;
}
}
}, {
key: "toJSON",
value: function toJSON() {
return JSON.stringify(this.config, null, 2);
}
}], [{
key: "fromJSON",
value: function fromJSON(jsonString) {
try {
var config = JSON.parse(jsonString);
return new ConfigManager(config);
} catch (error) {
throw new Error("Failed to parse config JSON: ".concat(error.message));
}
}
}]);
}();
var _default = exports["default"] = ConfigManager;