diff --git a/app/apps/server/bridges/bridges.js b/app/apps/server/bridges/bridges.js index 5781842fb766d..6298e94980005 100644 --- a/app/apps/server/bridges/bridges.js +++ b/app/apps/server/bridges/bridges.js @@ -13,6 +13,8 @@ import { AppRoomBridge } from './rooms'; import { AppInternalBridge } from './internal'; import { AppSettingBridge } from './settings'; import { AppUserBridge } from './users'; +import { AppLivechatBridge } from './livechat'; +import { AppUploadBridge } from './uploads'; export class RealAppBridges extends AppBridges { constructor(orch) { @@ -31,6 +33,8 @@ export class RealAppBridges extends AppBridges { this._internalBridge = new AppInternalBridge(orch); this._setsBridge = new AppSettingBridge(orch); this._userBridge = new AppUserBridge(orch); + this._livechatBridge = new AppLivechatBridge(orch); + this._uploadBridge = new AppUploadBridge(orch); } getCommandBridge() { @@ -84,4 +88,12 @@ export class RealAppBridges extends AppBridges { getUserBridge() { return this._userBridge; } + + getLivechatBridge() { + return this._livechatBridge; + } + + getUploadBridge() { + return this._uploadBridge; + } } diff --git a/app/apps/server/bridges/http.js b/app/apps/server/bridges/http.js index 743343fa12c96..1cfc983b9a99f 100644 --- a/app/apps/server/bridges/http.js +++ b/app/apps/server/bridges/http.js @@ -1,5 +1,31 @@ import { HTTP } from 'meteor/http'; +/** + * Normalize the options object to a shape + * the HTTP.call method recognizes + * + * @param Object options Http options received from the engine + * + */ +function normalizeHttpOptions(options) { + const npmRequestOptions = {}; + + if (options.hasOwnProperty('strictSSL')) { + npmRequestOptions.strictSSL = options.strictSSL; + delete options.strictSSL; + } + + if (options.hasOwnProperty('rejectUnauthorized')) { + npmRequestOptions.agentOptions = { + rejectUnauthorized: options.rejectUnauthorized, + }; + + delete options.rejectUnauthorized; + } + + options.npmRequestOptions = npmRequestOptions; +} + export class AppHttpBridge { constructor(orch) { this.orch = orch; @@ -10,6 +36,8 @@ export class AppHttpBridge { info.request.content = JSON.stringify(info.request.data); } + normalizeHttpOptions(info.request); + this.orch.debugLog(`The App ${ info.appId } is requesting from the outter webs:`, info); try { diff --git a/app/apps/server/bridges/livechat.js b/app/apps/server/bridges/livechat.js new file mode 100644 index 0000000000000..001d87fab741f --- /dev/null +++ b/app/apps/server/bridges/livechat.js @@ -0,0 +1,135 @@ +import { Random } from 'meteor/random'; + +import { getRoom } from '../../../livechat/server/api/lib/livechat'; +import { Livechat } from '../../../livechat/server/lib/Livechat'; +import Rooms from '../../../models/server/models/Rooms'; +import LivechatVisitors from '../../../models/server/models/LivechatVisitors'; +import Users from '../../../models/server/models/Users'; + +export class AppLivechatBridge { + constructor(orch) { + this.orch = orch; + } + + async createMessage(message, appId) { + this.orch.debugLog(`The App ${ appId } is creating a new message.`); + + if (!message.token) { + throw new Error('Invalid token for livechat message'); + } + + const data = { + guest: this.orch.getConverters().get('visitors').convertAppVisitor(message.visitor), + message: this.orch.getConverters().get('messages').convertAppMessage(message), + }; + + const msg = Livechat.sendMessage(data); + + return msg._id; + } + + async getMessageById(messageId, appId) { + this.orch.debugLog(`The App ${ appId } is getting the message: "${ messageId }"`); + + return this.orch.getConverters().get('messages').convertById(messageId); + } + + async updateMessage(message, appId) { + this.orch.debugLog(`The App ${ appId } is updating a message.`); + + const data = { + guest: message.visitor, + message: this.orch.getConverters().get('messages').convertAppMessage(message), + }; + + Livechat.updateMessage(data); + } + + async createRoom(visitor, agent, appId) { + this.orch.debugLog(`The App ${ appId } is creating a livechat room.`); + + const agentUser = Users.findOneById(agent.id); + agentUser.agentId = agentUser._id; + + return this.orch.getConverters().get('rooms').convertRoom(getRoom({ + guest: this.orch.getConverters().get('visitors').convertAppVisitor(visitor), + agent: agentUser, + rid: Random.id(), + }).room); + } + + async closeRoom(room, comment, appId) { + this.orch.debugLog(`The App ${ appId } is closing a livechat room.`); + + return Livechat.closeRoom({ + visitor: this.orch.getConverters().get('visitors').convertAppVisitor(room.visitor), + room: this.orch.getConverters().get('rooms').convertAppRoom(room), + comment, + }); + } + + async findRooms(visitor, departmentId, appId) { + this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`); + + if (!visitor) { + return []; + } + + let result; + + if (departmentId) { + result = Rooms.findOpenByVisitorTokenAndDepartmentId(visitor.token, departmentId).fetch(); + } else { + result = Rooms.findOpenByVisitorToken(visitor.token).fetch(); + } + + return result.map((room) => this.orch.getConverters().get('rooms').convertRoom(room)); + } + + async createVisitor(visitor, appId) { + this.orch.debugLog(`The App ${ appId } is creating a livechat visitor.`); + + const registerData = { + department: visitor.department, + username: visitor.username, + name: visitor.name, + token: visitor.token, + }; + + if (visitor.visitorEmails && visitor.visitorEmails.length) { + registerData.email = visitor.visitorEmails[0].address; + } + + if (visitor.phone && visitor.phone.length) { + registerData.phone = { number: visitor.phone[0].phoneNumber }; + } + + return Livechat.registerGuest(registerData); + } + + async transferVisitor(visitor, transferData, appId) { + this.orch.debugLog(`The App ${ appId } is transfering a livechat.`); + + if (!visitor) { + throw new Error('Invalid visitor, cannot transfer'); + } + + const { + targetAgent, + targetDepartment: departmentId, + currentRoom, + } = transferData; + + return Livechat.transfer( + this.orch.getConverters().get('rooms').convertAppRoom(currentRoom), + this.orch.getConverters().get('visitors').convertAppVisitor(visitor), + { userId: targetAgent.id, departmentId } + ); + } + + async findVisitors(query, appId) { + this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`); + + return LivechatVisitors.find(query).fetch().map((visitor) => this.orch.getConverters().get('visitors').convertVisitor(visitor)); + } +} diff --git a/app/apps/server/bridges/uploads.js b/app/apps/server/bridges/uploads.js new file mode 100644 index 0000000000000..a6a3efc6c1d70 --- /dev/null +++ b/app/apps/server/bridges/uploads.js @@ -0,0 +1,27 @@ +import { FileUpload } from '../../../file-upload/server'; + +export class AppUploadBridge { + constructor(orch) { + this.orch = orch; + } + + async getById(id, appId) { + this.orch.debugLog(`The App ${ appId } is getting the upload: "${ id }"`); + + return this.orch.getConverters().get('uploads').convertById(id); + } + + getBuffer(upload, appId) { + this.orch.debugLog(`The App ${ appId } is getting the upload: "${ upload.id }"`); + + return new Promise((resolve, reject) => { + FileUpload.getBuffer(upload, (error, result) => { + if (error) { + return reject(error); + } + + resolve(result); + }); + }); + } +} diff --git a/app/apps/server/converters/messages.js b/app/apps/server/converters/messages.js index 2abaedd58b92c..cb3acd690fd47 100644 --- a/app/apps/server/converters/messages.js +++ b/app/apps/server/converters/messages.js @@ -30,8 +30,10 @@ export class AppMessagesConverter { emoji: 'emoji', avatarUrl: 'avatar', alias: 'alias', + file: 'file', customFields: 'customFields', groupable: 'groupable', + token: 'token', room: (message) => { const result = this.orch.getConverters().get('rooms').convertById(message.rid); delete message.rid; diff --git a/app/apps/server/converters/rooms.js b/app/apps/server/converters/rooms.js index 59c16e40ba91b..0e3ed81759298 100644 --- a/app/apps/server/converters/rooms.js +++ b/app/apps/server/converters/rooms.js @@ -1,6 +1,6 @@ import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; -import { Rooms, Users } from '../../../models'; +import { Rooms, Users, LivechatVisitors } from '../../../models'; export class AppRoomsConverter { constructor(orch) { @@ -33,20 +33,55 @@ export class AppRoomsConverter { }; } + let v; + if (room.visitor) { + const visitor = LivechatVisitors.findOneById(room.visitor.id); + v = { + _id: visitor._id, + username: visitor.username, + token: visitor.token, + }; + } + + let servedBy; + if (room.servedBy) { + const user = Users.findOneById(room.servedBy.id); + servedBy = { + _id: user._id, + username: user.username, + }; + } + + let closedBy; + if (room.closedBy) { + const user = Users.findOneById(room.closedBy.id); + closedBy = { + _id: user._id, + username: user.username, + }; + } + return { _id: room.id, fname: room.displayName, name: room.slugifiedName, t: room.type, u, + v, + servedBy, + closedBy, members: room.members, default: typeof room.isDefault === 'undefined' ? false : room.isDefault, ro: typeof room.isReadOnly === 'undefined' ? false : room.isReadOnly, sysMes: typeof room.displaySystemMessages === 'undefined' ? true : room.displaySystemMessages, + waitingResponse: typeof room.isWaitingResponse === 'undefined' ? undefined : !!room.isWaitingResponse, + open: typeof room.isOpen === 'undefined' ? undefined : !!room.isOpen, msgs: room.messageCount || 0, ts: room.createdAt, _updatedAt: room.updatedAt, + closedAt: room.closedAt, lm: room.lastModifiedAt, + customFields: room.customFields, }; } @@ -60,21 +95,42 @@ export class AppRoomsConverter { creator = this.orch.getConverters().get('users').convertById(room.u._id); } + let visitor; + if (room.v) { + visitor = this.orch.getConverters().get('visitors').convertById(room.v._id); + } + + let servedBy; + if (room.servedBy) { + servedBy = this.orch.getConverters().get('users').convertById(room.servedBy._id); + } + + let responseBy; + if (room.responseBy) { + responseBy = this.orch.getConverters().get('users').convertById(room.responseBy._id); + } + return { id: room._id, displayName: room.fname, slugifiedName: room.name, type: this._convertTypeToApp(room.t), creator, + visitor, + servedBy, + responseBy, members: room.members, isDefault: typeof room.default === 'undefined' ? false : room.default, isReadOnly: typeof room.ro === 'undefined' ? false : room.ro, displaySystemMessages: typeof room.sysMes === 'undefined' ? true : room.sysMes, + isWaitingResponse: typeof room.waitingResponse === 'undefined' ? undefined : !!room.waitingResponse, + isOpen: typeof room.open === 'undefined' ? undefined : !!room.open, messageCount: room.msgs, createdAt: room.ts, updatedAt: room._updatedAt, + closedAt: room.closedAt, lastModifiedAt: room.lm, - customFields: {}, + customFields: room.customFields, }; } diff --git a/app/apps/server/converters/uploads.js b/app/apps/server/converters/uploads.js new file mode 100644 index 0000000000000..e138e162e0f0d --- /dev/null +++ b/app/apps/server/converters/uploads.js @@ -0,0 +1,97 @@ +import { transformMappedData } from '../../lib/misc/transformMappedData'; +import Uploads from '../../../models/server/models/Uploads'; + +export class AppUploadsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(id) { + const upload = Uploads.findOneById(id); + + return this.convertToApp(upload); + } + + convertToApp(upload) { + if (!upload) { + return undefined; + } + + const map = { + id: '_id', + name: 'name', + size: 'size', + type: 'type', + store: 'store', + description: 'description', + complete: 'complete', + uploading: 'uploading', + extension: 'extension', + progress: 'progress', + etag: 'etag', + path: 'path', + token: 'token', + url: 'url', + updatedAt: '_updatedAt', + uploadedAt: 'uploadedAt', + room: (upload) => { + const result = this.orch.getConverters().get('rooms').convertById(upload.rid); + delete upload.rid; + return result; + }, + user: (upload) => { + if (!upload.userId) { + return undefined; + } + + const result = this.orch.getConverters().get('users').convertById(upload.userId); + delete upload.userId; + return result; + }, + visitor: (upload) => { + if (!upload.visitorToken) { + return undefined; + } + + const result = this.orch.getConverters().get('users').convertByToken(upload.visitorToken); + delete upload.visitorToken; + return result; + }, + }; + + return transformMappedData(upload, map); + } + + convertToRocketChat(upload) { + if (!upload) { + return undefined; + } + + const { id: userId } = upload.user || {}; + const { token: visitorToken } = upload.visitor || {}; + const { id: rid } = upload.room; + + const newUpload = { + _id: upload.id, + name: upload.name, + size: upload.size, + type: upload.type, + extension: upload.extension, + description: upload.description, + store: upload.store, + etag: upload.etag, + complete: upload.complete, + uploading: upload.uploading, + progress: upload.progress, + token: upload.token, + url: upload.url, + _updatedAt: upload.updatedAt, + uploadedAt: upload.uploadedAt, + rid, + userId, + visitorToken, + }; + + return Object.assign(newUpload, upload._unmappedProperties_); + } +} diff --git a/app/apps/server/converters/visitors.js b/app/apps/server/converters/visitors.js new file mode 100644 index 0000000000000..66ab62158249b --- /dev/null +++ b/app/apps/server/converters/visitors.js @@ -0,0 +1,56 @@ +import LivechatVisitors from '../../../models/server/models/LivechatVisitors'; +import { transformMappedData } from '../../lib/misc/transformMappedData'; + +export class AppVisitorsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(id) { + const visitor = LivechatVisitors.findOneById(id); + + return this.convertVisitor(visitor); + } + + convertByToken(token) { + const visitor = LivechatVisitors.getVisitorByToken(token); + + return this.convertVisitor(visitor); + } + + convertVisitor(visitor) { + if (!visitor) { + return undefined; + } + + const map = { + id: '_id', + username: 'username', + name: 'name', + department: 'department', + updatedAt: '_updatedAt', + token: 'token', + phone: 'phone', + visitorEmails: 'visitorEmails', + }; + + return transformMappedData(visitor, map); + } + + convertAppVisitor(visitor) { + if (!visitor) { + return undefined; + } + + const newVisitor = { + _id: visitor.id, + username: visitor.username, + name: visitor.name, + token: visitor.token, + phone: visitor.phone, + visitorEmails: visitor.visitorEmails, + }; + + return Object.assign(newVisitor, visitor._unmappedProperties_); + } +} diff --git a/app/apps/server/orchestrator.js b/app/apps/server/orchestrator.js index 427fae9f50068..916f309ff42c6 100644 --- a/app/apps/server/orchestrator.js +++ b/app/apps/server/orchestrator.js @@ -8,11 +8,15 @@ import { AppRealStorage, AppRealLogsStorage } from './storage'; import { settings } from '../../settings'; import { Permissions, AppsLogsModel, AppsModel, AppsPersistenceModel } from '../../models'; import { Logger } from '../../logger'; - -export let Apps; +import { AppVisitorsConverter } from './converters/visitors'; +import { AppUploadsConverter } from './converters/uploads'; class AppServerOrchestrator { constructor() { + this._isInitialized = false; + } + + initialize() { this._rocketchatLogger = new Logger('Rocket.Chat Apps'); Permissions.createOrUpdate('manage-apps', ['admin']); @@ -29,6 +33,8 @@ class AppServerOrchestrator { this._converters.set('rooms', new AppRoomsConverter(this)); this._converters.set('settings', new AppSettingsConverter(this)); this._converters.set('users', new AppUsersConverter(this)); + this._converters.set('visitors', new AppVisitorsConverter(this)); + this._converters.set('uploads', new AppUploadsConverter(this)); this._bridges = new RealAppBridges(this); @@ -38,6 +44,8 @@ class AppServerOrchestrator { this._communicators.set('methods', new AppMethods(this)); this._communicators.set('notifier', new AppServerNotifier(this)); this._communicators.set('restapi', new AppsRestApi(this, this._manager)); + + this._isInitialized = true; } getModel() { @@ -72,6 +80,10 @@ class AppServerOrchestrator { return this._manager; } + isInitialized() { + return this._isInitialized; + } + isEnabled() { return settings.get('Apps_Framework_enabled'); } @@ -133,6 +145,8 @@ class AppServerOrchestrator { } } +export const Apps = new AppServerOrchestrator(); + settings.addGroup('General', function() { this.section('Apps', function() { this.add('Apps_Framework_enabled', true, { @@ -154,7 +168,7 @@ settings.addGroup('General', function() { settings.get('Apps_Framework_enabled', (key, isEnabled) => { // In case this gets called before `Meteor.startup` - if (!Apps) { + if (!Apps.isInitialized()) { return; } @@ -166,7 +180,7 @@ settings.get('Apps_Framework_enabled', (key, isEnabled) => { }); Meteor.startup(function _appServerOrchestrator() { - Apps = new AppServerOrchestrator(); + Apps.initialize(); if (Apps.isEnabled()) { Apps.load(); diff --git a/app/livechat/server/config.js b/app/livechat/server/config.js index 3fb0656b4b800..371ca37cd30bd 100644 --- a/app/livechat/server/config.js +++ b/app/livechat/server/config.js @@ -382,6 +382,14 @@ Meteor.startup(function() { i18nDescription: 'Accept_incoming_livechat_requests_even_if_there_are_no_online_agents', }); + settings.add('Livechat_assign_new_conversation_to_bot', false, { + type: 'boolean', + group: 'Livechat', + section: 'Routing', + i18nLabel: 'Assign_new_conversations_to_bot_agent', + i18nDescription: 'Assign_new_conversations_to_bot_agent_description', + }); + settings.add('Livechat_guest_pool_max_number_incoming_livechats_displayed', 0, { type: 'int', group: 'Livechat', diff --git a/app/livechat/server/hooks/beforeGetNextAgent.js b/app/livechat/server/hooks/beforeGetNextAgent.js new file mode 100644 index 0000000000000..766e3e44c8f8b --- /dev/null +++ b/app/livechat/server/hooks/beforeGetNextAgent.js @@ -0,0 +1,16 @@ +import { callbacks } from '../../../callbacks'; +import { settings } from '../../../settings'; +import { Users, LivechatDepartmentAgents } from '../../../models'; + +callbacks.add('livechat.beforeGetNextAgent', (department) => { + if (!settings.get('Livechat_assign_new_conversation_to_bot')) { + return null; + } + + console.log('department = ', department); + if (department) { + return LivechatDepartmentAgents.getNextBotForDepartment(department); + } + + return Users.getNextBotAgent(); +}, callbacks.priority.HIGH, 'livechat-before-get-next-agent'); diff --git a/app/livechat/server/index.js b/app/livechat/server/index.js index 3c937b9e1f6e7..2dfd14c2f8282 100644 --- a/app/livechat/server/index.js +++ b/app/livechat/server/index.js @@ -6,6 +6,7 @@ import './permissions'; import '../lib/messageTypes'; import './config'; import './roomType'; +import './hooks/beforeGetNextAgent'; import './hooks/externalMessage'; import './hooks/leadCapture'; import './hooks/markRoomResponded'; diff --git a/app/livechat/server/lib/Livechat.js b/app/livechat/server/lib/Livechat.js index d379b8682f879..26554d5473b3a 100644 --- a/app/livechat/server/lib/Livechat.js +++ b/app/livechat/server/lib/Livechat.js @@ -28,10 +28,12 @@ import { LivechatOfficeHour, } from '../../../models'; import { Logger } from '../../../logger'; -import { sendMessage, deleteMessage, updateMessage } from '../../../lib'; import { addUserRoles, removeUserFromRoles } from '../../../authorization'; import * as Mailer from '../../../mailer'; import { LivechatInquiry } from '../../lib/LivechatInquiry'; +import { sendMessage } from '../../../lib/server/functions/sendMessage'; +import { updateMessage } from '../../../lib/server/functions/updateMessage'; +import { deleteMessage } from '../../../lib/server/functions/deleteMessage'; export const Livechat = { Analytics, @@ -44,12 +46,23 @@ export const Livechat = { }), online() { + if (settings.get('Livechat_accept_chats_with_no_agents')) { + return true; + } + + if (settings.get('Livechat_assign_new_conversation_to_bot')) { + const botAgents = Livechat.getBotAgents(); + if (botAgents && botAgents.count() > 0) { + return true; + } + } + const onlineAgents = Livechat.getOnlineAgents(); - return (onlineAgents && onlineAgents.count() > 0) || settings.get('Livechat_accept_chats_with_no_agents'); + return onlineAgents && onlineAgents.count() > 0; }, getNextAgent(department) { - return RoutingManager.getMethod().getNextAgent(department); + return RoutingManager.getNextAgent(department); }, getAgents(department) { @@ -58,12 +71,22 @@ export const Livechat = { } return Users.findAgents(); }, + getOnlineAgents(department) { if (department) { return LivechatDepartmentAgents.getOnlineForDepartment(department); } return Users.findOnlineAgents(); }, + + getBotAgents(department) { + if (department) { + return LivechatDepartmentAgents.getBotsForDepartment(department); + } + + return Users.findBotAgents(); + }, + getRequiredDepartment(onlineRequired = true) { const departments = LivechatDepartment.findEnabledWithAgents(); diff --git a/app/livechat/server/lib/QueueManager.js b/app/livechat/server/lib/QueueManager.js index 51c8afdb5f491..ed62450d4dc0d 100644 --- a/app/livechat/server/lib/QueueManager.js +++ b/app/livechat/server/lib/QueueManager.js @@ -36,7 +36,7 @@ export const QueueManager = { agent = RoutingManager.getMethod().delegateAgent(agent, inquiry); } - inquiry = await callbacks.run('livechat.beforeRouteChat', inquiry); + inquiry = await callbacks.run('livechat.beforeRouteChat', inquiry, agent); if (inquiry.status !== 'ready') { return room; } diff --git a/app/livechat/server/lib/RoutingManager.js b/app/livechat/server/lib/RoutingManager.js index 28c834bcd3255..a397568fc0e59 100644 --- a/app/livechat/server/lib/RoutingManager.js +++ b/app/livechat/server/lib/RoutingManager.js @@ -30,19 +30,27 @@ export const RoutingManager = { return this.getMethod().config || {}; }, + async getNextAgent(department) { + let agent = callbacks.run('livechat.beforeGetNextAgent', department); + + if (!agent) { + agent = await this.getMethod().getNextAgent(department); + } + + return agent; + }, + async delegateInquiry(inquiry, agent) { - // return Room Object const { department, rid } = inquiry; if (!agent || (agent.username && !Users.findOneOnlineAgentByUsername(agent.username))) { - agent = await this.getMethod().getNextAgent(department); + agent = await this.getNextAgent(department); } if (!agent) { return LivechatRooms.findOneById(rid); } - const room = this.takeInquiry(inquiry, agent); - return room; + return this.takeInquiry(inquiry, agent); }, assignAgent(inquiry, agent) { diff --git a/app/models/server/models/LivechatDepartmentAgents.js b/app/models/server/models/LivechatDepartmentAgents.js index afe96d3420756..2184478621c00 100644 --- a/app/models/server/models/LivechatDepartmentAgents.js +++ b/app/models/server/models/LivechatDepartmentAgents.js @@ -12,6 +12,7 @@ export class LivechatDepartmentAgents extends Base { this.tryEnsureIndex({ departmentId: 1 }); this.tryEnsureIndex({ agentId: 1 }); + this.tryEnsureIndex({ username: 1 }); } findByDepartmentId(departmentId) { @@ -102,6 +103,67 @@ export class LivechatDepartmentAgents extends Base { return this.find(query); } + getBotsForDepartment(departmentId) { + const agents = this.findByDepartmentId(departmentId).fetch(); + + if (agents.length === 0) { + return; + } + + const botUsers = Users.findBotAgents(_.pluck(agents, 'username')); + const botUsernames = _.pluck(botUsers.fetch(), 'username'); + + const query = { + departmentId, + username: { + $in: botUsernames, + }, + }; + + return this.find(query); + } + + getNextBotForDepartment(departmentId) { + const agents = this.findByDepartmentId(departmentId).fetch(); + + if (agents.length === 0) { + return; + } + + const botUsers = Users.findBotAgents(_.pluck(agents, 'username')); + const botUsernames = _.pluck(botUsers.fetch(), 'username'); + + const query = { + departmentId, + username: { + $in: botUsernames, + }, + }; + + const sort = { + count: 1, + order: 1, + username: 1, + }; + const update = { + $inc: { + count: 1, + }, + }; + + const collectionObj = this.model.rawCollection(); + const findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); + + const bot = findAndModify(query, sort, update); + if (bot && bot.value) { + return { + agentId: bot.value.agentId, + username: bot.value.username, + }; + } + return null; + } + findUsersInQueue(usersList) { const query = {}; diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js index cfcda4d4f0b9b..b77db3d6d2e90 100644 --- a/app/models/server/models/Users.js +++ b/app/models/server/models/Users.js @@ -86,6 +86,31 @@ export class Users extends Base { return this.find(query); } + findBotAgents(usernameList) { + const query = { + roles: { + $all: ['bot', 'livechat-agent'], + }, + ...usernameList && { + username: { + $in: [].concat(usernameList), + }, + }, + }; + + return this.find(query); + } + + findOneBotAgent() { + const query = { + roles: { + $all: ['bot', 'livechat-agent'], + }, + }; + + return this.findOne(query); + } + findOneOnlineAgentByUsername(username) { const query = { username, @@ -172,6 +197,37 @@ export class Users extends Base { return null; } + getNextBotAgent() { + const query = { + roles: { + $all: ['bot', 'livechat-agent'], + }, + }; + + const collectionObj = this.model.rawCollection(); + const findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); + + const sort = { + livechatCount: 1, + username: 1, + }; + + const update = { + $inc: { + livechatCount: 1, + }, + }; + + const user = findAndModify(query, sort, update); + if (user && user.value) { + return { + agentId: user.value._id, + username: user.value.username, + }; + } + return null; + } + setLastRoutingTime(userId) { const query = { _id: userId, diff --git a/app/statistics/server/functions/get.js b/app/statistics/server/functions/get.js index 32c8801827b35..ad920ce3b3f3c 100644 --- a/app/statistics/server/functions/get.js +++ b/app/statistics/server/functions/get.js @@ -146,9 +146,9 @@ statistics.get = function _getStatistics() { statistics.apps = { engineVersion: Info.marketplaceApiVersion, - enabled: Apps && Apps.isEnabled(), - totalInstalled: Apps && Apps.getManager().get().length, - totalActive: Apps && Apps.getManager().get({ enabled: true }).length, + enabled: Apps.isEnabled(), + totalInstalled: Apps.isInitialized() && Apps.getManager().get().length, + totalActive: Apps.isInitialized() && Apps.getManager().get({ enabled: true }).length, }; const integrations = Integrations.find().fetch(); diff --git a/package-lock.json b/package-lock.json index 29abfbc0f8f06..6f6c1c0ac15d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -147,7 +147,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -681,9 +681,9 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@rocket.chat/apps-engine": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.5.2.tgz", - "integrity": "sha512-2Ncbv6XTSNHfEnXwrKBv/WQ19jA+w7Xa3I8FVYYNLLIAss3ZLsqu8k2LeSkSt6H0DWuOViJ8ZIfv/21Vpsu8GQ==", + "version": "1.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.6.0-beta.0.tgz", + "integrity": "sha512-PXMAraw/WZ6bbetWcLMmEKIqTTPWU0XhckBhIZTy1Ju5Bp0bVALr/E8YzcNh1NG6Uuxr+OjjzIE8njAO6qo+GQ==", "requires": { "adm-zip": "^0.4.9", "lodash.clonedeep": "^4.5.0", @@ -798,6 +798,7 @@ "msgpack-lite": "^0.1.26", "node-fetch": "^2.2.1", "node-fetch-polyfill": "^2.0.6", + "paho-mqtt": "github:eclipse/paho.mqtt.javascript#master", "protobufjs": "^6.8.8", "sha256": "^0.2.0", "tiny-events": "^1.0.1", @@ -895,7 +896,7 @@ }, "@types/events": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" }, "@types/express": { @@ -1840,7 +1841,7 @@ "dependencies": { "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -1872,7 +1873,7 @@ }, "axios": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { "follow-redirects": "^1.3.0", @@ -1957,7 +1958,7 @@ "dependencies": { "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true } @@ -2210,7 +2211,7 @@ }, "babel-plugin-add-module-exports": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", "dev": true }, @@ -2231,79 +2232,79 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-async-generators": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "dev": true }, "babel-plugin-syntax-class-constructor-call": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", "dev": true }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", "dev": true }, "babel-plugin-syntax-decorators": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "dev": true }, "babel-plugin-syntax-do-expressions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", "dev": true }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, "babel-plugin-syntax-export-extensions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", "dev": true }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", "dev": true }, "babel-plugin-syntax-function-bind": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", "dev": true }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -2700,7 +2701,7 @@ }, "babel-preset-es2015": { "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz", + "resolved": "http://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz", "integrity": "sha1-l9zn7ykuGMubK3VF2AxZPCjZUX8=", "dev": true, "requires": { @@ -2728,7 +2729,7 @@ }, "babel-preset-react": { "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.3.13.tgz", + "resolved": "http://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.3.13.tgz", "integrity": "sha1-E9VeBqZfqqoHw5v2Op2DbgMhFvo=", "dev": true, "requires": { @@ -2742,7 +2743,7 @@ }, "babel-preset-stage-0": { "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.3.13.tgz", + "resolved": "http://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.3.13.tgz", "integrity": "sha1-eKN8VvCzmI8qeZMtywzrj/N3sNE=", "dev": true, "requires": { @@ -3649,7 +3650,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -3813,7 +3814,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -3847,7 +3848,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { "bn.js": "^4.1.0", @@ -4033,7 +4034,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -4155,7 +4156,7 @@ "dependencies": { "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true } @@ -4176,6 +4177,16 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", @@ -4224,7 +4235,7 @@ "dependencies": { "cheerio": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "resolved": "http://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", "requires": { "css-select": "~1.0.0", @@ -4236,7 +4247,7 @@ }, "css-select": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", "requires": { "boolbase": "~1.0.0", @@ -4247,7 +4258,7 @@ }, "css-what": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" }, "domhandler": { @@ -4268,7 +4279,7 @@ }, "htmlparser2": { "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "requires": { "domelementtype": "1", @@ -4289,7 +4300,7 @@ }, "entities": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" } } @@ -4301,12 +4312,12 @@ }, "lodash": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -4317,7 +4328,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } @@ -4389,7 +4400,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -4463,7 +4474,7 @@ }, "cheerio": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "resolved": "http://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", "requires": { "css-select": "~1.2.0", @@ -4492,7 +4503,7 @@ }, "chimp": { "version": "0.51.1", - "resolved": "https://registry.npmjs.org/chimp/-/chimp-0.51.1.tgz", + "resolved": "http://registry.npmjs.org/chimp/-/chimp-0.51.1.tgz", "integrity": "sha1-6hIbzfJsidV/jvNBlUDPPCeaPMU=", "dev": true, "requires": { @@ -4512,6 +4523,7 @@ "chromedriver": "^2.35", "colors": "1.1.2", "commander": "^2.9.0", + "cucumber": "github:xolvio/cucumber-js#v1.3.0-chimp.6", "deep-extend": "^0.4.1", "exit": "^0.1.2", "fibers": "^1.0.14", @@ -4537,7 +4549,7 @@ "dependencies": { "async": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, @@ -4555,34 +4567,6 @@ "type-detect": "^4.0.0" } }, - "cucumber": { - "version": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", - "from": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", - "requires": { - "co": "^4.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "fibers": "^1.0.7", - "glob": "^7.0.0", - "lodash": "^4.0.0", - "meteor-promise": "^0.8.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -4601,7 +4585,8 @@ "fibers": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.15.tgz", - "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=" + "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=", + "dev": true }, "glob": { "version": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", @@ -4636,7 +4621,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -4683,11 +4668,12 @@ "once": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.0.tgz", - "integrity": "sha1-FRr4a/wfCMS58H0GqyUP/L61ZYE=" + "integrity": "sha1-FRr4a/wfCMS58H0GqyUP/L61ZYE=", + "dev": true }, "progress": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, @@ -4710,7 +4696,7 @@ }, "chokidar": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", + "resolved": "http://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", "dev": true, "requires": { @@ -4829,6 +4815,23 @@ "restore-cursor": "^2.0.0" } }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -4926,7 +4929,7 @@ }, "color-convert": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" }, "color-name": { @@ -4945,8 +4948,9 @@ }, "colors": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true }, "colour": { "version": "0.7.1", @@ -5248,7 +5252,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -5260,7 +5264,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -5282,7 +5286,7 @@ "dependencies": { "node-fetch": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" } } @@ -5372,7 +5376,7 @@ }, "css-select": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { "boolbase": "~1.0.0", @@ -5416,6 +5420,36 @@ "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", "dev": true }, + "cucumber": { + "version": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", + "from": "github:xolvio/cucumber-js#v1.3.0-chimp.6", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "cli-table": "^0.3.1", + "co": "^4.6.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "duration": "^0.2.0", + "fibers": "^1.0.7", + "figures": "1.7.0", + "gherkin": "4.0.0", + "glob": "^7.0.0", + "is-generator": "^1.0.2", + "lodash": "^4.0.0", + "meteor-promise": "^0.8.0", + "stack-chain": "^1.3.5", + "stacktrace-js": "^1.3.0" + }, + "dependencies": { + "fibers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.15.tgz", + "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=", + "dev": true + } + } + }, "cuid": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/cuid/-/cuid-1.3.8.tgz", @@ -5428,7 +5462,7 @@ "dependencies": { "core-js": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" } } @@ -5828,7 +5862,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -5858,7 +5892,7 @@ }, "deprecate": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz", "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg=" }, "deprecated-decorator": { @@ -5916,7 +5950,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -5945,7 +5979,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -5964,7 +5998,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5983,7 +6017,7 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } @@ -6056,6 +6090,16 @@ "stream-shift": "^1.0.0" } }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "eachr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz", @@ -6282,6 +6326,15 @@ } } }, + "error-stack-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", + "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", + "dev": true, + "requires": { + "stackframe": "^0.3.1" + } + }, "es-abstract": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", @@ -6347,7 +6400,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { "es6-promise": "^4.0.3" @@ -6849,7 +6902,7 @@ }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "evp_bytestokey": { @@ -7078,7 +7131,7 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", @@ -7097,7 +7150,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -7267,7 +7320,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -7437,13 +7490,13 @@ "dependencies": { "lodash": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", "dev": true }, "underscore.string": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", "dev": true } @@ -7463,6 +7516,16 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", @@ -7774,7 +7837,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -7795,12 +7859,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7815,17 +7881,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -7942,7 +8011,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -7954,6 +8024,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -7968,6 +8039,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7975,12 +8047,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7999,6 +8073,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -8086,7 +8161,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -8098,6 +8174,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -8183,7 +8260,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -8219,6 +8297,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8238,6 +8317,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -8281,12 +8361,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -8367,7 +8449,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { @@ -8409,6 +8491,12 @@ "integrity": "sha1-x9aGwf8spOiCpYrfOKfeJpG6f5k=", "dev": true }, + "gherkin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-4.0.0.tgz", + "integrity": "sha1-edzgTRIj6kO0hip2vlzo+JwSwyw=", + "dev": true + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -8608,7 +8696,7 @@ "dependencies": { "minimist": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", "dev": true } @@ -9468,7 +9556,7 @@ }, "hapi": { "version": "8.8.0", - "resolved": "https://registry.npmjs.org/hapi/-/hapi-8.8.0.tgz", + "resolved": "http://registry.npmjs.org/hapi/-/hapi-8.8.0.tgz", "integrity": "sha1-h+N6Bum0meiXkOLcERqpZotuYX8=", "dev": true, "requires": { @@ -9538,7 +9626,7 @@ }, "catbox": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/catbox/-/catbox-4.3.0.tgz", + "resolved": "http://registry.npmjs.org/catbox/-/catbox-4.3.0.tgz", "integrity": "sha1-IiN3vWfxKRrA4l0AAC0GWp3385o=", "dev": true, "requires": { @@ -9575,18 +9663,6 @@ "hoek": "2.x.x", "joi": "6.x.x", "wreck": "5.x.x" - }, - "dependencies": { - "wreck": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-5.6.1.tgz", - "integrity": "sha1-r/ADBAATiJ11YZtccYcN0qjdBpo=", - "dev": true, - "requires": { - "boom": "2.x.x", - "hoek": "2.x.x" - } - } } }, "heavy": { @@ -9598,20 +9674,6 @@ "boom": "2.x.x", "hoek": "2.x.x", "joi": "5.x.x" - }, - "dependencies": { - "joi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-5.1.0.tgz", - "integrity": "sha1-FSrQfbjunGQBmX/1/SwSiWBwv1g=", - "dev": true, - "requires": { - "hoek": "^2.2.x", - "isemail": "1.x.x", - "moment": "2.x.x", - "topo": "1.x.x" - } - } } }, "hoek": { @@ -9661,7 +9723,7 @@ }, "joi": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.4.1.tgz", + "resolved": "http://registry.npmjs.org/joi/-/joi-6.4.1.tgz", "integrity": "sha1-9Q9CRTVgBo5jg9oVrC0w3Xzra24=", "dev": true, "requires": { @@ -9673,7 +9735,7 @@ "dependencies": { "isemail": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz", "integrity": "sha1-4Mj23D9HCX53dzlcaJYnGqJWw7U=", "dev": true }, @@ -9706,7 +9768,7 @@ "dependencies": { "mime-db": { "version": "1.14.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.14.0.tgz", + "resolved": "http://registry.npmjs.org/mime-db/-/mime-db-1.14.0.tgz", "integrity": "sha1-1WHxC27mbbUflK5leilRp0IX7YM=", "dev": true } @@ -10101,7 +10163,7 @@ "dependencies": { "domelementtype": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "readable-stream": { @@ -10118,7 +10180,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -10447,7 +10509,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -10799,7 +10861,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { @@ -10914,6 +10976,12 @@ "number-is-nan": "^1.0.0" } }, + "is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", + "dev": true + }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -10960,7 +11028,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-object": { @@ -11133,7 +11201,7 @@ }, "isemail": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" }, "isexe": { @@ -11169,7 +11237,7 @@ }, "jasmine-core": { "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "resolved": "http://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", "dev": true }, @@ -11369,12 +11437,12 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { @@ -11682,7 +11750,7 @@ }, "promise": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz", "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", "optional": true, "requires": { @@ -11851,7 +11919,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -11863,7 +11931,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -12159,6 +12227,12 @@ "signal-exit": "^3.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12347,7 +12421,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -12685,7 +12759,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -12707,7 +12781,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -12739,7 +12813,8 @@ "meteor-promise": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.8.6.tgz", - "integrity": "sha512-HP6tOr67z/9XU2Dr0F2SSr8WRTuE23AG9Dj578DCJPEYHs67OLKBviU8A8rwvbwMD7Lu2+Of+yAMz2Wd8r4yxg==" + "integrity": "sha512-HP6tOr67z/9XU2Dr0F2SSr8WRTuE23AG9Dj578DCJPEYHs67OLKBviU8A8rwvbwMD7Lu2+Of+yAMz2Wd8r4yxg==", + "dev": true }, "methods": { "version": "1.1.2", @@ -12862,7 +12937,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { @@ -12950,7 +13025,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12983,7 +13058,7 @@ }, "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -13387,7 +13462,7 @@ }, "ncp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, @@ -13408,6 +13483,15 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "node-abi": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.9.0.tgz", @@ -13646,13 +13730,8 @@ "integrity": "sha1-CH52u+t+jcVmhrJdtOYMX/nbCR8=", "dev": true, "requires": { - "is-stream": "^1.1.0" - }, - "dependencies": { - "web-streams-polyfill": { - "version": "git://github.com/gwicke/web-streams-polyfill.git#42c488428adea1dc0c0245014e4896ad456b1ded", - "from": "git://github.com/gwicke/web-streams-polyfill.git#42c488428adea1dc0c0245014e4896ad456b1ded" - } + "is-stream": "^1.1.0", + "web-streams-polyfill": "git://github.com/gwicke/web-streams-polyfill.git#spec_performance_improvements" } }, "nodejieba": { @@ -13753,7 +13832,7 @@ }, "npm-install-package": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", "dev": true }, @@ -14019,7 +14098,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { "lcid": "^1.0.0" @@ -14107,9 +14186,14 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" }, + "paho-mqtt": { + "version": "github:eclipse/paho.mqtt.javascript#f5859463aba9a9b7c19f99ab7c4849a723f8d832", + "from": "github:eclipse/paho.mqtt.javascript#master", + "dev": true + }, "pako": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "resolved": "http://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" }, "parallel-transform": { @@ -14125,7 +14209,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -14352,7 +14436,7 @@ }, "es6-promise": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", "dev": true }, @@ -14408,7 +14492,7 @@ }, "progress": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, @@ -14456,7 +14540,7 @@ }, "tough-cookie": { "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { @@ -14779,7 +14863,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -14792,7 +14876,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -15664,7 +15748,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -15707,7 +15791,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -15741,7 +15825,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -15804,7 +15888,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -15942,7 +16026,7 @@ }, "regjsgen": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, @@ -16134,7 +16218,7 @@ }, "requestretry": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/requestretry/-/requestretry-1.5.0.tgz", "integrity": "sha1-7RV7ulNSbt6z7DKo5wSkmYvs5ic=", "dev": true, "requires": { @@ -16266,7 +16350,7 @@ }, "rimraf": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "requires": { "glob": "^6.0.1" @@ -16361,7 +16445,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { "ret": "~0.1.10" @@ -16392,7 +16476,7 @@ }, "sax": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "scandirectory": { @@ -16425,7 +16509,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } @@ -16510,7 +16594,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -16594,7 +16678,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -17023,11 +17107,69 @@ "figgy-pudding": "^3.5.1" } }, + "stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=", + "dev": true + }, + "stack-generator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-1.1.0.tgz", + "integrity": "sha1-NvapIHUabBD0maE8Msu19RoLiyU=", + "dev": true, + "requires": { + "stackframe": "^1.0.2" + }, + "dependencies": { + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + } + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", + "dev": true + }, + "stacktrace-gps": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-2.4.4.tgz", + "integrity": "sha1-acgn6dbW9Bz0ONfxleLjy/zyjEQ=", + "dev": true, + "requires": { + "source-map": "0.5.6", + "stackframe": "~0.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "stacktrace-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-1.3.1.tgz", + "integrity": "sha1-Z8qyWJr1xBe5Yvc2mUAne7O2oYs=", + "dev": true, + "requires": { + "error-stack-parser": "^1.3.6", + "stack-generator": "^1.0.7", + "stacktrace-gps": "^2.4.3" + } + }, "starttls": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/starttls/-/starttls-1.0.1.tgz", @@ -17070,7 +17212,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { "inherits": "~2.0.1", @@ -17102,7 +17244,7 @@ }, "stream-http": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "requires": { "builtin-status-codes": "^3.0.0", @@ -17194,7 +17336,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -17217,7 +17359,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -17771,7 +17913,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -18005,7 +18147,7 @@ "dependencies": { "progress": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" } } @@ -18469,6 +18611,12 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -18561,14 +18709,14 @@ "dependencies": { "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" } } }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { "inherits": "2.0.1" @@ -18607,7 +18755,7 @@ }, "valid-data-url": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/valid-data-url/-/valid-data-url-0.1.6.tgz", "integrity": "sha512-FXg2qXMzfAhZc0y2HzELNfUeiOjPr+52hU1DNBWiJJ2luXD+dD1R9NA48Ug5aj0ibbxroeGDc/RJv6ThiGgkDw==" }, "validate-npm-package-license": { @@ -18870,6 +19018,11 @@ "xtend": "^4.0.0" } }, + "web-streams-polyfill": { + "version": "git://github.com/gwicke/web-streams-polyfill.git#42c488428adea1dc0c0245014e4896ad456b1ded", + "from": "git://github.com/gwicke/web-streams-polyfill.git#spec_performance_improvements", + "dev": true + }, "webdav": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webdav/-/webdav-2.0.0.tgz", @@ -19141,7 +19294,7 @@ }, "whatwg-fetch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "whatwg-mimetype": { @@ -19237,7 +19390,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -19324,7 +19477,7 @@ "dependencies": { "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" } } @@ -19341,7 +19494,7 @@ }, "xolvio-ddp": { "version": "0.12.3", - "resolved": "https://registry.npmjs.org/xolvio-ddp/-/xolvio-ddp-0.12.3.tgz", + "resolved": "http://registry.npmjs.org/xolvio-ddp/-/xolvio-ddp-0.12.3.tgz", "integrity": "sha1-NqarlhKyQLWg0cCoNJCK8XwLjwI=", "dev": true, "requires": { @@ -19366,7 +19519,7 @@ }, "async": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, @@ -19378,7 +19531,7 @@ }, "bl": { "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", "dev": true, "requires": { @@ -19387,7 +19540,7 @@ }, "bluebird": { "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", "dev": true }, @@ -19399,7 +19552,7 @@ }, "combined-stream": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", "dev": true, "requires": { @@ -19420,7 +19573,7 @@ }, "form-data": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", "dev": true, "requires": { @@ -19460,13 +19613,13 @@ }, "mime-db": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "resolved": "http://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", "dev": true }, "mime-types": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "resolved": "http://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", "dev": true, "requires": { @@ -19493,7 +19646,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -19505,7 +19658,7 @@ }, "request": { "version": "2.53.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.53.0.tgz", + "resolved": "http://registry.npmjs.org/request/-/request-2.53.0.tgz", "integrity": "sha1-GAo66St7Y5gC5PlUXdj83rcddgw=", "dev": true, "requires": { @@ -19544,7 +19697,7 @@ }, "xolvio-fiber-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/xolvio-fiber-utils/-/xolvio-fiber-utils-2.0.3.tgz", + "resolved": "http://registry.npmjs.org/xolvio-fiber-utils/-/xolvio-fiber-utils-2.0.3.tgz", "integrity": "sha1-vsjXDHQGGjFjFbun0w0lyz6C3FA=", "dev": true, "requires": { @@ -19562,7 +19715,7 @@ }, "xolvio-jasmine-expect": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xolvio-jasmine-expect/-/xolvio-jasmine-expect-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/xolvio-jasmine-expect/-/xolvio-jasmine-expect-1.1.0.tgz", "integrity": "sha1-vCud1ghCMR8EV59agtzqaisxnH0=", "dev": true, "requires": { @@ -19629,7 +19782,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { "camelcase": "^2.0.1", diff --git a/package.json b/package.json index 14e79a8b87802..bf8ff6a7353ae 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "@google-cloud/language": "^2.0.0", "@google-cloud/storage": "^2.3.1", "@google-cloud/vision": "^0.23.0", - "@rocket.chat/apps-engine": "^1.5.2", + "@rocket.chat/apps-engine": "^1.6.0-beta.0", "@rocket.chat/fuselage": "^0.2.0-alpha.2", "@rocket.chat/icons": "^0.2.0-alpha.0", "@slack/client": "^4.8.0", diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 3bc8e6270a08e..85e428e34b551 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -389,6 +389,8 @@ "assign-admin-role": "Assign Admin Role", "assign-admin-role_description": "Permission to assign the admin role to other users", "Assign_admin": "Assigning admin", + "Assign_new_conversations_to_bot_agent": "Assign new conversations to bot agent", + "Assign_new_conversations_to_bot_agent_description": "The routing system will attempt to find a bot agent before addressing new conversations to a human agent.", "assign-roles": "Assign Roles", "at": "at", "At_least_one_added_token_is_required_by_the_user": "At least one added token is required by the user", @@ -3395,4 +3397,4 @@ "Your_question": "Your question", "Your_server_link": "Your server link", "Your_workspace_is_ready": "Your workspace is ready to use 🎉" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index e426825e97c2e..863125ed3864a 100644 --- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -368,6 +368,8 @@ "assign-admin-role": "Atribuir papel de administrador", "assign-admin-role_description": "Permissão para atribuir a função de administrador a outros usuários", "Assign_admin": "Atribuindo administrador", + "Assign_new_conversations_to_bot_agent": "Atribuir novas conversas para um agente bot", + "Assign_new_conversations_to_bot_agent_description": "O sistema de roteamento irá procurar por um agente bot antes de encaminhar novas conversas para um agente humano.", "assign-roles": "Atribuir papéis", "at": "em", "At_least_one_added_token_is_required_by_the_user": "Pelo menos um token adicionado é requerido pelo usuário", @@ -3234,4 +3236,4 @@ "Your_question": "A sua pergunta", "Your_server_link": "O link do seu servidor", "Your_workspace_is_ready": "O seu espaço de trabalho está pronto a usar 🎉" -} \ No newline at end of file +}