Improve Live Query Monitoring (#5927)

* Improve Live Query Monitoring

* typo
This commit is contained in:
Diamond Lewis
2019-08-16 13:38:24 -05:00
committed by Antonio Davi Macedo Coelho de Castro
parent cea1988ce9
commit 3ab9dcdfd0
5 changed files with 37 additions and 6 deletions

View File

@@ -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)

View File

@@ -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\")()'"

View File

@@ -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);
});

View File

@@ -15,6 +15,7 @@ class Client {
id: number;
parseWebSocket: any;
hasMasterKey: boolean;
sessionToken: string;
userId: string;
roles: Array<string>;
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');

View File

@@ -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) {