@sberdevices/assistant-client
Version:
Модуль взаимодействия с виртуальным ассистентом
1,123 lines (1,086 loc) • 236 kB
JavaScript
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