From f47b55c8425e59052dd6c52f27645be9769900b6 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Thu, 15 Aug 2019 08:00:16 +0300 Subject: [PATCH] feat(core-kernel): initial draft of core-kernel --- lerna.json | 2 +- package.json | 5 - packages/core-api/package.json | 13 +- packages/core-blockchain/package.json | 19 +- packages/core-container/package.json | 5 +- packages/core-database-postgres/package.json | 15 +- packages/core-database/package.json | 15 +- packages/core-elasticsearch/package.json | 11 +- .../core-error-tracker-airbrake/package.json | 4 +- .../core-error-tracker-bugsnag/package.json | 4 +- .../core-error-tracker-raygun/package.json | 4 +- .../core-error-tracker-rollbar/package.json | 4 +- .../core-error-tracker-sentry/package.json | 4 +- packages/core-event-emitter/package.json | 2 +- packages/core-exchange-json-rpc/package.json | 5 +- packages/core-explorer/package.json | 5 +- packages/core-forger/package.json | 15 +- packages/core-http-utils/package.json | 8 +- packages/core-interfaces/package.json | 36 -- .../src/core-blockchain/index.ts | 1 - .../src/core-container/container.ts | 106 ---- .../src/core-container/index.ts | 1 - .../src/core-event-emitter/index.ts | 1 - .../core-interfaces/src/core-logger/index.ts | 1 - .../core-interfaces/src/core-logger/logger.ts | 13 - packages/core-jest-matchers/package.json | 6 +- .../.gitattributes | 0 packages/core-kernel/package.json | 44 ++ packages/core-kernel/src/application.ts | 536 ++++++++++++++++++ packages/core-kernel/src/bootstrap/index.ts | 4 + .../src/bootstrap/load-configuration.ts | 16 + .../src/bootstrap/load-cryptography.ts | 34 ++ .../bootstrap/load-environment-variables.ts | 28 + .../src/bootstrap/register-providers.ts | 59 ++ .../core-kernel/src/config/adapters/base.ts | 28 + .../core-kernel/src/config/adapters/index.ts | 2 + .../core-kernel/src/config/adapters/local.ts | 48 ++ .../core-kernel/src/config/adapters/remote.ts | 24 + packages/core-kernel/src/config/factory.ts | 29 + packages/core-kernel/src/config/index.ts | 2 + packages/core-kernel/src/config/repository.ts | 14 + packages/core-kernel/src/config/watcher.ts | 55 ++ packages/core-kernel/src/container.ts | 106 ++++ .../src/contracts/core-blockchain/index.ts} | 0 .../blocks-business-repository.ts | 0 .../delegates-business-repository.ts | 0 .../business-repository/index.ts | 0 .../business-repository/parameters.ts | 0 .../transactions-business-repository.ts | 0 .../wallets-business-repository.ts | 0 .../core-database/database-connection.ts | 0 .../database-model/database-model.ts | 0 .../core-database/database-model/index.ts | 0 .../database-repository/blocks-repository.ts | 0 .../database-repository/index.ts | 0 .../database-repository/repository.ts | 0 .../database-repository/rounds-repository.ts | 0 .../transactions-repository.ts | 0 .../database-repository/wallets-repository.ts | 0 .../core-database/database-service.ts | 0 .../contracts}/core-database/event-types.ts | 0 .../src/contracts}/core-database/index.ts | 0 .../contracts}/core-database/search/index.ts | 0 .../search/search-parameter-converter.ts | 0 .../core-database/search/search-parameters.ts | 0 .../src/contracts/core-kernel/application.ts | 219 +++++++ .../src/contracts/core-kernel/cache.ts | 51 ++ .../src/contracts/core-kernel/container.ts | 36 ++ .../contracts/core-kernel/event-dispatcher.ts | 31 + .../src/contracts/core-kernel/index.ts | 5 + .../src/contracts/core-kernel/logger.ts | 88 +++ .../src/contracts}/core-p2p/index.ts | 0 .../contracts}/core-p2p/network-monitor.ts | 0 .../src/contracts}/core-p2p/network-state.ts | 0 .../contracts}/core-p2p/peer-communicator.ts | 0 .../src/contracts}/core-p2p/peer-connector.ts | 0 .../src/contracts}/core-p2p/peer-processor.ts | 0 .../src/contracts}/core-p2p/peer-service.ts | 0 .../src/contracts}/core-p2p/peer-storage.ts | 0 .../src/contracts}/core-p2p/peer-verifier.ts | 0 .../src/contracts}/core-p2p/peer.ts | 0 .../src/contracts}/core-p2p/server.ts | 0 .../src/contracts}/core-state/index.ts | 0 .../src/contracts}/core-state/service.ts | 0 .../src/contracts}/core-state/state-store.ts | 0 .../src/contracts}/core-state/wallets.ts | 0 .../core-transaction-pool/connection.ts | 0 .../contracts}/core-transaction-pool/index.ts | 0 .../core-transaction-pool/processor.ts | 0 .../src/contracts}/index.ts | 6 +- .../src/contracts}/shared/index.ts | 0 .../src/contracts}/shared/interfaces.ts | 0 packages/core-kernel/src/errors.ts | 227 ++++++++ packages/core-kernel/src/index.ts | 7 + .../core-kernel/src/repositories/index.ts | 1 + .../core-kernel/src/repositories/provider.ts | 39 ++ .../core-kernel/src/services/cache/factory.ts | 7 + .../core-kernel/src/services/cache/manager.ts | 7 + .../core-kernel/src/services/cache/store.ts | 133 +++++ .../src/services/events/dispatcher.ts | 86 +++ .../src/services/logger/factory.ts | 44 ++ .../core-kernel/src/services/logger/logger.ts | 169 ++++++ .../src/services/logger/manager.ts | 67 +++ .../core-kernel/src/services/queue/factory.ts | 7 + .../core-kernel/src/services/queue/manager.ts | 7 + packages/core-kernel/src/support/index.ts | 3 + .../src/support/service-provider.ts | 89 +++ .../tsconfig.json | 0 packages/core-logger-pino/package.json | 6 +- packages/core-logger-signale/package.json | 5 +- packages/core-logger-winston/package.json | 5 +- packages/core-logger/README.md | 21 - packages/core-logger/package.json | 37 -- packages/core-logger/src/factory.ts | 25 - packages/core-logger/src/index.ts | 3 - packages/core-logger/src/logger.ts | 73 --- packages/core-logger/src/manager.ts | 25 - packages/core-logger/src/plugin.ts | 9 - packages/core-logger/tsconfig.json | 7 - packages/core-new-relic/package.json | 4 +- packages/core-p2p/package.json | 15 +- packages/core-snapshots/package.json | 11 +- packages/core-state/package.json | 19 +- packages/core-tester-cli/package.json | 8 +- packages/core-transaction-pool/package.json | 17 +- packages/core-transactions/package.json | 11 +- packages/core-utils/package.json | 7 +- packages/core-vote-report/package.json | 10 +- packages/core-wallet-api/package.json | 9 +- packages/core-webhooks/package.json | 11 +- packages/core/package.json | 34 +- packages/crypto/package.json | 6 +- yarn.lock | 67 +-- 133 files changed, 2529 insertions(+), 579 deletions(-) delete mode 100644 packages/core-interfaces/package.json delete mode 100644 packages/core-interfaces/src/core-blockchain/index.ts delete mode 100644 packages/core-interfaces/src/core-container/container.ts delete mode 100644 packages/core-interfaces/src/core-container/index.ts delete mode 100644 packages/core-interfaces/src/core-event-emitter/index.ts delete mode 100644 packages/core-interfaces/src/core-logger/index.ts delete mode 100644 packages/core-interfaces/src/core-logger/logger.ts rename packages/{core-logger => core-kernel}/.gitattributes (100%) create mode 100644 packages/core-kernel/package.json create mode 100644 packages/core-kernel/src/application.ts create mode 100644 packages/core-kernel/src/bootstrap/index.ts create mode 100644 packages/core-kernel/src/bootstrap/load-configuration.ts create mode 100644 packages/core-kernel/src/bootstrap/load-cryptography.ts create mode 100644 packages/core-kernel/src/bootstrap/load-environment-variables.ts create mode 100644 packages/core-kernel/src/bootstrap/register-providers.ts create mode 100644 packages/core-kernel/src/config/adapters/base.ts create mode 100644 packages/core-kernel/src/config/adapters/index.ts create mode 100644 packages/core-kernel/src/config/adapters/local.ts create mode 100644 packages/core-kernel/src/config/adapters/remote.ts create mode 100644 packages/core-kernel/src/config/factory.ts create mode 100644 packages/core-kernel/src/config/index.ts create mode 100644 packages/core-kernel/src/config/repository.ts create mode 100644 packages/core-kernel/src/config/watcher.ts create mode 100644 packages/core-kernel/src/container.ts rename packages/{core-interfaces/src/core-blockchain/blockchain.ts => core-kernel/src/contracts/core-blockchain/index.ts} (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/blocks-business-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/delegates-business-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/parameters.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/transactions-business-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/business-repository/wallets-business-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-connection.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-model/database-model.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-model/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/blocks-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/rounds-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/transactions-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-repository/wallets-repository.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/database-service.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/event-types.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/search/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/search/search-parameter-converter.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-database/search/search-parameters.ts (100%) create mode 100644 packages/core-kernel/src/contracts/core-kernel/application.ts create mode 100644 packages/core-kernel/src/contracts/core-kernel/cache.ts create mode 100644 packages/core-kernel/src/contracts/core-kernel/container.ts create mode 100644 packages/core-kernel/src/contracts/core-kernel/event-dispatcher.ts create mode 100644 packages/core-kernel/src/contracts/core-kernel/index.ts create mode 100644 packages/core-kernel/src/contracts/core-kernel/logger.ts rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/network-monitor.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/network-state.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-communicator.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-connector.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-processor.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-service.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-storage.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer-verifier.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/peer.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-p2p/server.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-state/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-state/service.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-state/state-store.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-state/wallets.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-transaction-pool/connection.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-transaction-pool/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/core-transaction-pool/processor.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/index.ts (51%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/shared/index.ts (100%) rename packages/{core-interfaces/src => core-kernel/src/contracts}/shared/interfaces.ts (100%) create mode 100644 packages/core-kernel/src/errors.ts create mode 100644 packages/core-kernel/src/index.ts create mode 100644 packages/core-kernel/src/repositories/index.ts create mode 100644 packages/core-kernel/src/repositories/provider.ts create mode 100644 packages/core-kernel/src/services/cache/factory.ts create mode 100644 packages/core-kernel/src/services/cache/manager.ts create mode 100644 packages/core-kernel/src/services/cache/store.ts create mode 100644 packages/core-kernel/src/services/events/dispatcher.ts create mode 100644 packages/core-kernel/src/services/logger/factory.ts create mode 100644 packages/core-kernel/src/services/logger/logger.ts create mode 100644 packages/core-kernel/src/services/logger/manager.ts create mode 100644 packages/core-kernel/src/services/queue/factory.ts create mode 100644 packages/core-kernel/src/services/queue/manager.ts create mode 100644 packages/core-kernel/src/support/index.ts create mode 100644 packages/core-kernel/src/support/service-provider.ts rename packages/{core-interfaces => core-kernel}/tsconfig.json (100%) delete mode 100644 packages/core-logger/README.md delete mode 100644 packages/core-logger/package.json delete mode 100644 packages/core-logger/src/factory.ts delete mode 100644 packages/core-logger/src/index.ts delete mode 100644 packages/core-logger/src/logger.ts delete mode 100644 packages/core-logger/src/manager.ts delete mode 100644 packages/core-logger/src/plugin.ts delete mode 100644 packages/core-logger/tsconfig.json diff --git a/lerna.json b/lerna.json index 95fc3f02d7..2438fdfdd0 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "npmClient": "yarn", "packages": ["packages/*", "plugins/*"], "useWorkspaces": true, - "version": "2.5.0-next.10" + "version": "3.0.0-next.0" } diff --git a/package.json b/package.json index 55f6ecca23..02864520bc 100644 --- a/package.json +++ b/package.json @@ -97,11 +97,6 @@ "packages/*", "plugins/*" ], - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, "jest": { "testEnvironment": "node", "bail": true, diff --git a/packages/core-api/package.json b/packages/core-api/package.json index 46cdcf6500..bdc68c222b 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-api", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Public API for ARK Core", "license": "MIT", "contributors": [ @@ -21,12 +21,11 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-transaction-pool": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/core-transaction-pool": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@arkecosystem/utils": "^0.3.0", "@hapi/boom": "^7.4.2", "@hapi/joi": "^15.1.0", diff --git a/packages/core-blockchain/package.json b/packages/core-blockchain/package.json index 82c27e36a0..1523f3e66a 100644 --- a/packages/core-blockchain/package.json +++ b/packages/core-blockchain/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-blockchain", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Blockchain Manager for ARK Core", "license": "MIT", "contributors": [ @@ -22,14 +22,13 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-database": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-transactions": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-database": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-transactions": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "async": "^3.1.0", "delay": "^4.3.0", "immutable": "^4.0.0-rc.12", @@ -39,7 +38,7 @@ "xstate": "^4.6.7" }, "devDependencies": { - "@arkecosystem/core-p2p": "^2.5.0-next.10", + "@arkecosystem/core-p2p": "^3.0.0-next.0", "@types/async": "^3.0.0", "@types/lodash.get": "^4.4.6", "@types/pluralize": "^0.0.29", diff --git a/packages/core-container/package.json b/packages/core-container/package.json index 010d243de3..cfd6dfa4b9 100644 --- a/packages/core-container/package.json +++ b/packages/core-container/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-container", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Container for ARK Core", "license": "MIT", "contributors": [ @@ -19,8 +19,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/crypto": "^3.0.0-next.0", "@hapi/hoek": "^8.0.2", "@hapi/joi": "^15.1.0", "awilix": "^4.2.2", diff --git a/packages/core-database-postgres/package.json b/packages/core-database-postgres/package.json index bb72587ee8..69e4e0adc9 100644 --- a/packages/core-database-postgres/package.json +++ b/packages/core-database-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-database-postgres", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "PostgreSQL integration for ARK Core", "license": "MIT", "contributors": [ @@ -21,13 +21,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-database": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-transactions": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-database": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-transactions": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@arkecosystem/utils": "^0.3.0", "bluebird": "^3.5.5", "cpy-cli": "^2.0.0", diff --git a/packages/core-database/package.json b/packages/core-database/package.json index 9b801dd3ac..207b02cc9c 100644 --- a/packages/core-database/package.json +++ b/packages/core-database/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-database", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Database Interface for ARK Core", "license": "MIT", "contributors": [ @@ -22,13 +22,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-transactions": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-transactions": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@arkecosystem/utils": "^0.3.0", "lodash.clonedeep": "^4.5.0", "lodash.compact": "^3.0.1", diff --git a/packages/core-elasticsearch/package.json b/packages/core-elasticsearch/package.json index dd75baf0bc..7476d4d664 100644 --- a/packages/core-elasticsearch/package.json +++ b/packages/core-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-elasticsearch", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "A powerful Elasticsearch integration for ARK Core", "license": "MIT", "contributors": [ @@ -18,11 +18,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@elastic/elasticsearch": "^7.2.0", "@hapi/boom": "^7.4.2", "@hapi/joi": "^15.1.0", diff --git a/packages/core-error-tracker-airbrake/package.json b/packages/core-error-tracker-airbrake/package.json index 8139566c77..fc250d6917 100644 --- a/packages/core-error-tracker-airbrake/package.json +++ b/packages/core-error-tracker-airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-error-tracker-airbrake", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Airbrake error tracker integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "airbrake-js": "^1.6.8" }, "engines": { diff --git a/packages/core-error-tracker-bugsnag/package.json b/packages/core-error-tracker-bugsnag/package.json index 3747c8704f..cc2436f96f 100644 --- a/packages/core-error-tracker-bugsnag/package.json +++ b/packages/core-error-tracker-bugsnag/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-error-tracker-bugsnag", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Bugsnag error tracker integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "@bugsnag/js": "^6.3.2" }, "engines": { diff --git a/packages/core-error-tracker-raygun/package.json b/packages/core-error-tracker-raygun/package.json index 8f3070be13..1c11739d12 100644 --- a/packages/core-error-tracker-raygun/package.json +++ b/packages/core-error-tracker-raygun/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-error-tracker-raygun", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Raygun error tracker integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "raygun": "^0.10.1" }, "devDependencies": { diff --git a/packages/core-error-tracker-rollbar/package.json b/packages/core-error-tracker-rollbar/package.json index a8980575ad..4266398a40 100644 --- a/packages/core-error-tracker-rollbar/package.json +++ b/packages/core-error-tracker-rollbar/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-error-tracker-rollbar", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Rollbar error tracker integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "rollbar": "^2.8.1" }, "engines": { diff --git a/packages/core-error-tracker-sentry/package.json b/packages/core-error-tracker-sentry/package.json index 8e7f1bd5a0..885432fb9b 100644 --- a/packages/core-error-tracker-sentry/package.json +++ b/packages/core-error-tracker-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-error-tracker-sentry", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Sentry error tracker integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "@sentry/node": "^5.5.0" }, "engines": { diff --git a/packages/core-event-emitter/package.json b/packages/core-event-emitter/package.json index 5a24a60cdb..e4b82821e9 100644 --- a/packages/core-event-emitter/package.json +++ b/packages/core-event-emitter/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-event-emitter", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Event Manager for ARK Core", "license": "MIT", "contributors": [ diff --git a/packages/core-exchange-json-rpc/package.json b/packages/core-exchange-json-rpc/package.json index 4ddfef77e9..d9cc1a8bfe 100644 --- a/packages/core-exchange-json-rpc/package.json +++ b/packages/core-exchange-json-rpc/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-exchange-json-rpc", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Exchange JSON-RPC for ARK Core", "license": "MIT", "contributors": [ @@ -19,8 +19,7 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "@arkecosystem/exchange-json-rpc": "^1.0.3" }, "engines": { diff --git a/packages/core-explorer/package.json b/packages/core-explorer/package.json index 6bbba8aba4..ace3cbb5a7 100644 --- a/packages/core-explorer/package.json +++ b/packages/core-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-explorer", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Explorer for ARK Core", "license": "MIT", "contributors": [ @@ -19,8 +19,7 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "connect-history-api-fallback": "^1.6.0", "express": "^4.17.1" }, diff --git a/packages/core-forger/package.json b/packages/core-forger/package.json index 7334ef09b0..eebb1bb74e 100644 --- a/packages/core-forger/package.json +++ b/packages/core-forger/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-forger", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Forger for ARK Core", "license": "MIT", "contributors": [ @@ -21,13 +21,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-p2p": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-p2p": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "delay": "^4.3.0", "lodash.isempty": "^4.4.0", "lodash.uniq": "^4.5.0", diff --git a/packages/core-http-utils/package.json b/packages/core-http-utils/package.json index a2694d115e..efea00fe22 100644 --- a/packages/core-http-utils/package.json +++ b/packages/core-http-utils/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-http-utils", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Http Utilities for ARK Core", "license": "MIT", "contributors": [ @@ -18,9 +18,9 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@hapi/boom": "^7.4.2", "@hapi/good": "^8.2.0", "@hapi/good-console": "^8.1.0", diff --git a/packages/core-interfaces/package.json b/packages/core-interfaces/package.json deleted file mode 100644 index 5465a1eb79..0000000000 --- a/packages/core-interfaces/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@arkecosystem/core-interfaces", - "version": "2.5.0-next.10", - "description": "Interface types for essential ARK Core modules", - "license": "MIT", - "contributors": [ - "François-Xavier Thoorens ", - "Kristjan Košič ", - "Brian Faust ", - "Alex Barnsley " - ], - "files": [ - "dist" - ], - "main": "dist/index", - "types": "dist/index", - "scripts": { - "build": "yarn clean && yarn compile", - "build:watch": "yarn clean && yarn compile -w", - "clean": "del dist", - "compile": "../../node_modules/typescript/bin/tsc", - "prepublishOnly": "yarn build", - "pretest": "bash ../../scripts/pre-test.sh" - }, - "dependencies": { - "@arkecosystem/crypto": "^2.5.0-next.10", - "awilix": "^4.2.2", - "dayjs": "^1.8.15" - }, - "engines": { - "node": ">=10.x" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/core-interfaces/src/core-blockchain/index.ts b/packages/core-interfaces/src/core-blockchain/index.ts deleted file mode 100644 index 45426bb40a..0000000000 --- a/packages/core-interfaces/src/core-blockchain/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./blockchain"; diff --git a/packages/core-interfaces/src/core-container/container.ts b/packages/core-interfaces/src/core-container/container.ts deleted file mode 100644 index fd20c4438b..0000000000 --- a/packages/core-interfaces/src/core-container/container.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Resolver } from "awilix"; - -export interface IPluginDescriptor { - alias: string; - pkg: any; - required?: boolean; - defaults?: any; - extends?: string; - depends?: string; - register(container: IContainer, options?: IPluginOptions): Promise; - deregister?(container: IContainer, options?: any): Promise; -} - -type PluginOptionValue = string | number | boolean | object; - -export interface IPluginOptions { - [key: string]: PluginOptionValue | PluginOptionValue[]; -} - -export interface IPluginConfig { - name: string; - version: string; - options: IPluginOptions; - plugin: T; -} - -export interface IContainer { - config: any; - - silentShutdown: boolean; - - shuttingDown: boolean; - - isReady: boolean; - - setUp(version: string, variables: any, options?: any): Promise; - - getConfig(): any; - - /** - * Tear down the app. - * @return {Promise} - */ - tearDown(): Promise; - - /** - * Add a new registration. - */ - register(name: string, resolver: Resolver): this; - - /** - * Resolve a registration. - * @param {string} key - * @return {Object} - * @throws {Error} - */ - resolve(key: string): T; - - /** - * Resolve a plugin. - * @param {string} key - * @return {Object} - * @throws {Error} - */ - resolvePlugin(key: string): T; - - /** - * Resolve the options of a plugin. Available before a plugin mounts. - * @param {string} key - * @return {Object} - * @throws {Error} - */ - resolveOptions(key: string): any; - - /** - * Determine if the given registration exists. - * @param {String} key - * @return {Boolean} - */ - has(key: string): boolean; - - /** - * Force the container to exit and print the given message and associated error. - */ - forceExit(message: string, error?: Error): void; - - /** - * Exit the container with the given exitCode, message and associated error. - */ - exit(exitCode: number, message: string, error?: Error): void; - - /** - * Get the application version. - * @throws {String} - */ - getVersion(): string; - - /** - * Set the application version. - * @param {String} version - * @return {void} - */ - setVersion(version: any): void; - - getName(): string; -} diff --git a/packages/core-interfaces/src/core-container/index.ts b/packages/core-interfaces/src/core-container/index.ts deleted file mode 100644 index c5b5e8f38f..0000000000 --- a/packages/core-interfaces/src/core-container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./container"; diff --git a/packages/core-interfaces/src/core-event-emitter/index.ts b/packages/core-interfaces/src/core-event-emitter/index.ts deleted file mode 100644 index 685127b974..0000000000 --- a/packages/core-interfaces/src/core-event-emitter/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { EventEmitter } from "events"; diff --git a/packages/core-interfaces/src/core-logger/index.ts b/packages/core-interfaces/src/core-logger/index.ts deleted file mode 100644 index 41c7bf273e..0000000000 --- a/packages/core-interfaces/src/core-logger/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger"; diff --git a/packages/core-interfaces/src/core-logger/logger.ts b/packages/core-interfaces/src/core-logger/logger.ts deleted file mode 100644 index 675db16a08..0000000000 --- a/packages/core-interfaces/src/core-logger/logger.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface ILogger { - make(): ILogger; - getLogger(): T; - - log(level: string, message: any): boolean; - error(message: any): boolean; - warn(message: any): boolean; - info(message: any): boolean; - debug(message: any): boolean; - verbose(message: any): boolean; - - suppressConsoleOutput(suppress?: boolean): void; -} diff --git a/packages/core-jest-matchers/package.json b/packages/core-jest-matchers/package.json index 2b5a500bc5..4bea5fee52 100644 --- a/packages/core-jest-matchers/package.json +++ b/packages/core-jest-matchers/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-jest-matchers", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Jest matchers for ARK Core", "license": "MIT", "contributors": [ @@ -20,8 +20,8 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@arkecosystem/utils": "^0.3.0", "bip39": "^3.0.2", "got": "^9.6.0", diff --git a/packages/core-logger/.gitattributes b/packages/core-kernel/.gitattributes similarity index 100% rename from packages/core-logger/.gitattributes rename to packages/core-kernel/.gitattributes diff --git a/packages/core-kernel/package.json b/packages/core-kernel/package.json new file mode 100644 index 0000000000..e56e814118 --- /dev/null +++ b/packages/core-kernel/package.json @@ -0,0 +1,44 @@ +{ + "name": "@arkecosystem/core-kernel", + "description": "Kernel of ARK Core", + "version": "3.0.0-next.0", + "contributors": [ + "Brian Faust " + ], + "license": "MIT", + "main": "dist/index", + "types": "dist/index", + "files": [ + "dist" + ], + "scripts": { + "prepublishOnly": "yarn test && yarn build", + "pretest": "yarn lint && yarn build", + "compile": "../../node_modules/typescript/bin/tsc", + "build": "yarn clean && yarn compile", + "build:watch": "yarn clean && yarn compile -w", + "clean": "del dist" + }, + "dependencies": { + "@arkecosystem/crypto": "^3.0.0-next.0", + "awilix": "^4.2.2", + "delay": "^4.3.0", + "env-paths": "^2.2.0", + "envfile": "^3.0.0", + "expand-home-dir": "^0.0.3", + "fs-extra": "^8.1.0", + "hoek": "^6.1.3", + "joi": "^14.3.1", + "nsfw": "^1.2.5", + "semver": "^6.3.0" + }, + "publishConfig": { + "access": "public" + }, + "engines": { + "node": ">=10.x" + }, + "jest": { + "preset": "../../jest-preset.json" + } +} diff --git a/packages/core-kernel/src/application.ts b/packages/core-kernel/src/application.ts new file mode 100644 index 0000000000..8ee043a4a2 --- /dev/null +++ b/packages/core-kernel/src/application.ts @@ -0,0 +1,536 @@ +import { existsSync, removeSync, writeFileSync } from "fs-extra"; +import camelCase from "lodash/camelCase"; +import { join } from "path"; +import * as Bootstrappers from "./bootstrap"; +import { ConfigFactory, ConfigRepository } from "./config"; +import { Container } from "./container"; +import { Blockchain, Kernel, P2P, TransactionPool } from "./contracts"; +import { DirectoryNotFound, FailedNetworkDetection } from "./errors"; +import { EventDispatcher } from "./event-dispatcher"; +import { Logger } from "./logger"; +import { ProviderRepository } from "./repositories"; +import { AbstractServiceProvider } from "./support"; + +/** + * @export + * @class Application + * @extends {Container} + * @implements {Kernel.IApplication} + */ +export class Application extends Container implements Kernel.IApplication { + /** + * @private + * @type {ProviderRepository} + * @memberof Application + */ + private readonly providers: ProviderRepository = new ProviderRepository(this); + + /** + * @private + * @type {boolean} + * @memberof Application + */ + private hasBeenBootstrapped: boolean = false; + + /** + * @private + * @type {boolean} + * @memberof Application + */ + private booted: boolean = false; + + /** + * @param {Record} config + * @memberof Application + */ + public bootstrap(config: Record): void { + this.bindConfiguration(config); + + this.bindPathsInContainer(); + + this.registerCoreServices(); + + this.registerBindings(); + + this.registerNamespace(); + } + + /** + * @returns {Promise} + * @memberof Application + */ + public async boot(): Promise { + await this.registerServiceProviders(); + + this.booted = true; + } + + /** + * @returns {Promise} + * @memberof Application + */ + public async reboot(): Promise { + await this.terminate(); + + await this.registerServiceProviders(); + } + + /** + * @returns {Set} + * @memberof Application + */ + public getProviders(): Set { + return this.providers; + } + + /** + * @param {AbstractServiceProvider} provider + * @returns {Promise} + * @memberof Application + */ + public async registerProvider(provider: AbstractServiceProvider): Promise { + await this.providers.register(provider); + } + + /** + * @param {AbstractServiceProvider} provider + * @param {Record} opts + * @returns {AbstractServiceProvider} + * @memberof Application + */ + public makeProvider(provider: AbstractServiceProvider, opts: Record): AbstractServiceProvider { + return this.providers.make(provider, opts); + } + + /** + * @param {*} listener + * @returns {*} + * @memberof Application + */ + public afterLoadingEnvironment(listener: any): any { + return this.afterBootstrapping("LoadEnvironmentVariables", listener); + } + + /** + * @param {string} bootstrapper + * @param {*} listener + * @memberof Application + */ + public beforeBootstrapping(bootstrapper: string, listener: any): void { + this.events.listen(`bootstrapping: ${bootstrapper}`, listener); + } + + /** + * @param {string} bootstrapper + * @param {*} listener + * @memberof Application + */ + public afterBootstrapping(bootstrapper: string, listener: any): void { + this.events.listen(`bootstrapped: ${bootstrapper}`, listener); + } + + /** + * @template T + * @param {string} key + * @param {T} [value] + * @returns {T} + * @memberof Application + */ + public config(key: string, value?: T): T { + if (value) { + this.resolve("config").set(key, value); + } + + return this.resolve("config").get(key); + } + + /** + * @returns {string} + * @memberof Application + */ + public namespace(): string { + return this.resolve("app.namespace"); + } + + /** + * @returns {string} + * @memberof Application + */ + public version(): string { + return this.resolve("app.version"); + } + + /** + * @returns {string} + * @memberof Application + */ + public token(): string { + return this.resolve("app.token"); + } + + /** + * @returns {string} + * @memberof Application + */ + public network(): string { + return this.resolve("app.network"); + } + + /** + * @param {string} value + * @memberof Application + */ + public useNetwork(value: string): void { + this.bind("app.network", value); + } + + /** + * @param {string} [path=""] + * @returns {string} + * @memberof Application + */ + public dataPath(path: string = ""): string { + return join(this.getPath("data"), path); + } + + /** + * @param {string} path + * @memberof Application + */ + public useDataPath(path: string): void { + this.usePath("data", path); + } + + /** + * @param {string} [path=""] + * @returns {string} + * @memberof Application + */ + public configPath(path: string = ""): string { + return join(this.getPath("config"), path); + } + + /** + * @param {string} path + * @memberof Application + */ + public useConfigPath(path: string): void { + this.usePath("config", path); + } + + /** + * @param {string} [path=""] + * @returns {string} + * @memberof Application + */ + public cachePath(path: string = ""): string { + return join(this.getPath("cache"), path); + } + + /** + * @param {string} path + * @memberof Application + */ + public useCachePath(path: string): void { + this.usePath("cache", path); + } + + /** + * @param {string} [path=""] + * @returns {string} + * @memberof Application + */ + public logPath(path: string = ""): string { + return join(this.getPath("log"), path); + } + + /** + * @param {string} path + * @memberof Application + */ + public useLogPath(path: string): void { + this.usePath("log", path); + } + + /** + * @param {string} [path=""] + * @returns {string} + * @memberof Application + */ + public tempPath(path: string = ""): string { + return join(this.getPath("temp"), path); + } + + /** + * @param {string} path + * @memberof Application + */ + public useTempPath(path: string): void { + this.usePath("temp", path); + } + + /** + * @returns {string} + * @memberof Application + */ + public environmentFile(): string { + return this.configPath(".env"); + } + + /** + * @returns {string} + * @memberof Application + */ + public environment(): string { + return this.resolve("app.env"); + } + + /** + * @param {string} value + * @memberof Application + */ + public useEnvironment(value: string): void { + this.bind("app.env", value); + } + + /** + * @returns {boolean} + * @memberof Application + */ + public isProduction(): boolean { + return this.environment() === "production" || this.network() === "mainnet"; + } + + /** + * @returns {boolean} + * @memberof Application + */ + public isDevelopment(): boolean { + return this.environment() === "development" || ["devnet", "testnet"].includes(this.network()); + } + + /** + * @returns {boolean} + * @memberof Application + */ + public runningTests(): boolean { + return this.environment() === "test" || this.network() === "testnet"; + } + + /** + * @returns {boolean} + * @memberof Application + */ + public isBooted(): boolean { + return this.booted; + } + + /** + * @returns {boolean} + * @memberof Application + */ + public isBootstrapped(): boolean { + return this.hasBeenBootstrapped; + } + + /** + * @memberof Application + */ + public enableMaintenance(): void { + writeFileSync(this.tempPath("maintenance"), JSON.stringify({ time: +new Date() })); + + this.log.notice("Application is now in maintenance mode."); + + this.events.dispatch("kernel.maintenance", true); + } + + /** + * @memberof Application + */ + public disableMaintenance(): void { + removeSync(this.tempPath("maintenance")); + + this.log.notice("Application is now live."); + + this.events.dispatch("kernel.maintenance", false); + } + + /** + * @returns {boolean} + * @memberof Application + */ + public isDownForMaintenance(): boolean { + return existsSync(this.tempPath("maintenance")); + } + + /** + * @returns {Promise} + * @memberof Application + */ + public async terminate(): Promise { + this.hasBeenBootstrapped = false; + + await this.disposeServiceProviders(); + } + + /** + * @readonly + * @type {Kernel.ILogger} + * @memberof Application + */ + public get log(): Kernel.ILogger { + return this.resolve("log"); + } + + /** + * @readonly + * @type {Blockchain.IBlockchain} + * @memberof Application + */ + public get blockchain(): Blockchain.IBlockchain { + return this.resolve("blockchain"); + } + + /** + * @readonly + * @type {P2P.IMonitor} + * @memberof Application + */ + public get p2p(): P2P.IMonitor { + return this.resolve("p2p"); + } + + /** + * @readonly + * @type {TransactionPool.ITransactionPool} + * @memberof Application + */ + public get transactionPool(): TransactionPool.ITransactionPool { + return this.resolve("transactionPool"); + } + + /** + * @readonly + * @type {Kernel.IEventDispatcher} + * @memberof Application + */ + public get events(): Kernel.IEventDispatcher { + return this.resolve("events"); + } + + /** + * @private + * @param {Record} config + * @memberof Application + */ + private bindConfiguration(config: Record): void { + this.bind("configLoader", ConfigFactory.make(this, "local")); // @TODO + this.bind("config", new ConfigRepository(config)); + } + + /** + * @private + * @memberof Application + */ + private registerBindings(): void { + this.bind("app.env", this.config("env")); + this.bind("app.token", this.config("token")); + this.bind("app.network", this.config("network")); + this.bind("app.version", this.config("version")); + } + + /** + * @private + * @memberof Application + */ + private registerNamespace(): void { + const token = this.token(); + const network = this.network(); + + if (!token || !network) { + throw new FailedNetworkDetection(); + } + + this.bind("app.namespace", `${token}-${network}`); + this.bind("app.dirPrefix", `${token}/${network}`); + } + + /** + * @private + * @memberof Application + */ + private registerCoreServices(): void { + this.bind("events", new EventDispatcher()); + this.bind("log", new Logger(this)); + } + + /** + * @private + * @returns {Promise} + * @memberof Application + */ + private async registerServiceProviders(): Promise { + this.hasBeenBootstrapped = true; + + for (const Bootstrapper of Object.values(Bootstrappers)) { + this.events.dispatch(`bootstrapping: ${Bootstrapper.name}`, this); + + await new Bootstrapper().bootstrap(this); + + this.events.dispatch(`bootstrapped: ${Bootstrapper.name}`, this); + } + } + + /** + * @private + * @returns {Promise} + * @memberof Application + */ + private async disposeServiceProviders(): Promise { + for (const provider of this.getProviders()) { + await provider.dispose(); + } + } + + /** + * @private + * @memberof Application + */ + private bindPathsInContainer(): void { + for (const [type, path] of Object.entries(this.config("paths"))) { + this[camelCase(`use_${type}_path`)](path); + + this.bind(`path.${type}`, path); + } + } + + /** + * @private + * @param {string} type + * @returns {string} + * @memberof Application + */ + private getPath(type: string): string { + const path = this.resolve(`path.${type}`); + + if (!existsSync(path)) { + throw new DirectoryNotFound(path); + } + + return path; + } + + /** + * @private + * @param {string} type + * @param {string} path + * @memberof Application + */ + private usePath(type: string, path: string): void { + if (!existsSync(path)) { + throw new DirectoryNotFound(path); + } + + this.bind(`path.${type}`, path); + } +} diff --git a/packages/core-kernel/src/bootstrap/index.ts b/packages/core-kernel/src/bootstrap/index.ts new file mode 100644 index 0000000000..8be923df0d --- /dev/null +++ b/packages/core-kernel/src/bootstrap/index.ts @@ -0,0 +1,4 @@ +export * from "./load-environment-variables"; +export * from "./load-configuration"; +export * from "./load-cryptography"; +export * from "./register-providers"; diff --git a/packages/core-kernel/src/bootstrap/load-configuration.ts b/packages/core-kernel/src/bootstrap/load-configuration.ts new file mode 100644 index 0000000000..e43dd24418 --- /dev/null +++ b/packages/core-kernel/src/bootstrap/load-configuration.ts @@ -0,0 +1,16 @@ +import { Kernel } from "../contracts"; + +/** + * @export + * @class LoadConfiguration + */ +export class LoadConfiguration { + /** + * @param {Kernel.IApplication} app + * @returns {Promise} + * @memberof LoadConfiguration + */ + public async bootstrap(app: Kernel.IApplication): Promise { + await app.resolve("configLoader").loadConfiguration(); + } +} diff --git a/packages/core-kernel/src/bootstrap/load-cryptography.ts b/packages/core-kernel/src/bootstrap/load-cryptography.ts new file mode 100644 index 0000000000..2c3c6c27b6 --- /dev/null +++ b/packages/core-kernel/src/bootstrap/load-cryptography.ts @@ -0,0 +1,34 @@ +import { Interfaces, Managers } from "@arkecosystem/crypto"; +import { Kernel } from "../contracts"; + +/** + * @export + * @class LoadCryptography + */ +export class LoadCryptography { + /** + * @param {Kernel.IApplication} app + * @returns {Promise} + * @memberof LoadCryptography + */ + public async bootstrap(app: Kernel.IApplication): Promise { + const config: Interfaces.INetworkConfig = Managers.NetworkManager.findByName(app.network() as any); + + this.configure(app, config); + } + + /** + * @private + * @param {Kernel.IApplication} app + * @param {*} config + * @memberof LoadCryptography + */ + private configure(app: Kernel.IApplication, config: any): void { + Managers.configManager.setConfig(config); + + app.bind("crypto.network", Managers.configManager.all()); + app.bind("crypto.exceptions", Managers.configManager.get("exceptions")); + app.bind("crypto.milestones", Managers.configManager.get("milestones")); + app.bind("crypto.genesisBlock", Managers.configManager.get("genesisBlock")); + } +} diff --git a/packages/core-kernel/src/bootstrap/load-environment-variables.ts b/packages/core-kernel/src/bootstrap/load-environment-variables.ts new file mode 100644 index 0000000000..158cc43285 --- /dev/null +++ b/packages/core-kernel/src/bootstrap/load-environment-variables.ts @@ -0,0 +1,28 @@ +import envPaths from "env-paths"; +import expandHomeDir from "expand-home-dir"; +import { ensureDirSync } from "fs-extra"; +import { resolve } from "path"; +import { Kernel } from "../contracts"; + +/** + * @export + * @class LoadEnvironmentVariables + */ +export class LoadEnvironmentVariables { + /** + * @param {Kernel.IApplication} app + * @returns {Promise} + * @memberof LoadEnvironmentVariables + */ + public async bootstrap(app: Kernel.IApplication): Promise { + await app.resolve("configLoader").loadEnvironmentVariables(); + + for (const [key, value] of Object.entries(envPaths(app.token(), { suffix: "core" }))) { + const path = resolve(`${expandHomeDir(value)}/${app.network()}`); + + ensureDirSync(path); + + process.env[`PATH_${key.toUpperCase()}`] = path; + } + } +} diff --git a/packages/core-kernel/src/bootstrap/register-providers.ts b/packages/core-kernel/src/bootstrap/register-providers.ts new file mode 100644 index 0000000000..7007f255f6 --- /dev/null +++ b/packages/core-kernel/src/bootstrap/register-providers.ts @@ -0,0 +1,59 @@ +import semver from "semver"; +import { Kernel } from "../contracts"; +import { FailedDependencySatisfaction, FailedServiceProviderRegistration } from "../errors"; +import { AbstractServiceProvider } from "../support/service-provider"; + +/** + * @export + * @class RegisterProviders + */ +export class RegisterProviders { + /** + * @param {Kernel.IApplication} app + * @returns {Promise} + * @memberof RegisterProviders + */ + public async bootstrap(app: Kernel.IApplication): Promise { + const providers = app.config("providers"); + + for (const [pkg, opts] of Object.entries(providers)) { + const { ServiceProvider } = require(pkg); + + const serviceProvider: AbstractServiceProvider = app.makeProvider(ServiceProvider, opts); + + if (this.satisfiesDependencies(app, serviceProvider)) { + await app.registerProvider(serviceProvider); + } + } + } + + /** + * @private + * @param {Kernel.IApplication} app + * @param {AbstractServiceProvider} serviceProvider + * @returns {boolean} + * @memberof RegisterProviders + */ + private satisfiesDependencies(app: Kernel.IApplication, serviceProvider: AbstractServiceProvider): boolean { + const dependencies = serviceProvider.depends(); + + if (!dependencies) { + return true; + } + + for (const [dep, version] of Object.entries(dependencies)) { + if (!app.has(dep)) { + throw new FailedServiceProviderRegistration(serviceProvider.getName(), dep); + } + + // @ts-ignore + const constraint = app.resolve(dep).getVersion(); + + if (semver.satisfies(constraint, version)) { + throw new FailedDependencySatisfaction(dep, constraint, version); + } + } + + return true; + } +} diff --git a/packages/core-kernel/src/config/adapters/base.ts b/packages/core-kernel/src/config/adapters/base.ts new file mode 100644 index 0000000000..c36cb504a7 --- /dev/null +++ b/packages/core-kernel/src/config/adapters/base.ts @@ -0,0 +1,28 @@ +import { Kernel } from "../../contracts"; + +/** + * @export + * @abstract + * @class BaseAdapter + */ +export abstract class BaseAdapter { + /** + * @param {Kernel.IApplication} app + * @memberof BaseAdapter + */ + public constructor(protected readonly app: Kernel.IApplication) {} + + /** + * @abstract + * @returns {Promise} + * @memberof BaseAdapter + */ + public abstract async loadConfiguration(): Promise; + + /** + * @abstract + * @returns {Promise} + * @memberof BaseAdapter + */ + public abstract async loadEnvironmentVariables(): Promise; +} diff --git a/packages/core-kernel/src/config/adapters/index.ts b/packages/core-kernel/src/config/adapters/index.ts new file mode 100644 index 0000000000..f3a1793c5c --- /dev/null +++ b/packages/core-kernel/src/config/adapters/index.ts @@ -0,0 +1,2 @@ +export * from "./local"; +export * from "./remote"; diff --git a/packages/core-kernel/src/config/adapters/local.ts b/packages/core-kernel/src/config/adapters/local.ts new file mode 100644 index 0000000000..981ee065be --- /dev/null +++ b/packages/core-kernel/src/config/adapters/local.ts @@ -0,0 +1,48 @@ +import { set } from "dottie"; +import { parseFileSync } from "envfile"; +import { readJSONSync } from "fs-extra"; +import { InvalidApplicationConfiguration, InvalidEnvironmentConfiguration } from "../../errors"; +import { BaseAdapter } from "./base"; + +/** + * @export + * @class LocalAdapter + * @extends {BaseAdapter} + */ +export class LocalAdapter extends BaseAdapter { + /** + * @returns {Promise} + * @memberof LocalAdapter + */ + public async loadConfiguration(): Promise { + try { + const config: Record = readJSONSync(this.app.configPath("config.json")); + + for (const [key, value] of Object.entries(config)) { + this.app.config(key, value); + } + } catch (error) { + throw new InvalidApplicationConfiguration(); + } + } + + /** + * @returns {Promise} + * @memberof LocalAdapter + */ + public async loadEnvironmentVariables(): Promise { + if (this.app.runningTests()) { + return; + } + + try { + const config = parseFileSync(this.app.environmentFile()); + + for (const [key, value] of Object.entries(config)) { + set(process.env, key, value); + } + } catch (error) { + throw new InvalidEnvironmentConfiguration(); + } + } +} diff --git a/packages/core-kernel/src/config/adapters/remote.ts b/packages/core-kernel/src/config/adapters/remote.ts new file mode 100644 index 0000000000..5f9bc7c988 --- /dev/null +++ b/packages/core-kernel/src/config/adapters/remote.ts @@ -0,0 +1,24 @@ +import { BaseAdapter } from "./base"; + +/** + * @export + * @class RemoteAdapter + * @extends {BaseAdapter} + */ +export class RemoteAdapter extends BaseAdapter { + /** + * @returns {Promise} + * @memberof RemoteAdapter + */ + public async loadConfiguration(): Promise { + // @TODO + } + + /** + * @returns {Promise} + * @memberof RemoteAdapter + */ + public async loadEnvironmentVariables(): Promise { + // @TODO + } +} diff --git a/packages/core-kernel/src/config/factory.ts b/packages/core-kernel/src/config/factory.ts new file mode 100644 index 0000000000..48905e5526 --- /dev/null +++ b/packages/core-kernel/src/config/factory.ts @@ -0,0 +1,29 @@ +import { Kernel } from "../contracts"; +import { InvalidConfigurationAdapter } from "../errors"; +import { LocalAdapter, RemoteAdapter } from "./adapters"; +import { BaseAdapter } from "./adapters/base"; + +/** + * @export + * @class ConfigFactory + */ +export class ConfigFactory { + /** + * @static + * @param {Kernel.IApplication} app + * @param {string} adapter + * @returns {Record} + * @memberof ConfigFactory + */ + public static make(app: Kernel.IApplication, adapter: string): BaseAdapter { + try { + if (adapter === "remote") { + return new RemoteAdapter(app); + } + + return new LocalAdapter(app); + } catch (error) { + throw new InvalidConfigurationAdapter(); + } + } +} diff --git a/packages/core-kernel/src/config/index.ts b/packages/core-kernel/src/config/index.ts new file mode 100644 index 0000000000..e09a91db0b --- /dev/null +++ b/packages/core-kernel/src/config/index.ts @@ -0,0 +1,2 @@ +export * from "./factory"; +export * from "./repository"; diff --git a/packages/core-kernel/src/config/repository.ts b/packages/core-kernel/src/config/repository.ts new file mode 100644 index 0000000000..a22c77b18b --- /dev/null +++ b/packages/core-kernel/src/config/repository.ts @@ -0,0 +1,14 @@ +/** + * @export + * @class ConfigRepository + * @extends {Map} + */ +export class ConfigRepository extends Map { + /** + * @param {object} config + * @memberof ConfigRepository + */ + public constructor(config: object) { + super(Object.entries(config)); + } +} diff --git a/packages/core-kernel/src/config/watcher.ts b/packages/core-kernel/src/config/watcher.ts new file mode 100644 index 0000000000..1f29bdc741 --- /dev/null +++ b/packages/core-kernel/src/config/watcher.ts @@ -0,0 +1,55 @@ +import nsfw from "nsfw"; +import { Kernel } from "../contracts"; + +/** + * @interface IFileEvent + */ +interface IFileEvent { + /** + * @type {number} + * @memberof IFileEvent + */ + action: number; + + /** + * @type {string} + * @memberof IFileEvent + */ + directory: string; + + /** + * @type {string} + * @memberof IFileEvent + */ + file: string; +} + +/** + * @export + * @class Watcher + */ +export class Watcher { + /** + * @param {Kernel.IApplication} app + * @memberof Watcher + */ + public constructor(readonly app: Kernel.IApplication) {} + + /** + * @returns {Promise} + * @memberof Watcher + */ + public async watch(): Promise { + const configFiles = [".env", "config.yml"]; + + const watcher = await nsfw(this.app.configPath(), (events: IFileEvent[]) => { + for (const event of events) { + if (configFiles.includes(event.file) && event.action === nsfw.actions.MODIFIED) { + this.app.reboot(); + } + } + }); + + await watcher.start(); + } +} diff --git a/packages/core-kernel/src/container.ts b/packages/core-kernel/src/container.ts new file mode 100644 index 0000000000..eae6b0fd5b --- /dev/null +++ b/packages/core-kernel/src/container.ts @@ -0,0 +1,106 @@ +import { + aliasTo, + asClass, + asFunction, + asValue, + AwilixContainer, + BuildResolverOptions, + Constructor, + createContainer, + FunctionReturning, + Resolver, +} from "awilix"; +import { isClass, isFunction } from "typechecker"; +import { EntryDoesNotExist, InvalidType } from "./errors"; + +/** + * @export + * @class Container + */ +export class Container { + /** + * @private + * @type {AwilixContainer} + * @memberof Container + */ + private readonly container: AwilixContainer = createContainer(); + + /** + * @template T + * @param {string} name + * @returns {T} + * @memberof Container + */ + public resolve(name: string): T { + if (!this.has(name)) { + throw new EntryDoesNotExist(name); + } + + return this.container.resolve(name); + } + + /** + * @param {string} name + * @param {*} concrete + * @memberof Container + */ + public bind(name: string, concrete: any): void { + if (isClass(concrete)) { + concrete = asClass(concrete); + } else if (isFunction(concrete)) { + concrete = asFunction(concrete); + } else { + concrete = asValue(concrete); + } + + this.container.register(name, concrete); + } + + /** + * @param {string} name + * @param {*} concrete + * @memberof Container + */ + public shared(name: string, concrete: any): void { + if (isClass(concrete)) { + concrete = asClass(concrete); + } else if (isFunction(concrete)) { + concrete = asFunction(concrete); + } else { + throw new InvalidType("shared", "concrete", "class or function", typeof concrete); + } + + this.container.register(name, concrete.singleton()); + } + + /** + * @param {string} name + * @param {string} alias + * @memberof Container + */ + public alias(name: string, alias: string): void { + this.container.register(alias, aliasTo(name)); + } + + /** + * @param {string} name + * @returns {boolean} + * @memberof Container + */ + public has(name: string): boolean { + return this.container.has(name); + } + + /** + * @param {(FunctionReturning<{}> | Constructor<{}> | Resolver<{}>)} targetOrResolver + * @param {BuildResolverOptions<{}>} [opts] + * @returns + * @memberof Container + */ + public call( + targetOrResolver: FunctionReturning<{}> | Constructor<{}> | Resolver<{}>, + opts?: BuildResolverOptions<{}>, + ) { + return this.container.build(targetOrResolver, opts); + } +} diff --git a/packages/core-interfaces/src/core-blockchain/blockchain.ts b/packages/core-kernel/src/contracts/core-blockchain/index.ts similarity index 100% rename from packages/core-interfaces/src/core-blockchain/blockchain.ts rename to packages/core-kernel/src/contracts/core-blockchain/index.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/blocks-business-repository.ts b/packages/core-kernel/src/contracts/core-database/business-repository/blocks-business-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/blocks-business-repository.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/blocks-business-repository.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/delegates-business-repository.ts b/packages/core-kernel/src/contracts/core-database/business-repository/delegates-business-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/delegates-business-repository.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/delegates-business-repository.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/index.ts b/packages/core-kernel/src/contracts/core-database/business-repository/index.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/index.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/index.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/parameters.ts b/packages/core-kernel/src/contracts/core-database/business-repository/parameters.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/parameters.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/parameters.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/transactions-business-repository.ts b/packages/core-kernel/src/contracts/core-database/business-repository/transactions-business-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/transactions-business-repository.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/transactions-business-repository.ts diff --git a/packages/core-interfaces/src/core-database/business-repository/wallets-business-repository.ts b/packages/core-kernel/src/contracts/core-database/business-repository/wallets-business-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/business-repository/wallets-business-repository.ts rename to packages/core-kernel/src/contracts/core-database/business-repository/wallets-business-repository.ts diff --git a/packages/core-interfaces/src/core-database/database-connection.ts b/packages/core-kernel/src/contracts/core-database/database-connection.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-connection.ts rename to packages/core-kernel/src/contracts/core-database/database-connection.ts diff --git a/packages/core-interfaces/src/core-database/database-model/database-model.ts b/packages/core-kernel/src/contracts/core-database/database-model/database-model.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-model/database-model.ts rename to packages/core-kernel/src/contracts/core-database/database-model/database-model.ts diff --git a/packages/core-interfaces/src/core-database/database-model/index.ts b/packages/core-kernel/src/contracts/core-database/database-model/index.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-model/index.ts rename to packages/core-kernel/src/contracts/core-database/database-model/index.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/blocks-repository.ts b/packages/core-kernel/src/contracts/core-database/database-repository/blocks-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/blocks-repository.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/blocks-repository.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/index.ts b/packages/core-kernel/src/contracts/core-database/database-repository/index.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/index.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/index.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/repository.ts b/packages/core-kernel/src/contracts/core-database/database-repository/repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/repository.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/repository.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/rounds-repository.ts b/packages/core-kernel/src/contracts/core-database/database-repository/rounds-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/rounds-repository.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/rounds-repository.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/transactions-repository.ts b/packages/core-kernel/src/contracts/core-database/database-repository/transactions-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/transactions-repository.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/transactions-repository.ts diff --git a/packages/core-interfaces/src/core-database/database-repository/wallets-repository.ts b/packages/core-kernel/src/contracts/core-database/database-repository/wallets-repository.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-repository/wallets-repository.ts rename to packages/core-kernel/src/contracts/core-database/database-repository/wallets-repository.ts diff --git a/packages/core-interfaces/src/core-database/database-service.ts b/packages/core-kernel/src/contracts/core-database/database-service.ts similarity index 100% rename from packages/core-interfaces/src/core-database/database-service.ts rename to packages/core-kernel/src/contracts/core-database/database-service.ts diff --git a/packages/core-interfaces/src/core-database/event-types.ts b/packages/core-kernel/src/contracts/core-database/event-types.ts similarity index 100% rename from packages/core-interfaces/src/core-database/event-types.ts rename to packages/core-kernel/src/contracts/core-database/event-types.ts diff --git a/packages/core-interfaces/src/core-database/index.ts b/packages/core-kernel/src/contracts/core-database/index.ts similarity index 100% rename from packages/core-interfaces/src/core-database/index.ts rename to packages/core-kernel/src/contracts/core-database/index.ts diff --git a/packages/core-interfaces/src/core-database/search/index.ts b/packages/core-kernel/src/contracts/core-database/search/index.ts similarity index 100% rename from packages/core-interfaces/src/core-database/search/index.ts rename to packages/core-kernel/src/contracts/core-database/search/index.ts diff --git a/packages/core-interfaces/src/core-database/search/search-parameter-converter.ts b/packages/core-kernel/src/contracts/core-database/search/search-parameter-converter.ts similarity index 100% rename from packages/core-interfaces/src/core-database/search/search-parameter-converter.ts rename to packages/core-kernel/src/contracts/core-database/search/search-parameter-converter.ts diff --git a/packages/core-interfaces/src/core-database/search/search-parameters.ts b/packages/core-kernel/src/contracts/core-database/search/search-parameters.ts similarity index 100% rename from packages/core-interfaces/src/core-database/search/search-parameters.ts rename to packages/core-kernel/src/contracts/core-database/search/search-parameters.ts diff --git a/packages/core-kernel/src/contracts/core-kernel/application.ts b/packages/core-kernel/src/contracts/core-kernel/application.ts new file mode 100644 index 0000000000..5ef8d8d3a2 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/application.ts @@ -0,0 +1,219 @@ +import { AbstractServiceProvider } from "../../support"; +import { IBlockchain } from "../core-blockchain"; +import { IPeerService } from "../core-p2p"; +import { IConnection } from "../core-transaction-pool"; +import { IContainer } from "./container"; +import { IEventDispatcher } from "./event-dispatcher"; +import { ILogger } from "./logger"; + +export interface IApplication extends IContainer { + /** + * Get an instance of the application logger. + */ + readonly log: ILogger; + + /** + * Get an instance of the application blockchain. + */ + readonly blockchain: IBlockchain; + + /** + * Get an instance of the application p2p layer. + */ + readonly p2p: IPeerService; + + /** + * Get an instance of the application transaction pool. + */ + readonly transactionPool: IConnection; + + /** + * Get an instance of the application event dispatcher. + */ + readonly events: IEventDispatcher; + + /** + * Bootstrap the application with the given configuration. + */ + bootstrap(config: Record): void; + + /** + * Boot the application. + */ + boot(): void; + + /** + * Reboot the application. + */ + reboot(): void; + + /** + * Get the registered service provider instances if any exist. + */ + getProviders(): Set; + + /** + * Register the application service provider. + */ + registerProvider(provider: AbstractServiceProvider): Promise; + + /** + * Create a new provider instance. + */ + makeProvider(provider: AbstractServiceProvider, opts: Record): AbstractServiceProvider; + + /** + * Register a listener to run after loading the environment. + */ + afterLoadingEnvironment(listener: any): any; + + /** + * Register a listener to run before a bootstrapper. + */ + beforeBootstrapping(bootstrapper: string, listener: any): void; + + /** + * Register a listener to run after a bootstrapper. + */ + afterBootstrapping(bootstrapper: string, listener: any): void; + + /** + * Get or set the specified configuration value. + */ + config(key: string, value?: T): T; + + /** + * Get the namespace number of the application. + */ + namespace(): string; + + /** + * Get the version number of the application. + */ + version(): string; + + /** + * Get the current application token. + */ + token(): string; + + /** + * Get the current application network. + */ + network(): string; + + /** + * Set the current application network. + */ + useNetwork(value: string): void; + + /** + * Get the path to the data directory. + */ + dataPath(path?: string): string; + + /** + * Set the data directory. + */ + useDataPath(path: string): void; + + /** + * Get the path to the config directory. + */ + configPath(path?: string): string; + + /** + * Set the config directory. + */ + useConfigPath(path: string): void; + + /** + * Get the path to the cache directory. + */ + cachePath(path?: string): string; + + /** + * Set the cache directory. + */ + useCachePath(path: string): void; + + /** + * Get the path to the log directory. + */ + logPath(path?: string): string; + + /** + * Set the log directory. + */ + useLogPath(path: string): void; + + /** + * Get the path to the temp directory. + */ + tempPath(path?: string): string; + + /** + * Set the temp directory. + */ + useTempPath(path: string): void; + + /** + * Get the environment file the application is using. + */ + environmentFile(): string; + + /** + * Get the current application environment. + */ + environment(): string; + + /** + * Set the current application environment. + */ + useEnvironment(value: string): void; + + /** + * Determine if application is in local environment. + */ + isProduction(): boolean; + + /** + * Determine if application is in local environment. + */ + isDevelopment(): boolean; + + /** + * Determine if the application is running tests. + */ + runningTests(): boolean; + + /** + * Determine if the application has booted. + */ + isBooted(): boolean; + + /** + * Determine if the application has been bootstrapped. + */ + isBootstrapped(): boolean; + + /** + * Put the application into maintenance mode. + */ + enableMaintenance(): void; + + /** + * Bring the application out of maintenance mode + */ + disableMaintenance(): void; + + /** + * Determine if the application is currently down for maintenance. + */ + isDownForMaintenance(): boolean; + + /** + * Terminate the application. + */ + terminate(): Promise; +} diff --git a/packages/core-kernel/src/contracts/core-kernel/cache.ts b/packages/core-kernel/src/contracts/core-kernel/cache.ts new file mode 100644 index 0000000000..84864f00e5 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/cache.ts @@ -0,0 +1,51 @@ +export interface ICacheStore { + /** + * Retrieve an item from the cache by key. + */ + get(key: string): Promise; + + /** + * Retrieve multiple items from the cache by key. + */ + many(keys: string[]): Promise>; + + /** + * Store an item in the cache for a given number of milliseconds. + */ + put(key: string, value: any, ttl?: number): Promise; + + /** + * Store multiple items in the cache for a given number of milliseconds. + */ + putMany(values: string[], ttl?: number): Promise; + + /** + * Increment the value of an item in the cache. + */ + increment(key: string, value: number): Promise; + + /** + * Decrement the value of an item in the cache. + */ + decrement(key: string, value: number): Promise; + + /** + * Check if an item exists in the cache by key. + */ + has(key: string): Promise; + + /** + * Store an item in the cache indefinitely. + */ + forever(key: string, value: string): Promise; + + /** + * Remove an item from the cache. + */ + forget(key: string): Promise; + + /** + * Remove all items from the cache. + */ + flush(): Promise; +} diff --git a/packages/core-kernel/src/contracts/core-kernel/container.ts b/packages/core-kernel/src/contracts/core-kernel/container.ts new file mode 100644 index 0000000000..87518a4966 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/container.ts @@ -0,0 +1,36 @@ +import { BuildResolverOptions, Constructor, FunctionReturning, Resolver } from "awilix"; + +export interface IContainer { + /** + * Resolve the given name from the container. + */ + resolve(name: string): T; + + /** + * Register a class within the container. + */ + bind(name: string, concrete: any): void; + + /** + * Register a class within the container. + */ + shared(name: string, concrete: any): void; + + /** + * Alias a registration to a different name. + */ + alias(name: string, alias: string): void; + + /** + * Determine if the given name has been registered. + */ + has(name: string): boolean; + + /** + * Given a class or function, builds it up and returns it. + */ + call( + targetOrResolver: FunctionReturning<{}> | Constructor<{}> | Resolver<{}>, + opts?: BuildResolverOptions<{}>, + ): any; +} diff --git a/packages/core-kernel/src/contracts/core-kernel/event-dispatcher.ts b/packages/core-kernel/src/contracts/core-kernel/event-dispatcher.ts new file mode 100644 index 0000000000..ac1e59da27 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/event-dispatcher.ts @@ -0,0 +1,31 @@ +export interface IEventDispatcher { + /** + * Register an event listener with the dispatcher. + */ + listen(eventNames: string | string[], listener: any): void; + + /** + * Fire an event and call the listeners. + */ + dispatch(eventNames: string | string[], listener: any): void; + + /** + * Remove a set of listeners from the dispatcher. + */ + forget(eventNames: string | string[]): void; + + /** + * Determine if a given event has listeners. + */ + has(eventName: string): boolean; + + /** + * Get all of the listeners for a given event name. + */ + getListeners(eventName: string): any; + + /** + * Get the number of registered events. + */ + count(): number; +} diff --git a/packages/core-kernel/src/contracts/core-kernel/index.ts b/packages/core-kernel/src/contracts/core-kernel/index.ts new file mode 100644 index 0000000000..24df62bfa6 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/index.ts @@ -0,0 +1,5 @@ +export * from "./application"; +export * from "./cache"; +export * from "./container"; +export * from "./event-dispatcher"; +export * from "./logger"; diff --git a/packages/core-kernel/src/contracts/core-kernel/logger.ts b/packages/core-kernel/src/contracts/core-kernel/logger.ts new file mode 100644 index 0000000000..453513c174 --- /dev/null +++ b/packages/core-kernel/src/contracts/core-kernel/logger.ts @@ -0,0 +1,88 @@ +/** + * @see https://tools.ietf.org/html/rfc5424 + */ +export interface ILogger { + /** + * System is unusable. + * + * @param {*} message + * @memberof ILogger + */ + emergency(message: any): void; + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param {*} message + * @memberof ILogger + */ + alert(message: any): void; + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param {*} message + * @memberof ILogger + */ + critical(message: any): void; + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param {*} message + * @memberof ILogger + */ + error(message: any): void; + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param {*} message + * @memberof ILogger + */ + warning(message: any): void; + + /** + * Normal but significant events. + * + * @param {*} message + * @memberof ILogger + */ + notice(message: any): void; + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param {*} message + * @memberof ILogger + */ + info(message: any): void; + + /** + * Detailed debug information. + * + * @param {*} message + * @memberof ILogger + */ + debug(message: any): void; + + /** + * Logs with an arbitrary level. + * + * @param {string} level + * @param {*} message + * @memberof ILogger + */ + log(level: string, message: any): void; +} diff --git a/packages/core-interfaces/src/core-p2p/index.ts b/packages/core-kernel/src/contracts/core-p2p/index.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/index.ts rename to packages/core-kernel/src/contracts/core-p2p/index.ts diff --git a/packages/core-interfaces/src/core-p2p/network-monitor.ts b/packages/core-kernel/src/contracts/core-p2p/network-monitor.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/network-monitor.ts rename to packages/core-kernel/src/contracts/core-p2p/network-monitor.ts diff --git a/packages/core-interfaces/src/core-p2p/network-state.ts b/packages/core-kernel/src/contracts/core-p2p/network-state.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/network-state.ts rename to packages/core-kernel/src/contracts/core-p2p/network-state.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-communicator.ts b/packages/core-kernel/src/contracts/core-p2p/peer-communicator.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-communicator.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-communicator.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-connector.ts b/packages/core-kernel/src/contracts/core-p2p/peer-connector.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-connector.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-connector.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-processor.ts b/packages/core-kernel/src/contracts/core-p2p/peer-processor.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-processor.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-processor.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-service.ts b/packages/core-kernel/src/contracts/core-p2p/peer-service.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-service.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-service.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-storage.ts b/packages/core-kernel/src/contracts/core-p2p/peer-storage.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-storage.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-storage.ts diff --git a/packages/core-interfaces/src/core-p2p/peer-verifier.ts b/packages/core-kernel/src/contracts/core-p2p/peer-verifier.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer-verifier.ts rename to packages/core-kernel/src/contracts/core-p2p/peer-verifier.ts diff --git a/packages/core-interfaces/src/core-p2p/peer.ts b/packages/core-kernel/src/contracts/core-p2p/peer.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/peer.ts rename to packages/core-kernel/src/contracts/core-p2p/peer.ts diff --git a/packages/core-interfaces/src/core-p2p/server.ts b/packages/core-kernel/src/contracts/core-p2p/server.ts similarity index 100% rename from packages/core-interfaces/src/core-p2p/server.ts rename to packages/core-kernel/src/contracts/core-p2p/server.ts diff --git a/packages/core-interfaces/src/core-state/index.ts b/packages/core-kernel/src/contracts/core-state/index.ts similarity index 100% rename from packages/core-interfaces/src/core-state/index.ts rename to packages/core-kernel/src/contracts/core-state/index.ts diff --git a/packages/core-interfaces/src/core-state/service.ts b/packages/core-kernel/src/contracts/core-state/service.ts similarity index 100% rename from packages/core-interfaces/src/core-state/service.ts rename to packages/core-kernel/src/contracts/core-state/service.ts diff --git a/packages/core-interfaces/src/core-state/state-store.ts b/packages/core-kernel/src/contracts/core-state/state-store.ts similarity index 100% rename from packages/core-interfaces/src/core-state/state-store.ts rename to packages/core-kernel/src/contracts/core-state/state-store.ts diff --git a/packages/core-interfaces/src/core-state/wallets.ts b/packages/core-kernel/src/contracts/core-state/wallets.ts similarity index 100% rename from packages/core-interfaces/src/core-state/wallets.ts rename to packages/core-kernel/src/contracts/core-state/wallets.ts diff --git a/packages/core-interfaces/src/core-transaction-pool/connection.ts b/packages/core-kernel/src/contracts/core-transaction-pool/connection.ts similarity index 100% rename from packages/core-interfaces/src/core-transaction-pool/connection.ts rename to packages/core-kernel/src/contracts/core-transaction-pool/connection.ts diff --git a/packages/core-interfaces/src/core-transaction-pool/index.ts b/packages/core-kernel/src/contracts/core-transaction-pool/index.ts similarity index 100% rename from packages/core-interfaces/src/core-transaction-pool/index.ts rename to packages/core-kernel/src/contracts/core-transaction-pool/index.ts diff --git a/packages/core-interfaces/src/core-transaction-pool/processor.ts b/packages/core-kernel/src/contracts/core-transaction-pool/processor.ts similarity index 100% rename from packages/core-interfaces/src/core-transaction-pool/processor.ts rename to packages/core-kernel/src/contracts/core-transaction-pool/processor.ts diff --git a/packages/core-interfaces/src/index.ts b/packages/core-kernel/src/contracts/index.ts similarity index 51% rename from packages/core-interfaces/src/index.ts rename to packages/core-kernel/src/contracts/index.ts index d65da0e630..ff87b88975 100644 --- a/packages/core-interfaces/src/index.ts +++ b/packages/core-kernel/src/contracts/index.ts @@ -1,11 +1,9 @@ import * as Blockchain from "./core-blockchain"; -import * as Container from "./core-container"; import * as Database from "./core-database"; -import * as EventEmitter from "./core-event-emitter"; -import * as Logger from "./core-logger"; +import * as Kernel from "./core-kernel"; import * as P2P from "./core-p2p"; import * as State from "./core-state"; import * as TransactionPool from "./core-transaction-pool"; import * as Shared from "./shared"; -export { Container, Logger, Blockchain, TransactionPool, EventEmitter, P2P, Database, Shared, State }; +export { Kernel, Blockchain, TransactionPool, P2P, Database, Shared, State }; diff --git a/packages/core-interfaces/src/shared/index.ts b/packages/core-kernel/src/contracts/shared/index.ts similarity index 100% rename from packages/core-interfaces/src/shared/index.ts rename to packages/core-kernel/src/contracts/shared/index.ts diff --git a/packages/core-interfaces/src/shared/interfaces.ts b/packages/core-kernel/src/contracts/shared/interfaces.ts similarity index 100% rename from packages/core-interfaces/src/shared/interfaces.ts rename to packages/core-kernel/src/contracts/shared/interfaces.ts diff --git a/packages/core-kernel/src/errors.ts b/packages/core-kernel/src/errors.ts new file mode 100644 index 0000000000..f495898fe7 --- /dev/null +++ b/packages/core-kernel/src/errors.ts @@ -0,0 +1,227 @@ +// tslint:disable:max-classes-per-file + +/** + * @export + * @class KernelError + * @extends {Error} + */ +export class KernelError extends Error { + /** + * @param {string} message + * @memberof KernelError + */ + constructor(message: string) { + super(message); + + Object.defineProperty(this, "message", { + enumerable: false, + value: message, + }); + + Object.defineProperty(this, "name", { + enumerable: false, + value: this.constructor.name, + }); + + Error.captureStackTrace(this, this.constructor); + } +} + +/** + * @export + * @class DirectoryNotFound + * @extends {KernelError} + */ +export class DirectoryNotFound extends KernelError { + /** + * @param {string} value + * @memberof DirectoryNotFound + */ + constructor(value: string) { + super(`Directory [${value}] could not be found.`); + } +} + +/** + * @export + * @class EntryAlreadyExists + * @extends {KernelError} + */ +export class EntryAlreadyExists extends KernelError { + /** + * @param {string} value + * @memberof EntryAlreadyExists + */ + constructor(value: string) { + super(`[${value}] is not registered.`); + } +} + +/** + * @export + * @class EntryDoesNotExist + * @extends {KernelError} + */ +export class EntryDoesNotExist extends KernelError { + /** + * @param {string} value + * @memberof EntryDoesNotExist + */ + constructor(value: string) { + super(`[${value}] is not registered.`); + } +} + +/** + * @export + * @class FileNotFound + * @extends {KernelError} + */ +export class FileNotFound extends KernelError { + /** + * @param {string} value + * @memberof FileNotFound + */ + constructor(value: string) { + super(`File [${value}] could not be found.`); + } +} + +/** + * @export + * @class InvalidArgument + * @extends {KernelError} + */ +export class InvalidArgument extends KernelError { + /** + * @param {*} value + * @memberof InvalidArgument + */ + constructor(value: any) { + super(`[${value.toString()}] is an invalid argument.`); + } +} + +/** + * @export + * @class InvalidType + * @extends {KernelError} + */ +export class InvalidType extends KernelError { + /** + * @param {string} funcDescription + * @param {string} paramName + * @param {string} expectedType + * @param {*} givenType + * @memberof InvalidType + */ + constructor(funcDescription: string, paramName: string, expectedType: string, givenType: any) { + super(`${funcDescription}: expected ${paramName} to be ${expectedType}, but got ${givenType}.`); + } +} + +/** + * @export + * @class InvalidVersion + * @extends {KernelError} + */ +export class InvalidVersion extends KernelError { + /** + * @param {string} version + * @memberof InvalidVersion + */ + constructor(version: string) { + super( + `"${version}" is not a valid semantic version. Please check https://semver.org/ and make sure you follow the spec.`, + ); + } +} + +/** + * @export + * @class InvalidApplicationConfiguration + * @extends {KernelError} + */ +export class InvalidApplicationConfiguration extends KernelError { + /** + * @memberof InvalidApplicationConfiguration + */ + constructor() { + super("Unable to load the application configuration file."); + } +} + +/** + * @export + * @class InvalidEnvironmentConfiguration + * @extends {KernelError} + */ +export class InvalidEnvironmentConfiguration extends KernelError { + /** + * @memberof InvalidEnvironmentConfiguration + */ + constructor() { + super("Unable to load the environment file."); + } +} + +/** + * @export + * @class InvalidConfigurationAdapter + * @extends {KernelError} + */ +export class InvalidConfigurationAdapter extends KernelError { + /** + * @memberof InvalidConfigurationAdapter + */ + constructor() { + super("Unable to load the environment file."); + } +} + +/** + * @export + * @class FailedNetworkDetection + * @extends {KernelError} + */ +export class FailedNetworkDetection extends KernelError { + /** + * @memberof FailedNetworkDetection + */ + constructor() { + super("Unable to detect application token or network."); + } +} + +/** + * @export + * @class FailedServiceProviderRegistration + * @extends {KernelError} + */ +export class FailedServiceProviderRegistration extends KernelError { + /** + * @param {string} name + * @param {string} dep + * @memberof FailedServiceProviderRegistration + */ + constructor(name: string, dep: string) { + super(`Failed to register "${name}" as we did not detect "${dep}".`); + } +} + +/** + * @export + * @class FailedDependencySatisfaction + * @extends {KernelError} + */ +export class FailedDependencySatisfaction extends KernelError { + /** + * @param {string} dep + * @param {string} expected + * @param {string} given + * @memberof FailedDependencySatisfaction + */ + constructor(dep: string, expected: string, given: string) { + super(`Expected "${dep}" to satisfy "${expected}" but received "${given}".`); + } +} diff --git a/packages/core-kernel/src/index.ts b/packages/core-kernel/src/index.ts new file mode 100644 index 0000000000..8bf5560558 --- /dev/null +++ b/packages/core-kernel/src/index.ts @@ -0,0 +1,7 @@ +import { Application } from "./application"; +import * as Contracts from "./contracts"; +import * as Support from "./support"; + +const app: Contracts.Kernel.IApplication = new Application(); + +export { app, Contracts, Support }; diff --git a/packages/core-kernel/src/repositories/index.ts b/packages/core-kernel/src/repositories/index.ts new file mode 100644 index 0000000000..1a8f850f5f --- /dev/null +++ b/packages/core-kernel/src/repositories/index.ts @@ -0,0 +1 @@ +export * from "./provider"; diff --git a/packages/core-kernel/src/repositories/provider.ts b/packages/core-kernel/src/repositories/provider.ts new file mode 100644 index 0000000000..b311f726e4 --- /dev/null +++ b/packages/core-kernel/src/repositories/provider.ts @@ -0,0 +1,39 @@ +import { IApplication } from "../contracts/kernel"; +import { AbstractServiceProvider } from "../support"; + +/** + * @export + * @class ProviderRepository + * @extends {Set} + */ +export class ProviderRepository extends Set { + /** + * @param {IApplication} app + * @memberof ProviderRepository + */ + public constructor(readonly app: IApplication) { + super(); + } + + /** + * @param {AbstractServiceProvider} provider + * @returns {Promise} + * @memberof ProviderRepository + */ + public async register(provider: AbstractServiceProvider): Promise { + await provider.register(); + + this.add(provider); + } + + /** + * @param {AbstractServiceProvider} provider + * @param {Record} opts + * @returns {AbstractServiceProvider} + * @memberof ProviderRepository + */ + public make(provider: AbstractServiceProvider, opts: Record): AbstractServiceProvider { + // @ts-ignore + return new provider(this.app, opts); + } +} diff --git a/packages/core-kernel/src/services/cache/factory.ts b/packages/core-kernel/src/services/cache/factory.ts new file mode 100644 index 0000000000..c039681cf9 --- /dev/null +++ b/packages/core-kernel/src/services/cache/factory.ts @@ -0,0 +1,7 @@ +/** + * @export + * @class CacheFactory + */ +export class CacheFactory { + // +} diff --git a/packages/core-kernel/src/services/cache/manager.ts b/packages/core-kernel/src/services/cache/manager.ts new file mode 100644 index 0000000000..9cb55f4570 --- /dev/null +++ b/packages/core-kernel/src/services/cache/manager.ts @@ -0,0 +1,7 @@ +/** + * @export + * @class CacheManager + */ +export class CacheManager { + // +} diff --git a/packages/core-kernel/src/services/cache/store.ts b/packages/core-kernel/src/services/cache/store.ts new file mode 100644 index 0000000000..3115a38424 --- /dev/null +++ b/packages/core-kernel/src/services/cache/store.ts @@ -0,0 +1,133 @@ +import Keyv from "keyv"; +import { ICacheStore } from "../../contracts/core-kernel/cache"; + +/** + * @export + * @class CacheStore + * @implements {ICacheStore} + */ +export class CacheStore implements ICacheStore { + /** + * @private + * @type {Keyv} + * @memberof CacheStore + */ + private store: Keyv; + + /** + * @param {Record} [opts] + * @memberof CacheStore + */ + public constructor(opts?: Record) { + this.store = new Keyv(opts); + } + + /** + * @param {string} key + * @returns {Promise} + * @memberof CacheStore + */ + public async get(key: string): Promise { + return this.store.get(key); + } + + /** + * @param {string[]} keys + * @returns {Promise>} + * @memberof CacheStore + */ + public async many(keys: string[]): Promise> { + const values: Record = {}; + + for (const key of Object.keys(keys)) { + values[key] = await this.get(key); + } + + return values; + } + + /** + * @param {string} key + * @param {*} value + * @param {number} [ttl] + * @returns {Promise} + * @memberof CacheStore + */ + public async put(key: string, value: any, ttl?: number): Promise { + await this.store.set(key, value, ttl); + } + + /** + * @param {string[]} values + * @param {number} [ttl] + * @returns {Promise} + * @memberof CacheStore + */ + public async putMany(values: string[], ttl?: number): Promise { + for (const [key, value] of Object.entries(values)) { + await this.put(key, value, ttl); + } + } + + /** + * @param {string} key + * @param {number} [value=1] + * @returns {Promise} + * @memberof CacheStore + */ + public async increment(key: string, value: number = 1): Promise { + const currentValue: number = await this.get(key); + + await this.put(key, currentValue * 1); + } + + /** + * @param {string} key + * @param {number} [value=1] + * @returns {Promise} + * @memberof CacheStore + */ + public async decrement(key: string, value: number = 1): Promise { + const currentValue: number = await this.get(key); + + await this.put(key, currentValue * -1); + } + + /** + * @param {string} key + * @returns {Promise} + * @memberof CacheStore + */ + public async has(key: string): Promise { + const value: any = await this.get(key); + + return value !== undefined; + } + + /** + * @param {string} key + * @param {string} value + * @returns {Promise} + * @memberof CacheStore + */ + public async forever(key: string, value: string): Promise { + await this.store.set(key, value, 5 * 315576e5); + } + + /** + * @param {string} key + * @returns {Promise} + * @memberof CacheStore + */ + public async forget(key: string): Promise { + await this.store.delete(key); + } + + /** + * @returns {Promise} + * @memberof CacheStore + */ + public async flush(): Promise { + await this.store.clear(); + } +} diff --git a/packages/core-kernel/src/services/events/dispatcher.ts b/packages/core-kernel/src/services/events/dispatcher.ts new file mode 100644 index 0000000000..01ed00c824 --- /dev/null +++ b/packages/core-kernel/src/services/events/dispatcher.ts @@ -0,0 +1,86 @@ +import EventEmitter from "eventemitter3"; +import { IEventDispatcher } from "../../contracts/core-kernel/event-dispatcher"; + +/** + * @export + * @class EventDispatcher + * @implements {IEventDispatcher} + */ +export class EventDispatcher implements IEventDispatcher { + /** + * @private + * @type {EventEmitter} + * @memberof EventDispatcher + */ + private readonly dispatcher: EventEmitter = new EventEmitter(); + + /** + * @param {(string | string[])} eventNames + * @param {*} listener + * @memberof EventDispatcher + */ + public listen(eventNames: string | string[], listener: any): void { + if (!Array.isArray(eventNames)) { + eventNames = [eventNames]; + } + + for (const eventName of Object.values(eventNames)) { + this.dispatcher.addListener(eventName, listener); + } + } + + /** + * @param {(string | string[])} eventNames + * @param {*} listener + * @memberof EventDispatcher + */ + public dispatch(eventNames: string | string[], listener: any): void { + if (!Array.isArray(eventNames)) { + eventNames = [eventNames]; + } + + for (const eventName of Object.values(eventNames)) { + this.dispatcher.emit(eventName, listener); + } + } + + /** + * @param {(string | string[])} eventNames + * @memberof EventDispatcher + */ + public forget(eventNames: string | string[]): void { + if (!Array.isArray(eventNames)) { + eventNames = [eventNames]; + } + + for (const eventName of Object.values(eventNames)) { + this.dispatcher.removeListener(eventName); + } + } + + /** + * @param {string} eventName + * @returns {boolean} + * @memberof EventDispatcher + */ + public has(eventName: string): boolean { + return this.dispatcher.eventNames().includes(eventName); + } + + /** + * @param {string} eventName + * @returns {any[]} + * @memberof EventDispatcher + */ + public getListeners(eventName: string): any[] { + return this.dispatcher.listeners(eventName); + } + + /** + * @returns {number} + * @memberof EventDispatcher + */ + public count(): number { + return this.dispatcher.eventNames().length; + } +} diff --git a/packages/core-kernel/src/services/logger/factory.ts b/packages/core-kernel/src/services/logger/factory.ts new file mode 100644 index 0000000000..7528a651c3 --- /dev/null +++ b/packages/core-kernel/src/services/logger/factory.ts @@ -0,0 +1,44 @@ +import { Kernel } from "../../contracts"; + +/** + * @export + * @class LoggerFactory + */ +export class LoggerFactory { + /** + * @param {Kernel.IApplication} app + * @memberof LoggerFactory + */ + public constructor(private readonly app: Kernel.IApplication) {} + + /** + * @param {Kernel.ILogger} driver + * @returns {Kernel.ILogger} + * @memberof LoggerFactory + */ + public make(driver: Kernel.ILogger): Kernel.ILogger { + const instance: Kernel.ILogger = driver.make(); + + instance.debug(`${this.app.token()}/${this.app.network()}@${this.app.version()}`); + this.logPaths(instance); + + return instance; + } + + /** + * @private + * @param {Kernel.ILogger} driver + * @memberof LoggerFactory + */ + private logPaths(driver: Kernel.ILogger): void { + for (const [key, value] of Object.entries({ + Data: process.env.CORE_PATH_DATA, + Config: process.env.CORE_PATH_CONFIG, + Cache: process.env.CORE_PATH_CACHE, + Log: process.env.CORE_PATH_LOG, + Temp: process.env.CORE_PATH_TEMP, + })) { + driver.debug(`${key} Directory: ${value}`); + } + } +} diff --git a/packages/core-kernel/src/services/logger/logger.ts b/packages/core-kernel/src/services/logger/logger.ts new file mode 100644 index 0000000000..be84f39bcd --- /dev/null +++ b/packages/core-kernel/src/services/logger/logger.ts @@ -0,0 +1,169 @@ +import isEmpty from "lodash.isempty"; +import { inspect } from "util"; +import { ILogger } from "../../contracts/core-kernel/logger"; + +/** + * @export + * @abstract + * @class AbstractLogger + * @implements {ILogger} + */ +export abstract class AbstractLogger implements ILogger { + /** + * @protected + * @type {*} + * @memberof AbstractLogger + */ + protected logger: any; + + /** + * @protected + * @type {boolean} + * @memberof AbstractLogger + */ + protected silentConsole: boolean = false; + + /** + * @protected + * @type {Record} + * @memberof AbstractLogger + */ + protected readonly defaultLevels: Record = { + emergency: "emergency", + alert: "alert", + critical: "critical", + error: "error", + warning: "warning", + notice: "notice", + info: "info", + debug: "debug", + }; + + /** + * @param {Record} options + * @memberof AbstractLogger + */ + constructor(protected readonly options: Record) {} + + /** + * @abstract + * @returns {ILogger} + * @memberof AbstractLogger + */ + public abstract make(): ILogger; + + /** + * @param {string} level + * @param {*} message + * @returns {boolean} + * @memberof AbstractLogger + */ + public log(level: string, message: any): boolean { + if (this.silentConsole) { + return false; + } + + if (isEmpty(message)) { + return false; + } + + if (typeof message !== "string") { + message = inspect(message, { depth: 1 }); + } + + this.logger[level](message); + + return true; + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public emergency(message: any): void { + this.log(this.getLevel("emergency"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public alert(message: any): void { + this.log(this.getLevel("alert"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public critical(message: any): void { + this.log(this.getLevel("critical"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public error(message: any): void { + this.log(this.getLevel("error"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public warning(message: any): void { + this.log(this.getLevel("warning"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public notice(message: any): void { + this.log(this.getLevel("notice"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public info(message: any): void { + this.log(this.getLevel("info"), message); + } + + /** + * @param {*} message + * @memberof AbstractLogger + */ + public debug(message: any): void { + this.log(this.getLevel("debug"), message); + } + + /** + * @param {boolean} [suppress=true] + * @memberof AbstractLogger + */ + public suppressConsoleOutput(suppress: boolean = true): void { + this.silentConsole = suppress; + } + + /** + * @protected + * @param {string} level + * @returns {string} + * @memberof AbstractLogger + */ + protected getLevel(level: string): string { + return { ...this.defaultLevels, ...this.getLevels() }[level]; + } + + /** + * @protected + * @returns {Record} + * @memberof AbstractLogger + */ + protected getLevels(): Record { + return this.defaultLevels; + } +} diff --git a/packages/core-kernel/src/services/logger/manager.ts b/packages/core-kernel/src/services/logger/manager.ts new file mode 100644 index 0000000000..ced6f7e46f --- /dev/null +++ b/packages/core-kernel/src/services/logger/manager.ts @@ -0,0 +1,67 @@ +import { Kernel } from "../../contracts"; +import { LoggerFactory } from "./factory"; + +/** + * @export + * @class LoggerManager + */ +export class LoggerManager { + /** + * @private + * @type {LoggerFactory} + * @memberof LoggerManager + */ + private readonly factory: LoggerFactory; + + /** + * @private + * @type {Map} + * @memberof LoggerManager + */ + private readonly drivers: Map = new Map(); + + /** + * @param {Kernel.IApplication} app + * @memberof LoggerManager + */ + public constructor(app: Kernel.IApplication) { + this.factory = new LoggerFactory(app); + } + + /** + * @param {string} [name="default"] + * @returns {Kernel.ILogger} + * @memberof LoggerManager + */ + public driver(name: string = "default"): Kernel.ILogger { + return this.drivers.get(name); + } + + /** + * @param {Kernel.ILogger} driver + * @param {string} [name="default"] + * @returns {Kernel.ILogger} + * @memberof LoggerManager + */ + public createDriver(driver: Kernel.ILogger, name: string = "default"): Kernel.ILogger { + this.drivers.set(name, this.factory.make(driver)); + + return this.driver(); + } + + /** + * @returns {Map} + * @memberof LoggerManager + */ + public getDrivers(): Map { + return this.drivers; + } + + /** + * @returns {LoggerFactory} + * @memberof LoggerManager + */ + public getFactory(): LoggerFactory { + return this.factory; + } +} diff --git a/packages/core-kernel/src/services/queue/factory.ts b/packages/core-kernel/src/services/queue/factory.ts new file mode 100644 index 0000000000..ddc3184be3 --- /dev/null +++ b/packages/core-kernel/src/services/queue/factory.ts @@ -0,0 +1,7 @@ +/** + * @export + * @class QueueFactory + */ +export class QueueFactory { + // +} diff --git a/packages/core-kernel/src/services/queue/manager.ts b/packages/core-kernel/src/services/queue/manager.ts new file mode 100644 index 0000000000..319a98cdff --- /dev/null +++ b/packages/core-kernel/src/services/queue/manager.ts @@ -0,0 +1,7 @@ +/** + * @export + * @class QueueManager + */ +export class QueueManager { + // +} diff --git a/packages/core-kernel/src/support/index.ts b/packages/core-kernel/src/support/index.ts new file mode 100644 index 0000000000..b59e4f99f1 --- /dev/null +++ b/packages/core-kernel/src/support/index.ts @@ -0,0 +1,3 @@ +import { AbstractServiceProvider } from "./service-provider"; + +export { AbstractServiceProvider }; diff --git a/packages/core-kernel/src/support/service-provider.ts b/packages/core-kernel/src/support/service-provider.ts new file mode 100644 index 0000000000..a3e1427d94 --- /dev/null +++ b/packages/core-kernel/src/support/service-provider.ts @@ -0,0 +1,89 @@ +import { Kernel } from "../contracts"; + +export abstract class AbstractServiceProvider { + /** + * @protected + * @type {Kernel.IApplication} + * @memberof AbstractServiceProvider + */ + protected app: Kernel.IApplication; + + /** + * @protected + * @type {Record} + * @memberof AbstractServiceProvider + */ + protected opts: Record; + + /** + * @param {Kernel.IApplication} app + * @param {Record} [opts={}] + * @memberof AbstractServiceProvider + */ + public constructor(app: Kernel.IApplication, opts: Record = {}) { + this.app = app; + this.opts = opts; + } + + /** + * @abstract + * @returns {Promise} + * @memberof AbstractServiceProvider + */ + public abstract async register(): Promise; + + /** + * @returns {Promise} + * @memberof AbstractServiceProvider + */ + public async dispose(): Promise { + // do nothing by default... + } + + /** + * @abstract + * @returns {Record} + * @memberof AbstractServiceProvider + */ + public abstract getManifest(): Record; + + /** + * @returns {string} + * @memberof AbstractServiceProvider + */ + public getName(): string { + return this.getManifest().name; + } + + /** + * @returns {string} + * @memberof AbstractServiceProvider + */ + public getVersion(): string { + return this.getManifest().version; + } + + /** + * @returns {Record} + * @memberof AbstractServiceProvider + */ + public getDefaults(): Record { + return {}; + } + + /** + * @returns {string[]} + * @memberof AbstractServiceProvider + */ + public provides(): string[] { + return []; + } + + /** + * @returns {Record} + * @memberof AbstractServiceProvider + */ + public depends(): Record { + return {}; + } +} diff --git a/packages/core-interfaces/tsconfig.json b/packages/core-kernel/tsconfig.json similarity index 100% rename from packages/core-interfaces/tsconfig.json rename to packages/core-kernel/tsconfig.json diff --git a/packages/core-logger-pino/package.json b/packages/core-logger-pino/package.json index 63e41fe189..ae5bff29cd 100644 --- a/packages/core-logger-pino/package.json +++ b/packages/core-logger-pino/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-logger-pino", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Pino integration for ARK Core", "license": "MIT", "contributors": [ @@ -19,9 +19,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-logger": "^2.5.0-next.10", + "@arkecosystem/core-kernel": "^3.0.0-next.0", "pino": "^5.12.6", "pino-pretty": "^3.2.0", "pump": "^3.0.0", diff --git a/packages/core-logger-signale/package.json b/packages/core-logger-signale/package.json index edc408df94..b906017ff3 100644 --- a/packages/core-logger-signale/package.json +++ b/packages/core-logger-signale/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-logger-signale", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Signale integration for ARK Core", "license": "MIT", "contributors": [ @@ -19,8 +19,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-logger": "^2.5.0-next.10", + "@arkecosystem/core-kernel": "^3.0.0-next.0", "signale": "^1.4.0" }, "devDependencies": { diff --git a/packages/core-logger-winston/package.json b/packages/core-logger-winston/package.json index 457d148581..771facb5d0 100644 --- a/packages/core-logger-winston/package.json +++ b/packages/core-logger-winston/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-logger-winston", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Winston Logger for ARK Core", "license": "MIT", "contributors": [ @@ -20,8 +20,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-logger": "^2.5.0-next.10", + "@arkecosystem/core-kernel": "^3.0.0-next.0", "chalk": "^2.4.2", "colors": "^1.3.3", "dayjs": "^1.8.15", diff --git a/packages/core-logger/README.md b/packages/core-logger/README.md deleted file mode 100644 index c5b8172e27..0000000000 --- a/packages/core-logger/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# ARK Core - Logger - Interface - -

- -

- -## Documentation - -You can find installation instructions and detailed instructions on how to use this package at the [dedicated documentation site](https://docs.ark.io/guidebook/core/plugins/required/core-logger.html). - -## Security - -If you discover a security vulnerability within this package, please send an e-mail to security@ark.io. All security vulnerabilities will be promptly addressed. - -## Credits - -This project exists thanks to all the people who [contribute](../../../../contributors). - -## License - -[MIT](LICENSE) © [ARK Ecosystem](https://ark.io) diff --git a/packages/core-logger/package.json b/packages/core-logger/package.json deleted file mode 100644 index fba359ec1f..0000000000 --- a/packages/core-logger/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@arkecosystem/core-logger", - "version": "2.5.0-next.10", - "description": "Logger Manager for ARK Core", - "license": "MIT", - "contributors": [ - "Brian Faust " - ], - "files": [ - "dist" - ], - "main": "dist/index", - "types": "dist/index", - "scripts": { - "build": "yarn clean && yarn compile", - "build:watch": "yarn clean && yarn compile -w", - "clean": "del dist", - "compile": "../../node_modules/typescript/bin/tsc", - "prepublishOnly": "yarn build" - }, - "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "lodash.isempty": "^4.4.0" - }, - "devDependencies": { - "@types/capture-console": "^1.0.0", - "@types/lodash.isempty": "^4.4.6", - "capture-console": "^1.0.1" - }, - "engines": { - "node": ">=10.x" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/core-logger/src/factory.ts b/packages/core-logger/src/factory.ts deleted file mode 100644 index ec359727ef..0000000000 --- a/packages/core-logger/src/factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { app } from "@arkecosystem/core-container"; -import { Logger } from "@arkecosystem/core-interfaces"; - -export class LoggerFactory { - public make(driver: Logger.ILogger): Logger.ILogger { - const instance: Logger.ILogger = driver.make(); - - instance.debug(`${app.getName()} ${app.getVersion()}`); - this.logPaths(instance); - - return instance; - } - - private logPaths(driver: Logger.ILogger): void { - for (const [key, value] of Object.entries({ - Data: process.env.CORE_PATH_DATA, - Config: process.env.CORE_PATH_CONFIG, - Cache: process.env.CORE_PATH_CACHE, - Log: process.env.CORE_PATH_LOG, - Temp: process.env.CORE_PATH_TEMP, - })) { - driver.debug(`${key} Directory: ${value}`); - } - } -} diff --git a/packages/core-logger/src/index.ts b/packages/core-logger/src/index.ts deleted file mode 100644 index 5ea9d983cb..0000000000 --- a/packages/core-logger/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./manager"; -export * from "./logger"; -export * from "./plugin"; diff --git a/packages/core-logger/src/logger.ts b/packages/core-logger/src/logger.ts deleted file mode 100644 index 52d285686e..0000000000 --- a/packages/core-logger/src/logger.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Logger } from "@arkecosystem/core-interfaces"; -import isEmpty from "lodash.isempty"; -import { inspect } from "util"; - -export abstract class AbstractLogger implements Logger.ILogger { - protected logger: any; - protected silentConsole: boolean = false; - protected readonly defaultLevels: Record = { - error: "error", - warn: "warn", - info: "info", - debug: "debug", - verbose: "verbose", - }; - - constructor(protected readonly options: Record) {} - - public abstract make(): Logger.ILogger; - - public getLogger(): T { - return this.logger; - } - - public log(level: string, message: any): boolean { - if (this.silentConsole) { - return false; - } - - if (isEmpty(message)) { - return false; - } - - if (typeof message !== "string") { - message = inspect(message, { depth: 1 }); - } - - this.logger[level](message); - - return true; - } - - public error(message: any): boolean { - return this.log(this.getLevel("error"), message); - } - - public warn(message: any): boolean { - return this.log(this.getLevel("warn"), message); - } - - public info(message: any): boolean { - return this.log(this.getLevel("info"), message); - } - - public debug(message: any): boolean { - return this.log(this.getLevel("debug"), message); - } - - public verbose(message: any): boolean { - return this.log(this.getLevel("verbose"), message); - } - - public suppressConsoleOutput(suppress: boolean = true): void { - this.silentConsole = suppress; - } - - protected getLevel(level: string): string { - return { ...this.defaultLevels, ...this.getLevels() }[level]; - } - - protected getLevels(): Record { - return this.defaultLevels; - } -} diff --git a/packages/core-logger/src/manager.ts b/packages/core-logger/src/manager.ts deleted file mode 100644 index bfea18dce6..0000000000 --- a/packages/core-logger/src/manager.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Logger } from "@arkecosystem/core-interfaces"; -import { LoggerFactory } from "./factory"; - -export class LoggerManager { - private readonly factory: LoggerFactory = new LoggerFactory(); - private readonly drivers: Map = new Map(); - - public driver(name: string = "default"): Logger.ILogger { - return this.drivers.get(name); - } - - public createDriver(driver: Logger.ILogger, name: string = "default"): Logger.ILogger { - this.drivers.set(name, this.factory.make(driver)); - - return this.driver(); - } - - public getDrivers(): Map { - return this.drivers; - } - - public getFactory(): LoggerFactory { - return this.factory; - } -} diff --git a/packages/core-logger/src/plugin.ts b/packages/core-logger/src/plugin.ts deleted file mode 100644 index 1a080070ca..0000000000 --- a/packages/core-logger/src/plugin.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { LoggerManager } from "./manager"; - -export const plugin = { - pkg: require("../package.json"), - alias: "log-manager", - async register() { - return new LoggerManager(); - }, -}; diff --git a/packages/core-logger/tsconfig.json b/packages/core-logger/tsconfig.json deleted file mode 100644 index 0b089c5fa8..0000000000 --- a/packages/core-logger/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src/**/**.ts"] -} diff --git a/packages/core-new-relic/package.json b/packages/core-new-relic/package.json index 668753db49..0066d26b02 100644 --- a/packages/core-new-relic/package.json +++ b/packages/core-new-relic/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-new-relic", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "New Relic integration for ARK Core.", "license": "MIT", "contributors": [ @@ -18,7 +18,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", "newrelic": "^5.10.0" }, "devDependencies": { diff --git a/packages/core-p2p/package.json b/packages/core-p2p/package.json index b18e0a3694..5e298becd0 100644 --- a/packages/core-p2p/package.json +++ b/packages/core-p2p/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-p2p", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "P2P API for ARK Core", "license": "MIT", "contributors": [ @@ -23,13 +23,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-transaction-pool": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/core-transaction-pool": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@hapi/boom": "^7.4.2", "@hapi/sntp": "^3.1.1", "ajv": "^6.10.2", diff --git a/packages/core-snapshots/package.json b/packages/core-snapshots/package.json index 31a134d7d7..bc626766b4 100644 --- a/packages/core-snapshots/package.json +++ b/packages/core-snapshots/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-snapshots", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Provides live local streamed snapshots functionality for ARK Core", "license": "MIT", "contributors": [ @@ -20,11 +20,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-database-postgres": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-database-postgres": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "JSONStream": "^1.3.5", "cpy-cli": "^2.0.0", "fs-extra": "^8.1.0", diff --git a/packages/core-state/package.json b/packages/core-state/package.json index 7415211e9b..1a08413895 100644 --- a/packages/core-state/package.json +++ b/packages/core-state/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-state", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "State Management for ARK Core", "license": "MIT", "contributors": [ @@ -21,20 +21,19 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-transactions": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-transactions": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", + "dottie": "^2.0.1", "immutable": "^4.0.0-rc.12", "lodash.clonedeep": "^4.5.0", - "pluralize": "^8.0.0", - "dottie": "^2.0.1" + "pluralize": "^8.0.0" }, "devDependencies": { + "@types/dottie": "^2.0.3", "@types/lodash.clonedeep": "^4.5.6", - "@types/pluralize": "^0.0.29", - "@types/dottie": "^2.0.3" + "@types/pluralize": "^0.0.29" }, "engines": { "node": ">=10.x" diff --git a/packages/core-tester-cli/package.json b/packages/core-tester-cli/package.json index 2ce5989774..e5aabd94be 100644 --- a/packages/core-tester-cli/package.json +++ b/packages/core-tester-cli/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-tester-cli", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Tester CLI for ARK Core", "license": "MIT", "contributors": [ @@ -28,9 +28,9 @@ "tester": "./bin/run" }, "dependencies": { - "@arkecosystem/core-forger": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-forger": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@oclif/command": "^1.5.16", "@oclif/config": "^1.13.2", "@oclif/plugin-help": "^2.2.0", diff --git a/packages/core-transaction-pool/package.json b/packages/core-transaction-pool/package.json index 9091977712..e7a0c2ec72 100644 --- a/packages/core-transaction-pool/package.json +++ b/packages/core-transaction-pool/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-transaction-pool", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Transaction Pool Manager for ARK Core", "license": "MIT", "contributors": [ @@ -24,13 +24,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-database": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-transactions": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-database": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-transactions": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@types/better-sqlite3": "^5.4.0", "@types/fs-extra": "^8.0.0", "@types/pluralize": "^0.0.29", @@ -42,7 +41,7 @@ "pluralize": "^8.0.0" }, "devDependencies": { - "@arkecosystem/core-utils": "^2.5.0-next.10", + "@arkecosystem/core-utils": "^3.0.0-next.0", "@types/better-sqlite3": "^5.4.0", "@types/bip39": "^2.4.2", "@types/fs-extra": "^8.0.0", diff --git a/packages/core-transactions/package.json b/packages/core-transactions/package.json index f2c8afdb98..e65e35c11a 100644 --- a/packages/core-transactions/package.json +++ b/packages/core-transactions/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-transactions", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Transaction Services for ARK Core", "license": "MIT", "contributors": [ @@ -19,11 +19,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "bs58check": "^2.1.2" }, "engines": { diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index af792ff9dc..0a65cbe34b 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-utils", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Utilities for ARK Core", "license": "MIT", "contributors": [ @@ -18,9 +18,8 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "cli-table3": "^0.5.1", "dayjs": "^1.8.15", "fast-json-parse": "^1.0.3", diff --git a/packages/core-vote-report/package.json b/packages/core-vote-report/package.json index 2fc8e6b79e..0453f1a961 100644 --- a/packages/core-vote-report/package.json +++ b/packages/core-vote-report/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-vote-report", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Vote Report for ARK Core", "license": "MIT", "contributors": [ @@ -18,10 +18,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "handlebars": "^4.1.2", "vision": "^5.4.4" }, diff --git a/packages/core-wallet-api/package.json b/packages/core-wallet-api/package.json index b7b2c871d1..b467fdcbd9 100644 --- a/packages/core-wallet-api/package.json +++ b/packages/core-wallet-api/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-wallet-api", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Wallet API for ARK Core", "license": "MIT", "contributors": [ @@ -21,10 +21,9 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", "@hapi/h2o2": "^8.3.0", "hapi-rate-limit": "^4.0.0", "ip": "^1.1.5" diff --git a/packages/core-webhooks/package.json b/packages/core-webhooks/package.json index 1244f722d3..639c5ceeea 100644 --- a/packages/core-webhooks/package.json +++ b/packages/core-webhooks/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-webhooks", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Webhooks for ARK Core", "license": "MIT", "contributors": [ @@ -19,11 +19,10 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-http-utils": "^2.5.0-next.10", - "@arkecosystem/core-interfaces": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-http-utils": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", "@hapi/boom": "^7.4.2", "@hapi/joi": "^15.1.0", "fs-extra": "^8.1.0", diff --git a/packages/core/package.json b/packages/core/package.json index 1a533c28bb..c32249b796 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Core of the ARK Blockchain", "license": "MIT", "contributors": [ @@ -44,22 +44,22 @@ "start:testnet": "cross-env CORE_PATH_CONFIG=./bin/config/testnet yarn ark core:run --env=test" }, "dependencies": { - "@arkecosystem/core-api": "^2.5.0-next.10", - "@arkecosystem/core-blockchain": "^2.5.0-next.10", - "@arkecosystem/core-container": "^2.5.0-next.10", - "@arkecosystem/core-database-postgres": "^2.5.0-next.10", - "@arkecosystem/core-event-emitter": "^2.5.0-next.10", - "@arkecosystem/core-exchange-json-rpc": "^2.5.0-next.10", - "@arkecosystem/core-forger": "^2.5.0-next.10", - "@arkecosystem/core-logger-pino": "^2.5.0-next.10", - "@arkecosystem/core-p2p": "^2.5.0-next.10", - "@arkecosystem/core-snapshots": "^2.5.0-next.10", - "@arkecosystem/core-state": "^2.5.0-next.10", - "@arkecosystem/core-transaction-pool": "^2.5.0-next.10", - "@arkecosystem/core-utils": "^2.5.0-next.10", - "@arkecosystem/core-wallet-api": "^2.5.0-next.10", - "@arkecosystem/core-webhooks": "^2.5.0-next.10", - "@arkecosystem/crypto": "^2.5.0-next.10", + "@arkecosystem/core-api": "^3.0.0-next.0", + "@arkecosystem/core-blockchain": "^3.0.0-next.0", + "@arkecosystem/core-container": "^3.0.0-next.0", + "@arkecosystem/core-database-postgres": "^3.0.0-next.0", + "@arkecosystem/core-event-emitter": "^3.0.0-next.0", + "@arkecosystem/core-exchange-json-rpc": "^3.0.0-next.0", + "@arkecosystem/core-forger": "^3.0.0-next.0", + "@arkecosystem/core-logger-pino": "^3.0.0-next.0", + "@arkecosystem/core-p2p": "^3.0.0-next.0", + "@arkecosystem/core-snapshots": "^3.0.0-next.0", + "@arkecosystem/core-state": "^3.0.0-next.0", + "@arkecosystem/core-transaction-pool": "^3.0.0-next.0", + "@arkecosystem/core-utils": "^3.0.0-next.0", + "@arkecosystem/core-wallet-api": "^3.0.0-next.0", + "@arkecosystem/core-webhooks": "^3.0.0-next.0", + "@arkecosystem/crypto": "^3.0.0-next.0", "@oclif/command": "^1.5.16", "@oclif/config": "^1.13.2", "@oclif/plugin-autocomplete": "^0.1.1", diff --git a/packages/crypto/package.json b/packages/crypto/package.json index ea2fc6986f..60e4640669 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/crypto", - "version": "2.5.0-next.10", + "version": "3.0.0-next.0", "description": "Crypto utilities for the ARK Blockchain", "license": "MIT", "contributors": [ @@ -63,10 +63,10 @@ "@types/pluralize": "^0.0.29", "@types/wif": "^2.0.1", "rollup": "^1.17.0", - "rollup-plugin-terser": "^5.1.1", "rollup-plugin-commonjs": "^10.0.1", "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-resolve": "^5.2.0" + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-terser": "^5.1.1" }, "publishConfig": { "access": "public" diff --git a/yarn.lock b/yarn.lock index bbec1dbb47..18aae19d44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2415,12 +2415,6 @@ "@types/long" "*" "@types/node" "*" -"@types/capture-console@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/capture-console/-/capture-console-1.0.0.tgz#8730d90248d862c4ccdaf5a623bfee0272d9a934" - dependencies: - "@types/node" "*" - "@types/catbox@*": version "10.0.6" resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-10.0.6.tgz#8a4c91261cf0afca03351bb82a95b2d6cf43a5d0" @@ -3409,13 +3403,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argle@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/argle/-/argle-1.1.1.tgz#0cfe3bc032c36b2f48ba42b9c17f89f70607e994" - dependencies: - lodash.isfunction "^3.0.8" - lodash.isnumber "^3.0.3" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3473,10 +3460,6 @@ array-union@^1.0.1, array-union@^1.0.2: dependencies: array-uniq "^1.0.1" -array-uniq@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" - array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -4141,14 +4124,6 @@ caniuse-lite@^1.0.30000971: version "1.0.30000971" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz#d1000e4546486a6977756547352bc96a4cfd2b13" -capture-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-console/-/capture-console-1.0.1.tgz#db63c39ac73239019badd7fbb10143eda380ff71" - dependencies: - argle "~1.1.1" - lodash.isfunction "~3.0.8" - randomstring "~1.1.5" - capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -6467,7 +6442,7 @@ hoek@5.x.x, hoek@^5.0.2: version "5.0.4" resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" -hoek@6.x.x: +hoek@6.x.x, hoek@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" @@ -7489,7 +7464,7 @@ jmespath@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" -joi@14.x.x: +joi@14.x.x, joi@^14.3.1: version "14.3.1" resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" dependencies: @@ -7972,10 +7947,6 @@ lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" -lodash.isfunction@^3.0.8, lodash.isfunction@~3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -7996,6 +7967,11 @@ lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" +lodash.isundefined@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" + integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= + lodash.map@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -8554,14 +8530,14 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nan@^2.0.0, nan@^2.13.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + nan@^2.12.1, nan@^2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" -nan@^2.13.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - nanomatch@^1.2.13, nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8917,6 +8893,16 @@ npm-run-path@^3.0.0: gauge "~2.7.3" set-blocking "~2.0.0" +nsfw@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-1.2.5.tgz#febe581af616f7b042f89df133abe62416c4c803" + integrity sha512-m3mwZUKXiCR69PDMLfAmKmiNzy0Oe9LhFE0DYZC5cc1htNj5Hyb1sAgglXhuaDkibFy22AVvPC5cCFB3A6mYIw== + dependencies: + fs-extra "^7.0.0" + lodash.isinteger "^4.0.4" + lodash.isundefined "^3.0.1" + nan "^2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -9901,12 +9887,6 @@ randombytes@^2.0.1: dependencies: safe-buffer "^5.1.0" -randomstring@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.1.5.tgz#6df0628f75cbd5932930d9fe3ab4e956a18518c3" - dependencies: - array-uniq "1.0.2" - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -10602,6 +10582,11 @@ semver@^6.1.2, semver@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"