@super-protocol/sdk-js 2.1.4-beta.1 → 2.1.4-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{build → dist/cjs}/TIIGenerator.js +1 -1
- package/{build → dist/cjs}/analytics/Analytics.js +1 -1
- package/{build → dist/cjs}/analytics/AnalyticsError.js +1 -1
- package/{build → dist/cjs}/analytics/eventProviders/BrowserEventProvider.js +1 -1
- package/dist/cjs/analytics/eventProviders/EventProvider.js +14 -0
- package/{build → dist/cjs}/analytics/eventProviders/NodeEventProvider.js +1 -1
- package/{build → dist/cjs}/analytics/transports/AxiosTransport.js +1 -1
- package/{build → dist/cjs}/analytics/transports/FetchTransport.js +1 -1
- package/{build → dist/cjs}/analytics/types.js +1 -1
- package/{build → dist/cjs}/config.js +1 -1
- package/{build → dist/cjs}/connectors/BaseConnector.js +1 -1
- package/{build → dist/cjs}/connectors/BlockchainConnector.js +1 -1
- package/{build → dist/cjs}/connectors/BlockchainEventsListener.js +1 -1
- package/{build → dist/cjs}/connectors/index.js +1 -1
- package/{build → dist/cjs}/constants.js +1 -1
- package/{build → dist/cjs}/contracts/abi.js +1 -1
- package/{build → dist/cjs}/crypto/Crypto.js +1 -1
- package/{build → dist/cjs}/crypto/index.js +1 -1
- package/{build → dist/cjs}/crypto/nodejs/AES.js +1 -1
- package/{build → dist/cjs}/crypto/nodejs/ARIA.js +1 -1
- package/{build → dist/cjs}/crypto/nodejs/ECIES.js +1 -1
- package/dist/cjs/crypto/nodejs/NativeCrypto.js +183 -0
- package/{build → dist/cjs}/crypto/nodejs/RSA-Hybrid.js +1 -1
- package/{build → dist/cjs}/index.js +1 -1
- package/{build → dist/cjs}/logger.js +1 -1
- package/{build → dist/cjs}/models/EtlModel.js +1 -1
- package/{build → dist/cjs}/models/Offer.js +1 -1
- package/{build → dist/cjs}/models/Order.js +1 -1
- package/{build → dist/cjs}/models/Provider.js +1 -1
- package/{build → dist/cjs}/models/TCB.js +1 -1
- package/{build → dist/cjs}/models/TeeOffer.js +1 -1
- package/{build → dist/cjs}/models/index.js +1 -1
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/polyfills.js +7 -0
- package/dist/cjs/proto/Compression.js +132 -0
- package/dist/cjs/proto/TRI.js +293 -0
- package/dist/cjs/proto/TeeProperties.js +401 -0
- package/{build → dist/cjs}/providers/storage/ChunksDownloadDecorator.js +1 -1
- package/{build → dist/cjs}/providers/storage/IStorageProvider.js +1 -1
- package/{build → dist/cjs}/providers/storage/S3StorageProvider.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorageAdapter.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorageContentWriter.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorageKeyValueAdapter.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorageMetadataReader.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorjAdapter.js +1 -1
- package/{build → dist/cjs}/providers/storage/StorjStorageProvider.js +1 -1
- package/{build → dist/cjs}/providers/storage/getStorageProvider.js +1 -1
- package/{build → dist/cjs}/providers/storage/types.js +1 -1
- package/{build → dist/cjs}/staticModels/ActiveOffers.js +1 -1
- package/{build → dist/cjs}/staticModels/ActiveOrders.js +1 -1
- package/dist/cjs/staticModels/Consensus.js +247 -0
- package/{build → dist/cjs}/staticModels/Deposits.js +1 -1
- package/{build → dist/cjs}/staticModels/Marks.js +1 -1
- package/{build → dist/cjs}/staticModels/ModelPackager.js +1 -1
- package/{build → dist/cjs}/staticModels/Offers.js +1 -1
- package/{build → dist/cjs}/staticModels/Orders.js +1 -1
- package/{build → dist/cjs}/staticModels/ProviderRegistry.js +1 -1
- package/{build → dist/cjs}/staticModels/StaticModel.js +1 -1
- package/{build → dist/cjs}/staticModels/Superpro.js +1 -1
- package/{build → dist/cjs}/staticModels/SuperproToken.js +1 -1
- package/{build → dist/cjs}/staticModels/TeeOffers.js +1 -1
- package/{build → dist/cjs}/store.js +1 -1
- package/{build → dist/cjs}/tee/QuoteParser.js +1 -1
- package/{build → dist/cjs}/tee/QuoteValidator.js +1 -1
- package/{build → dist/cjs}/tee/errors.js +1 -1
- package/dist/cjs/tee/helpers.js +119 -0
- package/{build → dist/cjs}/tee/interface.js +1 -1
- package/{build → dist/cjs}/tee/statuses.js +1 -1
- package/{build → dist/cjs}/tee/types.js +1 -1
- package/{build → dist/cjs}/types/Compressor.js +1 -1
- package/{build → dist/cjs}/types/Consensus.js +1 -1
- package/{build → dist/cjs}/types/DepositInfo.js +1 -1
- package/{build → dist/cjs}/types/EtlModel.js +1 -1
- package/{build → dist/cjs}/types/Events.js +1 -1
- package/{build → dist/cjs}/types/HardwareInfo.js +1 -1
- package/{build → dist/cjs}/types/Marks.js +1 -1
- package/{build → dist/cjs}/types/Offer.js +1 -1
- package/{build → dist/cjs}/types/OptionInfo.js +1 -1
- package/{build → dist/cjs}/types/Order.js +1 -1
- package/{build → dist/cjs}/types/OrderUsage.js +1 -1
- package/{build → dist/cjs}/types/Origins.js +1 -1
- package/{build → dist/cjs}/types/Provider.js +1 -1
- package/{build → dist/cjs}/types/ResourceLoader.js +1 -1
- package/{build → dist/cjs}/types/SlotInfo.js +1 -1
- package/{build → dist/cjs}/types/SlotUsage.js +1 -1
- package/{build → dist/cjs}/types/Superpro.js +1 -1
- package/{build → dist/cjs}/types/TeeOfferInfo.js +1 -1
- package/{build → dist/cjs}/types/TeeOfferOption.js +1 -1
- package/{build → dist/cjs}/types/TeeOfferSlot.js +1 -1
- package/{build → dist/cjs}/types/ValueOfferSlot.js +1 -1
- package/{build → dist/cjs}/types/Web3.js +1 -1
- package/{build → dist/cjs}/types/blockchainConnector/StorageAccess.js +1 -1
- package/{build → dist/cjs}/types/index.js +1 -1
- package/{build → dist/cjs}/types/storage/StorageAccess.js +1 -1
- package/{build → dist/cjs}/types/storage/StorageFileAccess.js +1 -1
- package/{build → dist/cjs}/types/storage/StorageObject.js +1 -1
- package/dist/cjs/utils/Monitoring.js +48 -0
- package/{build → dist/cjs}/utils/NonceTracker.js +1 -1
- package/dist/cjs/utils/PubSub.js +37 -0
- package/{build → dist/cjs}/utils/TxManager.js +1 -1
- package/{build → dist/cjs}/utils/compressors/GzipCompressor.js +1 -1
- package/{build → dist/cjs}/utils/compressors/UncompressedCompressor.js +1 -1
- package/{build → dist/cjs}/utils/compressors/index.js +1 -1
- package/{build → dist/cjs}/utils/helper.js +1 -1
- package/{build → dist/cjs}/utils/helpers/getStreamChunks.js +1 -1
- package/{build → dist/cjs}/utils/helpers/index.js +1 -1
- package/{build → dist/cjs}/utils/helpers/tryWithInterval.js +1 -1
- package/{build → dist/cjs}/utils/resourceLoaders/BaseResourceLoader.js +1 -1
- package/{build → dist/cjs}/utils/resourceLoaders/StorageProviderLoader.js +1 -1
- package/{build → dist/cjs}/utils/resourceLoaders/UrlResourceLoader.js +1 -1
- package/{build → dist/cjs}/utils/resourceLoaders/getResourceLoader.js +1 -1
- package/{build → dist/cjs}/utils/resourceLoaders/index.js +1 -1
- package/dist/mjs/TIIGenerator.d.ts +22 -0
- package/dist/mjs/TIIGenerator.js +224 -0
- package/dist/mjs/analytics/Analytics.d.ts +15 -0
- package/dist/mjs/analytics/Analytics.js +61 -0
- package/dist/mjs/analytics/AnalyticsError.d.ts +7 -0
- package/dist/mjs/analytics/AnalyticsError.js +8 -0
- package/dist/mjs/analytics/eventProviders/BrowserEventProvider.d.ts +18 -0
- package/dist/mjs/analytics/eventProviders/BrowserEventProvider.js +32 -0
- package/dist/mjs/analytics/eventProviders/EventProvider.d.ts +24 -0
- package/dist/mjs/analytics/eventProviders/EventProvider.js +22 -0
- package/dist/mjs/analytics/eventProviders/NodeEventProvider.d.ts +22 -0
- package/dist/mjs/analytics/eventProviders/NodeEventProvider.js +50 -0
- package/dist/mjs/analytics/transports/AxiosTransport.d.ts +4 -0
- package/dist/mjs/analytics/transports/AxiosTransport.js +31 -0
- package/dist/mjs/analytics/transports/FetchTransport.d.ts +4 -0
- package/dist/mjs/analytics/transports/FetchTransport.js +28 -0
- package/dist/mjs/analytics/types.d.ts +22 -0
- package/dist/mjs/analytics/types.js +2 -0
- package/dist/mjs/config.d.ts +4 -0
- package/dist/mjs/config.js +5 -0
- package/dist/mjs/connectors/BaseConnector.d.ts +36 -0
- package/dist/mjs/connectors/BaseConnector.js +34 -0
- package/dist/mjs/connectors/BlockchainConnector.d.ts +81 -0
- package/dist/mjs/connectors/BlockchainConnector.js +313 -0
- package/dist/mjs/connectors/BlockchainEventsListener.d.ts +15 -0
- package/dist/mjs/connectors/BlockchainEventsListener.js +75 -0
- package/dist/mjs/connectors/index.d.ts +2 -0
- package/dist/mjs/connectors/index.js +3 -0
- package/dist/mjs/constants.d.ts +13 -0
- package/dist/mjs/constants.js +14 -0
- package/dist/mjs/contracts/abi.d.ts +9916 -0
- package/dist/mjs/contracts/abi.js +12941 -0
- package/dist/mjs/crypto/Crypto.d.ts +54 -0
- package/dist/mjs/crypto/Crypto.js +95 -0
- package/dist/mjs/crypto/index.d.ts +2 -0
- package/dist/mjs/crypto/index.js +3 -0
- package/dist/mjs/crypto/nodejs/AES.d.ts +24 -0
- package/dist/mjs/crypto/nodejs/AES.js +74 -0
- package/dist/mjs/crypto/nodejs/ARIA.d.ts +24 -0
- package/dist/mjs/crypto/nodejs/ARIA.js +73 -0
- package/dist/mjs/crypto/nodejs/ECIES.d.ts +6 -0
- package/dist/mjs/crypto/nodejs/ECIES.js +51 -0
- package/dist/mjs/crypto/nodejs/NativeCrypto.d.ts +58 -0
- package/dist/mjs/crypto/nodejs/NativeCrypto.js +168 -0
- package/dist/mjs/crypto/nodejs/RSA-Hybrid.d.ts +15 -0
- package/dist/mjs/crypto/nodejs/RSA-Hybrid.js +89 -0
- package/dist/mjs/index.d.ts +79 -0
- package/dist/mjs/index.js +75 -0
- package/dist/mjs/logger.d.ts +7 -0
- package/dist/mjs/logger.js +7 -0
- package/dist/mjs/models/EtlModel.d.ts +34 -0
- package/dist/mjs/models/EtlModel.js +96 -0
- package/dist/mjs/models/Offer.d.ts +130 -0
- package/dist/mjs/models/Offer.js +356 -0
- package/dist/mjs/models/Order.d.ts +148 -0
- package/dist/mjs/models/Order.js +520 -0
- package/dist/mjs/models/Provider.d.ts +51 -0
- package/dist/mjs/models/Provider.js +114 -0
- package/dist/mjs/models/TCB.d.ts +58 -0
- package/dist/mjs/models/TCB.js +107 -0
- package/dist/mjs/models/TeeOffer.d.ts +204 -0
- package/dist/mjs/models/TeeOffer.js +533 -0
- package/dist/mjs/models/index.d.ts +5 -0
- package/dist/mjs/models/index.js +6 -0
- package/dist/mjs/package.json +1 -0
- package/dist/mjs/polyfills.d.ts +0 -0
- package/dist/mjs/polyfills.js +7 -0
- package/dist/mjs/proto/Compression.d.ts +36 -0
- package/dist/mjs/proto/Compression.js +123 -0
- package/dist/mjs/proto/TRI.d.ts +124 -0
- package/dist/mjs/proto/TRI.js +284 -0
- package/dist/mjs/proto/TeeProperties.d.ts +263 -0
- package/dist/mjs/proto/TeeProperties.js +391 -0
- package/dist/mjs/providers/storage/ChunksDownloadDecorator.d.ts +36 -0
- package/dist/mjs/providers/storage/ChunksDownloadDecorator.js +139 -0
- package/dist/mjs/providers/storage/IStorageProvider.d.ts +15 -0
- package/dist/mjs/providers/storage/IStorageProvider.js +2 -0
- package/dist/mjs/providers/storage/S3StorageProvider.d.ts +25 -0
- package/dist/mjs/providers/storage/S3StorageProvider.js +167 -0
- package/dist/mjs/providers/storage/StorageAdapter.d.ts +60 -0
- package/dist/mjs/providers/storage/StorageAdapter.js +271 -0
- package/dist/mjs/providers/storage/StorageContentWriter.d.ts +46 -0
- package/dist/mjs/providers/storage/StorageContentWriter.js +161 -0
- package/dist/mjs/providers/storage/StorageKeyValueAdapter.d.ts +23 -0
- package/dist/mjs/providers/storage/StorageKeyValueAdapter.js +119 -0
- package/dist/mjs/providers/storage/StorageMetadataReader.d.ts +20 -0
- package/dist/mjs/providers/storage/StorageMetadataReader.js +51 -0
- package/dist/mjs/providers/storage/StorjAdapter.d.ts +19 -0
- package/dist/mjs/providers/storage/StorjAdapter.js +48 -0
- package/dist/mjs/providers/storage/StorjStorageProvider.d.ts +25 -0
- package/dist/mjs/providers/storage/StorjStorageProvider.js +141 -0
- package/dist/mjs/providers/storage/getStorageProvider.d.ts +4 -0
- package/dist/mjs/providers/storage/getStorageProvider.js +15 -0
- package/dist/mjs/providers/storage/types.d.ts +7 -0
- package/dist/mjs/providers/storage/types.js +2 -0
- package/dist/mjs/staticModels/ActiveOffers.d.ts +15 -0
- package/dist/mjs/staticModels/ActiveOffers.js +32 -0
- package/dist/mjs/staticModels/ActiveOrders.d.ts +20 -0
- package/dist/mjs/staticModels/ActiveOrders.js +71 -0
- package/dist/mjs/staticModels/Consensus.d.ts +42 -0
- package/dist/mjs/staticModels/Consensus.js +220 -0
- package/dist/mjs/staticModels/Deposits.d.ts +70 -0
- package/dist/mjs/staticModels/Deposits.js +190 -0
- package/dist/mjs/staticModels/Marks.d.ts +8 -0
- package/dist/mjs/staticModels/Marks.js +25 -0
- package/dist/mjs/staticModels/ModelPackager.d.ts +18 -0
- package/dist/mjs/staticModels/ModelPackager.js +45 -0
- package/dist/mjs/staticModels/Offers.d.ts +65 -0
- package/dist/mjs/staticModels/Offers.js +184 -0
- package/dist/mjs/staticModels/Orders.d.ts +155 -0
- package/dist/mjs/staticModels/Orders.js +472 -0
- package/dist/mjs/staticModels/ProviderRegistry.d.ts +74 -0
- package/dist/mjs/staticModels/ProviderRegistry.js +169 -0
- package/dist/mjs/staticModels/StaticModel.d.ts +8 -0
- package/dist/mjs/staticModels/StaticModel.js +30 -0
- package/dist/mjs/staticModels/Superpro.d.ts +16 -0
- package/dist/mjs/staticModels/Superpro.js +23 -0
- package/dist/mjs/staticModels/SuperproToken.d.ts +48 -0
- package/dist/mjs/staticModels/SuperproToken.js +136 -0
- package/dist/mjs/staticModels/TeeOffers.d.ts +115 -0
- package/dist/mjs/staticModels/TeeOffers.js +309 -0
- package/dist/mjs/store.d.ts +15 -0
- package/dist/mjs/store.js +15 -0
- package/dist/mjs/tee/QuoteParser.d.ts +27 -0
- package/dist/mjs/tee/QuoteParser.js +162 -0
- package/dist/mjs/tee/QuoteValidator.d.ts +38 -0
- package/dist/mjs/tee/QuoteValidator.js +382 -0
- package/dist/mjs/tee/errors.d.ts +6 -0
- package/dist/mjs/tee/errors.js +7 -0
- package/dist/mjs/tee/helpers.d.ts +14 -0
- package/dist/mjs/tee/helpers.js +115 -0
- package/dist/mjs/tee/interface.d.ts +63 -0
- package/dist/mjs/tee/interface.js +2 -0
- package/dist/mjs/tee/statuses.d.ts +21 -0
- package/dist/mjs/tee/statuses.js +25 -0
- package/dist/mjs/tee/types.d.ts +75 -0
- package/dist/mjs/tee/types.js +2 -0
- package/dist/mjs/types/Compressor.d.ts +5 -0
- package/dist/mjs/types/Compressor.js +2 -0
- package/dist/mjs/types/Consensus.d.ts +60 -0
- package/dist/mjs/types/Consensus.js +16 -0
- package/dist/mjs/types/DepositInfo.d.ts +6 -0
- package/dist/mjs/types/DepositInfo.js +2 -0
- package/dist/mjs/types/EtlModel.d.ts +2 -0
- package/dist/mjs/types/EtlModel.js +2 -0
- package/dist/mjs/types/Events.d.ts +34 -0
- package/dist/mjs/types/Events.js +2 -0
- package/dist/mjs/types/HardwareInfo.d.ts +6 -0
- package/dist/mjs/types/HardwareInfo.js +2 -0
- package/dist/mjs/types/Marks.d.ts +9 -0
- package/dist/mjs/types/Marks.js +7 -0
- package/dist/mjs/types/Offer.d.ts +33 -0
- package/dist/mjs/types/Offer.js +14 -0
- package/dist/mjs/types/OptionInfo.d.ts +8 -0
- package/dist/mjs/types/OptionInfo.js +2 -0
- package/dist/mjs/types/Order.d.ts +56 -0
- package/dist/mjs/types/Order.js +51 -0
- package/dist/mjs/types/OrderUsage.d.ts +26 -0
- package/dist/mjs/types/OrderUsage.js +2 -0
- package/dist/mjs/types/Origins.d.ts +6 -0
- package/dist/mjs/types/Origins.js +2 -0
- package/dist/mjs/types/Provider.d.ts +7 -0
- package/dist/mjs/types/Provider.js +2 -0
- package/dist/mjs/types/ResourceLoader.d.ts +28 -0
- package/dist/mjs/types/ResourceLoader.js +2 -0
- package/dist/mjs/types/SlotInfo.d.ts +6 -0
- package/dist/mjs/types/SlotInfo.js +2 -0
- package/dist/mjs/types/SlotUsage.d.ts +11 -0
- package/dist/mjs/types/SlotUsage.js +6 -0
- package/dist/mjs/types/Superpro.d.ts +9 -0
- package/dist/mjs/types/Superpro.js +11 -0
- package/dist/mjs/types/TeeOfferInfo.d.ts +10 -0
- package/dist/mjs/types/TeeOfferInfo.js +2 -0
- package/dist/mjs/types/TeeOfferOption.d.ts +13 -0
- package/dist/mjs/types/TeeOfferOption.js +2 -0
- package/dist/mjs/types/TeeOfferSlot.d.ts +8 -0
- package/dist/mjs/types/TeeOfferSlot.js +2 -0
- package/dist/mjs/types/ValueOfferSlot.d.ts +16 -0
- package/dist/mjs/types/ValueOfferSlot.js +2 -0
- package/dist/mjs/types/Web3.d.ts +62 -0
- package/dist/mjs/types/Web3.js +2 -0
- package/dist/mjs/types/blockchainConnector/StorageAccess.d.ts +8 -0
- package/dist/mjs/types/blockchainConnector/StorageAccess.js +2 -0
- package/dist/mjs/types/index.d.ts +22 -0
- package/dist/mjs/types/index.js +23 -0
- package/dist/mjs/types/storage/StorageAccess.d.ts +7 -0
- package/dist/mjs/types/storage/StorageAccess.js +2 -0
- package/dist/mjs/types/storage/StorageFileAccess.d.ts +5 -0
- package/dist/mjs/types/storage/StorageFileAccess.js +2 -0
- package/dist/mjs/types/storage/StorageObject.d.ts +8 -0
- package/dist/mjs/types/storage/StorageObject.js +2 -0
- package/dist/mjs/utils/Monitoring.d.ts +11 -0
- package/dist/mjs/utils/Monitoring.js +42 -0
- package/dist/mjs/utils/NonceTracker.d.ts +19 -0
- package/dist/mjs/utils/NonceTracker.js +73 -0
- package/dist/mjs/utils/PubSub.d.ts +9 -0
- package/dist/mjs/utils/PubSub.js +32 -0
- package/dist/mjs/utils/TxManager.d.ts +25 -0
- package/dist/mjs/utils/TxManager.js +162 -0
- package/dist/mjs/utils/compressors/GzipCompressor.d.ts +8 -0
- package/dist/mjs/utils/compressors/GzipCompressor.js +14 -0
- package/dist/mjs/utils/compressors/UncompressedCompressor.d.ts +8 -0
- package/dist/mjs/utils/compressors/UncompressedCompressor.js +13 -0
- package/dist/mjs/utils/compressors/index.d.ts +2 -0
- package/dist/mjs/utils/compressors/index.js +3 -0
- package/dist/mjs/utils/helper.d.ts +44 -0
- package/dist/mjs/utils/helper.js +258 -0
- package/dist/mjs/utils/helpers/getStreamChunks.d.ts +9 -0
- package/dist/mjs/utils/helpers/getStreamChunks.js +31 -0
- package/dist/mjs/utils/helpers/index.d.ts +1 -0
- package/dist/mjs/utils/helpers/index.js +2 -0
- package/dist/mjs/utils/helpers/tryWithInterval.d.ts +13 -0
- package/dist/mjs/utils/helpers/tryWithInterval.js +35 -0
- package/dist/mjs/utils/resourceLoaders/BaseResourceLoader.d.ts +10 -0
- package/dist/mjs/utils/resourceLoaders/BaseResourceLoader.js +10 -0
- package/dist/mjs/utils/resourceLoaders/StorageProviderLoader.d.ts +18 -0
- package/dist/mjs/utils/resourceLoaders/StorageProviderLoader.js +53 -0
- package/dist/mjs/utils/resourceLoaders/UrlResourceLoader.d.ts +9 -0
- package/dist/mjs/utils/resourceLoaders/UrlResourceLoader.js +44 -0
- package/dist/mjs/utils/resourceLoaders/getResourceLoader.d.ts +5 -0
- package/dist/mjs/utils/resourceLoaders/getResourceLoader.js +11 -0
- package/dist/mjs/utils/resourceLoaders/index.d.ts +1 -0
- package/dist/mjs/utils/resourceLoaders/index.js +2 -0
- package/package.json +11 -4
- package/build/analytics/eventProviders/EventProvider.js +0 -14
- package/build/crypto/nodejs/NativeCrypto.js +0 -183
- package/build/polyfills.js +0 -7
- package/build/proto/Compression.js +0 -132
- package/build/proto/TRI.js +0 -293
- package/build/proto/TeeProperties.js +0 -401
- package/build/staticModels/Consensus.js +0 -247
- package/build/tee/helpers.js +0 -119
- package/build/utils/Monitoring.js +0 -48
- package/build/utils/PubSub.js +0 -37
- /package/{build → dist/cjs}/TIIGenerator.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/Analytics.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/AnalyticsError.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/eventProviders/BrowserEventProvider.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/eventProviders/EventProvider.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/eventProviders/NodeEventProvider.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/transports/AxiosTransport.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/transports/FetchTransport.d.ts +0 -0
- /package/{build → dist/cjs}/analytics/types.d.ts +0 -0
- /package/{build → dist/cjs}/config.d.ts +0 -0
- /package/{build → dist/cjs}/connectors/BaseConnector.d.ts +0 -0
- /package/{build → dist/cjs}/connectors/BlockchainConnector.d.ts +0 -0
- /package/{build → dist/cjs}/connectors/BlockchainEventsListener.d.ts +0 -0
- /package/{build → dist/cjs}/connectors/index.d.ts +0 -0
- /package/{build → dist/cjs}/constants.d.ts +0 -0
- /package/{build → dist/cjs}/contracts/abi.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/Crypto.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/index.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/nodejs/AES.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/nodejs/ARIA.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/nodejs/ECIES.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/nodejs/NativeCrypto.d.ts +0 -0
- /package/{build → dist/cjs}/crypto/nodejs/RSA-Hybrid.d.ts +0 -0
- /package/{build → dist/cjs}/index.d.ts +0 -0
- /package/{build → dist/cjs}/logger.d.ts +0 -0
- /package/{build → dist/cjs}/models/EtlModel.d.ts +0 -0
- /package/{build → dist/cjs}/models/Offer.d.ts +0 -0
- /package/{build → dist/cjs}/models/Order.d.ts +0 -0
- /package/{build → dist/cjs}/models/Provider.d.ts +0 -0
- /package/{build → dist/cjs}/models/TCB.d.ts +0 -0
- /package/{build → dist/cjs}/models/TeeOffer.d.ts +0 -0
- /package/{build → dist/cjs}/models/index.d.ts +0 -0
- /package/{build → dist/cjs}/polyfills.d.ts +0 -0
- /package/{build → dist/cjs}/proto/Compression.d.ts +0 -0
- /package/{build → dist/cjs}/proto/TRI.d.ts +0 -0
- /package/{build → dist/cjs}/proto/TeeProperties.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/ChunksDownloadDecorator.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/IStorageProvider.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/S3StorageProvider.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorageAdapter.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorageContentWriter.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorageKeyValueAdapter.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorageMetadataReader.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorjAdapter.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/StorjStorageProvider.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/getStorageProvider.d.ts +0 -0
- /package/{build → dist/cjs}/providers/storage/types.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/ActiveOffers.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/ActiveOrders.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Consensus.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Deposits.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Marks.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/ModelPackager.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Offers.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Orders.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/ProviderRegistry.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/StaticModel.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/Superpro.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/SuperproToken.d.ts +0 -0
- /package/{build → dist/cjs}/staticModels/TeeOffers.d.ts +0 -0
- /package/{build → dist/cjs}/store.d.ts +0 -0
- /package/{build → dist/cjs}/tee/QuoteParser.d.ts +0 -0
- /package/{build → dist/cjs}/tee/QuoteValidator.d.ts +0 -0
- /package/{build → dist/cjs}/tee/errors.d.ts +0 -0
- /package/{build → dist/cjs}/tee/helpers.d.ts +0 -0
- /package/{build → dist/cjs}/tee/interface.d.ts +0 -0
- /package/{build → dist/cjs}/tee/statuses.d.ts +0 -0
- /package/{build → dist/cjs}/tee/types.d.ts +0 -0
- /package/{build → dist/cjs}/types/Compressor.d.ts +0 -0
- /package/{build → dist/cjs}/types/Consensus.d.ts +0 -0
- /package/{build → dist/cjs}/types/DepositInfo.d.ts +0 -0
- /package/{build → dist/cjs}/types/EtlModel.d.ts +0 -0
- /package/{build → dist/cjs}/types/Events.d.ts +0 -0
- /package/{build → dist/cjs}/types/HardwareInfo.d.ts +0 -0
- /package/{build → dist/cjs}/types/Marks.d.ts +0 -0
- /package/{build → dist/cjs}/types/Offer.d.ts +0 -0
- /package/{build → dist/cjs}/types/OptionInfo.d.ts +0 -0
- /package/{build → dist/cjs}/types/Order.d.ts +0 -0
- /package/{build → dist/cjs}/types/OrderUsage.d.ts +0 -0
- /package/{build → dist/cjs}/types/Origins.d.ts +0 -0
- /package/{build → dist/cjs}/types/Provider.d.ts +0 -0
- /package/{build → dist/cjs}/types/ResourceLoader.d.ts +0 -0
- /package/{build → dist/cjs}/types/SlotInfo.d.ts +0 -0
- /package/{build → dist/cjs}/types/SlotUsage.d.ts +0 -0
- /package/{build → dist/cjs}/types/Superpro.d.ts +0 -0
- /package/{build → dist/cjs}/types/TeeOfferInfo.d.ts +0 -0
- /package/{build → dist/cjs}/types/TeeOfferOption.d.ts +0 -0
- /package/{build → dist/cjs}/types/TeeOfferSlot.d.ts +0 -0
- /package/{build → dist/cjs}/types/ValueOfferSlot.d.ts +0 -0
- /package/{build → dist/cjs}/types/Web3.d.ts +0 -0
- /package/{build → dist/cjs}/types/blockchainConnector/StorageAccess.d.ts +0 -0
- /package/{build → dist/cjs}/types/index.d.ts +0 -0
- /package/{build → dist/cjs}/types/storage/StorageAccess.d.ts +0 -0
- /package/{build → dist/cjs}/types/storage/StorageFileAccess.d.ts +0 -0
- /package/{build → dist/cjs}/types/storage/StorageObject.d.ts +0 -0
- /package/{build → dist/cjs}/utils/Monitoring.d.ts +0 -0
- /package/{build → dist/cjs}/utils/NonceTracker.d.ts +0 -0
- /package/{build → dist/cjs}/utils/PubSub.d.ts +0 -0
- /package/{build → dist/cjs}/utils/TxManager.d.ts +0 -0
- /package/{build → dist/cjs}/utils/compressors/GzipCompressor.d.ts +0 -0
- /package/{build → dist/cjs}/utils/compressors/UncompressedCompressor.d.ts +0 -0
- /package/{build → dist/cjs}/utils/compressors/index.d.ts +0 -0
- /package/{build → dist/cjs}/utils/helper.d.ts +0 -0
- /package/{build → dist/cjs}/utils/helpers/getStreamChunks.d.ts +0 -0
- /package/{build → dist/cjs}/utils/helpers/index.d.ts +0 -0
- /package/{build → dist/cjs}/utils/helpers/tryWithInterval.d.ts +0 -0
- /package/{build → dist/cjs}/utils/resourceLoaders/BaseResourceLoader.d.ts +0 -0
- /package/{build → dist/cjs}/utils/resourceLoaders/StorageProviderLoader.d.ts +0 -0
- /package/{build → dist/cjs}/utils/resourceLoaders/UrlResourceLoader.d.ts +0 -0
- /package/{build → dist/cjs}/utils/resourceLoaders/getResourceLoader.d.ts +0 -0
- /package/{build → dist/cjs}/utils/resourceLoaders/index.d.ts +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import Queue from 'p-queue';
|
|
2
|
+
import logger from '../../logger';
|
|
3
|
+
export var ContentWriterType;
|
|
4
|
+
(function (ContentWriterType) {
|
|
5
|
+
ContentWriterType["NEEDS_UPLOAD"] = "NEEDS_UPLOAD";
|
|
6
|
+
ContentWriterType["NEEDS_DELETE"] = "NEEDS_DELETE";
|
|
7
|
+
})(ContentWriterType || (ContentWriterType = {}));
|
|
8
|
+
const DEFAULT_WRITE_CONTENT_CONCURRENCY = 16;
|
|
9
|
+
const DEFAULT_CACHE_EXPIRATION_TS = 5 * 60 * 1000;
|
|
10
|
+
export default class StorageContentWriter {
|
|
11
|
+
timeout = null;
|
|
12
|
+
INTERVAL;
|
|
13
|
+
storageKeyValueAdapter;
|
|
14
|
+
logger;
|
|
15
|
+
instanceId;
|
|
16
|
+
cacheExpirationTs;
|
|
17
|
+
objectDeletedFlag;
|
|
18
|
+
queueWriteContent;
|
|
19
|
+
performance;
|
|
20
|
+
storageWrites = new Map();
|
|
21
|
+
constructor(config) {
|
|
22
|
+
const { writeContentConcurrency, interval, storageKeyValueAdapter, instanceId, objectDeletedFlag, cacheExpirationTs, performance, showLogs = true, } = config || {};
|
|
23
|
+
this.logger = showLogs ? logger.child({ class: StorageContentWriter.name }) : null;
|
|
24
|
+
this.performance = performance;
|
|
25
|
+
this.INTERVAL = interval;
|
|
26
|
+
this.cacheExpirationTs = cacheExpirationTs || DEFAULT_CACHE_EXPIRATION_TS;
|
|
27
|
+
this.storageKeyValueAdapter = storageKeyValueAdapter;
|
|
28
|
+
this.instanceId = instanceId;
|
|
29
|
+
this.objectDeletedFlag = objectDeletedFlag;
|
|
30
|
+
this.queueWriteContent = new Queue({
|
|
31
|
+
concurrency: writeContentConcurrency || DEFAULT_WRITE_CONTENT_CONCURRENCY,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async actualizeCacheDelete(key, encryptionKey) {
|
|
35
|
+
const objects = await this.storageKeyValueAdapter.listFiles(key);
|
|
36
|
+
const objectsToDelete = objects.filter((object) => !object.name.endsWith(this.objectDeletedFlag));
|
|
37
|
+
await Promise.all(objectsToDelete.map((object) => this.storageKeyValueAdapter.delete(object.name)));
|
|
38
|
+
if (objectsToDelete.length === objects.length) {
|
|
39
|
+
await this.storageKeyValueAdapter.set(`${key}/${this.objectDeletedFlag}`, null, encryptionKey);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async actualizeCacheUpload(key, encryptionKey, cache) {
|
|
43
|
+
const instances = cache.get(key);
|
|
44
|
+
const instance = instances?.get(this.instanceId);
|
|
45
|
+
if (!instances || !instance) {
|
|
46
|
+
this.logger?.error({
|
|
47
|
+
key,
|
|
48
|
+
instancesSize: instances?.size,
|
|
49
|
+
value: instance,
|
|
50
|
+
}, 'Attempted to upload non-existing value');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (instance.value) {
|
|
54
|
+
const startUpload = this.performance?.now();
|
|
55
|
+
await this.storageKeyValueAdapter.set(`${key}/${this.instanceId}`, instance.value, encryptionKey);
|
|
56
|
+
if (this.performance && startUpload !== undefined) {
|
|
57
|
+
const finishUpload = this.performance.now();
|
|
58
|
+
this.logger?.info(`Uploading took ${(finishUpload - startUpload).toFixed(1)} ms`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
await this.deleteOutdatedInstances(key, instances);
|
|
62
|
+
}
|
|
63
|
+
async actualizeCache(cache) {
|
|
64
|
+
const logger = this.logger?.child({ method: this.actualizeCache.name });
|
|
65
|
+
if (this.storageWrites.size) {
|
|
66
|
+
Array.from(this.storageWrites.entries()).forEach(([key, { type, index, encryptionKey }]) => {
|
|
67
|
+
this.queueWriteContent.add(async () => {
|
|
68
|
+
try {
|
|
69
|
+
switch (type) {
|
|
70
|
+
case ContentWriterType.NEEDS_DELETE:
|
|
71
|
+
await this.actualizeCacheDelete(key, encryptionKey);
|
|
72
|
+
break;
|
|
73
|
+
case ContentWriterType.NEEDS_UPLOAD:
|
|
74
|
+
await this.actualizeCacheUpload(key, encryptionKey, cache);
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
// delete only if the current index is up to date
|
|
80
|
+
if (index === this.storageWrites.get(key)?.index) {
|
|
81
|
+
this.storageWrites.delete(key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
logger?.error({
|
|
86
|
+
err,
|
|
87
|
+
size: this.storageWrites.size,
|
|
88
|
+
}, `Error storage writing ${key}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
await this.queueWriteContent.onIdle();
|
|
93
|
+
logger?.info({ size: this.storageWrites.size }, 'Success storage writing');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async deleteOutdatedInstances(key, instances) {
|
|
97
|
+
const expiredTs = Date.now() - this.cacheExpirationTs;
|
|
98
|
+
const instancesToDelete = [];
|
|
99
|
+
instances?.forEach((instance, instanceId) => {
|
|
100
|
+
const isOutdated = instance.modifiedTs < expiredTs;
|
|
101
|
+
const isNotNull = Boolean(instance.value);
|
|
102
|
+
if (instanceId !== this.instanceId && isNotNull && isOutdated) {
|
|
103
|
+
instancesToDelete.push([instanceId, instance]);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// For safety, always preserve one additional copy in storage
|
|
107
|
+
if (instancesToDelete.length <= 1) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Finding the most up-to-date instance to preserve
|
|
111
|
+
instancesToDelete
|
|
112
|
+
.sort((a, b) => {
|
|
113
|
+
const diff = a[1].modifiedTs - b[1].modifiedTs;
|
|
114
|
+
if (diff === 0) {
|
|
115
|
+
return a[0] >= b[0] ? 1 : -1;
|
|
116
|
+
}
|
|
117
|
+
return diff;
|
|
118
|
+
})
|
|
119
|
+
.pop();
|
|
120
|
+
await Promise.allSettled(instancesToDelete.map(([instanceId]) => this.storageKeyValueAdapter
|
|
121
|
+
.delete(`${key}/${instanceId}`)
|
|
122
|
+
.then(() => {
|
|
123
|
+
instances.delete(instanceId);
|
|
124
|
+
})
|
|
125
|
+
.catch((err) => this.logger?.error({ err }, 'Error deleting outdated instance'))));
|
|
126
|
+
}
|
|
127
|
+
startActualizeCacheTimer(cache) {
|
|
128
|
+
if (this.INTERVAL) {
|
|
129
|
+
if (this.timeout)
|
|
130
|
+
clearTimeout(this.timeout);
|
|
131
|
+
this.timeout = setTimeout(async () => {
|
|
132
|
+
await this.actualizeCache(cache);
|
|
133
|
+
this.startActualizeCacheTimer(cache);
|
|
134
|
+
}, this.INTERVAL);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
stop() {
|
|
138
|
+
if (this.timeout)
|
|
139
|
+
clearTimeout(this.timeout);
|
|
140
|
+
this.timeout = null;
|
|
141
|
+
}
|
|
142
|
+
set(key, type, encryptionKey) {
|
|
143
|
+
const oldValue = this.storageWrites.get(key);
|
|
144
|
+
this.storageWrites.set(key, {
|
|
145
|
+
type,
|
|
146
|
+
index: oldValue?.index ? oldValue.index + 1 : 1,
|
|
147
|
+
encryptionKey,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
get(key) {
|
|
151
|
+
return this.storageWrites.get(key)?.type || null;
|
|
152
|
+
}
|
|
153
|
+
clear() {
|
|
154
|
+
this.storageWrites.clear();
|
|
155
|
+
}
|
|
156
|
+
async shutdown(cache) {
|
|
157
|
+
this.stop();
|
|
158
|
+
await this.actualizeCache(cache);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmFnZUNvbnRlbnRXcml0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3N0b3JhZ2UvU3RvcmFnZUNvbnRlbnRXcml0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sTUFBa0IsTUFBTSxjQUFjLENBQUM7QUFlOUMsTUFBTSxDQUFOLElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQixrREFBNkIsQ0FBQTtJQUM3QixrREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQUVELE1BQU0saUNBQWlDLEdBQUcsRUFBRSxDQUFDO0FBQzdDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFRbEQsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQkFBb0I7SUFDL0IsT0FBTyxHQUF5QyxJQUFJLENBQUM7SUFDNUMsUUFBUSxDQUFTO0lBQ2pCLHNCQUFzQixDQUE0QjtJQUNsRCxNQUFNLENBQWlCO0lBQ3ZCLFVBQVUsQ0FBUztJQUNuQixpQkFBaUIsQ0FBUztJQUMxQixpQkFBaUIsQ0FBUztJQUMxQixpQkFBaUIsQ0FBUTtJQUN6QixXQUFXLENBQWU7SUFDM0IsYUFBYSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXRFLFlBQVksTUFBcUM7UUFDL0MsTUFBTSxFQUNKLHVCQUF1QixFQUN2QixRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxRQUFRLEdBQUcsSUFBSSxHQUNoQixHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVB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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Encryption } from '@super-protocol/dto-js';
|
|
2
|
+
import StorageAccess from '../../types/storage/StorageAccess';
|
|
3
|
+
import StorageObject from '../../types/storage/StorageObject';
|
|
4
|
+
export interface StorageKeyValueAdapterConfig {
|
|
5
|
+
showLogs?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export default class StorageKeyValueAdapter<V extends object> {
|
|
8
|
+
private readonly storageProvider;
|
|
9
|
+
private readonly logger?;
|
|
10
|
+
constructor(storageAccess: StorageAccess, config?: StorageKeyValueAdapterConfig);
|
|
11
|
+
decrypt(encryption: Encryption, key: string): Promise<V | null>;
|
|
12
|
+
encrypt(data: V | null, key: string): Promise<Encryption>;
|
|
13
|
+
private downloadFromStorage;
|
|
14
|
+
private streamToString;
|
|
15
|
+
private storageUpload;
|
|
16
|
+
private storageDelete;
|
|
17
|
+
private storageDownload;
|
|
18
|
+
private storageListFiles;
|
|
19
|
+
set(key: string, value: V | null, privateKey: string): Promise<void>;
|
|
20
|
+
delete(key: string): Promise<void>;
|
|
21
|
+
get(key: string, privateKey: string): Promise<V | null>;
|
|
22
|
+
listFiles(key: string): Promise<StorageObject[]>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import { CryptoAlgorithm, Encoding, Cipher } from '@super-protocol/dto-js';
|
|
3
|
+
import getStorageProvider from './getStorageProvider';
|
|
4
|
+
import logger from '../../logger';
|
|
5
|
+
import Crypto from '../../crypto/Crypto';
|
|
6
|
+
export default class StorageKeyValueAdapter {
|
|
7
|
+
storageProvider;
|
|
8
|
+
logger;
|
|
9
|
+
constructor(storageAccess, config) {
|
|
10
|
+
if (!storageAccess?.credentials)
|
|
11
|
+
throw new Error('Credentials is empty');
|
|
12
|
+
const { showLogs = true } = config || {};
|
|
13
|
+
this.logger = showLogs ? logger.child({ class: StorageKeyValueAdapter.name }) : null;
|
|
14
|
+
this.storageProvider = getStorageProvider(storageAccess);
|
|
15
|
+
}
|
|
16
|
+
async decrypt(encryption, key) {
|
|
17
|
+
if (!encryption)
|
|
18
|
+
return null;
|
|
19
|
+
if (!key)
|
|
20
|
+
throw new Error('Key cannot be empty!');
|
|
21
|
+
encryption.key = key;
|
|
22
|
+
return JSON.parse(await Crypto.decrypt(encryption));
|
|
23
|
+
}
|
|
24
|
+
async encrypt(data, key) {
|
|
25
|
+
if (data === undefined)
|
|
26
|
+
throw new Error('Data cannot be empty!');
|
|
27
|
+
if (!key)
|
|
28
|
+
throw new Error('Private cannot be empty!');
|
|
29
|
+
return Crypto.encrypt(JSON.stringify(data), {
|
|
30
|
+
algo: CryptoAlgorithm.AES,
|
|
31
|
+
encoding: Encoding.base64,
|
|
32
|
+
key,
|
|
33
|
+
cipher: Cipher.AES_256_GCM,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async downloadFromStorage(filepath) {
|
|
37
|
+
const downloadStream = await this.storageProvider.downloadFile(filepath, {});
|
|
38
|
+
return this.streamToString(downloadStream);
|
|
39
|
+
}
|
|
40
|
+
streamToString(stream) {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
stream.on('data', (chunk) => {
|
|
44
|
+
chunks.push(Buffer.from(chunk));
|
|
45
|
+
});
|
|
46
|
+
stream.on('error', (err) => reject(err));
|
|
47
|
+
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async storageUpload(key, value, privateKey) {
|
|
51
|
+
try {
|
|
52
|
+
const encryptedValue = await this.encrypt(value, privateKey);
|
|
53
|
+
const buffer = Buffer.from(JSON.stringify(encryptedValue));
|
|
54
|
+
await this.storageProvider.uploadFile(Readable.from(buffer), key, buffer.byteLength);
|
|
55
|
+
this.logger?.info({ data: key }, 'Success uploading to storage');
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
this.logger?.error({ err }, 'Error uploading to storage');
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async storageDelete(key) {
|
|
63
|
+
try {
|
|
64
|
+
await this.storageProvider.deleteObject(key);
|
|
65
|
+
this.logger?.info({ data: key }, 'Success deleting from storage');
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
this.logger?.info({ err }, 'Error deleting from storage');
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async storageDownload(key, privateKey) {
|
|
73
|
+
try {
|
|
74
|
+
const downloaded = await this.downloadFromStorage(key);
|
|
75
|
+
this.logger?.info({ key }, 'Success download data from storage');
|
|
76
|
+
if (!downloaded)
|
|
77
|
+
return null;
|
|
78
|
+
const decryptedValue = await this.decrypt(JSON.parse(downloaded), privateKey);
|
|
79
|
+
return decryptedValue;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
this.logger?.info({
|
|
83
|
+
err,
|
|
84
|
+
key,
|
|
85
|
+
}, 'Error download data from storage');
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async storageListFiles(key) {
|
|
90
|
+
try {
|
|
91
|
+
const listObjects = await this.storageProvider.listObjects(key);
|
|
92
|
+
this.logger?.trace({
|
|
93
|
+
data: listObjects,
|
|
94
|
+
key,
|
|
95
|
+
}, 'Success list objects from storage');
|
|
96
|
+
return listObjects.filter((obj) => !obj.isFolder);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
this.logger?.info({
|
|
100
|
+
err,
|
|
101
|
+
key,
|
|
102
|
+
}, 'Error list objects from storage');
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async set(key, value, privateKey) {
|
|
107
|
+
return this.storageUpload(key, value, privateKey);
|
|
108
|
+
}
|
|
109
|
+
async delete(key) {
|
|
110
|
+
return this.storageDelete(key);
|
|
111
|
+
}
|
|
112
|
+
async get(key, privateKey) {
|
|
113
|
+
return this.storageDownload(key, privateKey);
|
|
114
|
+
}
|
|
115
|
+
async listFiles(key) {
|
|
116
|
+
return this.storageListFiles(key);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmFnZUtleVZhbHVlQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc3RvcmFnZS9TdG9yYWdlS2V5VmFsdWVBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFjLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHdkYsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLE1BQWtCLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sTUFBTSxNQUFNLHFCQUFxQixDQUFDO0FBTXpDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sc0JBQXNCO0lBQ3hCLGVBQWUsQ0FBbUI7SUFDbEMsTUFBTSxDQUFpQjtJQUV4QyxZQUFZLGFBQTRCLEVBQUUsTUFBcUM7UUFDN0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFzQixFQUFFLEdBQVc7UUFDdEQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRztZQUFFLE1B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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import StorageObject from '../../types/storage/StorageObject';
|
|
2
|
+
import { CacheRecord } from './types';
|
|
3
|
+
import StorageKeyValueAdapter from './StorageKeyValueAdapter';
|
|
4
|
+
export interface InstancesUpdates {
|
|
5
|
+
updated: Map<string, StorageObject>;
|
|
6
|
+
deleted: Set<string>;
|
|
7
|
+
}
|
|
8
|
+
export interface StorageMetadataReaderConfig<V extends object> {
|
|
9
|
+
storageKeyValueAdapter: StorageKeyValueAdapter<V>;
|
|
10
|
+
objectDeletedFlag: string;
|
|
11
|
+
showLogs?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export default class StorageMetadataReader<K extends string, V extends object> {
|
|
14
|
+
private readonly logger?;
|
|
15
|
+
private readonly storageKeyValueAdapter;
|
|
16
|
+
private readonly objectDeletedFlag;
|
|
17
|
+
constructor(config: StorageMetadataReaderConfig<V>);
|
|
18
|
+
private listInstances;
|
|
19
|
+
fetchInstancesUpdates(key: K, currentInstances: Map<string, CacheRecord<V>>): Promise<InstancesUpdates>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import logger from '../../logger';
|
|
2
|
+
export default class StorageMetadataReader {
|
|
3
|
+
logger;
|
|
4
|
+
storageKeyValueAdapter;
|
|
5
|
+
objectDeletedFlag;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
const { showLogs = true, objectDeletedFlag, storageKeyValueAdapter } = config;
|
|
8
|
+
this.logger = showLogs ? logger.child({ class: StorageMetadataReader.name }) : null;
|
|
9
|
+
this.storageKeyValueAdapter = storageKeyValueAdapter;
|
|
10
|
+
this.objectDeletedFlag = objectDeletedFlag;
|
|
11
|
+
}
|
|
12
|
+
async listInstances(key) {
|
|
13
|
+
return this.storageKeyValueAdapter
|
|
14
|
+
.listFiles(`${key}/`)
|
|
15
|
+
.then((objects) => new Map(objects.map((obj) => [obj.name.split('/')?.pop() || obj.name, obj])));
|
|
16
|
+
}
|
|
17
|
+
async fetchInstancesUpdates(key, currentInstances) {
|
|
18
|
+
const result = {
|
|
19
|
+
updated: new Map(),
|
|
20
|
+
deleted: new Set(),
|
|
21
|
+
};
|
|
22
|
+
try {
|
|
23
|
+
const directoryInstances = await this.listInstances(key);
|
|
24
|
+
if (directoryInstances.has(this.objectDeletedFlag)) {
|
|
25
|
+
result.deleted.add(key);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
directoryInstances.forEach((instance, instanceId) => {
|
|
29
|
+
const currentInstance = currentInstances.get(instanceId);
|
|
30
|
+
if (!currentInstance || currentInstance.modifiedTs < instance.createdAt.getTime()) {
|
|
31
|
+
result.updated.set(instanceId, instance);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
currentInstances.forEach((_, instanceId) => {
|
|
35
|
+
if (!directoryInstances.has(instanceId)) {
|
|
36
|
+
result.deleted.add(instanceId);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.logger?.trace({
|
|
40
|
+
updated: result.updated.size,
|
|
41
|
+
deleted: result.deleted.size,
|
|
42
|
+
}, 'Check result');
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger?.error({ error }, 'Error fetching remote copy');
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmFnZU1ldGFkYXRhUmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zdG9yYWdlL1N0b3JhZ2VNZXRhZGF0YVJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQWtCLE1BQU0sY0FBYyxDQUFDO0FBZTlDLE1BQU0sQ0FBQyxPQUFPLE9BQU8scUJBQXFCO0lBQ3ZCLE1BQU0sQ0FBaUI7SUFDdkIsc0JBQXNCLENBQTRCO0lBQ2xELGlCQUFpQixDQUFTO0lBRTNDLFlBQVksTUFBc0M7UUFDaEQsTUFBTSxFQUFFLFFBQVEsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDOUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7SUFDN0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBTTtRQUNoQyxPQUFPLElBQUksQ0FBQyxzQkFBc0I7YUFDL0IsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7YUFDcEIsSUFBSSxDQUNILENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsR0FBTSxFQUNOLGdCQUE2QztRQUU3QyxNQUFNLE1BQU0sR0FBcUI7WUFDL0IsT0FBTyxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRTtTQUNuQixDQUFDO1FBRUYsSUFBSTtZQUNGLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXpELElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFeEIsT0FBTyxNQUFNLENBQUM7YUFDZjtZQUVELGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDakYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUMxQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDaEM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUNoQjtnQkFDRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUM1QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2FBQzdCLEVBQ0QsY0FBYyxDQUNmLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLDRCQUE0QixDQUFDLENBQUM7WUFFNUQsT0FBTyxNQUFNLENBQUM7U0FDZjtJQUNILENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import StorageAccess from '../../types/storage/StorageAccess';
|
|
3
|
+
import { StorageAdapterConfig, CacheEvents } from './StorageAdapter';
|
|
4
|
+
export type StorjConfig = StorageAdapterConfig;
|
|
5
|
+
export default class StorjAdapter<V extends object> {
|
|
6
|
+
private storageAdapter;
|
|
7
|
+
private readonly logger?;
|
|
8
|
+
constructor(storageAccess: StorageAccess, config: StorjConfig);
|
|
9
|
+
subscribe(cb: (props: {
|
|
10
|
+
type: CacheEvents;
|
|
11
|
+
message: unknown;
|
|
12
|
+
}) => void): Promise<() => Promise<void>>;
|
|
13
|
+
get(key: string, encryptionKey: Buffer): Promise<(V | null)[] | null>;
|
|
14
|
+
has(key: string): Promise<boolean>;
|
|
15
|
+
set(key: string, value: V, encryptionKey: Buffer): Promise<void>;
|
|
16
|
+
del(key: string): Promise<void>;
|
|
17
|
+
stop(): void;
|
|
18
|
+
shutdown(): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import logger from '../../logger';
|
|
2
|
+
import StorageAdapter from './StorageAdapter';
|
|
3
|
+
export default class StorjAdapter {
|
|
4
|
+
storageAdapter;
|
|
5
|
+
logger;
|
|
6
|
+
constructor(storageAccess, config) {
|
|
7
|
+
const { showLogs = true } = config || {};
|
|
8
|
+
this.logger = showLogs ? logger.child({ class: StorjAdapter.name }) : null;
|
|
9
|
+
this.storageAdapter = new StorageAdapter(storageAccess, config);
|
|
10
|
+
this.storageAdapter.run();
|
|
11
|
+
}
|
|
12
|
+
subscribe(cb) {
|
|
13
|
+
return this.storageAdapter?.subscribe(cb);
|
|
14
|
+
}
|
|
15
|
+
async get(key, encryptionKey) {
|
|
16
|
+
return this.storageAdapter.get(key, encryptionKey).catch((err) => {
|
|
17
|
+
const message = err.message?.toLowerCase() || '';
|
|
18
|
+
if (message.includes('object not found') || message.includes('object has been deleted')) {
|
|
19
|
+
this.logger?.info({ key }, 'Object not found');
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
throw err;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async has(key) {
|
|
26
|
+
return this.storageAdapter.has(key);
|
|
27
|
+
}
|
|
28
|
+
async set(key, value, encryptionKey) {
|
|
29
|
+
return this.storageAdapter.set(key, value, encryptionKey).catch((err) => {
|
|
30
|
+
const message = err.message?.toLowerCase() || '';
|
|
31
|
+
if (message.includes('object has been deleted')) {
|
|
32
|
+
this.logger?.info({ key }, 'Object has been deleted');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
throw err;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async del(key) {
|
|
39
|
+
return this.storageAdapter.delete(key);
|
|
40
|
+
}
|
|
41
|
+
stop() {
|
|
42
|
+
this.storageAdapter.stop();
|
|
43
|
+
}
|
|
44
|
+
async shutdown() {
|
|
45
|
+
await this.storageAdapter.shutdown();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmpBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zdG9yYWdlL1N0b3JqQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQWtCLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sY0FBcUQsTUFBTSxrQkFBa0IsQ0FBQztBQUlyRixNQUFNLENBQUMsT0FBTyxPQUFPLFlBQVk7SUFDdkIsY0FBYyxDQUFvQjtJQUN6QixNQUFNLENBQWlCO0lBQ3hDLFlBQVksYUFBNEIsRUFBRSxNQUFtQjtRQUMzRCxNQUFNLEVBQUUsUUFBUSxHQUFHLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDTSxTQUFTLENBQUMsRUFBNEQ7UUFDM0UsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ00sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsYUFBcUI7UUFDakQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBVSxFQUFFLEVBQUU7WUFDdEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO2dCQUN2RixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBRS9DLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUMxQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFRLEVBQUUsYUFBcUI7UUFDM0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVUsRUFBRSxFQUFFO1lBQzdFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2pELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLHlCQUF5QixDQUFDLENBQUM7Z0JBRXRELE9BQU87YUFDUjtZQUNELE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNNLElBQUk7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDTSxLQUFLLENBQUMsUUFBUTtRQUNuQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import IStorageProvider, { DownloadConfig } from './IStorageProvider';
|
|
3
|
+
import StorageObject from '../../types/storage/StorageObject';
|
|
4
|
+
import stream from 'stream';
|
|
5
|
+
export default class StorJStorageProvider implements IStorageProvider {
|
|
6
|
+
static DOWNLOAD_BUFFER_SIZE: number;
|
|
7
|
+
private logger;
|
|
8
|
+
private bucket;
|
|
9
|
+
private prefix;
|
|
10
|
+
private accessToken;
|
|
11
|
+
private _access?;
|
|
12
|
+
private _project?;
|
|
13
|
+
private _storj?;
|
|
14
|
+
private maximumConcurrent?;
|
|
15
|
+
constructor(credentials: any, maximumConcurrent?: number);
|
|
16
|
+
uploadFile(inputStream: stream.Readable, remotePath: string, contentLength: number, progressListener?: (total: number, current: number) => void): Promise<void>;
|
|
17
|
+
downloadFile(remotePath: string, config: DownloadConfig, progressListener?: (total: number, current: number) => void): Promise<stream.Readable>;
|
|
18
|
+
deleteObject(remotePath: string): Promise<void>;
|
|
19
|
+
listObjects(remotePath: string): Promise<StorageObject[]>;
|
|
20
|
+
getObjectSize(remotePath: string): Promise<number>;
|
|
21
|
+
getLastModified(remotePath: string): Promise<Date>;
|
|
22
|
+
private lazyStorj;
|
|
23
|
+
private lazyAccess;
|
|
24
|
+
private lazyProject;
|
|
25
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { isNodeJS } from '../../utils/helper';
|
|
3
|
+
import stream from 'stream';
|
|
4
|
+
import logger from '../../logger';
|
|
5
|
+
export default class StorJStorageProvider {
|
|
6
|
+
static DOWNLOAD_BUFFER_SIZE = 4194304; // 4mb
|
|
7
|
+
logger = logger.child({ className: 'StorJStorageProvider' });
|
|
8
|
+
bucket;
|
|
9
|
+
prefix;
|
|
10
|
+
accessToken;
|
|
11
|
+
_access;
|
|
12
|
+
_project;
|
|
13
|
+
_storj;
|
|
14
|
+
maximumConcurrent;
|
|
15
|
+
constructor(credentials, maximumConcurrent) {
|
|
16
|
+
if (!isNodeJS()) {
|
|
17
|
+
throw Error('StorageProvider: StorJ is supported only in the node.js execution environment');
|
|
18
|
+
}
|
|
19
|
+
this.bucket = '';
|
|
20
|
+
this.prefix = '';
|
|
21
|
+
if (credentials.bucket) {
|
|
22
|
+
this.bucket = credentials.bucket;
|
|
23
|
+
this.prefix = credentials.prefix;
|
|
24
|
+
}
|
|
25
|
+
else if (credentials.storageId) {
|
|
26
|
+
// back compatibility
|
|
27
|
+
this.bucket = credentials.storageId;
|
|
28
|
+
}
|
|
29
|
+
this.accessToken = credentials.token;
|
|
30
|
+
this.maximumConcurrent = maximumConcurrent;
|
|
31
|
+
}
|
|
32
|
+
async uploadFile(inputStream, remotePath, contentLength, progressListener) {
|
|
33
|
+
const storj = await this.lazyStorj();
|
|
34
|
+
const options = new storj.UploadOptions();
|
|
35
|
+
const project = await this.lazyProject();
|
|
36
|
+
const uploader = await project.uploadObject(this.bucket, this.prefix + remotePath, options);
|
|
37
|
+
let totalWritten = 0;
|
|
38
|
+
try {
|
|
39
|
+
for await (const buffer of inputStream) {
|
|
40
|
+
await uploader.write(buffer, buffer.length);
|
|
41
|
+
totalWritten += buffer.length;
|
|
42
|
+
if (!!progressListener) {
|
|
43
|
+
progressListener(contentLength, totalWritten);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
await uploader.commit();
|
|
47
|
+
}
|
|
48
|
+
catch (uploadingError) {
|
|
49
|
+
try {
|
|
50
|
+
await uploader.abort();
|
|
51
|
+
}
|
|
52
|
+
catch (abortingError) {
|
|
53
|
+
logger.error({ err: abortingError }, 'Failed to abort file uploading');
|
|
54
|
+
}
|
|
55
|
+
throw uploadingError;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async downloadFile(remotePath, config, progressListener) {
|
|
59
|
+
const storj = await this.lazyStorj();
|
|
60
|
+
const project = await this.lazyProject();
|
|
61
|
+
const length = config.length || (await this.getObjectSize(remotePath));
|
|
62
|
+
const options = new storj.DownloadOptions(config.offset || 0, length);
|
|
63
|
+
const downloader = await project.downloadObject(this.bucket, this.prefix + remotePath, options);
|
|
64
|
+
const loader = async function* () {
|
|
65
|
+
const readBuffer = Buffer.alloc(StorJStorageProvider.DOWNLOAD_BUFFER_SIZE);
|
|
66
|
+
let current = 0;
|
|
67
|
+
while (current < length) {
|
|
68
|
+
// We have to cast result to any, because of the wrong type declartion in uplink-nodejs.
|
|
69
|
+
const downloadResult = await downloader.read(readBuffer, readBuffer.length);
|
|
70
|
+
const bytesRead = downloadResult.bytes_read;
|
|
71
|
+
current += bytesRead;
|
|
72
|
+
yield Buffer.from(readBuffer.subarray(0, bytesRead));
|
|
73
|
+
if (!!progressListener) {
|
|
74
|
+
progressListener(length, current);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return stream.Readable.from(loader()).on('close', async () => {
|
|
79
|
+
await downloader.close();
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async deleteObject(remotePath) {
|
|
83
|
+
const project = await this.lazyProject();
|
|
84
|
+
await project.deleteObject(this.bucket, this.prefix + remotePath);
|
|
85
|
+
}
|
|
86
|
+
async listObjects(remotePath) {
|
|
87
|
+
const storj = await this.lazyStorj();
|
|
88
|
+
const project = await this.lazyProject();
|
|
89
|
+
const objects = await project.listObjects(this.bucket, {
|
|
90
|
+
recursive: true,
|
|
91
|
+
cursor: '',
|
|
92
|
+
prefix: this.prefix + remotePath,
|
|
93
|
+
system: true,
|
|
94
|
+
custom: true,
|
|
95
|
+
});
|
|
96
|
+
const result = [];
|
|
97
|
+
for (const key in Object.keys(objects)) {
|
|
98
|
+
const value = objects[key];
|
|
99
|
+
result.push({
|
|
100
|
+
name: value.key,
|
|
101
|
+
size: value.system.content_length,
|
|
102
|
+
isFolder: value.is_prefix == 1,
|
|
103
|
+
childrenCount: value.custom.count,
|
|
104
|
+
createdAt: new Date(value.system.created * 1000), // TODO: check timezone
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
async getObjectSize(remotePath) {
|
|
110
|
+
const project = await this.lazyProject();
|
|
111
|
+
const objectInfo = await project.statObject(this.bucket, this.prefix + remotePath);
|
|
112
|
+
return objectInfo.system.content_length;
|
|
113
|
+
}
|
|
114
|
+
async getLastModified(remotePath) {
|
|
115
|
+
const project = await this.lazyProject();
|
|
116
|
+
const objectInfo = await project.statObject(this.bucket, this.prefix + remotePath);
|
|
117
|
+
return new Date(objectInfo.system.created * 1000);
|
|
118
|
+
}
|
|
119
|
+
async lazyStorj() {
|
|
120
|
+
if (!this._storj) {
|
|
121
|
+
this._storj = await require('@super-protocol/uplink-nodejs');
|
|
122
|
+
}
|
|
123
|
+
return this._storj;
|
|
124
|
+
}
|
|
125
|
+
async lazyAccess() {
|
|
126
|
+
if (!this._access) {
|
|
127
|
+
const storj = await this.lazyStorj();
|
|
128
|
+
const uplink = new storj.Uplink();
|
|
129
|
+
this._access = await uplink.parseAccess(this.accessToken);
|
|
130
|
+
}
|
|
131
|
+
return this._access;
|
|
132
|
+
}
|
|
133
|
+
async lazyProject() {
|
|
134
|
+
if (!this._project) {
|
|
135
|
+
const access = await this.lazyAccess();
|
|
136
|
+
this._project = await access.openProject(this.maximumConcurrent);
|
|
137
|
+
}
|
|
138
|
+
return this._project;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmpTdG9yYWdlUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3N0b3JhZ2UvU3RvcmpTdG9yYWdlUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUVsQyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2QyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTTtJQUVyQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxDQUFTO0lBQ2YsTUFBTSxDQUFTO0lBQ2YsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sQ0FBVTtJQUNqQixRQUFRLENBQVc7SUFDbkIsTUFBTSxDQUFPO0lBQ2IsaUJBQWlCLENBQVU7SUFFbkMsWUFBWSxXQUFnQixFQUFFLGlCQUEwQjtRQUN0RCxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixNQUFNLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDbEM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUU7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
|