UNPKG

@sberdevices/assistant-client

Version:

Модуль взаимодействия с виртуальным ассистентом

1,123 lines (1,086 loc) 236 kB
import { M as MessageNames, d as __awaiter, e as __generator, c as createNanoEvents, b as __assign, p as proto, a as __rest, _ as __spreadArrays, f as createCommonjsModule, h as commonjsRequire, m as minimal, g as commonjsGlobal } from './typings-4aa98dc6.js'; var createClient = function (protocol, provideMeta) { if (provideMeta === void 0) { provideMeta = undefined; } var _a = createNanoEvents(), on = _a.on, emit = _a.emit; /** ждет ответ бека и возвращает данные из этого ответа */ var waitForAnswer = function (messageId) { return new Promise(function (resolve) { var off = on('systemMessage', function (systemMessageData, originalMessage) { if (originalMessage.messageId === messageId && (originalMessage.messageName === MessageNames.ANSWER_TO_USER || originalMessage.messageName === MessageNames.DO_NOTHING)) { off(); resolve(systemMessageData); } }); }); }; /** отправляет произвольный systemMessage, не подкладывает мету */ var sendData = function (data, messageName) { if (messageName === void 0) { messageName = ''; } var messageId = protocol.getMessageId(); protocol.sendSystemMessage({ data: data, messageName: messageName, }, true, messageId); return messageId; }; /** отправляет cancel на сообщение */ var sendCancel = function (messageId) { protocol.sendCancel({}, true, messageId); }; /** отправляет приветствие */ var sendOpenAssistant = function (_a) { var isFirstSession = (_a === void 0 ? { isFirstSession: false } : _a).isFirstSession; return __awaiter(void 0, void 0, void 0, function () { var data, meta, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: data = isFirstSession ? { is_first_session: true } : {}; if (!provideMeta) return [3 /*break*/, 2]; return [4 /*yield*/, provideMeta()]; case 1: _b = _c.sent(); return [3 /*break*/, 3]; case 2: _b = {}; _c.label = 3; case 3: meta = _b; return [2 /*return*/, waitForAnswer(sendData(__assign(__assign({}, meta), data), 'OPEN_ASSISTANT'))]; } }); }); }; /** вызывает sendSystemMessage, куда подкладывает мету */ var sendMeta = function (sendSystemMessage) { return __awaiter(void 0, void 0, void 0, function () { var meta, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!provideMeta) return [3 /*break*/, 2]; return [4 /*yield*/, provideMeta()]; case 1: _a = _b.sent(); return [3 /*break*/, 3]; case 2: _a = {}; _b.label = 3; case 3: meta = _a; if (Object.keys(meta).length) { sendSystemMessage({ data: meta, messageName: '', }, false); } return [2 /*return*/]; } }); }); }; /** отправляет server_action и мету */ var sendServerAction = function (serverAction, appInfo, messageName) { if (messageName === void 0) { messageName = 'SERVER_ACTION'; } return __awaiter(void 0, void 0, void 0, function () { var messageId; return __generator(this, function (_a) { switch (_a.label) { case 0: messageId = protocol.getMessageId(); // мету и server_action отправляем в одном systemMessage return [4 /*yield*/, sendMeta(function (_a) { var data = _a.data; protocol.sendSystemMessage({ // eslint-disable-next-line @typescript-eslint/camelcase data: __assign(__assign({}, data), { app_info: appInfo, server_action: serverAction }), messageName: messageName || 'SERVER_ACTION', }, true, messageId); })]; case 1: // мету и server_action отправляем в одном systemMessage _a.sent(); return [2 /*return*/, messageId]; } }); }); }; /** отправляет текст и текущую мету */ var sendText = function (text, isSsml, shouldSendDisableDubbing) { if (isSsml === void 0) { isSsml = false; } return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { if (text.trim() === '') { return [2 /*return*/, undefined]; } return [2 /*return*/, protocol.batch(function (_a) { var sendSystemMessage = _a.sendSystemMessage, clientSendText = _a.sendText, sendSettings = _a.sendSettings, messageId = _a.messageId; return __awaiter(void 0, void 0, void 0, function () { var prevDubbing, sendDisableDubbing; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, sendMeta(sendSystemMessage)]; case 1: _b.sent(); prevDubbing = protocol.configuration.settings.dubbing; sendDisableDubbing = prevDubbing !== -1 && shouldSendDisableDubbing; if (!sendDisableDubbing) return [3 /*break*/, 3]; return [4 /*yield*/, sendSettings({ dubbing: -1 }, false)]; case 2: _b.sent(); _b.label = 3; case 3: isSsml ? clientSendText(text, {}, 'application/ssml') : clientSendText(text, {}); if (sendDisableDubbing) { sendSettings({ dubbing: prevDubbing }); } return [2 /*return*/, messageId]; } }); }); })]; }); }); }; /** инициализирует исходящий голосовой поток, факт. передает в callback параметры для отправки голоса, * отправляет мету */ var createVoiceStream = function (callback) { return protocol.batch(function (_a) { var sendSystemMessage = _a.sendSystemMessage, sendVoice = _a.sendVoice, messageId = _a.messageId; return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, callback({ sendVoice: sendVoice, messageId: messageId, onMessage: function (cb) { return protocol.on('incoming', cb); }, })]; case 1: _b.sent(); sendMeta(sendSystemMessage); return [2 /*return*/]; } }); }); }); }; var off = protocol.on('incoming', function (message) { var _a; if (message.voice) { emit('voice', message.voice.data || new Uint8Array(), message); } if ((_a = message.systemMessage) === null || _a === void 0 ? void 0 : _a.data) { emit('systemMessage', JSON.parse(message.systemMessage.data), message); } if (message.status) { emit('status', message.status, message); } }); return { destroy: function () { off(); }, createVoiceStream: createVoiceStream, sendData: sendData, sendMeta: sendMeta, sendOpenAssistant: sendOpenAssistant, sendServerAction: sendServerAction, sendText: sendText, sendCancel: sendCancel, on: on, waitForAnswer: waitForAnswer, }; }; var createClientMethods = function (_a) { var getMessageId = _a.getMessageId, sendMessage = _a.sendMessage; var send = function (_a) { var payload = _a.payload, messageId = _a.messageId, other = __rest(_a, ["payload", "messageId"]); sendMessage(__assign(__assign(__assign({ messageName: '' }, payload), { messageId: messageId }), other)); }; var sendDevice = function (data, last, messageId) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } return send({ payload: { device: proto.Device.create(data), last: last ? 1 : -1, }, messageId: messageId, }); }; var sendInitialSettings = function (data, last, messageId, params) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } if (params === void 0) { params = {}; } return send({ payload: __assign({ initialSettings: proto.InitialSettings.create(data), last: last ? 1 : -1 }, params), messageId: messageId, }); }; var sendCancel = function (data, last, messageId) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } return send({ payload: { cancel: proto.Cancel.create(data), last: last ? 1 : -1, }, messageId: messageId, }); }; var sendLegacyDevice = function (data, last, messageId) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } return send({ payload: { legacyDevice: proto.LegacyDevice.create(data), last: last ? 1 : -1, }, messageId: messageId, }); }; var sendSettings = function (data, last, messageId) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } return send({ payload: { settings: proto.Settings.create(data), last: last ? 1 : -1, }, messageId: messageId, }); }; var sendText = function (data, params, type, messageId) { var _a; if (params === void 0) { params = {}; } if (type === void 0) { type = ''; } if (messageId === void 0) { messageId = getMessageId(); } var text = type ? { data: data, type: type } : { data: data }; send(__assign({ payload: { text: proto.Text.create(text), last: (_a = params.last) !== null && _a !== void 0 ? _a : 1, }, messageId: messageId }, params)); }; var sendSystemMessage = function (_a, last, messageId, params) { var data = _a.data, _b = _a.messageName, mesName = _b === void 0 ? '' : _b; if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } if (params === void 0) { params = {}; } send({ payload: __assign({ systemMessage: proto.SystemMessage.create({ data: JSON.stringify(data), }), messageName: mesName, last: last ? 1 : -1 }, params), messageId: messageId, }); }; var sendVoice = function (data, last, messageId, mesName, params) { if (last === void 0) { last = true; } if (messageId === void 0) { messageId = getMessageId(); } if (params === void 0) { params = {}; } return send({ payload: __assign({ voice: proto.Voice.create({ data: new Uint8Array(data), }), messageName: mesName, last: last ? 1 : -1 }, params), messageId: messageId, }); }; var batch = function (cb) { var batchingMessageId = getMessageId(); var lastMessageSent = false; var checkLastMessageStatus = function (last) { if (lastMessageSent) { if (last) { throw new Error("Can't send two last items in batch"); } else { throw new Error("Can't send messages in batch after last message have been sent"); } } else if (last) { lastMessageSent = true; } }; var upgradedSendText = function () { var _a = []; for (var _i = 0; _i < arguments.length; _i++) { _a[_i] = arguments[_i]; } var data = _a[0], params = _a[1], type = _a[2]; checkLastMessageStatus((params === null || params === void 0 ? void 0 : params.last) === 1); return sendText(data, params, type, batchingMessageId); }; var upgradedSendSystemMessage = function (data, last, params) { checkLastMessageStatus(last); return sendSystemMessage(data, last, batchingMessageId, params); }; var upgradedSendVoice = function (data, last, mesName, params) { checkLastMessageStatus(last); return sendVoice(data, last, batchingMessageId, mesName, params); }; var upgradedSendSettings = function (data, last, messageId) { checkLastMessageStatus(last); return sendSettings(data, last, messageId); }; return cb({ sendText: upgradedSendText, sendSystemMessage: upgradedSendSystemMessage, sendVoice: upgradedSendVoice, sendSettings: upgradedSendSettings, messageId: batchingMessageId, }); }; return { sendDevice: sendDevice, sendInitialSettings: sendInitialSettings, sendCancel: sendCancel, sendLegacyDevice: sendLegacyDevice, sendSettings: sendSettings, sendText: sendText, sendSystemMessage: sendSystemMessage, sendVoice: sendVoice, batch: batch, }; }; var safeJSONParse = function (str, defaultValue) { try { return JSON.parse(str); } catch (err) { return defaultValue; } }; var compileBasePayload = function (_a) { var userId = _a.userId, token = _a.token, userChannel = _a.userChannel, version = _a.version, messageName = _a.messageName, vpsToken = _a.vpsToken; if (version < 3) { return { userId: userId, token: token, userChannel: userChannel, messageName: messageName, vpsToken: vpsToken, version: version, }; } return { token: token, messageName: messageName, version: version, }; }; var appendHeader = function (uint8Array) { // Добавляем 4 байта в начало с длинной сообщения var arrayBuffer = new ArrayBuffer(4); var dataView = new DataView(arrayBuffer, 0); dataView.setInt32(0, uint8Array.length, true); var newUint8Array = new Uint8Array(4 + uint8Array.length); newUint8Array.set(new Uint8Array(arrayBuffer)); newUint8Array.set(uint8Array, 4); return newUint8Array; }; var removeHeader = function (uint8Array) { // Убираем 4 байта в начале с длинной сообщения var newUint8Array = new Uint8Array(uint8Array).slice(4); return newUint8Array; }; var createProtocol = function (transport, _a) { var logger = _a.logger, getToken = _a.getToken, params = __rest(_a, ["logger", "getToken"]); var configuration = __assign(__assign({}, params), { token: '' }); var url = configuration.url, userId = configuration.userId, userChannel = configuration.userChannel, locale = configuration.locale, device = configuration.device, settings = configuration.settings, legacyDevice = configuration.legacyDevice, version = configuration.version, messageName = configuration.messageName, vpsToken = configuration.vpsToken, meta = configuration.meta; var basePayload = compileBasePayload({ userId: userId, token: '', messageName: messageName, vpsToken: vpsToken, userChannel: userChannel, version: version }); var _b = createNanoEvents(), on = _b.on, emit = _b.emit; var subscriptions = []; var messageQueue = []; var initMessageId; // ид инициализационного сообщения, отправим мессаджи в неинициализированный протокол var currentSettings = { device: device, legacyDevice: legacyDevice, settings: settings, locale: locale }; var currentMessageId = Date.now(); var status = 'closed'; var destroyed = false; var clearReadyTimer; // ид таймера установки состояния ready var getMessageId = function () { return currentMessageId++; }; var send = function (message) { var createdMessage = proto.Message.create(__assign(__assign({}, basePayload), message)); logger === null || logger === void 0 ? void 0 : logger({ type: 'outcoming', message: createdMessage }); var encodedMessage = proto.Message.encode(createdMessage).finish(); var encodedMessageWithHeader = appendHeader(encodedMessage); transport.send(encodedMessageWithHeader); emit('outcoming', createdMessage); }; var sendMessage = function (message) { // отправляем инициализационные сообщения или все, когда сессия = ready if (status === 'ready' || (typeof initMessageId !== undefined && message.messageId === initMessageId)) { send(message); } else { // накапливаем сообщения, отправим после успешного коннекта messageQueue.push(message); if (status === 'closed' && !destroyed) { transport.open(url); } } }; var _c = createClientMethods({ getMessageId: getMessageId, sendMessage: sendMessage }), sendDeviceOriginal = _c.sendDevice, sendInitialSettingsOriginal = _c.sendInitialSettings, sendCancel = _c.sendCancel, sendLegacyDeviceOriginal = _c.sendLegacyDevice, sendSettingsOriginal = _c.sendSettings, sendText = _c.sendText, sendSystemMessage = _c.sendSystemMessage, sendVoice = _c.sendVoice, batch = _c.batch; var sendDevice = (function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } currentSettings = __assign(__assign({}, currentSettings), { device: data }); return sendDeviceOriginal.apply(void 0, __spreadArrays([data], args)); }); var sendInitialSettings = (function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (data.device && data.settings) { currentSettings = __assign(__assign({}, currentSettings), { device: data.device, settings: data.settings, locale: data.locale || undefined }); } return sendInitialSettingsOriginal.apply(void 0, __spreadArrays([data], args)); }); var sendLegacyDevice = (function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } currentSettings = __assign(__assign({}, currentSettings), { legacyDevice: data }); return sendLegacyDeviceOriginal.apply(void 0, __spreadArrays([data], args)); }); var updateDefaults = function (obj) { Object.assign(basePayload, obj); Object.assign(configuration, obj); }; var updateDevice = function (obj) { var _a, _b; if (obj) { var additionalInfo = obj.additionalInfo, deviceOptions = __rest(obj, ["additionalInfo"]); var oldInfo = ((_a = currentSettings.device) === null || _a === void 0 ? void 0 : _a.additionalInfo) ? safeJSONParse((_b = currentSettings.device) === null || _b === void 0 ? void 0 : _b.additionalInfo, {}) : {}; var newInfo = additionalInfo ? safeJSONParse(additionalInfo, {}) : {}; currentSettings.device = __assign(__assign(__assign({}, currentSettings.device), deviceOptions), { additionalInfo: JSON.stringify(__assign(__assign({}, oldInfo), newInfo)) }); } }; var updateSettings = function (obj) { Object.assign(currentSettings.settings, obj); if (status === 'connected' || status === 'ready') { sendSettingsOriginal(obj); } }; subscriptions.push(transport.on('connecting', function () { status = 'connecting'; })); subscriptions.push(transport.on('close', function () { status = 'closed'; })); subscriptions.push(transport.on('ready', function () { return __awaiter(void 0, void 0, void 0, function () { var _a, _b, _c, _d, e_1; return __generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 2, , 3]); _b = (_a = Object).assign; _c = [basePayload]; _d = {}; return [4 /*yield*/, getToken()]; case 1: _b.apply(_a, _c.concat([(_d.token = _e.sent(), _d)])); return [3 /*break*/, 3]; case 2: e_1 = _e.sent(); emit('error', { type: 'GET_TOKEN_ERROR', message: e_1 === null || e_1 === void 0 ? void 0 : e_1.message, }); return [2 /*return*/]; case 3: Object.assign(configuration, { token: basePayload.token }); initMessageId = getMessageId(); if (version < 3) { if (version === 1 && currentSettings.legacyDevice) { sendLegacyDevice(currentSettings.legacyDevice, false, initMessageId); } else if (version === 2 && currentSettings.device) { sendDevice(currentSettings.device, false, initMessageId); } sendSettingsOriginal(currentSettings.settings, true, initMessageId); } else { sendInitialSettings({ userId: userId, userChannel: userChannel, device: currentSettings.device, settings: currentSettings.settings, locale: version > 3 ? currentSettings.locale : undefined, }, true, initMessageId, { meta: meta }); } status = 'connected'; clearTimeout(clearReadyTimer); /// считаем коннект = ready, если по истечении таймаута сокет не был разорван /// т.к бек может разрывать сокет, если с settings что-то не так clearReadyTimer = window.setTimeout(function () { if (status !== 'connected') { return; } status = 'ready'; while (messageQueue.length > 0) { var message = messageQueue.shift(); if (message) { send(message); } } emit('ready'); }, 500); logger === null || logger === void 0 ? void 0 : logger({ type: 'init', params: __assign(__assign({}, configuration), currentSettings) }); return [2 /*return*/]; } }); }); })); subscriptions.push(transport.on('message', function (message) { var decodedMessage = proto.Message.decode(removeHeader(message)); logger === null || logger === void 0 ? void 0 : logger({ type: 'incoming', message: decodedMessage }); emit('incoming', decodedMessage); })); return { clearQueue: function () { messageQueue.splice(0, messageQueue.length); }, destroy: function () { destroyed = true; transport.close(); subscriptions.splice(0, subscriptions.length).map(function (unsubscribe) { return unsubscribe(); }); }, on: on, getMessageId: getMessageId, sendCancel: sendCancel, sendText: sendText, sendSystemMessage: sendSystemMessage, sendVoice: sendVoice, send: sendMessage, batch: batch, changeConfiguration: updateDefaults, changeDevice: updateDevice, changeSettings: updateSettings, reconnect: function () { if (status !== 'closed') { transport.reconnect(url); // даем время случиться close } else { transport.open(url); } }, get currentMessageId() { return currentMessageId; }, get configuration() { return configuration; }, }; }; var defaultWSCreator = function (url) { return new WebSocket(url); }; var createTransport = function (createWS) { if (createWS === void 0) { createWS = defaultWSCreator; } var _a = createNanoEvents(), on = _a.on, emit = _a.emit; var status = 'closed'; var stopped = false; var ws; var timeOut; // ид таймера автореконнекта var retries = 0; // количество попыток коннекта при ошибке var close = function () { stopped = true; ws && ws.close(); // статус изменится по подписке clearTimeout(timeOut); timeOut = undefined; }; var send = function (data) { if (!navigator.onLine) { close(); emit('error'); return; } ws.send(data); }; var open = function (url) { if (status !== 'closed') { return; } status = 'connecting'; emit('connecting'); // TODO: нужен таймаут для подключения ws = createWS(url); ws.binaryType = 'arraybuffer'; ws.addEventListener('open', function () { if (ws.readyState === 1) { retries = 0; // сбрасываем количество попыток реконнекта status = 'ready'; emit('ready'); } }); ws.addEventListener('close', function () { status = 'closed'; emit('close'); }); ws.addEventListener('error', function (e) { if (status !== 'connecting') { throw e; } // пробуем переподключаться, если возникла ошибка при коннекте if (!ws || (ws.readyState === 3 && !stopped)) { if (timeOut) { clearTimeout(timeOut); } if (retries < 3) { timeOut = window.setTimeout(function () { open(url); retries++; }, 300 * retries); } else { retries = 0; emit('error', e); } } }); ws.addEventListener('message', function (e) { emit('message', e.data); }); }; var reconnect = function (url) { if (status === 'closed') { open(url); return; } close(); setTimeout(function () { return reconnect(url); }); }; return { send: send, open: open, close: close, reconnect: reconnect, on: on, }; }; var getMetaPermissons = function (permission) { return Object.keys(permission).map(function (key) { return ({ type: key, status: permission[key], }); }); }; var getCurrentLocation = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { navigator.geolocation.getCurrentPosition(function (_a) { var coords = _a.coords, timestamp = _a.timestamp; resolve({ lat: coords.latitude.toString(), lon: coords.longitude.toString(), accuracy: coords.accuracy, timestamp: timestamp, }); }, reject, { timeout: 5000 }); })]; }); }); }; var getTime = function () { return ({ // Здесь нужен полифилл, т.к. `Intl.DateTimeFormat().resolvedOptions().timeZone` - возвращает пустую строку timezone_id: Intl.DateTimeFormat().resolvedOptions().timeZone, timezone_offset_sec: -new Date().getTimezoneOffset() * 60, timestamp: Date.now(), }); }; var getAnswerForRequestPermissions = function (requestMessageId, appInfo, items) { return __awaiter(void 0, void 0, void 0, function () { var permissions, response; return __generator(this, function (_a) { permissions = { record_audio: 'denied_once', geo: 'denied_once', read_contacts: 'denied_permanently', push: 'denied_once', }; response = { auto_listening: false, app_info: appInfo, meta: { time: getTime(), permissions: [], }, server_action: { action_id: 'command_response', request_message_id: requestMessageId, command_response: { request_permissions: { permissions: [], }, }, }, }; return [2 /*return*/, Promise.all(items.map(function (permission) { return __awaiter(void 0, void 0, void 0, function () { var _a, location_1, _b; var _c, _d; return __generator(this, function (_e) { switch (_e.label) { case 0: _a = permission; switch (_a) { case 'geo': return [3 /*break*/, 1]; } return [3 /*break*/, 5]; case 1: _e.trys.push([1, 3, , 4]); return [4 /*yield*/, getCurrentLocation()]; case 2: location_1 = _e.sent(); permissions.geo = 'granted'; response.meta.location = location_1; (_c = response.server_action.command_response.request_permissions) === null || _c === void 0 ? void 0 : _c.permissions.push({ type: 'geo', status: 'granted', }); return [3 /*break*/, 4]; case 3: _b = _e.sent(); permissions.geo = 'denied_permanently'; (_d = response.server_action.command_response.request_permissions) === null || _d === void 0 ? void 0 : _d.permissions.push({ type: 'geo', status: 'denied_permanently', }); return [3 /*break*/, 4]; case 4: return [3 /*break*/, 6]; case 5: // eslint-disable-next-line no-console console.warn('Unsupported permission request:', permission); _e.label = 6; case 6: return [2 /*return*/]; } }); }); })).then(function () { response.meta.permissions = getMetaPermissons(permissions); return response; })]; }); }); }; var mtt = createCommonjsModule(function (module) { /*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ (function(global, factory) { /* global define, require, module */ /* AMD */ if (typeof commonjsRequire === 'function' && 'object' === 'object' && module && module.exports) module.exports = factory(minimal); })(commonjsGlobal, function($protobuf) { // Common aliases var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; // Exported root namespace var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); $root.Music2TrackProtocol = (function() { /** * Namespace Music2TrackProtocol. * @exports Music2TrackProtocol * @namespace */ var Music2TrackProtocol = {}; Music2TrackProtocol.DecoderResult = (function() { /** * Properties of a DecoderResult. * @memberof Music2TrackProtocol * @interface IDecoderResult * @property {string|null} [result] DecoderResult result * @property {boolean|null} [isMusicFound] DecoderResult isMusicFound * @property {boolean|null} [isFinal] DecoderResult isFinal */ /** * Constructs a new DecoderResult. * @memberof Music2TrackProtocol * @classdesc Represents a DecoderResult. * @implements IDecoderResult * @constructor * @param {Music2TrackProtocol.IDecoderResult=} [properties] Properties to set */ function DecoderResult(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * DecoderResult result. * @member {string} result * @memberof Music2TrackProtocol.DecoderResult * @instance */ DecoderResult.prototype.result = ""; /** * DecoderResult isMusicFound. * @member {boolean} isMusicFound * @memberof Music2TrackProtocol.DecoderResult * @instance */ DecoderResult.prototype.isMusicFound = false; /** * DecoderResult isFinal. * @member {boolean} isFinal * @memberof Music2TrackProtocol.DecoderResult * @instance */ DecoderResult.prototype.isFinal = false; /** * Creates a new DecoderResult instance using the specified properties. * @function create * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Music2TrackProtocol.IDecoderResult=} [properties] Properties to set * @returns {Music2TrackProtocol.DecoderResult} DecoderResult instance */ DecoderResult.create = function create(properties) { return new DecoderResult(properties); }; /** * Encodes the specified DecoderResult message. Does not implicitly {@link Music2TrackProtocol.DecoderResult.verify|verify} messages. * @function encode * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Music2TrackProtocol.IDecoderResult} message DecoderResult message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DecoderResult.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.result != null && Object.hasOwnProperty.call(message, "result")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.result); if (message.isMusicFound != null && Object.hasOwnProperty.call(message, "isMusicFound")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isMusicFound); if (message.isFinal != null && Object.hasOwnProperty.call(message, "isFinal")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isFinal); return writer; }; /** * Encodes the specified DecoderResult message, length delimited. Does not implicitly {@link Music2TrackProtocol.DecoderResult.verify|verify} messages. * @function encodeDelimited * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Music2TrackProtocol.IDecoderResult} message DecoderResult message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ DecoderResult.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes a DecoderResult message from the specified reader or buffer. * @function decode * @memberof Music2TrackProtocol.DecoderResult * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {Music2TrackProtocol.DecoderResult} DecoderResult * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DecoderResult.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Music2TrackProtocol.DecoderResult(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: message.result = reader.string(); break; case 2: message.isMusicFound = reader.bool(); break; case 3: message.isFinal = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }; /** * Decodes a DecoderResult message from the specified reader or buffer, length delimited. * @function decodeDelimited * @memberof Music2TrackProtocol.DecoderResult * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @returns {Music2TrackProtocol.DecoderResult} DecoderResult * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ DecoderResult.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** * Verifies a DecoderResult message. * @function verify * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Object.<string,*>} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ DecoderResult.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; if (message.result != null && message.hasOwnProperty("result")) if (!$util.isString(message.result)) return "result: string expected"; if (message.isMusicFound != null && message.hasOwnProperty("isMusicFound")) if (typeof message.isMusicFound !== "boolean") return "isMusicFound: boolean expected"; if (message.isFinal != null && message.hasOwnProperty("isFinal")) if (typeof message.isFinal !== "boolean") return "isFinal: boolean expected"; return null; }; /** * Creates a DecoderResult message from a plain object. Also converts values to their respective internal types. * @function fromObject * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Object.<string,*>} object Plain object * @returns {Music2TrackProtocol.DecoderResult} DecoderResult */ DecoderResult.fromObject = function fromObject(object) { if (object instanceof $root.Music2TrackProtocol.DecoderResult) return object; var message = new $root.Music2TrackProtocol.DecoderResult(); if (object.result != null) message.result = String(object.result); if (object.isMusicFound != null) message.isMusicFound = Boolean(object.isMusicFound); if (object.isFinal != null) message.isFinal = Boolean(object.isFinal); return message; }; /** * Creates a plain object from a DecoderResult message. Also converts values to other types if specified. * @function toObject * @memberof Music2TrackProtocol.DecoderResult * @static * @param {Music2TrackProtocol.DecoderResult} message DecoderResult * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.<string,*>} Plain object */ DecoderResult.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) { object.result = ""; object.isMusicFound = false; object.isFinal = false; } if (message.result != null && message.hasOwnProperty("result")) object.result = message.result; if (message.isMusicFound != null && message.hasOwnProperty("isMusicFound")) object.isMusicFound = message.isMusicFound; if (message.isFinal != null && message.hasOwnProperty("isFinal")) object.isFinal = message.isFinal; return object; }; /** * Converts this DecoderResult to JSON. * @function toJSON * @memberof Music2TrackProtocol.DecoderResult * @instance * @returns {Object.<string,*>} JSON object */ DecoderResult.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; return DecoderResult; })(); Music2TrackProtocol.ErrorResponse = (function() { /** * Properties of an ErrorResponse. * @memberof Music2TrackProtocol * @interface IErrorResponse * @property {string|null} [errorMessage] ErrorResponse errorMessage * @property {number|null} [errorCode] ErrorResponse errorCode */ /** * Constructs a new ErrorResponse. * @memberof Music2TrackProtocol * @classdesc Represents an ErrorResponse. * @implements IErrorResponse * @constructor * @param {Music2TrackProtocol.IErrorResponse=} [properties] Properties to set */ function ErrorResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; } /** * ErrorResponse errorMessage. * @member {string} errorMessage * @memberof Music2TrackProtocol.ErrorResponse * @instance */ ErrorResponse.prototype.errorMessage = ""; /** * ErrorResponse errorCode. * @member {number} errorCode * @memberof Music2TrackProtocol.ErrorResponse * @instance */ ErrorResponse.prototype.errorCode = 0; /** * Creates a new ErrorResponse instance using the specified properties. * @function create * @memberof Music2TrackProtocol.ErrorResponse * @static * @param {Music2TrackProtocol.IErrorResponse=} [properties] Properties to set * @returns {Music2TrackProtocol.ErrorResponse} ErrorResponse instance */ ErrorResponse.create = function create(properties) { return new ErrorResponse(properties); }; /** * Encodes the specified ErrorResponse message. Does not implicitly {@link Music2TrackProtocol.ErrorResponse.verify|verify} messages. * @function encode * @memberof Music2TrackProtocol.ErrorResponse * @static * @param {Music2TrackProtocol.IErrorResponse} message ErrorResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ErrorResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.errorMessage != null && Object.hasOwnProperty.call(message, "errorMessage")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.errorMessage); if (message.errorCode != null && Object.hasOwnProperty.call(message, "errorCode")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.errorCode); return writer; }; /** * Encodes the specified ErrorResponse message, length delimited. Does not implicitly {@link Music2TrackProtocol.ErrorResponse.verify|verify} messages. * @function encodeDelimited * @memberof Music2TrackProtocol.ErrorResponse * @static * @param {Music2TrackProtocol.IErrorResponse} message ErrorResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ ErrorResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** * Decodes an ErrorResponse message from the specified reader or buffer. * @function decode * @memberof Music2TrackProtocol.ErrorResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand * @returns {Music2TrackProtocol.ErrorResponse} ErrorResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ ErrorResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Music2TrackProtocol.Error