@financialforcedev/orizuru
Version:
Streamlined communication between Heroku dynos / other worker processes
90 lines • 10.1 kB
JavaScript
;
/*
* Copyright (c) 2017-2019, FinancialForce.com, inc
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the FinancialForce.com, inc nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module validator/shared/schema
*/
const avsc_1 = require("avsc");
const lodash_1 = require("lodash");
/**
* Parses the schema from a JSON string.
*/
function parseSchema(schema) {
try {
return JSON.parse(schema);
}
catch (error) {
throw new Error(`Invalid Avro Schema. Failed to parse JSON string: ${schema}.`);
}
}
/**
* Compiles the schema using the {@link https://www.npmjs.com/package/avsc|NPM avsc library}.
*
* This also checks that the schema has no anonymous types which can cause problems with other
* [Apache Avro](https://avro.apache.org/docs/current/) implementations.
*/
function compileSchema(uncompiledSchema) {
try {
return avsc_1.Type.forSchema(uncompiledSchema, {
noAnonymousTypes: true
});
}
catch (error) {
throw new Error(`Invalid Avro Schema. Schema error: ${error.message}.`);
}
}
/**
* Validates the [Apache Avro](https://avro.apache.org/docs/current/) schema.
*/
class SchemaValidator {
/**
* Validates the schema.
* @param schema The [Apache Avro](https://avro.apache.org/docs/current/) schema to validate.
*/
validate(schema) {
if (!schema) {
throw new Error('Missing required avro-schema parameter: schema.');
}
if (lodash_1.isString(schema)) {
const parsedSchema = parseSchema(schema);
schema = compileSchema(parsedSchema);
}
else if (lodash_1.isPlainObject(schema)) {
schema = compileSchema(schema);
}
else if (lodash_1.hasIn(schema, 'toJSON') && lodash_1.hasIn(schema, 'toBuffer')) {
// Compile the schema to validate that there are no anonymous types.
schema = compileSchema(schema);
}
else {
throw new Error(`Invalid Avro Schema. Unexpected value type: ${typeof schema}.`);
}
return schema;
}
}
exports.SchemaValidator = SchemaValidator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2luZGV4L3ZhbGlkYXRvci9zaGFyZWQvc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHOztBQUVIOztHQUVHO0FBRUgsK0JBQTRCO0FBQzVCLG1DQUF3RDtBQUl4RDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFFbEMsSUFBSTtRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNoRjtBQUVGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsYUFBYSxDQUFDLGdCQUFxQjtJQUUzQyxJQUFJO1FBQ0gsT0FBTyxXQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZDLGdCQUFnQixFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDO0tBQ0g7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQ3hFO0FBRUYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxlQUFlO0lBRTNCOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxNQUFXO1FBRTFCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLGlCQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckM7YUFBTSxJQUFJLHNCQUFhLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjthQUFNLElBQUksY0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxjQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2hFLG9FQUFvRTtZQUNwRSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDakY7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUVmLENBQUM7Q0FFRDtBQTVCRCwwQ0E0QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTksIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG4gKiAgIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBGaW5hbmNpYWxGb3JjZS5jb20sIGluYyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcbiAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTFxuICogIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EU1xuICogIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuICogIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qKlxuICogQG1vZHVsZSB2YWxpZGF0b3Ivc2hhcmVkL3NjaGVtYVxuICovXG5cbmltcG9ydCB7IFR5cGUgfSBmcm9tICdhdnNjJztcbmltcG9ydCB7IGhhc0luLCBpc1BsYWluT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEF2cm9TY2hlbWEgfSBmcm9tICcuLi8uLi8uLic7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBzY2hlbWEgZnJvbSBhIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVNjaGVtYShzY2hlbWE6IHN0cmluZykge1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2Uoc2NoZW1hKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQXZybyBTY2hlbWEuIEZhaWxlZCB0byBwYXJzZSBKU09OIHN0cmluZzogJHtzY2hlbWF9LmApO1xuXHR9XG5cbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgc2NoZW1hIHVzaW5nIHRoZSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYXZzY3xOUE0gYXZzYyBsaWJyYXJ5fS5cbiAqXG4gKiBUaGlzIGFsc28gY2hlY2tzIHRoYXQgdGhlIHNjaGVtYSBoYXMgbm8gYW5vbnltb3VzIHR5cGVzIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIG90aGVyXG4gKiBbQXBhY2hlIEF2cm9dKGh0dHBzOi8vYXZyby5hcGFjaGUub3JnL2RvY3MvY3VycmVudC8pIGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVNjaGVtYSh1bmNvbXBpbGVkU2NoZW1hOiBhbnkpIHtcblxuXHR0cnkge1xuXHRcdHJldHVybiBUeXBlLmZvclNjaGVtYSh1bmNvbXBpbGVkU2NoZW1hLCB7XG5cdFx0XHRub0Fub255bW91c1R5cGVzOiB0cnVlXG5cdFx0fSk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEF2cm8gU2NoZW1hLiBTY2hlbWEgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX0uYCk7XG5cdH1cblxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgW0FwYWNoZSBBdnJvXShodHRwczovL2F2cm8uYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvKSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFWYWxpZGF0b3Ige1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgdGhlIHNjaGVtYS5cblx0ICogQHBhcmFtIHNjaGVtYSBUaGUgW0FwYWNoZSBBdnJvXShodHRwczovL2F2cm8uYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvKSBzY2hlbWEgdG8gdmFsaWRhdGUuXG5cdCAqL1xuXHRwdWJsaWMgdmFsaWRhdGUoc2NoZW1hOiBhbnkpOiBBdnJvU2NoZW1hIHtcblxuXHRcdGlmICghc2NoZW1hKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgYXZyby1zY2hlbWEgcGFyYW1ldGVyOiBzY2hlbWEuJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzU3RyaW5nKHNjaGVtYSkpIHtcblx0XHRcdGNvbnN0IHBhcnNlZFNjaGVtYSA9IHBhcnNlU2NoZW1hKHNjaGVtYSk7XG5cdFx0XHRzY2hlbWEgPSBjb21waWxlU2NoZW1hKHBhcnNlZFNjaGVtYSk7XG5cdFx0fSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNjaGVtYSkpIHtcblx0XHRcdHNjaGVtYSA9IGNvbXBpbGVTY2hlbWEoc2NoZW1hKTtcblx0XHR9IGVsc2UgaWYgKGhhc0luKHNjaGVtYSwgJ3RvSlNPTicpICYmIGhhc0luKHNjaGVtYSwgJ3RvQnVmZmVyJykpIHtcblx0XHRcdC8vIENvbXBpbGUgdGhlIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGF0IHRoZXJlIGFyZSBubyBhbm9ueW1vdXMgdHlwZXMuXG5cdFx0XHRzY2hlbWEgPSBjb21waWxlU2NoZW1hKHNjaGVtYSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBBdnJvIFNjaGVtYS4gVW5leHBlY3RlZCB2YWx1ZSB0eXBlOiAke3R5cGVvZiBzY2hlbWF9LmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBzY2hlbWE7XG5cblx0fVxuXG59XG4iXX0=