Files
kami-parse-server/src/LiveQuery/Client.js
Diamond Lewis e6ac3b6932 fix(prettier): Properly handle lint-stage files (#6970)
Now handles top level files and recursive files in folders.

Set max line length to be 100
2020-10-25 15:06:58 -05:00

132 lines
3.6 KiB
JavaScript

import logger from '../logger';
import type { FlattenedObjectData } from './Subscription';
export type Message = { [attr: string]: any };
const dafaultFields = ['className', 'objectId', 'updatedAt', 'createdAt', 'ACL'];
class Client {
id: number;
parseWebSocket: any;
hasMasterKey: boolean;
sessionToken: string;
installationId: string;
userId: string;
roles: Array<string>;
subscriptionInfos: Object;
pushConnect: Function;
pushSubscribe: Function;
pushUnsubscribe: Function;
pushCreate: Function;
pushEnter: Function;
pushUpdate: Function;
pushDelete: Function;
pushLeave: Function;
constructor(
id: number,
parseWebSocket: any,
hasMasterKey: boolean = false,
sessionToken: string,
installationId: string
) {
this.id = id;
this.parseWebSocket = parseWebSocket;
this.hasMasterKey = hasMasterKey;
this.sessionToken = sessionToken;
this.installationId = installationId;
this.roles = [];
this.subscriptionInfos = new Map();
this.pushConnect = this._pushEvent('connected');
this.pushSubscribe = this._pushEvent('subscribed');
this.pushUnsubscribe = this._pushEvent('unsubscribed');
this.pushCreate = this._pushEvent('create');
this.pushEnter = this._pushEvent('enter');
this.pushUpdate = this._pushEvent('update');
this.pushDelete = this._pushEvent('delete');
this.pushLeave = this._pushEvent('leave');
}
static pushResponse(parseWebSocket: any, message: Message): void {
logger.verbose('Push Response : %j', message);
parseWebSocket.send(message);
}
static pushError(
parseWebSocket: any,
code: number,
error: string,
reconnect: boolean = true,
requestId: number | void = null
): void {
Client.pushResponse(
parseWebSocket,
JSON.stringify({
op: 'error',
error,
code,
reconnect,
requestId,
})
);
}
addSubscriptionInfo(requestId: number, subscriptionInfo: any): void {
this.subscriptionInfos.set(requestId, subscriptionInfo);
}
getSubscriptionInfo(requestId: number): any {
return this.subscriptionInfos.get(requestId);
}
deleteSubscriptionInfo(requestId: number): void {
return this.subscriptionInfos.delete(requestId);
}
_pushEvent(type: string): Function {
return function (
subscriptionId: number,
parseObjectJSON: any,
parseOriginalObjectJSON: any
): void {
const response: Message = {
op: type,
clientId: this.id,
installationId: this.installationId,
};
if (typeof subscriptionId !== 'undefined') {
response['requestId'] = subscriptionId;
}
if (typeof parseObjectJSON !== 'undefined') {
let fields;
if (this.subscriptionInfos.has(subscriptionId)) {
fields = this.subscriptionInfos.get(subscriptionId).fields;
}
response['object'] = this._toJSONWithFields(parseObjectJSON, fields);
if (parseOriginalObjectJSON) {
response['original'] = this._toJSONWithFields(parseOriginalObjectJSON, fields);
}
}
Client.pushResponse(this.parseWebSocket, JSON.stringify(response));
};
}
_toJSONWithFields(parseObjectJSON: any, fields: any): FlattenedObjectData {
if (!fields) {
return parseObjectJSON;
}
const limitedParseObject = {};
for (const field of dafaultFields) {
limitedParseObject[field] = parseObjectJSON[field];
}
for (const field of fields) {
if (field in parseObjectJSON) {
limitedParseObject[field] = parseObjectJSON[field];
}
}
return limitedParseObject;
}
}
export { Client };