UNPKG

@convergence/convergence

Version:
20 lines (18 loc) 374 kB
/**! Copyright © 2016-2020 - Convergence Labs, Inc. @version 1.0.0-rc.12 @license Licensed under the terms of the GNU Lesser General Public License version 3 (GPLv3). See https://www.gnu.org/licenses/lgpl-3.0.html */ "use strict";Object.defineProperty(exports,"t",{value:!0});var rxjs=require("rxjs"),operators=require("rxjs/operators"),protobuf=require("protobufjs/light");function _interopNamespace(e){if(e&&e.t)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(s){if("default"!==s){var n=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,n.get?n:{enumerable:!0,get:function(){return e[s]}})}})),t.default=e,Object.freeze(t)}var protobuf__namespace=_interopNamespace(protobuf); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */function __awaiter(e,t,s,n){return new(s||(s=Promise))((function(i,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}exports.LogLevel=void 0,function(e){e.TRACE="trace",e.DEBUG="debug",e.INFO="info",e.WARN="warn",e.ERROR="error",e.SILENT="silent"}(exports.LogLevel||(exports.LogLevel={}));class Immutable{static make(e){"object"==typeof e&&(Object.freeze(e),Object.keys(e).forEach((e,t,s)=>{Immutable.make(e)}))}static copy(e,t){const s={};return Object.keys(e).forEach((n,i,r)=>{s[n]=void 0!==t[n]?t[n]:e[n]}),Object.freeze(s),s}static getOrDefault(e,t){return void 0===e?t:e}static update(e,t){return void 0!==t?t:e}}class LogEvent{constructor(e,t,s,n,i){this.timestamp=e,this.logger=t,this.level=s,this.message=n,this.error=i,Immutable.make(this)}}class TypeChecker{static isArray(e){return Array.isArray(e)}static isMap(e){return e instanceof Map}static isBoolean(e){return"boolean"==typeof e}static isDate(e){return e instanceof Date||"Date"===e.constructor.name}static isError(e){return e instanceof Error&&void 0!==e.message}static isFunction(e){return"function"==typeof e}static isNull(e){return null===e}static isNumber(e){return"number"==typeof e&&isFinite(e)}static isObject(e){return e&&"object"==typeof e&&e.constructor===Object}static isString(e){return"string"==typeof e||e instanceof String}static isSymbol(e){return"symbol"==typeof e}static isRegExp(e){return e&&"object"==typeof e&&e.constructor===RegExp}static isUndefined(e){return void 0===e}static isSet(e){return!TypeChecker.isNull(e)&&!TypeChecker.isUndefined(e)}static isNotSet(e){return!TypeChecker.isSet(e)}static switch(e,t){if(TypeChecker.isUndefined(t)||TypeChecker.isNull(t))throw new Error("matcher must be defined.");if(TypeChecker.isArray(e)&&!TypeChecker.isUndefined(t.array))t.array(e);else if(TypeChecker.isBoolean(e)&&!TypeChecker.isUndefined(t.boolean))t.boolean(e);else if(TypeChecker.isError(e)&&!TypeChecker.isUndefined(t.error))t.error(e);else if(TypeChecker.isDate(e)&&!TypeChecker.isUndefined(t.date))t.date(e);else if(TypeChecker.isFunction(e)&&!TypeChecker.isUndefined(t.function))t.function(e);else if(TypeChecker.isNull(e)&&!TypeChecker.isUndefined(t.null))t.null();else if(TypeChecker.isNumber(e)&&!TypeChecker.isUndefined(t.number))t.number(e);else if(TypeChecker.isObject(e)&&!TypeChecker.isUndefined(t.object))t.object(e);else if(TypeChecker.isRegExp(e)&&!TypeChecker.isUndefined(t.regexp))t.regexp(e);else if(TypeChecker.isString(e)&&!TypeChecker.isUndefined(t.string))t.string(e);else if(TypeChecker.isSymbol(e)&&!TypeChecker.isUndefined(t.symbol))t.symbol(e);else if(TypeChecker.isUndefined(e)&&!TypeChecker.isUndefined(t.undefined))t.undefined();else{const s=TypeChecker.isArray(t.custom)?t.custom.find(t=>TypeChecker.isFunction(t.test)&&TypeChecker.isFunction(t.callback)&&t.test(e)):void 0;TypeChecker.isUndefined(s)?TypeChecker.isUndefined(t.default)||t.default(e):s.callback(e)}}}const LogLevelPriority={SILENT:-1,TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4};class Logger{constructor(e,t,s){this.s=e,this.i=s,this.setLevel(t)}getId(){return this.s}getLevel(){return this.o}setLevel(e){this.o=e,this.l=LogLevelPriority[this.o.toUpperCase()]}trace(e){if(LogLevelPriority.TRACE>=this.l){const t=new LogEvent(new Date,this.s,exports.LogLevel.TRACE,this.h(e));this.p(t)}}debug(e){if(LogLevelPriority.DEBUG>=this.l){const t=new LogEvent(new Date,this.s,exports.LogLevel.DEBUG,this.h(e));this.p(t)}}info(e){if(LogLevelPriority.INFO>=this.l){const t=new LogEvent(new Date,this.s,exports.LogLevel.INFO,this.h(e));this.p(t)}}warn(e){if(LogLevelPriority.WARN>=this.l){const t=new LogEvent(new Date,this.s,exports.LogLevel.WARN,this.h(e));this.p(t)}}error(e,t){if(LogLevelPriority.ERROR>=this.l){const s=new LogEvent(new Date,this.s,exports.LogLevel.ERROR,this.h(e),t);this.p(s)}}p(e){this.l!==LogLevelPriority.SILENT&&this.i.forEach(t=>t.writeLog(e))}h(e){return TypeChecker.isFunction(e)?e():e}}function mapObjectValues(e,t){return Object.keys(e).reduce((s,n)=>(s[n]=t(e[n]),s),{})}function objectForEach(e,t){return Object.keys(e).forEach(s=>{t(s,e[s])})}function deepClone(e){const t=typeof e;if(null==e||"string"===t||"number"===t||"boolean"===t)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(e=>deepClone(e));if(e instanceof Map){const t=new Map;return e.forEach((e,s)=>{t.set(s,deepClone(e))}),t}if(e instanceof Set){const t=new Set;return e.forEach(e=>t.add(deepClone(e))),t}if(e.constructor===Object){const t={};return Object.keys(e).forEach(s=>{t[s]=deepClone(e[s])}),t}const s=e.constructor.name||e.constructor.toString();throw new Error("Can not clone unknown type: "+s)}class Validation{static isSet(e){return!Validation.isNotSet(e)}static isNotSet(e){return null==e}static nonEmptyString(e){return"string"==typeof e&&e.length>0}static assertNonEmptyString(e,t){if(void 0===t&&(t="value"),!Validation.nonEmptyString(e))throw new Error(t+" must be a non-empty string: "+typeof e)}static assertString(e,t){if("string"!=typeof e)throw new Error(`${Validation.getValueName(t)} must be a string: ${typeof e}`)}static assertValidStringIndex(e,t,s,n){Validation.assertValidIndex(e,0,s?t.length+1:t.length,n)}static assertNumber(e,t){if("number"!=typeof e)throw new Error(`${Validation.getValueName(t)} must be a number: ${typeof e}`)}static assertArray(e,t){if(!Array.isArray(e))throw new Error(`${Validation.getValueName(t)} must be an array: ${typeof e}`)}static assertNonEmptyArray(e,t){if(Validation.assertArray(e,t),0===e.length)throw new Error(`${Validation.getValueName(t)} must be a non-empty array: ${typeof e}`)}static assertValidArrayIndex(e,t,s){Validation.assertValidIndex(e,0,t.length,s)}static assertValidIndex(e,t,s,n){if(Validation.assertNumber(e,n),e<t||e>=s)throw n=Validation.getValueName(n),new Error(`Index out of bounds. ${n} must be > 0 and <= ${s}: ${e}`)}static assertBoolean(e,t){if("boolean"!=typeof e)throw new Error(`${Validation.getValueName(t)} must be a boolean but was: ${typeof e}`)}static assertDate(e,t){if(!TypeChecker.isDate(e))throw new Error(`${Validation.getValueName(t)} must be a Date but was: ${e.constructor.name}`)}static getValueName(e,t){return e||t||"value"}}class LoggingConfig{constructor(e){this.u=new Map,TypeChecker.isSet(e.loggers)&&objectForEach(e.loggers,(e,t)=>{if(!Validation.nonEmptyString(e))throw new Error("A logger's id must be a non-empty string");this.u.set(e,this.m(t))}),this.u.set(LoggingConfig.ROOT_LOGGER_ID,this.m(e.root))}resolveLoggerConfig(e){let t=e,s=this.u.get(t);for(;void 0===s&&""!==t;){const e=t.lastIndexOf(".");t=t.substring(0,e),s=this.u.get(t)}return void 0!==s?s:this.u.get(LoggingConfig.ROOT_LOGGER_ID)}m(e){return TypeChecker.isString(e)?{level:e}:e}}LoggingConfig.ROOT_LOGGER_ID="";class PatternLogWriter{constructor(e){this.g=e||PatternLogWriter.DEFAULT_PATTERN}v(e){return`${this.O(e.level.toUpperCase(),5," ",!1)} ${this.R(e)} ${e.message}`}R(e){const t=e.timestamp;return this.O(t.getHours(),2,"0")+":"+this.O(t.getMinutes(),2,"0")+":"+this.O(t.getSeconds(),2,"0")+"."+this.O(t.getMilliseconds(),3,"0")}O(e,t,s,n=!0){let i=String(e);for(;i.length<t;)i=n?s+i:i+s;return i}}PatternLogWriter.FIELDS={LOG_NAME:"%l",MESSAGE:"%m",DATE_TIME:"%t",LOG_LEVEL:"%p"},PatternLogWriter.DEFAULT_PATTERN="%t %p %m";class ConsoleLogWriter extends PatternLogWriter{constructor(e){super(e)}writeLog(e){switch(e.level){case exports.LogLevel.TRACE:case exports.LogLevel.DEBUG:console.debug(this.v(e));break;case exports.LogLevel.INFO:console.info(this.v(e));break;case exports.LogLevel.WARN:console.warn(this.v(e));break;case exports.LogLevel.ERROR:e.error?console.error(this.v(e)+"\n",e.error):console.error(this.v(e))}}}const DEFAULT_CONFIG={root:{level:exports.LogLevel.WARN}};class ConvergenceLogging{constructor(e){this.configure(e||{}),this.S=new ConsoleLogWriter("")}configure(e){const t=Object.assign(Object.assign({},DEFAULT_CONFIG),e);this.C=new LoggingConfig(t),this.u=new Map}root(){return this.logger()}logger(e){if(null==e&&(e=LoggingConfig.ROOT_LOGGER_ID),!this.u.has(e)){const t=this.C.resolveLoggerConfig(e);this.u.set(e,new Logger(e,t.level,[this.S]))}return this.u.get(e)}}const Logging=new ConvergenceLogging;class HeartbeatHelper{constructor(e,t,s){this.M=()=>{this.I.sendPing(),this.D()},this.T=()=>{this.P.trace(()=>"A pong timeout occurred"),this.I.onTimeout()},this.I=e,this.A=t,this._=s,this.N=!1,this.P=Logging.logger("heartbeat")}messageReceived(){this.N&&(this.j(),this.U())}start(){if(null==this.I)throw new Error("Can't start the HeartbeatManager unless the callback is set.");this.P.trace(()=>"HeartbeatHelper started with Ping Interval "+this.A+" and Pong Timeout "+this._),this.N=!0,this.messageReceived()}stop(){this.N=!1,this.V(),this.j(),this.P.trace(()=>"HeartbeatHelper stopped.")}get started(){return this.N}dispose(){this.stop()}D(){this.j();const e=1e3*this._;this.k=setTimeout(this.T,e)}j(){null!==this.k&&(clearTimeout(this.k),this.k=null)}V(){null!==this.q&&(clearTimeout(this.q),this.q=null)}U(){this.V();const e=1e3*this.A;this.q=setTimeout(this.M,e)}}class ConvergenceError extends Error{constructor(e,t,s){super(e),this.F=t,this.L=s||{},this.name="ConvergenceError",Object.setPrototypeOf(this,ConvergenceError.prototype)}get code(){return this.F}get details(){return this.L}}class ConvergenceEventEmitter{constructor(){this.H=new rxjs.Subject,this.B=this.H.asObservable().pipe(operators.share()),this.G=new Map}static $(e){if("string"==typeof e)return e.toLowerCase();throw new Error("Event names must be strings: "+typeof e)}addListener(e,t){if("function"!=typeof t)throw new TypeError("Listeners must be functions");e=ConvergenceEventEmitter.$(e);let s=this.G.get(e);if(void 0===s)s=[],this.G.set(e,s);else if(void 0!==s.find(e=>e.listener===t))return this;const n=this.B.pipe(operators.filter(t=>t.name.toLowerCase()===e)).subscribe(e=>{t(e)});return s.push({listener:t,subscription:n}),this}on(e,t){return this.addListener(e,t)}once(e,t){const s=n=>{this.removeListener(e,s),t(n)};return this.addListener(e,s)}removeAllListeners(){return Array.from(this.G.keys()).forEach(e=>this.removeListeners(e)),this}removeListeners(e){if(e=ConvergenceEventEmitter.$(e),this.G.has(e)){this.G.get(e).forEach(e=>e.subscription.unsubscribe()),this.G.delete(e)}return this}removeListener(e,t){if(e=ConvergenceEventEmitter.$(e),this.G.has(e)){const s=this.G.get(e),n=s.findIndex(e=>e.listener===t);if(-1!==n){const e=s[n];s.splice(n,1),e.subscription.unsubscribe()}0===s.length&&this.G.delete(e)}return this}off(e,t){return this.removeListener(e,t)}events(){return this.B}J(e){return e.subscribe(e=>{this.H.next(e)},e=>{this.H.error(e)})}W(e){if(Validation.isNotSet(e.name))throw new ConvergenceError("An event must have a name.");this.H.next(e)}Y(){this.H.complete()}}class ConvergenceServerError extends Error{constructor(e,t,s){super(e),this.F=t,this.L=s,Object.setPrototypeOf(this,ConvergenceServerError.prototype)}get code(){return this.F}get details(){return this.L}}class CancellationToken{constructor(){this.K=null,this.X=!1}static create(){return new CancellationToken}cancel(){if(null===this.K)throw new Error("The cancellation token must be bound before calling cancel.");if(this.X)throw new Error("The cancellation token has already been cancelled.");this.K(),this.X=!0}isBound(){return null!==this.K}Z(e){if("function"!=typeof e)throw new Error("callback must be a function");if(null!==this.K)throw new Error("The cancellation token was already bound");this.K=e}}class PagedData{constructor(e,t,s){this.data=e,this.offset=t,this.totalResults=s,Object.freeze(this),Object.freeze(e)}}class AbstractDeferred{constructor(){this.ee=!1,this.te=!1}isPending(){return!this.te&&!this.ee}isRejected(){return this.ee}isResolved(){return this.te}resolve(e){this.ee=!1,this.te=!0}reject(e){this.ee=!0,this.te=!1}resolveFromPromise(e){e.then(e=>this.resolve(e)).catch(e=>this.reject(e))}}class Deferred extends AbstractDeferred{constructor(){super(),this.se=new Promise((e,t)=>{this.ne=e,this.ie=t})}resolve(e){super.resolve(e),this.ne(e)}reject(e){super.reject(e),this.ie(e)}promise(){return this.se}}class ConvergenceSocket extends ConvergenceEventEmitter{constructor(e,t,s){super(),this.re=null,this.P=Logging.logger("socket");let n=e;n=n.replace(/https:/i,"wss:"),n=n.replace(/http:/i,"ws:"),this.oe=n,this.ae=null,this.ce=null!==t?t:WebSocket,this.de=null!==s?s:e=>new this.ce(e)}static le(e){e.onmessage=void 0,e.onopen=void 0,e.onerror=void 0,e.onclose=void 0}get url(){return this.oe}open(){if(this.he=new Deferred,this.ae&&this.ae.readyState===this.ce.CONNECTING)throw new Error("Socket already in the process of opening.");if(this.ae&&this.ae.readyState===this.ce.OPEN)throw new Error("Can not call connect on a socket that is already connected.");if(this.ae&&this.ae.readyState===this.ce.CLOSING)throw new Error("Can not call connect on a socket that is in the process of closing.");return this.ae=this.de(this.oe),this.ae.binaryType="arraybuffer",this.pe(this.ae),this.he.promise()}close(){return this.ue(!0)}terminate(e){return this.ue(!1,e)}isOpen(){return null!==this.ae&&this.ae.readyState===this.ce.OPEN}isConnecting(){return null!==this.ae&&this.ae.readyState===this.ce.CONNECTING}isClosed(){return null===this.ae||this.ae.readyState===this.ce.CLOSED}send(e){if(!this.isOpen())throw new Error("Can't send messages because the WebSocket is not open.");this.ae.send(e)}ue(e,t){if(this.ae&&this.ae.readyState!==this.ce.CLOSED){if(this.ae.readyState===this.ce.CLOSING)return this.P.trace("Attempted to close a WebSocket that is in the CLOSING state."),Promise.reject(new Error("Can not call close on a WebSocket in the CLOSING state."));if(this.ae.readyState===this.ce.CONNECTING?this.P.trace("Closing a connecting WebSocket."):this.P.trace("Closing an open WebSocket."),this.me=new Deferred,e?(this.P.debug("Closing WebSocket normally."),this.ae.close(1e3,t||"The client closed the connection")):(this.P.debug("Closing WebSocket abnormally: "+t),this.ae.close(4006,t)),null!==this.he){const e=this.he;this.he=null,e.reject(new Error("Web Socket connection closed while opening."))}return this.me.promise()}return this.P.trace("Attempted to close a WebSocket that is in the CLOSED state."),Promise.reject(new Error("Can not call close on a WebSocket in the CLOSED state."))}pe(e){e.onmessage=e=>{try{if(!(e.data instanceof ArrayBuffer))throw new ConvergenceError("Convergence protocol does not accept text frames: "+e.data);{const t=new Uint8Array(e.data);this.W({name:ConvergenceSocket.Events.MESSAGE,message:t})}}catch(e){this.W({name:ConvergenceSocket.Events.ERROR,error:e}),this.P.error("Error handling web socket frame",e)}},e.onopen=e=>{if(this.he){this.P.debug("WebSocket connection opened");try{this.he.resolve()}catch(e){this.P.error("Error resolving WebSocket Open Promise.",e)}this.he=null}else{const e={name:ConvergenceSocket.Events.ERROR,error:new ConvergenceError("Received onOpen event while in state: "+this.ae.readyState)};this.W(e)}},e.onerror=e=>{if(this.P.debug("WebSocket Error: "+e.message),void 0===this.ae||this.ae.readyState===this.ce.CONNECTING)try{const t={name:ConvergenceSocket.Events.ERROR,error:new ConvergenceError("WebSocket error: "+e.message)};this.W(t)}catch(e){this.P.error("Error handling WebSocket error.",e)}else this.re=e.error},e.onclose=t=>{this.P.trace(()=>`WebSocket close event: {code: ${t.code}, reason: "${t.reason}"}`),ConvergenceSocket.le(e),this.ae=null;try{if(this.he&&(this.P.debug(()=>`Web Socket connection failed: {code: ${t.code}, reason: "${t.reason}"}`),this.he.reject(new Error(this.re)),this.he=null),this.me){const e={name:ConvergenceSocket.Events.CLOSE,reason:"close requested by client"};this.W(e),this.me.resolve()}else{this.P.debug(()=>`Web Socket connection unexpectedly closed: {code: ${t.code}, reason: "${t.reason}"}`);const e={name:ConvergenceSocket.Events.CLOSE,reason:"unexpected Web Socket closure."};this.W(e)}}catch(e){this.P.error("Error handling web socket close event.",e)}}}}ConvergenceSocket.Events={MESSAGE:"message",ERROR:"error",CLOSE:"close"};var nested={com:{nested:{convergencelabs:{nested:{convergence:{nested:{proto:{nested:{ConvergenceMessage:{oneofs:{body:{oneof:["ok","error","ping","pong","connectionRequest","connectionResponse","serverTimeRequest","serverTimeResponse","openRealTimeModelRequest","openRealTimeModelResponse","closeRealTimeModelRequest","closeRealTimeModelResponse","createRealTimeModelRequest","createRealTimeModelResponse","deleteRealtimeModelRequest","deleteRealtimeModelResponse","forceCloseRealTimeModel","remoteClientOpenedModel","remoteClientClosedModel","modelAutoCreateConfigRequest","modelAutoCreateConfigResponse","remoteOperation","operationSubmission","operationAck","shareReference","setReference","clearReference","unshareReference","referenceShared","referenceSet","referenceCleared","referenceUnshared","modelsQueryRequest","modelsQueryResponse","getModelPermissionsRequest","getModelPermissionsResponse","setModelPermissionsRequest","setModelPermissionsResponse","modelPermissionsChanged","modelResyncRequest","modelResyncResponse","modelResyncClientComplete","modelResyncServerComplete","remoteClientResyncStarted","remoteClientResyncCompleted","modelOfflineSubscriptionChange","modelOfflineUpdated","historicalDataRequest","historicalDataResponse","historicalOperationsRequest","historicalOperationsResponse","modelGetVersionAtTimeRequest","modelGetVersionAtTimeResponse","identityCacheUpdate","usersGetRequest","userSearchRequest","userListResponse","userGroupsRequest","userGroupsResponse","userGroupsForUsersRequest","userGroupsForUsersResponse","activityParticipantsRequest","activityParticipantsResponse","activityCreateRequest","activityDeleteRequest","activityJoinRequest","activityJoinResponse","activityLeaveRequest","activitySessionJoined","activitySessionLeft","activityUpdateState","activityStateUpdated","activityDeleted","activityForceLeave","presenceSetState","presenceRemoveState","presenceClearState","presenceStateSet","presenceStateRemoved","presenceStateCleared","presenceAvailabilityChanged","presenceRequest","presenceResponse","presenceSubscribeRequest","presenceSubscribeResponse","presenceUnsubscribe","createChatRequest","createChatResponse","removeChatRequest","removeChatResponse","chatRemoved","getChatsRequest","getChatsResponse","chatsExistRequest","chatsExistResponse","getDirectChatsRequest","getDirectChatsResponse","getJoinedChatsRequest","getJoinedChatsResponse","chatsSearchRequest","chatsSearchResponse","joinChatRequest","joinChatResponse","userJoinedChat","leaveChatRequest","leaveChatResponse","userLeftChat","addUserToChatRequest","addUserToChatResponse","userAddedToChat","removeUserFromChatRequest","removeUserFromChatResponse","userRemovedFromChat","setChatNameRequest","setChatNameResponse","chatNameChanged","setChatTopicRequest","setChatTopicResponse","chatTopicChanged","markChatEventsSeenRequest","markChatEventsSeenResponse","chatEventsMarkedSeen","publishChatMessageRequest","publishChatMessageResponse","remoteChatMessage","getChatHistoryRequest","getChatHistoryResponse","resolvePermissionsForConnectedSessionRequest","resolvePermissionsForConnectedSessionResponse","addPermissionsRequest","removePermissionsRequest","setPermissionsRequest","getPermissionsRequest","getPermissionsResponse"]}},fields:{requestId:{type:"google.protobuf.Int32Value",id:1},responseId:{type:"google.protobuf.Int32Value",id:2},ok:{type:"core.OkResponse",id:3},error:{type:"core.ErrorMessage",id:4},ping:{type:"core.PingMessage",id:5},pong:{type:"core.PongMessage",id:6},connectionRequest:{type:"core.ConnectionRequestMessage",id:7},connectionResponse:{type:"core.ConnectionResponseMessage",id:8},serverTimeRequest:{type:"core.GetServerTimeRequestMessage",id:20},serverTimeResponse:{type:"core.GetServerTimeResponseMessage",id:21},openRealTimeModelRequest:{type:"model.OpenRealtimeModelRequestMessage",id:100},openRealTimeModelResponse:{type:"model.OpenRealtimeModelResponseMessage",id:101},closeRealTimeModelRequest:{type:"model.CloseRealtimeModelRequestMessage",id:102},closeRealTimeModelResponse:{type:"model.CloseRealTimeModelResponseMessage",id:103},createRealTimeModelRequest:{type:"model.CreateRealtimeModelRequestMessage",id:104},createRealTimeModelResponse:{type:"model.CreateRealtimeModelResponseMessage",id:105},deleteRealtimeModelRequest:{type:"model.DeleteRealtimeModelRequestMessage",id:106},deleteRealtimeModelResponse:{type:"model.DeleteRealtimeModelResponseMessage",id:107},forceCloseRealTimeModel:{type:"model.ModelForceCloseMessage",id:108},remoteClientOpenedModel:{type:"model.RemoteClientOpenedMessage",id:109},remoteClientClosedModel:{type:"model.RemoteClientClosedMessage",id:110},modelAutoCreateConfigRequest:{type:"model.AutoCreateModelConfigRequestMessage",id:111},modelAutoCreateConfigResponse:{type:"model.AutoCreateModelConfigResponseMessage",id:112},remoteOperation:{type:"model.RemoteOperationMessage",id:113},operationSubmission:{type:"model.OperationSubmissionMessage",id:114},operationAck:{type:"model.OperationAcknowledgementMessage",id:115},shareReference:{type:"model.ShareReferenceMessage",id:116},setReference:{type:"model.SetReferenceMessage",id:117},clearReference:{type:"model.ClearReferenceMessage",id:118},unshareReference:{type:"model.UnshareReferenceMessage",id:119},referenceShared:{type:"model.RemoteReferenceSharedMessage",id:120},referenceSet:{type:"model.RemoteReferenceSetMessage",id:121},referenceCleared:{type:"model.RemoteReferenceClearedMessage",id:122},referenceUnshared:{type:"model.RemoteReferenceUnsharedMessage",id:123},modelsQueryRequest:{type:"model.ModelsQueryRequestMessage",id:124},modelsQueryResponse:{type:"model.ModelsQueryResponseMessage",id:125},getModelPermissionsRequest:{type:"model.GetModelPermissionsRequestMessage",id:126},getModelPermissionsResponse:{type:"model.GetModelPermissionsResponseMessage",id:127},setModelPermissionsRequest:{type:"model.SetModelPermissionsRequestMessage",id:128},setModelPermissionsResponse:{type:"model.SetModelPermissionsResponseMessage",id:129},modelPermissionsChanged:{type:"model.ModelPermissionsChangedMessage",id:130},modelResyncRequest:{type:"model.ModelResyncRequestMessage",id:131},modelResyncResponse:{type:"model.ModelResyncResponseMessage",id:132},modelResyncClientComplete:{type:"model.ModelResyncClientCompleteMessage",id:133},modelResyncServerComplete:{type:"model.ModelResyncServerCompleteMessage",id:134},remoteClientResyncStarted:{type:"model.RemoteClientResyncStartedMessage",id:135},remoteClientResyncCompleted:{type:"model.RemoteClientResyncCompletedMessage",id:136},modelOfflineSubscriptionChange:{type:"model.ModelOfflineSubscriptionChangeRequestMessage",id:137},modelOfflineUpdated:{type:"model.OfflineModelUpdatedMessage",id:138},historicalDataRequest:{type:"model.HistoricalDataRequestMessage",id:139},historicalDataResponse:{type:"model.HistoricalDataResponseMessage",id:140},historicalOperationsRequest:{type:"model.HistoricalOperationRequestMessage",id:141},historicalOperationsResponse:{type:"model.HistoricalOperationsResponseMessage",id:142},modelGetVersionAtTimeRequest:{type:"model.ModelGetVersionAtTimeRequestMessage",id:143},modelGetVersionAtTimeResponse:{type:"model.ModelGetVersionAtTimeResponseMessage",id:144},identityCacheUpdate:{type:"identity.IdentityCacheUpdateMessage",id:200},usersGetRequest:{type:"identity.GetUsersRequestMessage",id:201},userSearchRequest:{type:"identity.SearchUsersRequestMessage",id:202},userListResponse:{type:"identity.UserListMessage",id:203},userGroupsRequest:{type:"identity.UserGroupsRequestMessage",id:204},userGroupsResponse:{type:"identity.UserGroupsResponseMessage",id:205},userGroupsForUsersRequest:{type:"identity.UserGroupsForUsersRequestMessage",id:206},userGroupsForUsersResponse:{type:"identity.UserGroupsForUsersResponseMessage",id:207},activityParticipantsRequest:{type:"activity.ActivityParticipantsRequestMessage",id:300},activityParticipantsResponse:{type:"activity.ActivityParticipantsResponseMessage",id:301},activityCreateRequest:{type:"activity.ActivityCreateRequestMessage",id:302},activityDeleteRequest:{type:"activity.ActivityDeleteRequestMessage",id:304},activityJoinRequest:{type:"activity.ActivityJoinRequestMessage",id:306},activityJoinResponse:{type:"activity.ActivityJoinResponseMessage",id:307},activityLeaveRequest:{type:"activity.ActivityLeaveRequestMessage",id:308},activitySessionJoined:{type:"activity.ActivitySessionJoinedMessage",id:310},activitySessionLeft:{type:"activity.ActivitySessionLeftMessage",id:311},activityUpdateState:{type:"activity.ActivityUpdateStateMessage",id:312},activityStateUpdated:{type:"activity.ActivityStateUpdatedMessage",id:313},activityDeleted:{type:"activity.ActivityDeletedMessage",id:314},activityForceLeave:{type:"activity.ActivityForceLeaveMessage",id:315},presenceSetState:{type:"presence.PresenceSetStateMessage",id:400},presenceRemoveState:{type:"presence.PresenceRemoveStateMessage",id:401},presenceClearState:{type:"presence.PresenceClearStateMessage",id:402},presenceStateSet:{type:"presence.PresenceStateSetMessage",id:403},presenceStateRemoved:{type:"presence.PresenceStateRemovedMessage",id:404},presenceStateCleared:{type:"presence.PresenceStateClearedMessage",id:405},presenceAvailabilityChanged:{type:"presence.PresenceAvailabilityChangedMessage",id:406},presenceRequest:{type:"presence.PresenceRequestMessage",id:407},presenceResponse:{type:"presence.PresenceResponseMessage",id:408},presenceSubscribeRequest:{type:"presence.SubscribePresenceRequestMessage",id:409},presenceSubscribeResponse:{type:"presence.SubscribePresenceResponseMessage",id:410},presenceUnsubscribe:{type:"presence.UnsubscribePresenceMessage",id:411},createChatRequest:{type:"chat.CreateChatRequestMessage",id:500},createChatResponse:{type:"chat.CreateChatResponseMessage",id:501},removeChatRequest:{type:"chat.RemoveChatRequestMessage",id:502},removeChatResponse:{type:"chat.RemoveChatResponseMessage",id:503},chatRemoved:{type:"chat.ChatRemovedMessage",id:504},getChatsRequest:{type:"chat.GetChatsRequestMessage",id:505},getChatsResponse:{type:"chat.GetChatsResponseMessage",id:506},chatsExistRequest:{type:"chat.ChatsExistRequestMessage",id:507},chatsExistResponse:{type:"chat.ChatsExistResponseMessage",id:508},getDirectChatsRequest:{type:"chat.GetDirectChatsRequestMessage",id:509},getDirectChatsResponse:{type:"chat.GetDirectChatsResponseMessage",id:510},getJoinedChatsRequest:{type:"chat.GetJoinedChatsRequestMessage",id:511},getJoinedChatsResponse:{type:"chat.GetJoinedChatsResponseMessage",id:512},chatsSearchRequest:{type:"chat.ChatsSearchRequestMessage",id:513},chatsSearchResponse:{type:"chat.ChatsSearchResponseMessage",id:514},joinChatRequest:{type:"chat.JoinChatRequestMessage",id:515},joinChatResponse:{type:"chat.JoinChatResponseMessage",id:516},userJoinedChat:{type:"chat.UserJoinedChatMessage",id:517},leaveChatRequest:{type:"chat.LeaveChatRequestMessage",id:518},leaveChatResponse:{type:"chat.LeaveChatResponseMessage",id:519},userLeftChat:{type:"chat.UserLeftChatMessage",id:520},addUserToChatRequest:{type:"chat.AddUserToChatRequestMessage",id:521},addUserToChatResponse:{type:"chat.AddUserToChatResponseMessage",id:522},userAddedToChat:{type:"chat.UserAddedToChatMessage",id:523},removeUserFromChatRequest:{type:"chat.RemoveUserFromChatRequestMessage",id:524},removeUserFromChatResponse:{type:"chat.RemoveUserFromChatResponseMessage",id:525},userRemovedFromChat:{type:"chat.UserRemovedFromChatMessage",id:526},setChatNameRequest:{type:"chat.SetChatNameRequestMessage",id:527},setChatNameResponse:{type:"chat.SetChatNameResponseMessage",id:528},chatNameChanged:{type:"chat.ChatNameSetMessage",id:529},setChatTopicRequest:{type:"chat.SetChatTopicRequestMessage",id:530},setChatTopicResponse:{type:"chat.SetChatTopicResponseMessage",id:531},chatTopicChanged:{type:"chat.ChatTopicSetMessage",id:532},markChatEventsSeenRequest:{type:"chat.MarkChatEventsSeenRequestMessage",id:533},markChatEventsSeenResponse:{type:"chat.MarkChatEventsSeenResponseMessage",id:534},chatEventsMarkedSeen:{type:"chat.ChatEventsMarkedSeenMessage",id:535},publishChatMessageRequest:{type:"chat.PublishChatRequestMessage",id:536},publishChatMessageResponse:{type:"chat.PublishChatResponseMessage",id:537},remoteChatMessage:{type:"chat.RemoteChatMessageMessage",id:538},getChatHistoryRequest:{type:"chat.ChatHistoryRequestMessage",id:539},getChatHistoryResponse:{type:"chat.ChatHistoryResponseMessage",id:540},resolvePermissionsForConnectedSessionRequest:{type:"core.ResolvePermissionsForConnectedSessionRequestMessage",id:601},resolvePermissionsForConnectedSessionResponse:{type:"core.ResolvePermissionsForConnectedSessionResponseMessage",id:602},addPermissionsRequest:{type:"core.AddPermissionsRequestMessage",id:603},removePermissionsRequest:{type:"core.RemovePermissionsRequestMessage",id:605},setPermissionsRequest:{type:"core.SetPermissionsRequestMessage",id:607},getPermissionsRequest:{type:"core.GetPermissionsRequestMessage",id:609},getPermissionsResponse:{type:"core.GetPermissionsResponseMessage",id:610}}},core:{nested:{PingMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},PongMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},ConnectionRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},oneofs:{auth:{oneof:["password","jwt","anonymous","reconnect"]}},fields:{client:{type:"string",id:1},clientVersion:{type:"string",id:2},password:{type:"PasswordAuthRequestData",id:3},jwt:{type:"JwtAuthRequestData",id:4},anonymous:{type:"AnonymousAuthRequestData",id:5},reconnect:{type:"ReconnectTokenAuthRequestData",id:6}},nested:{PasswordAuthRequestData:{fields:{username:{type:"string",id:1},password:{type:"string",id:2}}},JwtAuthRequestData:{fields:{jwt:{type:"string",id:1}}},ReconnectTokenAuthRequestData:{fields:{token:{type:"string",id:1}}},AnonymousAuthRequestData:{fields:{displayName:{type:"google.protobuf.StringValue",id:1}}}}},ConnectionResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},oneofs:{response:{oneof:["success","failure"]}},fields:{server:{type:"ServerData",id:1},success:{type:"ConnectionSuccessData",id:3},failure:{type:"ConnectionFailureData",id:4}},nested:{ServerData:{fields:{version:{type:"string",id:1}}},ConnectionSuccessData:{fields:{namespace:{type:"string",id:1},domainId:{type:"string",id:2},user:{type:"DomainUserData",id:3},sessionId:{type:"string",id:4},reconnectToken:{type:"string",id:5},presenceState:{keyType:"string",type:"google.protobuf.Value",id:6}}},ConnectionFailureData:{fields:{code:{type:"string",id:1},details:{type:"string",id:2},retryOk:{type:"bool",id:3}}}}},DomainUserTypeData:{values:{Normal:0,Convergence:1,Anonymous:2}},DomainUserIdData:{fields:{userType:{type:"DomainUserTypeData",id:1},username:{type:"string",id:2}}},DomainUserIdList:{fields:{values:{rule:"repeated",type:"DomainUserIdData",id:1}}},DomainUserData:{fields:{userId:{type:"DomainUserIdData",id:1},firstName:{type:"google.protobuf.StringValue",id:2},lastName:{type:"google.protobuf.StringValue",id:3},displayName:{type:"google.protobuf.StringValue",id:4},email:{type:"google.protobuf.StringValue",id:5},disabled:{type:"bool",id:6},deleted:{type:"bool",id:7},deletedUsername:{type:"google.protobuf.StringValue",id:8}}},UserPermissionsEntry:{fields:{user:{type:"DomainUserIdData",id:1},permissions:{rule:"repeated",type:"string",id:2}}},PermissionsList:{fields:{values:{rule:"repeated",type:"string",id:1}}},PermissionTarget:{oneofs:{targetType:{oneof:["chat","activity"]}},fields:{chat:{type:"Chat",id:1},activity:{type:"Activity",id:2}},nested:{Chat:{fields:{id:{type:"string",id:1}}},Activity:{fields:{type:{type:"string",id:1},id:{type:"string",id:2}}}}},AddPermissionsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{target:{type:"PermissionTarget",id:1},world:{rule:"repeated",type:"string",id:2},user:{rule:"repeated",type:"UserPermissionsEntry",id:3},group:{keyType:"string",type:"PermissionsList",id:4}}},RemovePermissionsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{target:{type:"PermissionTarget",id:1},world:{rule:"repeated",type:"string",id:2},user:{rule:"repeated",type:"UserPermissionsEntry",id:3},group:{keyType:"string",type:"PermissionsList",id:4}}},SetPermissionsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{target:{type:"PermissionTarget",id:1},world:{type:"SetWorld",id:2},user:{type:"SetUser",id:3},group:{type:"SetGroup",id:4}},nested:{SetWorld:{fields:{permissions:{rule:"repeated",type:"string",id:1}}},SetUser:{fields:{permissions:{rule:"repeated",type:"UserPermissionsEntry",id:1},replaceAll:{type:"bool",id:2}}},SetGroup:{fields:{permissions:{keyType:"string",type:"PermissionsList",id:1},replaceAll:{type:"bool",id:2}}}}},GetPermissionsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{target:{type:"PermissionTarget",id:1}}},GetPermissionsResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{user:{rule:"repeated",type:"UserPermissionsEntry",id:1},group:{keyType:"string",type:"PermissionsList",id:2},world:{rule:"repeated",type:"string",id:3}}},ResolvePermissionsForConnectedSessionRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{target:{type:"PermissionTarget",id:1}}},ResolvePermissionsForConnectedSessionResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{permissions:{rule:"repeated",type:"string",id:1}}},ErrorMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{code:{type:"string",id:1},message:{type:"string",id:2},details:{keyType:"string",type:"google.protobuf.Value",id:3}}},OkResponse:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},GetServerTimeRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{}},GetServerTimeResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{serverTime:{type:"google.protobuf.Timestamp",id:1}}},StringList:{fields:{values:{rule:"repeated",type:"string",id:1}}},Int32List:{fields:{values:{rule:"repeated",type:"int32",id:1}}}}},activity:{nested:{ActivityCreateRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{activityType:{type:"string",id:1},activityId:{type:"string",id:2},worldPermissions:{rule:"repeated",type:"string",id:3},userPermissions:{rule:"repeated",type:"core.UserPermissionsEntry",id:4},groupPermissions:{keyType:"string",type:"core.PermissionsList",id:5}}},ActivityDeleteRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{activityType:{type:"string",id:1},activityId:{type:"string",id:2}}},ActivityParticipantsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{activityType:{type:"string",id:1},activityId:{type:"string",id:2}}},ActivityParticipantsResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{state:{keyType:"string",type:"ActivityStateData",id:1}}},ActivityJoinRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{activityType:{type:"string",id:1},activityId:{type:"string",id:2},lurk:{type:"bool",id:3},state:{keyType:"string",type:"google.protobuf.Value",id:4},autoCreateData:{type:"AutoCreateData",id:5}},nested:{AutoCreateData:{fields:{ephemeral:{type:"bool",id:1},worldPermissions:{rule:"repeated",type:"string",id:3},userPermissions:{rule:"repeated",type:"core.UserPermissionsEntry",id:4},groupPermissions:{keyType:"string",type:"core.PermissionsList",id:5}}}}},ActivityJoinResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1},state:{keyType:"string",type:"ActivityStateData",id:2},ephemeral:{type:"bool",id:3},created:{type:"google.protobuf.Timestamp",id:5}}},ActivityLeaveRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.RequestMessage"},fields:{resourceId:{type:"int32",id:1}}},ActivityUpdateStateMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{resourceId:{type:"int32",id:1},set:{keyType:"string",type:"google.protobuf.Value",id:2},complete:{type:"bool",id:3},removed:{rule:"repeated",type:"string",id:4}}},ActivitySessionJoinedMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1},sessionId:{type:"string",id:2},state:{keyType:"string",type:"google.protobuf.Value",id:3}}},ActivitySessionLeftMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1},sessionId:{type:"string",id:2}}},ActivityStateUpdatedMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1},sessionId:{type:"string",id:2},set:{keyType:"string",type:"google.protobuf.Value",id:3},complete:{type:"bool",id:4},removed:{rule:"repeated",type:"string",id:5}}},ActivityDeletedMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1}}},ActivityForceLeaveMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{resourceId:{type:"int32",id:1},reason:{type:"string",id:2}}},ActivityStateData:{fields:{state:{keyType:"string",type:"google.protobuf.Value",id:1}}}}},chat:{nested:{PublishChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},message:{type:"string",id:2}}},PublishChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{eventNumber:{type:"int64",id:1},timestamp:{type:"google.protobuf.Timestamp",id:2}}},RemoteChatMessageMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4},message:{type:"string",id:5}}},CreateChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"google.protobuf.StringValue",id:1},chatType:{type:"string",id:2},membership:{type:"string",id:3},name:{type:"string",id:4},topic:{type:"string",id:5},members:{rule:"repeated",type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:6}}},CreateChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1}}},RemoveChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1}}},RemoveChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},ChatRemovedMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1}}},JoinChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1}}},JoinChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatInfo:{type:"ChatInfoData",id:1}}},UserJoinedChatMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4}}},AddUserToChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},userToAdd:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:2}}},AddUserToChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},UserAddedToChatMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4},addedUser:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:5}}},ChatJoinedMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1}}},LeaveChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1}}},LeaveChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},UserLeftChatMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4}}},RemoveUserFromChatRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},userToRemove:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:2}}},RemoveUserFromChatResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},UserRemovedFromChatMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4},removedUser:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:5}}},ChatLeftMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1}}},SetChatNameRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},name:{type:"string",id:2}}},SetChatNameResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},ChatNameSetMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4},name:{type:"string",id:5}}},SetChatTopicRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},topic:{type:"string",id:2}}},SetChatTopicResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},ChatTopicSetMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:4},topic:{type:"string",id:5}}},MarkChatEventsSeenRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2}}},MarkChatEventsSeenResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{}},ChatEventsMarkedSeenMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatId:{type:"string",id:1},user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:2},eventNumber:{type:"int64",id:3}}},GetJoinedChatsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{}},GetJoinedChatsResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatInfo:{rule:"repeated",type:"ChatInfoData",id:1}}},GetChatsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatIds:{rule:"repeated",type:"string",id:1}}},GetChatsResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatInfo:{rule:"repeated",type:"ChatInfoData",id:1}}},GetDirectChatsRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{userLists:{rule:"repeated",type:"com.convergencelabs.convergence.proto.core.DomainUserIdList",id:1}}},GetDirectChatsResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{chatInfo:{rule:"repeated",type:"ChatInfoData",id:1}}},ChatHistoryRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatId:{type:"string",id:1},offset:{type:"google.protobuf.Int64Value",id:2},limit:{type:"google.protobuf.Int64Value",id:3},startEvent:{type:"google.protobuf.Int64Value",id:4},forward:{type:"google.protobuf.BoolValue",id:5},eventFilter:{rule:"repeated",type:"string",id:6}}},ChatHistoryResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{data:{rule:"repeated",type:"ChatEventData",id:1},startIndex:{type:"int64",id:2},totalResults:{type:"int64",id:3}}},ChatsExistRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{chatIds:{rule:"repeated",type:"string",id:1}}},ChatsExistResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{exists:{rule:"repeated",type:"bool",id:1}}},ChatsSearchRequestMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ClientMessage"},fields:{searchTerm:{type:"string",id:1},searchFields:{rule:"repeated",type:"string",id:2},types:{rule:"repeated",type:"string",id:3},membership:{type:"string",id:4},offset:{type:"google.protobuf.Int64Value",id:5},limit:{type:"google.protobuf.Int64Value",id:6}}},ChatsSearchResponseMessage:{options:{"(scalapb.message).extends":"com.convergencelabs.convergence.proto.ServerMessage"},fields:{data:{rule:"repeated",type:"ChatInfoData",id:1},startIndex:{type:"int64",id:2},totalResults:{type:"int64",id:3}}},ChatMemberData:{fields:{user:{type:"com.convergencelabs.convergence.proto.core.DomainUserIdData",id:1},maxSeenEventNumber:{type:"int64",id:2}}},ChatInfoData:{fields:{id:{type:"string",id:1},chatType:{type:"string",id:2},membership:{type:"string",id:3},name:{type:"string",id:4},topic:{type:"string",id:5},createdTime:{type:"google.protobuf.Timestamp",id:6},lastEventTime:{type:"google.protobuf.Timestamp",id:7},lastEventNumber:{type:"int64",id:8},members:{rule:"repeated",type:"ChatMemberData",id:9}}},ChatCreatedEventData:{fields:{chatId:{type:"string",id:1},eventNumber:{type:"int64",id:2},timestamp:{type:"google.protobuf.Timestamp",id:3},user:{type:"com.convergencelabs.converg