UNPKG

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
"use strict"; 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;