ba2feef09d81f52934eaccfb4d1fbcd407d2c74b10c8ec56062c30f4c0a7da39.json 55 KB

1
  1. {"ast":null,"code":"\"use strict\";\n\nvar _asyncToGenerator = require(\"F:/workspace/202226701027/huinongbao-app/node_modules/@babel/runtime/helpers/asyncToGenerator.js\").default;\nvar _Object$defineProperty = require(\"@babel/runtime-corejs3/core-js-stable/object/define-property\");\nvar _interopRequireDefault = require(\"@babel/runtime-corejs3/helpers/interopRequireDefault\");\n_Object$defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _indexOf = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/index-of\"));\nvar _map = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/map\"));\nvar _keys = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/keys\"));\nvar _stringify = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/json/stringify\"));\nvar _forEach = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/for-each\"));\nvar _values = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/values\"));\nvar _setTimeout2 = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/set-timeout\"));\nvar _bind = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/bind\"));\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime-corejs3/helpers/defineProperty\"));\nvar _CoreManager = _interopRequireDefault(require(\"./CoreManager\"));\nvar _ParseObject = _interopRequireDefault(require(\"./ParseObject\"));\nvar _LiveQuerySubscription = _interopRequireDefault(require(\"./LiveQuerySubscription\"));\nvar _promiseUtils = require(\"./promiseUtils\");\nvar _ParseError = _interopRequireDefault(require(\"./ParseError\"));\n// The LiveQuery client inner state\nconst CLIENT_STATE = {\n INITIALIZED: 'initialized',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed',\n RECONNECTING: 'reconnecting',\n DISCONNECTED: 'disconnected'\n};\n\n// The event type the LiveQuery client should sent to server\nconst OP_TYPES = {\n CONNECT: 'connect',\n SUBSCRIBE: 'subscribe',\n UNSUBSCRIBE: 'unsubscribe',\n ERROR: 'error'\n};\n\n// The event we get back from LiveQuery server\nconst OP_EVENTS = {\n CONNECTED: 'connected',\n SUBSCRIBED: 'subscribed',\n UNSUBSCRIBED: 'unsubscribed',\n ERROR: 'error',\n CREATE: 'create',\n UPDATE: 'update',\n ENTER: 'enter',\n LEAVE: 'leave',\n DELETE: 'delete'\n};\n\n// The event the LiveQuery client should emit\nconst CLIENT_EMMITER_TYPES = {\n CLOSE: 'close',\n ERROR: 'error',\n OPEN: 'open'\n};\n\n// The event the LiveQuery subscription should emit\nconst SUBSCRIPTION_EMMITER_TYPES = {\n OPEN: 'open',\n CLOSE: 'close',\n ERROR: 'error',\n CREATE: 'create',\n UPDATE: 'update',\n ENTER: 'enter',\n LEAVE: 'leave',\n DELETE: 'delete'\n};\n\n// Exponentially-growing random delay\nconst generateInterval = k => {\n return Math.random() * Math.min(30, Math.pow(2, k) - 1) * 1000;\n};\n\n/**\n * Creates a new LiveQueryClient.\n * <a href=\"https://nodejs.org/api/events.html#events_class_eventemitter\">cloud functions</a>.\n *\n * A wrapper of a standard WebSocket client. We add several useful methods to\n * help you connect/disconnect to LiveQueryServer, subscribe/unsubscribe a ParseQuery easily.\n *\n * javascriptKey and masterKey are used for verifying the LiveQueryClient when it tries\n * to connect to the LiveQuery server\n *\n * We expose three events to help you monitor the status of the LiveQueryClient.\n *\n * <pre>\n * const LiveQueryClient = Parse.LiveQueryClient;\n * const client = new LiveQueryClient({\n * applicationId: '',\n * serverURL: '',\n * javascriptKey: '',\n * masterKey: ''\n * });\n * </pre>\n *\n * Open - When we establish the WebSocket connection to the LiveQuery server, you'll get this event.\n * <pre>\n * client.on('open', () => {\n *\n * });</pre>\n *\n * Close - When we lose the WebSocket connection to the LiveQuery server, you'll get this event.\n * <pre>\n * client.on('close', () => {\n *\n * });</pre>\n *\n * Error - When some network error or LiveQuery server error happens, you'll get this event.\n * <pre>\n * client.on('error', (error) => {\n *\n * });</pre>\n *\n * @alias Parse.LiveQueryClient\n */\nclass LiveQueryClient {\n /**\n * @param {object} options\n * @param {string} options.applicationId - applicationId of your Parse app\n * @param {string} options.serverURL - <b>the URL of your LiveQuery server</b>\n * @param {string} options.javascriptKey (optional)\n * @param {string} options.masterKey (optional) Your Parse Master Key. (Node.js only!)\n * @param {string} options.sessionToken (optional)\n * @param {string} options.installationId (optional)\n */\n constructor(_ref) {\n var _this = this;\n let {\n applicationId,\n serverURL,\n javascriptKey,\n masterKey,\n sessionToken,\n installationId\n } = _ref;\n (0, _defineProperty2.default)(this, \"attempts\", void 0);\n (0, _defineProperty2.default)(this, \"id\", void 0);\n (0, _defineProperty2.default)(this, \"requestId\", void 0);\n (0, _defineProperty2.default)(this, \"applicationId\", void 0);\n (0, _defineProperty2.default)(this, \"serverURL\", void 0);\n (0, _defineProperty2.default)(this, \"javascriptKey\", void 0);\n (0, _defineProperty2.default)(this, \"masterKey\", void 0);\n (0, _defineProperty2.default)(this, \"sessionToken\", void 0);\n (0, _defineProperty2.default)(this, \"installationId\", void 0);\n (0, _defineProperty2.default)(this, \"additionalProperties\", void 0);\n (0, _defineProperty2.default)(this, \"connectPromise\", void 0);\n (0, _defineProperty2.default)(this, \"subscriptions\", void 0);\n (0, _defineProperty2.default)(this, \"socket\", void 0);\n (0, _defineProperty2.default)(this, \"state\", void 0);\n (0, _defineProperty2.default)(this, \"reconnectHandle\", void 0);\n (0, _defineProperty2.default)(this, \"emitter\", void 0);\n (0, _defineProperty2.default)(this, \"on\", void 0);\n (0, _defineProperty2.default)(this, \"emit\", void 0);\n if (!serverURL || (0, _indexOf.default)(serverURL).call(serverURL, 'ws') !== 0) {\n throw new Error('You need to set a proper Parse LiveQuery server url before using LiveQueryClient');\n }\n this.reconnectHandle = null;\n this.attempts = 1;\n this.id = 0;\n this.requestId = 1;\n this.serverURL = serverURL;\n this.applicationId = applicationId;\n this.javascriptKey = javascriptKey || undefined;\n this.masterKey = masterKey || undefined;\n this.sessionToken = sessionToken || undefined;\n this.installationId = installationId || undefined;\n this.additionalProperties = true;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.subscriptions = new _map.default();\n this.state = CLIENT_STATE.INITIALIZED;\n const EventEmitter = _CoreManager.default.getEventEmitter();\n this.emitter = new EventEmitter();\n this.on = (eventName, listener) => this.emitter.on(eventName, listener);\n this.emit = function (eventName) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return _this.emitter.emit(eventName, ...args);\n };\n // adding listener so process does not crash\n // best practice is for developer to register their own listener\n this.on('error', () => {});\n }\n shouldOpen() {\n return this.state === CLIENT_STATE.INITIALIZED || this.state === CLIENT_STATE.DISCONNECTED;\n }\n\n /**\n * Subscribes to a ParseQuery\n *\n * If you provide the sessionToken, when the LiveQuery server gets ParseObject's\n * updates from parse server, it'll try to check whether the sessionToken fulfills\n * the ParseObject's ACL. The LiveQuery server will only send updates to clients whose\n * sessionToken is fit for the ParseObject's ACL. You can check the LiveQuery protocol\n * <a href=\"https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification\">here</a> for more details. The subscription you get is the same subscription you get\n * from our Standard API.\n *\n * @param {ParseQuery} query - the ParseQuery you want to subscribe to\n * @param {string} sessionToken (optional)\n * @returns {LiveQuerySubscription | undefined}\n */\n subscribe(query, sessionToken) {\n var _ref2, _queryJSON$watch;\n if (!query) {\n return;\n }\n const className = query.className;\n const queryJSON = query.toJSON();\n const where = queryJSON.where;\n const keys = (_ref2 = (0, _keys.default)(queryJSON)) === null || _ref2 === void 0 ? void 0 : _ref2.split(',');\n const watch = (_queryJSON$watch = queryJSON.watch) === null || _queryJSON$watch === void 0 ? void 0 : _queryJSON$watch.split(',');\n const subscribeRequest = {\n op: OP_TYPES.SUBSCRIBE,\n requestId: this.requestId,\n query: {\n className,\n where,\n keys,\n watch\n },\n sessionToken: undefined\n };\n if (sessionToken) {\n subscribeRequest.sessionToken = sessionToken;\n }\n const subscription = new _LiveQuerySubscription.default(this.requestId, query, sessionToken);\n this.subscriptions.set(this.requestId, subscription);\n this.requestId += 1;\n this.connectPromise.then(() => {\n this.socket.send((0, _stringify.default)(subscribeRequest));\n }).catch(error => {\n subscription.subscribePromise.reject(error);\n });\n return subscription;\n }\n\n /**\n * After calling unsubscribe you'll stop receiving events from the subscription object.\n *\n * @param {object} subscription - subscription you would like to unsubscribe from.\n * @returns {Promise | undefined}\n */\n unsubscribe(subscription) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n if (!subscription) {\n return;\n }\n const unsubscribeRequest = {\n op: OP_TYPES.UNSUBSCRIBE,\n requestId: subscription.id\n };\n return _this2.connectPromise.then(() => {\n return _this2.socket.send((0, _stringify.default)(unsubscribeRequest));\n }).then(() => {\n return subscription.unsubscribePromise;\n });\n })();\n }\n\n /**\n * After open is called, the LiveQueryClient will try to send a connect request\n * to the LiveQuery server.\n *\n */\n open() {\n const WebSocketImplementation = _CoreManager.default.getWebSocketController();\n if (!WebSocketImplementation) {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, 'Can not find WebSocket implementation');\n return;\n }\n if (this.state !== CLIENT_STATE.RECONNECTING) {\n this.state = CLIENT_STATE.CONNECTING;\n }\n this.socket = new WebSocketImplementation(this.serverURL);\n this.socket.closingPromise = (0, _promiseUtils.resolvingPromise)();\n\n // Bind WebSocket callbacks\n this.socket.onopen = () => {\n this._handleWebSocketOpen();\n };\n this.socket.onmessage = event => {\n this._handleWebSocketMessage(event);\n };\n this.socket.onclose = event => {\n var _this$socket$closingP;\n (_this$socket$closingP = this.socket.closingPromise) === null || _this$socket$closingP === void 0 || _this$socket$closingP.resolve(event);\n this._handleWebSocketClose();\n };\n this.socket.onerror = error => {\n this._handleWebSocketError(error);\n };\n }\n resubscribe() {\n var _context;\n (0, _forEach.default)(_context = this.subscriptions).call(_context, (subscription, requestId) => {\n var _ref3, _queryJSON$watch2;\n const query = subscription.query;\n const queryJSON = query.toJSON();\n const where = queryJSON.where;\n const keys = (_ref3 = (0, _keys.default)(queryJSON)) === null || _ref3 === void 0 ? void 0 : _ref3.split(',');\n const watch = (_queryJSON$watch2 = queryJSON.watch) === null || _queryJSON$watch2 === void 0 ? void 0 : _queryJSON$watch2.split(',');\n const className = query.className;\n const sessionToken = subscription.sessionToken;\n const subscribeRequest = {\n op: OP_TYPES.SUBSCRIBE,\n requestId,\n query: {\n className,\n where,\n keys,\n watch\n },\n sessionToken: undefined\n };\n if (sessionToken) {\n subscribeRequest.sessionToken = sessionToken;\n }\n this.connectPromise.then(() => {\n this.socket.send((0, _stringify.default)(subscribeRequest));\n });\n });\n }\n\n /**\n * This method will close the WebSocket connection to this LiveQueryClient,\n * cancel the auto reconnect and unsubscribe all subscriptions based on it.\n *\n * @returns {Promise | undefined} CloseEvent {@link https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event}\n */\n close() {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n var _this3$socket, _this3$socket2;\n if (_this3.state === CLIENT_STATE.INITIALIZED || _this3.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n _this3.state = CLIENT_STATE.DISCONNECTED;\n (_this3$socket = _this3.socket) === null || _this3$socket === void 0 || _this3$socket.close();\n // Notify each subscription about the close\n for (const subscription of (0, _values.default)(_context2 = _this3.subscriptions).call(_context2)) {\n var _context2;\n subscription.subscribed = false;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.CLOSE);\n }\n _this3._handleReset();\n _this3.emit(CLIENT_EMMITER_TYPES.CLOSE);\n return (_this3$socket2 = _this3.socket) === null || _this3$socket2 === void 0 ? void 0 : _this3$socket2.closingPromise;\n })();\n }\n\n // ensure we start with valid state if connect is called again after close\n _handleReset() {\n this.attempts = 1;\n this.id = 0;\n this.requestId = 1;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.subscriptions = new _map.default();\n }\n _handleWebSocketOpen() {\n const connectRequest = {\n op: OP_TYPES.CONNECT,\n applicationId: this.applicationId,\n javascriptKey: this.javascriptKey,\n masterKey: this.masterKey,\n sessionToken: this.sessionToken,\n installationId: undefined\n };\n if (this.additionalProperties) {\n connectRequest.installationId = this.installationId;\n }\n this.socket.send((0, _stringify.default)(connectRequest));\n }\n _handleWebSocketMessage(event) {\n let data = event.data;\n if (typeof data === 'string') {\n data = JSON.parse(data);\n }\n let subscription = null;\n if (data.requestId) {\n subscription = this.subscriptions.get(data.requestId) || null;\n }\n const response = {\n clientId: data.clientId,\n installationId: data.installationId\n };\n switch (data.op) {\n case OP_EVENTS.CONNECTED:\n if (this.state === CLIENT_STATE.RECONNECTING) {\n this.resubscribe();\n }\n this.emit(CLIENT_EMMITER_TYPES.OPEN);\n this.id = data.clientId;\n this.connectPromise.resolve();\n this.state = CLIENT_STATE.CONNECTED;\n break;\n case OP_EVENTS.SUBSCRIBED:\n if (subscription) {\n this.attempts = 1;\n subscription.subscribed = true;\n subscription.subscribePromise.resolve();\n (0, _setTimeout2.default)(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.OPEN, response), 200);\n }\n break;\n case OP_EVENTS.ERROR:\n {\n const parseError = new _ParseError.default(data.code, data.error);\n if (!this.id) {\n this.connectPromise.reject(parseError);\n this.state = CLIENT_STATE.DISCONNECTED;\n }\n if (data.requestId) {\n if (subscription) {\n subscription.subscribePromise.reject(parseError);\n (0, _setTimeout2.default)(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.ERROR, data.error), 200);\n }\n } else {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, data.error);\n }\n if (data.error === 'Additional properties not allowed') {\n this.additionalProperties = false;\n }\n if (data.reconnect) {\n this._handleReconnect();\n }\n break;\n }\n case OP_EVENTS.UNSUBSCRIBED:\n {\n if (subscription) {\n this.subscriptions.delete(data.requestId);\n subscription.subscribed = false;\n subscription.unsubscribePromise.resolve();\n }\n break;\n }\n default:\n {\n // create, update, enter, leave, delete cases\n if (!subscription) {\n break;\n }\n let override = false;\n if (data.original) {\n override = true;\n delete data.original.__type;\n // Check for removed fields\n for (const field in data.original) {\n if (!(field in data.object)) {\n data.object[field] = undefined;\n }\n }\n data.original = _ParseObject.default.fromJSON(data.original, false);\n }\n delete data.object.__type;\n const parseObject = _ParseObject.default.fromJSON(data.object, !(subscription.query && subscription.query._select) ? override : false);\n if (data.original) {\n subscription.emit(data.op, parseObject, data.original, response);\n } else {\n subscription.emit(data.op, parseObject, response);\n }\n const localDatastore = _CoreManager.default.getLocalDatastore();\n if (override && localDatastore.isEnabled) {\n localDatastore._updateObjectIfPinned(parseObject).then(() => {});\n }\n }\n }\n }\n _handleWebSocketClose() {\n if (this.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n this.state = CLIENT_STATE.CLOSED;\n this.emit(CLIENT_EMMITER_TYPES.CLOSE);\n // Notify each subscription about the close\n for (const subscription of (0, _values.default)(_context3 = this.subscriptions).call(_context3)) {\n var _context3;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.CLOSE);\n }\n this._handleReconnect();\n }\n _handleWebSocketError(error) {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, error);\n for (const subscription of (0, _values.default)(_context4 = this.subscriptions).call(_context4)) {\n var _context4;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.ERROR, error);\n }\n this._handleReconnect();\n }\n _handleReconnect() {\n var _context5;\n // if closed or currently reconnecting we stop attempting to reconnect\n if (this.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n this.state = CLIENT_STATE.RECONNECTING;\n const time = generateInterval(this.attempts);\n\n // handle case when both close/error occur at frequent rates we ensure we do not reconnect unnecessarily.\n // we're unable to distinguish different between close/error when we're unable to reconnect therefore\n // we try to reconnect in both cases\n // server side ws and browser WebSocket behave differently in when close/error get triggered\n if (this.reconnectHandle) {\n clearTimeout(this.reconnectHandle);\n }\n this.reconnectHandle = (0, _setTimeout2.default)((0, _bind.default)(_context5 = () => {\n this.attempts++;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.open();\n }).call(_context5, this), time);\n }\n}\nvar _default = exports.default = LiveQueryClient;","map":{"version":3,"names":["_asyncToGenerator","require","default","_Object$defineProperty","_interopRequireDefault","exports","value","_indexOf","_map","_keys","_stringify","_forEach","_values","_setTimeout2","_bind","_defineProperty2","_CoreManager","_ParseObject","_LiveQuerySubscription","_promiseUtils","_ParseError","CLIENT_STATE","INITIALIZED","CONNECTING","CONNECTED","CLOSED","RECONNECTING","DISCONNECTED","OP_TYPES","CONNECT","SUBSCRIBE","UNSUBSCRIBE","ERROR","OP_EVENTS","SUBSCRIBED","UNSUBSCRIBED","CREATE","UPDATE","ENTER","LEAVE","DELETE","CLIENT_EMMITER_TYPES","CLOSE","OPEN","SUBSCRIPTION_EMMITER_TYPES","generateInterval","k","Math","random","min","pow","LiveQueryClient","constructor","_ref","_this","applicationId","serverURL","javascriptKey","masterKey","sessionToken","installationId","call","Error","reconnectHandle","attempts","id","requestId","undefined","additionalProperties","connectPromise","resolvingPromise","subscriptions","state","EventEmitter","getEventEmitter","emitter","on","eventName","listener","emit","_len","arguments","length","args","Array","_key","shouldOpen","subscribe","query","_ref2","_queryJSON$watch","className","queryJSON","toJSON","where","keys","split","watch","subscribeRequest","op","subscription","set","then","socket","send","catch","error","subscribePromise","reject","unsubscribe","_this2","unsubscribeRequest","unsubscribePromise","open","WebSocketImplementation","getWebSocketController","closingPromise","onopen","_handleWebSocketOpen","onmessage","event","_handleWebSocketMessage","onclose","_this$socket$closingP","resolve","_handleWebSocketClose","onerror","_handleWebSocketError","resubscribe","_context","_ref3","_queryJSON$watch2","close","_this3","_this3$socket","_this3$socket2","_context2","subscribed","_handleReset","connectRequest","data","JSON","parse","get","response","clientId","parseError","code","reconnect","_handleReconnect","delete","override","original","__type","field","object","fromJSON","parseObject","_select","localDatastore","getLocalDatastore","isEnabled","_updateObjectIfPinned","_context3","_context4","_context5","time","clearTimeout","_default"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/parse/lib/browser/LiveQueryClient.js"],"sourcesContent":["\"use strict\";\n\nvar _Object$defineProperty = require(\"@babel/runtime-corejs3/core-js-stable/object/define-property\");\nvar _interopRequireDefault = require(\"@babel/runtime-corejs3/helpers/interopRequireDefault\");\n_Object$defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _indexOf = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/index-of\"));\nvar _map = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/map\"));\nvar _keys = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/keys\"));\nvar _stringify = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/json/stringify\"));\nvar _forEach = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/for-each\"));\nvar _values = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/values\"));\nvar _setTimeout2 = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/set-timeout\"));\nvar _bind = _interopRequireDefault(require(\"@babel/runtime-corejs3/core-js-stable/instance/bind\"));\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime-corejs3/helpers/defineProperty\"));\nvar _CoreManager = _interopRequireDefault(require(\"./CoreManager\"));\nvar _ParseObject = _interopRequireDefault(require(\"./ParseObject\"));\nvar _LiveQuerySubscription = _interopRequireDefault(require(\"./LiveQuerySubscription\"));\nvar _promiseUtils = require(\"./promiseUtils\");\nvar _ParseError = _interopRequireDefault(require(\"./ParseError\"));\n// The LiveQuery client inner state\nconst CLIENT_STATE = {\n INITIALIZED: 'initialized',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed',\n RECONNECTING: 'reconnecting',\n DISCONNECTED: 'disconnected'\n};\n\n// The event type the LiveQuery client should sent to server\nconst OP_TYPES = {\n CONNECT: 'connect',\n SUBSCRIBE: 'subscribe',\n UNSUBSCRIBE: 'unsubscribe',\n ERROR: 'error'\n};\n\n// The event we get back from LiveQuery server\nconst OP_EVENTS = {\n CONNECTED: 'connected',\n SUBSCRIBED: 'subscribed',\n UNSUBSCRIBED: 'unsubscribed',\n ERROR: 'error',\n CREATE: 'create',\n UPDATE: 'update',\n ENTER: 'enter',\n LEAVE: 'leave',\n DELETE: 'delete'\n};\n\n// The event the LiveQuery client should emit\nconst CLIENT_EMMITER_TYPES = {\n CLOSE: 'close',\n ERROR: 'error',\n OPEN: 'open'\n};\n\n// The event the LiveQuery subscription should emit\nconst SUBSCRIPTION_EMMITER_TYPES = {\n OPEN: 'open',\n CLOSE: 'close',\n ERROR: 'error',\n CREATE: 'create',\n UPDATE: 'update',\n ENTER: 'enter',\n LEAVE: 'leave',\n DELETE: 'delete'\n};\n\n// Exponentially-growing random delay\nconst generateInterval = k => {\n return Math.random() * Math.min(30, Math.pow(2, k) - 1) * 1000;\n};\n\n/**\n * Creates a new LiveQueryClient.\n * <a href=\"https://nodejs.org/api/events.html#events_class_eventemitter\">cloud functions</a>.\n *\n * A wrapper of a standard WebSocket client. We add several useful methods to\n * help you connect/disconnect to LiveQueryServer, subscribe/unsubscribe a ParseQuery easily.\n *\n * javascriptKey and masterKey are used for verifying the LiveQueryClient when it tries\n * to connect to the LiveQuery server\n *\n * We expose three events to help you monitor the status of the LiveQueryClient.\n *\n * <pre>\n * const LiveQueryClient = Parse.LiveQueryClient;\n * const client = new LiveQueryClient({\n * applicationId: '',\n * serverURL: '',\n * javascriptKey: '',\n * masterKey: ''\n * });\n * </pre>\n *\n * Open - When we establish the WebSocket connection to the LiveQuery server, you'll get this event.\n * <pre>\n * client.on('open', () => {\n *\n * });</pre>\n *\n * Close - When we lose the WebSocket connection to the LiveQuery server, you'll get this event.\n * <pre>\n * client.on('close', () => {\n *\n * });</pre>\n *\n * Error - When some network error or LiveQuery server error happens, you'll get this event.\n * <pre>\n * client.on('error', (error) => {\n *\n * });</pre>\n *\n * @alias Parse.LiveQueryClient\n */\nclass LiveQueryClient {\n /**\n * @param {object} options\n * @param {string} options.applicationId - applicationId of your Parse app\n * @param {string} options.serverURL - <b>the URL of your LiveQuery server</b>\n * @param {string} options.javascriptKey (optional)\n * @param {string} options.masterKey (optional) Your Parse Master Key. (Node.js only!)\n * @param {string} options.sessionToken (optional)\n * @param {string} options.installationId (optional)\n */\n constructor(_ref) {\n var _this = this;\n let {\n applicationId,\n serverURL,\n javascriptKey,\n masterKey,\n sessionToken,\n installationId\n } = _ref;\n (0, _defineProperty2.default)(this, \"attempts\", void 0);\n (0, _defineProperty2.default)(this, \"id\", void 0);\n (0, _defineProperty2.default)(this, \"requestId\", void 0);\n (0, _defineProperty2.default)(this, \"applicationId\", void 0);\n (0, _defineProperty2.default)(this, \"serverURL\", void 0);\n (0, _defineProperty2.default)(this, \"javascriptKey\", void 0);\n (0, _defineProperty2.default)(this, \"masterKey\", void 0);\n (0, _defineProperty2.default)(this, \"sessionToken\", void 0);\n (0, _defineProperty2.default)(this, \"installationId\", void 0);\n (0, _defineProperty2.default)(this, \"additionalProperties\", void 0);\n (0, _defineProperty2.default)(this, \"connectPromise\", void 0);\n (0, _defineProperty2.default)(this, \"subscriptions\", void 0);\n (0, _defineProperty2.default)(this, \"socket\", void 0);\n (0, _defineProperty2.default)(this, \"state\", void 0);\n (0, _defineProperty2.default)(this, \"reconnectHandle\", void 0);\n (0, _defineProperty2.default)(this, \"emitter\", void 0);\n (0, _defineProperty2.default)(this, \"on\", void 0);\n (0, _defineProperty2.default)(this, \"emit\", void 0);\n if (!serverURL || (0, _indexOf.default)(serverURL).call(serverURL, 'ws') !== 0) {\n throw new Error('You need to set a proper Parse LiveQuery server url before using LiveQueryClient');\n }\n this.reconnectHandle = null;\n this.attempts = 1;\n this.id = 0;\n this.requestId = 1;\n this.serverURL = serverURL;\n this.applicationId = applicationId;\n this.javascriptKey = javascriptKey || undefined;\n this.masterKey = masterKey || undefined;\n this.sessionToken = sessionToken || undefined;\n this.installationId = installationId || undefined;\n this.additionalProperties = true;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.subscriptions = new _map.default();\n this.state = CLIENT_STATE.INITIALIZED;\n const EventEmitter = _CoreManager.default.getEventEmitter();\n this.emitter = new EventEmitter();\n this.on = (eventName, listener) => this.emitter.on(eventName, listener);\n this.emit = function (eventName) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return _this.emitter.emit(eventName, ...args);\n };\n // adding listener so process does not crash\n // best practice is for developer to register their own listener\n this.on('error', () => {});\n }\n shouldOpen() {\n return this.state === CLIENT_STATE.INITIALIZED || this.state === CLIENT_STATE.DISCONNECTED;\n }\n\n /**\n * Subscribes to a ParseQuery\n *\n * If you provide the sessionToken, when the LiveQuery server gets ParseObject's\n * updates from parse server, it'll try to check whether the sessionToken fulfills\n * the ParseObject's ACL. The LiveQuery server will only send updates to clients whose\n * sessionToken is fit for the ParseObject's ACL. You can check the LiveQuery protocol\n * <a href=\"https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification\">here</a> for more details. The subscription you get is the same subscription you get\n * from our Standard API.\n *\n * @param {ParseQuery} query - the ParseQuery you want to subscribe to\n * @param {string} sessionToken (optional)\n * @returns {LiveQuerySubscription | undefined}\n */\n subscribe(query, sessionToken) {\n if (!query) {\n return;\n }\n const className = query.className;\n const queryJSON = query.toJSON();\n const where = queryJSON.where;\n const keys = (0, _keys.default)(queryJSON)?.split(',');\n const watch = queryJSON.watch?.split(',');\n const subscribeRequest = {\n op: OP_TYPES.SUBSCRIBE,\n requestId: this.requestId,\n query: {\n className,\n where,\n keys,\n watch\n },\n sessionToken: undefined\n };\n if (sessionToken) {\n subscribeRequest.sessionToken = sessionToken;\n }\n const subscription = new _LiveQuerySubscription.default(this.requestId, query, sessionToken);\n this.subscriptions.set(this.requestId, subscription);\n this.requestId += 1;\n this.connectPromise.then(() => {\n this.socket.send((0, _stringify.default)(subscribeRequest));\n }).catch(error => {\n subscription.subscribePromise.reject(error);\n });\n return subscription;\n }\n\n /**\n * After calling unsubscribe you'll stop receiving events from the subscription object.\n *\n * @param {object} subscription - subscription you would like to unsubscribe from.\n * @returns {Promise | undefined}\n */\n async unsubscribe(subscription) {\n if (!subscription) {\n return;\n }\n const unsubscribeRequest = {\n op: OP_TYPES.UNSUBSCRIBE,\n requestId: subscription.id\n };\n return this.connectPromise.then(() => {\n return this.socket.send((0, _stringify.default)(unsubscribeRequest));\n }).then(() => {\n return subscription.unsubscribePromise;\n });\n }\n\n /**\n * After open is called, the LiveQueryClient will try to send a connect request\n * to the LiveQuery server.\n *\n */\n open() {\n const WebSocketImplementation = _CoreManager.default.getWebSocketController();\n if (!WebSocketImplementation) {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, 'Can not find WebSocket implementation');\n return;\n }\n if (this.state !== CLIENT_STATE.RECONNECTING) {\n this.state = CLIENT_STATE.CONNECTING;\n }\n this.socket = new WebSocketImplementation(this.serverURL);\n this.socket.closingPromise = (0, _promiseUtils.resolvingPromise)();\n\n // Bind WebSocket callbacks\n this.socket.onopen = () => {\n this._handleWebSocketOpen();\n };\n this.socket.onmessage = event => {\n this._handleWebSocketMessage(event);\n };\n this.socket.onclose = event => {\n this.socket.closingPromise?.resolve(event);\n this._handleWebSocketClose();\n };\n this.socket.onerror = error => {\n this._handleWebSocketError(error);\n };\n }\n resubscribe() {\n var _context;\n (0, _forEach.default)(_context = this.subscriptions).call(_context, (subscription, requestId) => {\n const query = subscription.query;\n const queryJSON = query.toJSON();\n const where = queryJSON.where;\n const keys = (0, _keys.default)(queryJSON)?.split(',');\n const watch = queryJSON.watch?.split(',');\n const className = query.className;\n const sessionToken = subscription.sessionToken;\n const subscribeRequest = {\n op: OP_TYPES.SUBSCRIBE,\n requestId,\n query: {\n className,\n where,\n keys,\n watch\n },\n sessionToken: undefined\n };\n if (sessionToken) {\n subscribeRequest.sessionToken = sessionToken;\n }\n this.connectPromise.then(() => {\n this.socket.send((0, _stringify.default)(subscribeRequest));\n });\n });\n }\n\n /**\n * This method will close the WebSocket connection to this LiveQueryClient,\n * cancel the auto reconnect and unsubscribe all subscriptions based on it.\n *\n * @returns {Promise | undefined} CloseEvent {@link https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event}\n */\n async close() {\n if (this.state === CLIENT_STATE.INITIALIZED || this.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n this.state = CLIENT_STATE.DISCONNECTED;\n this.socket?.close();\n // Notify each subscription about the close\n for (const subscription of (0, _values.default)(_context2 = this.subscriptions).call(_context2)) {\n var _context2;\n subscription.subscribed = false;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.CLOSE);\n }\n this._handleReset();\n this.emit(CLIENT_EMMITER_TYPES.CLOSE);\n return this.socket?.closingPromise;\n }\n\n // ensure we start with valid state if connect is called again after close\n _handleReset() {\n this.attempts = 1;\n this.id = 0;\n this.requestId = 1;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.subscriptions = new _map.default();\n }\n _handleWebSocketOpen() {\n const connectRequest = {\n op: OP_TYPES.CONNECT,\n applicationId: this.applicationId,\n javascriptKey: this.javascriptKey,\n masterKey: this.masterKey,\n sessionToken: this.sessionToken,\n installationId: undefined\n };\n if (this.additionalProperties) {\n connectRequest.installationId = this.installationId;\n }\n this.socket.send((0, _stringify.default)(connectRequest));\n }\n _handleWebSocketMessage(event) {\n let data = event.data;\n if (typeof data === 'string') {\n data = JSON.parse(data);\n }\n let subscription = null;\n if (data.requestId) {\n subscription = this.subscriptions.get(data.requestId) || null;\n }\n const response = {\n clientId: data.clientId,\n installationId: data.installationId\n };\n switch (data.op) {\n case OP_EVENTS.CONNECTED:\n if (this.state === CLIENT_STATE.RECONNECTING) {\n this.resubscribe();\n }\n this.emit(CLIENT_EMMITER_TYPES.OPEN);\n this.id = data.clientId;\n this.connectPromise.resolve();\n this.state = CLIENT_STATE.CONNECTED;\n break;\n case OP_EVENTS.SUBSCRIBED:\n if (subscription) {\n this.attempts = 1;\n subscription.subscribed = true;\n subscription.subscribePromise.resolve();\n (0, _setTimeout2.default)(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.OPEN, response), 200);\n }\n break;\n case OP_EVENTS.ERROR:\n {\n const parseError = new _ParseError.default(data.code, data.error);\n if (!this.id) {\n this.connectPromise.reject(parseError);\n this.state = CLIENT_STATE.DISCONNECTED;\n }\n if (data.requestId) {\n if (subscription) {\n subscription.subscribePromise.reject(parseError);\n (0, _setTimeout2.default)(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.ERROR, data.error), 200);\n }\n } else {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, data.error);\n }\n if (data.error === 'Additional properties not allowed') {\n this.additionalProperties = false;\n }\n if (data.reconnect) {\n this._handleReconnect();\n }\n break;\n }\n case OP_EVENTS.UNSUBSCRIBED:\n {\n if (subscription) {\n this.subscriptions.delete(data.requestId);\n subscription.subscribed = false;\n subscription.unsubscribePromise.resolve();\n }\n break;\n }\n default:\n {\n // create, update, enter, leave, delete cases\n if (!subscription) {\n break;\n }\n let override = false;\n if (data.original) {\n override = true;\n delete data.original.__type;\n // Check for removed fields\n for (const field in data.original) {\n if (!(field in data.object)) {\n data.object[field] = undefined;\n }\n }\n data.original = _ParseObject.default.fromJSON(data.original, false);\n }\n delete data.object.__type;\n const parseObject = _ParseObject.default.fromJSON(data.object, !(subscription.query && subscription.query._select) ? override : false);\n if (data.original) {\n subscription.emit(data.op, parseObject, data.original, response);\n } else {\n subscription.emit(data.op, parseObject, response);\n }\n const localDatastore = _CoreManager.default.getLocalDatastore();\n if (override && localDatastore.isEnabled) {\n localDatastore._updateObjectIfPinned(parseObject).then(() => {});\n }\n }\n }\n }\n _handleWebSocketClose() {\n if (this.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n this.state = CLIENT_STATE.CLOSED;\n this.emit(CLIENT_EMMITER_TYPES.CLOSE);\n // Notify each subscription about the close\n for (const subscription of (0, _values.default)(_context3 = this.subscriptions).call(_context3)) {\n var _context3;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.CLOSE);\n }\n this._handleReconnect();\n }\n _handleWebSocketError(error) {\n this.emit(CLIENT_EMMITER_TYPES.ERROR, error);\n for (const subscription of (0, _values.default)(_context4 = this.subscriptions).call(_context4)) {\n var _context4;\n subscription.emit(SUBSCRIPTION_EMMITER_TYPES.ERROR, error);\n }\n this._handleReconnect();\n }\n _handleReconnect() {\n var _context5;\n // if closed or currently reconnecting we stop attempting to reconnect\n if (this.state === CLIENT_STATE.DISCONNECTED) {\n return;\n }\n this.state = CLIENT_STATE.RECONNECTING;\n const time = generateInterval(this.attempts);\n\n // handle case when both close/error occur at frequent rates we ensure we do not reconnect unnecessarily.\n // we're unable to distinguish different between close/error when we're unable to reconnect therefore\n // we try to reconnect in both cases\n // server side ws and browser WebSocket behave differently in when close/error get triggered\n if (this.reconnectHandle) {\n clearTimeout(this.reconnectHandle);\n }\n this.reconnectHandle = (0, _setTimeout2.default)((0, _bind.default)(_context5 = () => {\n this.attempts++;\n this.connectPromise = (0, _promiseUtils.resolvingPromise)();\n this.open();\n }).call(_context5, this), time);\n }\n}\nvar _default = exports.default = LiveQueryClient;"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]}