rxdb-server
Version:
RxDB Server Plugin
102 lines (101 loc) • 2.93 kB
JavaScript
import { flatClone, getFromMapOrCreate, getQueryMatcher, normalizeMangoQuery, uniqueArray } from 'rxdb/plugins/core';
export function setCors(server, path, cors) {
var useCors = cors;
if (!useCors) {
useCors = server.cors;
}
if (useCors) {
server.adapter.setCors(server.serverApp, path, useCors);
}
}
var AUTH_PER_REQUEST = new WeakMap();
export async function getAuthDataByRequest(server, request, response) {
return getFromMapOrCreate(AUTH_PER_REQUEST, request, async () => {
try {
var headers = server.adapter.getRequestHeaders(request);
var authData = await server.authHandler(headers);
return authData;
} catch (err) {
server.adapter.closeConnection(response, 401, 'Unauthorized');
return false;
}
});
}
;
var defaultMatchingQuery = {
selector: {},
skip: 0,
sort: []
};
export function getDocAllowedMatcher(endpoint, authData) {
var useQuery = endpoint.queryModifier ? endpoint.queryModifier(authData, normalizeMangoQuery(endpoint.collection.schema.jsonSchema, {})) : defaultMatchingQuery;
var docDataMatcher = getQueryMatcher(endpoint.collection.schema.jsonSchema, useQuery);
return docDataMatcher;
}
export function docContainsServerOnlyFields(serverOnlyFields, doc) {
var has = serverOnlyFields.find(field => {
return typeof doc[field] !== 'undefined';
});
return has;
}
export function removeServerOnlyFieldsMonad(serverOnlyFields) {
var serverOnlyFieldsStencil = {
_meta: undefined,
_rev: undefined,
_attachments: undefined
};
serverOnlyFields.forEach(field => serverOnlyFieldsStencil[field] = undefined);
return docData => {
if (!docData) {
return docData;
}
return Object.assign({}, docData, serverOnlyFieldsStencil);
};
}
export function mergeServerDocumentFieldsMonad(serverOnlyFields) {
var useFields = serverOnlyFields.slice(0);
// useFields.push('_rev');
// useFields.push('_meta');
// useFields.push('_attachments');
useFields = uniqueArray(useFields);
return (clientDoc, serverDoc) => {
if (!serverDoc) {
return clientDoc;
}
var ret = flatClone(clientDoc);
useFields.forEach(field => {
ret[field] = serverDoc[field];
});
return ret;
};
}
/**
* $regex queries are dangerous because they can dos-attack the server.
*
* @param selector
*/
export function doesContainRegexQuerySelector(selector) {
if (!selector) {
return false;
}
if (Array.isArray(selector)) {
var found = !!selector.find(item => doesContainRegexQuerySelector(item));
return found;
}
if (typeof selector !== 'object') {
return false;
}
var entries = Object.entries(selector);
for (var [key, value] of entries) {
if (key === '$regex') {
return true;
} else {
var has = doesContainRegexQuerySelector(value);
if (has) {
return true;
}
}
}
return false;
}
//# sourceMappingURL=helper.js.map