diff --git a/.travis.yml b/.travis.yml index 56ec8cc958..7f05e7c922 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,7 @@ before_script: - greenkeeper-lockfile-update script: - npm run lint -- npm run coverage +- npm run pretest && npm run coverage after_script: - greenkeeper-lockfile-upload - bash <(curl -s https://codecov.io/bash) diff --git a/package.json b/package.json index b64aa48f33..0446ba7056 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} TESTING=1 jasmine", "test": "npm run testonly", "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} mongodb-runner stop", - "coverage": "npm run pretest && cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} TESTING=1 nyc jasmine && npm run posttest", + "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} TESTING=1 nyc jasmine", "start": "node ./bin/parse-server", "prepare": "npm run build", "postinstall": "node -p 'require(\"./postinstall.js\")()'" diff --git a/spec/ParseLiveQueryServer.spec.js b/spec/ParseLiveQueryServer.spec.js index 1773162d35..b59ac19450 100644 --- a/spec/ParseLiveQueryServer.spec.js +++ b/spec/ParseLiveQueryServer.spec.js @@ -293,7 +293,9 @@ describe('ParseLiveQueryServer', function() { parseLiveQueryServer._validateKeys = jasmine .createSpy('validateKeys') .and.returnValue(true); - parseLiveQueryServer._handleConnect(parseWebSocket); + parseLiveQueryServer._handleConnect(parseWebSocket, { + sessionToken: 'token', + }); const clientKeys = parseLiveQueryServer.clients.keys(); expect(parseLiveQueryServer.clients.size).toBe(1); @@ -335,6 +337,7 @@ describe('ParseLiveQueryServer', function() { query: query, requestId: requestId, sessionToken: 'sessionToken', + installationId: 'installationId', }; parseLiveQueryServer._handleSubscribe(parseWebSocket, request); @@ -357,6 +360,7 @@ describe('ParseLiveQueryServer', function() { expect(args[0]).toBe(requestId); expect(args[1].fields).toBe(query.fields); expect(args[1].sessionToken).toBe(request.sessionToken); + expect(args[1].installationId).toBe(request.installationId); // Make sure we send subscribe response to the client expect(client.pushSubscribe).toHaveBeenCalledWith(requestId); }); diff --git a/src/LiveQuery/Client.js b/src/LiveQuery/Client.js index ffda8e4296..3e1d8d0686 100644 --- a/src/LiveQuery/Client.js +++ b/src/LiveQuery/Client.js @@ -15,6 +15,7 @@ class Client { id: number; parseWebSocket: any; hasMasterKey: boolean; + sessionToken: string; userId: string; roles: Array; subscriptionInfos: Object; @@ -27,10 +28,16 @@ class Client { pushDelete: Function; pushLeave: Function; - constructor(id: number, parseWebSocket: any, hasMasterKey: boolean) { + constructor( + id: number, + parseWebSocket: any, + hasMasterKey: boolean = false, + sessionToken: string + ) { this.id = id; this.parseWebSocket = parseWebSocket; this.hasMasterKey = hasMasterKey; + this.sessionToken = sessionToken; this.roles = []; this.subscriptionInfos = new Map(); this.pushConnect = this._pushEvent('connected'); diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js index b0d254f2e8..b902ed151e 100644 --- a/src/LiveQuery/ParseLiveQueryServer.js +++ b/src/LiveQuery/ParseLiveQueryServer.js @@ -580,15 +580,24 @@ class ParseLiveQueryServer { } const hasMasterKey = this._hasMasterKey(request, this.keyPairs); const clientId = uuid(); - const client = new Client(clientId, parseWebsocket, hasMasterKey); + const client = new Client( + clientId, + parseWebsocket, + hasMasterKey, + request.sessionToken + ); parseWebsocket.clientId = clientId; this.clients.set(parseWebsocket.clientId, client); logger.info(`Create new client: ${parseWebsocket.clientId}`); client.pushConnect(); runLiveQueryEventHandlers({ + client, event: 'connect', clients: this.clients.size, subscriptions: this.subscriptions.size, + sessionToken: request.sessionToken, + useMasterKey: client.hasMasterKey, + installationId: request.installationId, }); } @@ -663,13 +672,16 @@ class ParseLiveQueryServer { const subscriptionInfo = { subscription: subscription, }; - // Add selected fields and sessionToken for this subscription if necessary + // Add selected fields, sessionToken and installationId for this subscription if necessary if (request.query.fields) { subscriptionInfo.fields = request.query.fields; } if (request.sessionToken) { subscriptionInfo.sessionToken = request.sessionToken; } + if (request.installationId) { + subscriptionInfo.installationId = request.installationId; + } client.addSubscriptionInfo(request.requestId, subscriptionInfo); // Add clientId to subscription @@ -685,9 +697,13 @@ class ParseLiveQueryServer { ); logger.verbose('Current client number: %d', this.clients.size); runLiveQueryEventHandlers({ + client, event: 'subscribe', clients: this.clients.size, subscriptions: this.subscriptions.size, + sessionToken: request.sessionToken, + useMasterKey: client.hasMasterKey, + installationId: request.installationId, }); } @@ -763,9 +779,13 @@ class ParseLiveQueryServer { this.subscriptions.delete(className); } runLiveQueryEventHandlers({ + client, event: 'unsubscribe', clients: this.clients.size, subscriptions: this.subscriptions.size, + sessionToken: subscriptionInfo.sessionToken, + useMasterKey: client.hasMasterKey, + installationId: subscriptionInfo.installationId, }); if (!notifyClient) {