Skip to content
This repository has been archived by the owner on Jan 4, 2022. It is now read-only.

feat: initialization will run only once #315

Merged
merged 3 commits into from
Jun 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 46 additions & 27 deletions lib/DashPlatformProtocol.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const getRE2Class = require('@dashevo/re2-wasm').default;
const { default: getRE2Class } = require('@dashevo/re2-wasm');
const createAjv = require('./ajv/createAjv');

const JsonSchemaValidator = require('./validation/JsonSchemaValidator');
Expand All @@ -19,38 +19,57 @@ class DashPlatformProtocol {
* @param {JsonSchemaValidator} [options.jsonSchemaValidator]
*/
constructor(options = {}) {
this.stateRepository = options.stateRepository;
this.options = options;

this.jsonSchemaValidator = options.jsonSchemaValidator;
this.stateRepository = undefined;
this.jsonSchemaValidator = undefined;
this.initialized = undefined;
}

/**
* Initialize
*
* @return {Promise<boolean>}
*/
async initialize() {
if (this.jsonSchemaValidator === undefined) {
const ajv = await createAjv();

this.jsonSchemaValidator = new JsonSchemaValidator(ajv);
if (this.initialized) {
return this.initialized;
}

const RE2 = await getRE2Class();
this.dataContract = new DataContractFacade(
this.jsonSchemaValidator,
RE2,
);

this.document = new DocumentFacade(
this.stateRepository,
this.jsonSchemaValidator,
);

this.stateTransition = new StateTransitionFacade(
this.stateRepository,
this.jsonSchemaValidator,
RE2,
);

this.identity = new IdentityFacade(
this.jsonSchemaValidator,
);
this.initialized = getRE2Class().then((RE2) => {
this.stateRepository = this.options.stateRepository;

this.jsonSchemaValidator = this.options.jsonSchemaValidator;
if (this.jsonSchemaValidator === undefined) {
const ajv = createAjv(RE2);

this.jsonSchemaValidator = new JsonSchemaValidator(ajv);
}

this.dataContract = new DataContractFacade(
this.jsonSchemaValidator,
RE2,
);

this.document = new DocumentFacade(
this.stateRepository,
this.jsonSchemaValidator,
);

this.stateTransition = new StateTransitionFacade(
this.stateRepository,
this.jsonSchemaValidator,
RE2,
);

this.identity = new IdentityFacade(
this.jsonSchemaValidator,
);

return true;
});

return this.initialized;
}

/**
Expand Down
7 changes: 4 additions & 3 deletions lib/ajv/createAjv.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ const addByteArrayKeyword = require('./keywords/byteArray/addByteArrayKeyword');
const injectRE2 = require('./injectRE2');

/**
* @return {Promise<ajv.Ajv>}
* @param {Function} RE2
* @return {Ajv2020}
*/
async function createAjv() {
await injectRE2();
function createAjv(RE2) {
injectRE2(RE2);

const ajv = new Ajv({
strictTypes: true,
Expand Down
9 changes: 4 additions & 5 deletions lib/ajv/injectRE2.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const codegen = require('ajv/dist/compile/codegen');
const code = require('ajv/dist/vocabularies/code');

async function injectRE2() {
const RE2 = await getRE2Class();

/**
* @param {Function} RE2
*/
function injectRE2(RE2) {
global.RE2 = RE2;

code.usePattern = function usePattern({ gen }, pattern) {
Expand Down
2 changes: 1 addition & 1 deletion lib/ajv/keywords/byteArray/addByteArrayKeyword.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const byteArray = require('./byteArray');

/**
* @param {ajv.Ajv} ajv
* @param {Ajv2020} ajv
*/
function addByteArrayKeyword(ajv) {
ajv.addKeyword(byteArray);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
const crypto = require('crypto');

const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../../lib/ajv/createAjv');

const JsonSchemaValidator = require('../../../../../lib/validation/JsonSchemaValidator');
Expand Down Expand Up @@ -56,7 +58,9 @@ describe('validateDataContractCreateTransitionStructureFactory', () => {
new ValidationResult(),
);

const ajv = await createAjv();
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

const jsonSchemaValidator = new JsonSchemaValidator(ajv);

// eslint-disable-next-line max-len
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const getRE2Class = require('@dashevo/re2-wasm').default;
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const $RefParser = require('@apidevtools/json-schema-ref-parser');

const createAjv = require('../../../lib/ajv/createAjv');
Expand Down Expand Up @@ -41,7 +42,8 @@ describe('validateDataContractFactory', function main() {
dataContract = getDataContractFixture();
rawDataContract = dataContract.toObject();

const jsonSchemaValidator = new JsonSchemaValidator(await createAjv());
const ajv = createAjv(RE2);
const jsonSchemaValidator = new JsonSchemaValidator(ajv);

const validateDataContractMaxDepth = validateDataContractMaxDepthFactory($RefParser);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../../../lib/ajv/createAjv');

const Document = require('../../../../../../lib/document/Document');
Expand Down Expand Up @@ -90,7 +92,10 @@ describe('validateDocumentsBatchTransitionStructureFactory', () => {
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
stateRepositoryMock.fetchDataContract.resolves(dataContract);

validator = new JsonSchemaValidator(await createAjv());
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

validator = new JsonSchemaValidator(ajv);

enrichSpy = this.sinonSandbox.spy(enrichDataContractWithBaseSchema);

Expand Down
6 changes: 5 additions & 1 deletion test/integration/document/validateDocumentFactory.spec.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../lib/ajv/createAjv');

const JsonSchemaValidator = require('../../../lib/validation/JsonSchemaValidator');
Expand Down Expand Up @@ -31,9 +33,11 @@ describe('validateDocumentFactory', () => {
let validator;

beforeEach(async function beforeEach() {
const ajv = await createAjv();
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

validator = new JsonSchemaValidator(ajv);

this.sinonSandbox.spy(validator, 'validate');

dataContract = getDataContractFixture();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../../../lib/ajv/createAjv');

const getChainAssetLockFixture = require('../../../../../../lib/test/fixtures/getChainAssetLockProofFixture');
Expand Down Expand Up @@ -32,7 +34,10 @@ describe('validateChainAssetLockProofStructureFactory', () => {

rawProof = assetLock.toObject();

jsonSchemaValidator = new JsonSchemaValidator(await createAjv());
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

jsonSchemaValidator = new JsonSchemaValidator(ajv);

stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const rewiremock = require('rewiremock/node');

const { Transaction } = require('@dashevo/dashcore-lib');
Expand Down Expand Up @@ -37,7 +39,10 @@ describe('validateInstantAssetLockProofStructureFactory', () => {

rawProof = assetLock.toObject();

jsonSchemaValidator = new JsonSchemaValidator(await createAjv());
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

jsonSchemaValidator = new JsonSchemaValidator(ajv);

stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
stateRepositoryMock.verifyInstantLock.resolves(true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../../lib/ajv/createAjv');

const JsonSchemaValidator = require('../../../../../lib/validation/JsonSchemaValidator');
Expand Down Expand Up @@ -40,7 +42,9 @@ describe('validateIdentityCreateTransitionStructureFactory', () => {
validateSignatureAgainstAssetLockPublicKeyMock = this.sinonSandbox.stub()
.resolves(new ValidationResult());

const ajv = await createAjv();
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

const jsonSchemaValidator = new JsonSchemaValidator(ajv);

const proofValidationResult = new ValidationResult();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../../lib/ajv/createAjv');

const JsonSchemaValidator = require('../../../../../lib/validation/JsonSchemaValidator');
Expand Down Expand Up @@ -46,7 +48,9 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => {
validateSignatureAgainstAssetLockPublicKeyMock = this.sinonSandbox.stub()
.resolves(new ValidationResult());

const ajv = await createAjv();
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

const jsonSchemaValidator = new JsonSchemaValidator(ajv);

validateIdentityTopUpTransitionStructure = validateIdentityTopUpTransitionStructureFactory(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../lib/ajv/createAjv');

const getIdentityFixture = require('../../../../lib/test/fixtures/getIdentityFixture');
Expand Down Expand Up @@ -27,7 +29,10 @@ describe('validateIdentityFactory', () => {
let validatePublicKeysMock;

beforeEach(async function beforeEach() {
const schemaValidator = new JsonSchemaValidator(await createAjv());
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

const schemaValidator = new JsonSchemaValidator(ajv);

validatePublicKeysMock = this.sinonSandbox.stub().returns(new ValidationResult());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const { default: getRE2Class } = require('@dashevo/re2-wasm');

const createAjv = require('../../../../lib/ajv/createAjv');

const JsonSchemaValidator = require(
Expand Down Expand Up @@ -33,7 +35,10 @@ describe('validatePublicKeysFactory', () => {
beforeEach(async () => {
({ publicKeys: rawPublicKeys } = getIdentityFixture().toObject());

const validator = new JsonSchemaValidator(await createAjv());
const RE2 = await getRE2Class();
const ajv = createAjv(RE2);

const validator = new JsonSchemaValidator(ajv);

validatePublicKeys = validatePublicKeysFactory(
validator,
Expand Down