@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.
Files changed (457) hide show
  1. package/{build → dist/cjs}/TIIGenerator.js +1 -1
  2. package/{build → dist/cjs}/analytics/Analytics.js +1 -1
  3. package/{build → dist/cjs}/analytics/AnalyticsError.js +1 -1
  4. package/{build → dist/cjs}/analytics/eventProviders/BrowserEventProvider.js +1 -1
  5. package/dist/cjs/analytics/eventProviders/EventProvider.js +14 -0
  6. package/{build → dist/cjs}/analytics/eventProviders/NodeEventProvider.js +1 -1
  7. package/{build → dist/cjs}/analytics/transports/AxiosTransport.js +1 -1
  8. package/{build → dist/cjs}/analytics/transports/FetchTransport.js +1 -1
  9. package/{build → dist/cjs}/analytics/types.js +1 -1
  10. package/{build → dist/cjs}/config.js +1 -1
  11. package/{build → dist/cjs}/connectors/BaseConnector.js +1 -1
  12. package/{build → dist/cjs}/connectors/BlockchainConnector.js +1 -1
  13. package/{build → dist/cjs}/connectors/BlockchainEventsListener.js +1 -1
  14. package/{build → dist/cjs}/connectors/index.js +1 -1
  15. package/{build → dist/cjs}/constants.js +1 -1
  16. package/{build → dist/cjs}/contracts/abi.js +1 -1
  17. package/{build → dist/cjs}/crypto/Crypto.js +1 -1
  18. package/{build → dist/cjs}/crypto/index.js +1 -1
  19. package/{build → dist/cjs}/crypto/nodejs/AES.js +1 -1
  20. package/{build → dist/cjs}/crypto/nodejs/ARIA.js +1 -1
  21. package/{build → dist/cjs}/crypto/nodejs/ECIES.js +1 -1
  22. package/dist/cjs/crypto/nodejs/NativeCrypto.js +183 -0
  23. package/{build → dist/cjs}/crypto/nodejs/RSA-Hybrid.js +1 -1
  24. package/{build → dist/cjs}/index.js +1 -1
  25. package/{build → dist/cjs}/logger.js +1 -1
  26. package/{build → dist/cjs}/models/EtlModel.js +1 -1
  27. package/{build → dist/cjs}/models/Offer.js +1 -1
  28. package/{build → dist/cjs}/models/Order.js +1 -1
  29. package/{build → dist/cjs}/models/Provider.js +1 -1
  30. package/{build → dist/cjs}/models/TCB.js +1 -1
  31. package/{build → dist/cjs}/models/TeeOffer.js +1 -1
  32. package/{build → dist/cjs}/models/index.js +1 -1
  33. package/dist/cjs/package.json +1 -0
  34. package/dist/cjs/polyfills.js +7 -0
  35. package/dist/cjs/proto/Compression.js +132 -0
  36. package/dist/cjs/proto/TRI.js +293 -0
  37. package/dist/cjs/proto/TeeProperties.js +401 -0
  38. package/{build → dist/cjs}/providers/storage/ChunksDownloadDecorator.js +1 -1
  39. package/{build → dist/cjs}/providers/storage/IStorageProvider.js +1 -1
  40. package/{build → dist/cjs}/providers/storage/S3StorageProvider.js +1 -1
  41. package/{build → dist/cjs}/providers/storage/StorageAdapter.js +1 -1
  42. package/{build → dist/cjs}/providers/storage/StorageContentWriter.js +1 -1
  43. package/{build → dist/cjs}/providers/storage/StorageKeyValueAdapter.js +1 -1
  44. package/{build → dist/cjs}/providers/storage/StorageMetadataReader.js +1 -1
  45. package/{build → dist/cjs}/providers/storage/StorjAdapter.js +1 -1
  46. package/{build → dist/cjs}/providers/storage/StorjStorageProvider.js +1 -1
  47. package/{build → dist/cjs}/providers/storage/getStorageProvider.js +1 -1
  48. package/{build → dist/cjs}/providers/storage/types.js +1 -1
  49. package/{build → dist/cjs}/staticModels/ActiveOffers.js +1 -1
  50. package/{build → dist/cjs}/staticModels/ActiveOrders.js +1 -1
  51. package/dist/cjs/staticModels/Consensus.js +247 -0
  52. package/{build → dist/cjs}/staticModels/Deposits.js +1 -1
  53. package/{build → dist/cjs}/staticModels/Marks.js +1 -1
  54. package/{build → dist/cjs}/staticModels/ModelPackager.js +1 -1
  55. package/{build → dist/cjs}/staticModels/Offers.js +1 -1
  56. package/{build → dist/cjs}/staticModels/Orders.js +1 -1
  57. package/{build → dist/cjs}/staticModels/ProviderRegistry.js +1 -1
  58. package/{build → dist/cjs}/staticModels/StaticModel.js +1 -1
  59. package/{build → dist/cjs}/staticModels/Superpro.js +1 -1
  60. package/{build → dist/cjs}/staticModels/SuperproToken.js +1 -1
  61. package/{build → dist/cjs}/staticModels/TeeOffers.js +1 -1
  62. package/{build → dist/cjs}/store.js +1 -1
  63. package/{build → dist/cjs}/tee/QuoteParser.js +1 -1
  64. package/{build → dist/cjs}/tee/QuoteValidator.js +1 -1
  65. package/{build → dist/cjs}/tee/errors.js +1 -1
  66. package/dist/cjs/tee/helpers.js +119 -0
  67. package/{build → dist/cjs}/tee/interface.js +1 -1
  68. package/{build → dist/cjs}/tee/statuses.js +1 -1
  69. package/{build → dist/cjs}/tee/types.js +1 -1
  70. package/{build → dist/cjs}/types/Compressor.js +1 -1
  71. package/{build → dist/cjs}/types/Consensus.js +1 -1
  72. package/{build → dist/cjs}/types/DepositInfo.js +1 -1
  73. package/{build → dist/cjs}/types/EtlModel.js +1 -1
  74. package/{build → dist/cjs}/types/Events.js +1 -1
  75. package/{build → dist/cjs}/types/HardwareInfo.js +1 -1
  76. package/{build → dist/cjs}/types/Marks.js +1 -1
  77. package/{build → dist/cjs}/types/Offer.js +1 -1
  78. package/{build → dist/cjs}/types/OptionInfo.js +1 -1
  79. package/{build → dist/cjs}/types/Order.js +1 -1
  80. package/{build → dist/cjs}/types/OrderUsage.js +1 -1
  81. package/{build → dist/cjs}/types/Origins.js +1 -1
  82. package/{build → dist/cjs}/types/Provider.js +1 -1
  83. package/{build → dist/cjs}/types/ResourceLoader.js +1 -1
  84. package/{build → dist/cjs}/types/SlotInfo.js +1 -1
  85. package/{build → dist/cjs}/types/SlotUsage.js +1 -1
  86. package/{build → dist/cjs}/types/Superpro.js +1 -1
  87. package/{build → dist/cjs}/types/TeeOfferInfo.js +1 -1
  88. package/{build → dist/cjs}/types/TeeOfferOption.js +1 -1
  89. package/{build → dist/cjs}/types/TeeOfferSlot.js +1 -1
  90. package/{build → dist/cjs}/types/ValueOfferSlot.js +1 -1
  91. package/{build → dist/cjs}/types/Web3.js +1 -1
  92. package/{build → dist/cjs}/types/blockchainConnector/StorageAccess.js +1 -1
  93. package/{build → dist/cjs}/types/index.js +1 -1
  94. package/{build → dist/cjs}/types/storage/StorageAccess.js +1 -1
  95. package/{build → dist/cjs}/types/storage/StorageFileAccess.js +1 -1
  96. package/{build → dist/cjs}/types/storage/StorageObject.js +1 -1
  97. package/dist/cjs/utils/Monitoring.js +48 -0
  98. package/{build → dist/cjs}/utils/NonceTracker.js +1 -1
  99. package/dist/cjs/utils/PubSub.js +37 -0
  100. package/{build → dist/cjs}/utils/TxManager.js +1 -1
  101. package/{build → dist/cjs}/utils/compressors/GzipCompressor.js +1 -1
  102. package/{build → dist/cjs}/utils/compressors/UncompressedCompressor.js +1 -1
  103. package/{build → dist/cjs}/utils/compressors/index.js +1 -1
  104. package/{build → dist/cjs}/utils/helper.js +1 -1
  105. package/{build → dist/cjs}/utils/helpers/getStreamChunks.js +1 -1
  106. package/{build → dist/cjs}/utils/helpers/index.js +1 -1
  107. package/{build → dist/cjs}/utils/helpers/tryWithInterval.js +1 -1
  108. package/{build → dist/cjs}/utils/resourceLoaders/BaseResourceLoader.js +1 -1
  109. package/{build → dist/cjs}/utils/resourceLoaders/StorageProviderLoader.js +1 -1
  110. package/{build → dist/cjs}/utils/resourceLoaders/UrlResourceLoader.js +1 -1
  111. package/{build → dist/cjs}/utils/resourceLoaders/getResourceLoader.js +1 -1
  112. package/{build → dist/cjs}/utils/resourceLoaders/index.js +1 -1
  113. package/dist/mjs/TIIGenerator.d.ts +22 -0
  114. package/dist/mjs/TIIGenerator.js +224 -0
  115. package/dist/mjs/analytics/Analytics.d.ts +15 -0
  116. package/dist/mjs/analytics/Analytics.js +61 -0
  117. package/dist/mjs/analytics/AnalyticsError.d.ts +7 -0
  118. package/dist/mjs/analytics/AnalyticsError.js +8 -0
  119. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.d.ts +18 -0
  120. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.js +32 -0
  121. package/dist/mjs/analytics/eventProviders/EventProvider.d.ts +24 -0
  122. package/dist/mjs/analytics/eventProviders/EventProvider.js +22 -0
  123. package/dist/mjs/analytics/eventProviders/NodeEventProvider.d.ts +22 -0
  124. package/dist/mjs/analytics/eventProviders/NodeEventProvider.js +50 -0
  125. package/dist/mjs/analytics/transports/AxiosTransport.d.ts +4 -0
  126. package/dist/mjs/analytics/transports/AxiosTransport.js +31 -0
  127. package/dist/mjs/analytics/transports/FetchTransport.d.ts +4 -0
  128. package/dist/mjs/analytics/transports/FetchTransport.js +28 -0
  129. package/dist/mjs/analytics/types.d.ts +22 -0
  130. package/dist/mjs/analytics/types.js +2 -0
  131. package/dist/mjs/config.d.ts +4 -0
  132. package/dist/mjs/config.js +5 -0
  133. package/dist/mjs/connectors/BaseConnector.d.ts +36 -0
  134. package/dist/mjs/connectors/BaseConnector.js +34 -0
  135. package/dist/mjs/connectors/BlockchainConnector.d.ts +81 -0
  136. package/dist/mjs/connectors/BlockchainConnector.js +313 -0
  137. package/dist/mjs/connectors/BlockchainEventsListener.d.ts +15 -0
  138. package/dist/mjs/connectors/BlockchainEventsListener.js +75 -0
  139. package/dist/mjs/connectors/index.d.ts +2 -0
  140. package/dist/mjs/connectors/index.js +3 -0
  141. package/dist/mjs/constants.d.ts +13 -0
  142. package/dist/mjs/constants.js +14 -0
  143. package/dist/mjs/contracts/abi.d.ts +9916 -0
  144. package/dist/mjs/contracts/abi.js +12941 -0
  145. package/dist/mjs/crypto/Crypto.d.ts +54 -0
  146. package/dist/mjs/crypto/Crypto.js +95 -0
  147. package/dist/mjs/crypto/index.d.ts +2 -0
  148. package/dist/mjs/crypto/index.js +3 -0
  149. package/dist/mjs/crypto/nodejs/AES.d.ts +24 -0
  150. package/dist/mjs/crypto/nodejs/AES.js +74 -0
  151. package/dist/mjs/crypto/nodejs/ARIA.d.ts +24 -0
  152. package/dist/mjs/crypto/nodejs/ARIA.js +73 -0
  153. package/dist/mjs/crypto/nodejs/ECIES.d.ts +6 -0
  154. package/dist/mjs/crypto/nodejs/ECIES.js +51 -0
  155. package/dist/mjs/crypto/nodejs/NativeCrypto.d.ts +58 -0
  156. package/dist/mjs/crypto/nodejs/NativeCrypto.js +168 -0
  157. package/dist/mjs/crypto/nodejs/RSA-Hybrid.d.ts +15 -0
  158. package/dist/mjs/crypto/nodejs/RSA-Hybrid.js +89 -0
  159. package/dist/mjs/index.d.ts +79 -0
  160. package/dist/mjs/index.js +75 -0
  161. package/dist/mjs/logger.d.ts +7 -0
  162. package/dist/mjs/logger.js +7 -0
  163. package/dist/mjs/models/EtlModel.d.ts +34 -0
  164. package/dist/mjs/models/EtlModel.js +96 -0
  165. package/dist/mjs/models/Offer.d.ts +130 -0
  166. package/dist/mjs/models/Offer.js +356 -0
  167. package/dist/mjs/models/Order.d.ts +148 -0
  168. package/dist/mjs/models/Order.js +520 -0
  169. package/dist/mjs/models/Provider.d.ts +51 -0
  170. package/dist/mjs/models/Provider.js +114 -0
  171. package/dist/mjs/models/TCB.d.ts +58 -0
  172. package/dist/mjs/models/TCB.js +107 -0
  173. package/dist/mjs/models/TeeOffer.d.ts +204 -0
  174. package/dist/mjs/models/TeeOffer.js +533 -0
  175. package/dist/mjs/models/index.d.ts +5 -0
  176. package/dist/mjs/models/index.js +6 -0
  177. package/dist/mjs/package.json +1 -0
  178. package/dist/mjs/polyfills.d.ts +0 -0
  179. package/dist/mjs/polyfills.js +7 -0
  180. package/dist/mjs/proto/Compression.d.ts +36 -0
  181. package/dist/mjs/proto/Compression.js +123 -0
  182. package/dist/mjs/proto/TRI.d.ts +124 -0
  183. package/dist/mjs/proto/TRI.js +284 -0
  184. package/dist/mjs/proto/TeeProperties.d.ts +263 -0
  185. package/dist/mjs/proto/TeeProperties.js +391 -0
  186. package/dist/mjs/providers/storage/ChunksDownloadDecorator.d.ts +36 -0
  187. package/dist/mjs/providers/storage/ChunksDownloadDecorator.js +139 -0
  188. package/dist/mjs/providers/storage/IStorageProvider.d.ts +15 -0
  189. package/dist/mjs/providers/storage/IStorageProvider.js +2 -0
  190. package/dist/mjs/providers/storage/S3StorageProvider.d.ts +25 -0
  191. package/dist/mjs/providers/storage/S3StorageProvider.js +167 -0
  192. package/dist/mjs/providers/storage/StorageAdapter.d.ts +60 -0
  193. package/dist/mjs/providers/storage/StorageAdapter.js +271 -0
  194. package/dist/mjs/providers/storage/StorageContentWriter.d.ts +46 -0
  195. package/dist/mjs/providers/storage/StorageContentWriter.js +161 -0
  196. package/dist/mjs/providers/storage/StorageKeyValueAdapter.d.ts +23 -0
  197. package/dist/mjs/providers/storage/StorageKeyValueAdapter.js +119 -0
  198. package/dist/mjs/providers/storage/StorageMetadataReader.d.ts +20 -0
  199. package/dist/mjs/providers/storage/StorageMetadataReader.js +51 -0
  200. package/dist/mjs/providers/storage/StorjAdapter.d.ts +19 -0
  201. package/dist/mjs/providers/storage/StorjAdapter.js +48 -0
  202. package/dist/mjs/providers/storage/StorjStorageProvider.d.ts +25 -0
  203. package/dist/mjs/providers/storage/StorjStorageProvider.js +141 -0
  204. package/dist/mjs/providers/storage/getStorageProvider.d.ts +4 -0
  205. package/dist/mjs/providers/storage/getStorageProvider.js +15 -0
  206. package/dist/mjs/providers/storage/types.d.ts +7 -0
  207. package/dist/mjs/providers/storage/types.js +2 -0
  208. package/dist/mjs/staticModels/ActiveOffers.d.ts +15 -0
  209. package/dist/mjs/staticModels/ActiveOffers.js +32 -0
  210. package/dist/mjs/staticModels/ActiveOrders.d.ts +20 -0
  211. package/dist/mjs/staticModels/ActiveOrders.js +71 -0
  212. package/dist/mjs/staticModels/Consensus.d.ts +42 -0
  213. package/dist/mjs/staticModels/Consensus.js +220 -0
  214. package/dist/mjs/staticModels/Deposits.d.ts +70 -0
  215. package/dist/mjs/staticModels/Deposits.js +190 -0
  216. package/dist/mjs/staticModels/Marks.d.ts +8 -0
  217. package/dist/mjs/staticModels/Marks.js +25 -0
  218. package/dist/mjs/staticModels/ModelPackager.d.ts +18 -0
  219. package/dist/mjs/staticModels/ModelPackager.js +45 -0
  220. package/dist/mjs/staticModels/Offers.d.ts +65 -0
  221. package/dist/mjs/staticModels/Offers.js +184 -0
  222. package/dist/mjs/staticModels/Orders.d.ts +155 -0
  223. package/dist/mjs/staticModels/Orders.js +472 -0
  224. package/dist/mjs/staticModels/ProviderRegistry.d.ts +74 -0
  225. package/dist/mjs/staticModels/ProviderRegistry.js +169 -0
  226. package/dist/mjs/staticModels/StaticModel.d.ts +8 -0
  227. package/dist/mjs/staticModels/StaticModel.js +30 -0
  228. package/dist/mjs/staticModels/Superpro.d.ts +16 -0
  229. package/dist/mjs/staticModels/Superpro.js +23 -0
  230. package/dist/mjs/staticModels/SuperproToken.d.ts +48 -0
  231. package/dist/mjs/staticModels/SuperproToken.js +136 -0
  232. package/dist/mjs/staticModels/TeeOffers.d.ts +115 -0
  233. package/dist/mjs/staticModels/TeeOffers.js +309 -0
  234. package/dist/mjs/store.d.ts +15 -0
  235. package/dist/mjs/store.js +15 -0
  236. package/dist/mjs/tee/QuoteParser.d.ts +27 -0
  237. package/dist/mjs/tee/QuoteParser.js +162 -0
  238. package/dist/mjs/tee/QuoteValidator.d.ts +38 -0
  239. package/dist/mjs/tee/QuoteValidator.js +382 -0
  240. package/dist/mjs/tee/errors.d.ts +6 -0
  241. package/dist/mjs/tee/errors.js +7 -0
  242. package/dist/mjs/tee/helpers.d.ts +14 -0
  243. package/dist/mjs/tee/helpers.js +115 -0
  244. package/dist/mjs/tee/interface.d.ts +63 -0
  245. package/dist/mjs/tee/interface.js +2 -0
  246. package/dist/mjs/tee/statuses.d.ts +21 -0
  247. package/dist/mjs/tee/statuses.js +25 -0
  248. package/dist/mjs/tee/types.d.ts +75 -0
  249. package/dist/mjs/tee/types.js +2 -0
  250. package/dist/mjs/types/Compressor.d.ts +5 -0
  251. package/dist/mjs/types/Compressor.js +2 -0
  252. package/dist/mjs/types/Consensus.d.ts +60 -0
  253. package/dist/mjs/types/Consensus.js +16 -0
  254. package/dist/mjs/types/DepositInfo.d.ts +6 -0
  255. package/dist/mjs/types/DepositInfo.js +2 -0
  256. package/dist/mjs/types/EtlModel.d.ts +2 -0
  257. package/dist/mjs/types/EtlModel.js +2 -0
  258. package/dist/mjs/types/Events.d.ts +34 -0
  259. package/dist/mjs/types/Events.js +2 -0
  260. package/dist/mjs/types/HardwareInfo.d.ts +6 -0
  261. package/dist/mjs/types/HardwareInfo.js +2 -0
  262. package/dist/mjs/types/Marks.d.ts +9 -0
  263. package/dist/mjs/types/Marks.js +7 -0
  264. package/dist/mjs/types/Offer.d.ts +33 -0
  265. package/dist/mjs/types/Offer.js +14 -0
  266. package/dist/mjs/types/OptionInfo.d.ts +8 -0
  267. package/dist/mjs/types/OptionInfo.js +2 -0
  268. package/dist/mjs/types/Order.d.ts +56 -0
  269. package/dist/mjs/types/Order.js +51 -0
  270. package/dist/mjs/types/OrderUsage.d.ts +26 -0
  271. package/dist/mjs/types/OrderUsage.js +2 -0
  272. package/dist/mjs/types/Origins.d.ts +6 -0
  273. package/dist/mjs/types/Origins.js +2 -0
  274. package/dist/mjs/types/Provider.d.ts +7 -0
  275. package/dist/mjs/types/Provider.js +2 -0
  276. package/dist/mjs/types/ResourceLoader.d.ts +28 -0
  277. package/dist/mjs/types/ResourceLoader.js +2 -0
  278. package/dist/mjs/types/SlotInfo.d.ts +6 -0
  279. package/dist/mjs/types/SlotInfo.js +2 -0
  280. package/dist/mjs/types/SlotUsage.d.ts +11 -0
  281. package/dist/mjs/types/SlotUsage.js +6 -0
  282. package/dist/mjs/types/Superpro.d.ts +9 -0
  283. package/dist/mjs/types/Superpro.js +11 -0
  284. package/dist/mjs/types/TeeOfferInfo.d.ts +10 -0
  285. package/dist/mjs/types/TeeOfferInfo.js +2 -0
  286. package/dist/mjs/types/TeeOfferOption.d.ts +13 -0
  287. package/dist/mjs/types/TeeOfferOption.js +2 -0
  288. package/dist/mjs/types/TeeOfferSlot.d.ts +8 -0
  289. package/dist/mjs/types/TeeOfferSlot.js +2 -0
  290. package/dist/mjs/types/ValueOfferSlot.d.ts +16 -0
  291. package/dist/mjs/types/ValueOfferSlot.js +2 -0
  292. package/dist/mjs/types/Web3.d.ts +62 -0
  293. package/dist/mjs/types/Web3.js +2 -0
  294. package/dist/mjs/types/blockchainConnector/StorageAccess.d.ts +8 -0
  295. package/dist/mjs/types/blockchainConnector/StorageAccess.js +2 -0
  296. package/dist/mjs/types/index.d.ts +22 -0
  297. package/dist/mjs/types/index.js +23 -0
  298. package/dist/mjs/types/storage/StorageAccess.d.ts +7 -0
  299. package/dist/mjs/types/storage/StorageAccess.js +2 -0
  300. package/dist/mjs/types/storage/StorageFileAccess.d.ts +5 -0
  301. package/dist/mjs/types/storage/StorageFileAccess.js +2 -0
  302. package/dist/mjs/types/storage/StorageObject.d.ts +8 -0
  303. package/dist/mjs/types/storage/StorageObject.js +2 -0
  304. package/dist/mjs/utils/Monitoring.d.ts +11 -0
  305. package/dist/mjs/utils/Monitoring.js +42 -0
  306. package/dist/mjs/utils/NonceTracker.d.ts +19 -0
  307. package/dist/mjs/utils/NonceTracker.js +73 -0
  308. package/dist/mjs/utils/PubSub.d.ts +9 -0
  309. package/dist/mjs/utils/PubSub.js +32 -0
  310. package/dist/mjs/utils/TxManager.d.ts +25 -0
  311. package/dist/mjs/utils/TxManager.js +162 -0
  312. package/dist/mjs/utils/compressors/GzipCompressor.d.ts +8 -0
  313. package/dist/mjs/utils/compressors/GzipCompressor.js +14 -0
  314. package/dist/mjs/utils/compressors/UncompressedCompressor.d.ts +8 -0
  315. package/dist/mjs/utils/compressors/UncompressedCompressor.js +13 -0
  316. package/dist/mjs/utils/compressors/index.d.ts +2 -0
  317. package/dist/mjs/utils/compressors/index.js +3 -0
  318. package/dist/mjs/utils/helper.d.ts +44 -0
  319. package/dist/mjs/utils/helper.js +258 -0
  320. package/dist/mjs/utils/helpers/getStreamChunks.d.ts +9 -0
  321. package/dist/mjs/utils/helpers/getStreamChunks.js +31 -0
  322. package/dist/mjs/utils/helpers/index.d.ts +1 -0
  323. package/dist/mjs/utils/helpers/index.js +2 -0
  324. package/dist/mjs/utils/helpers/tryWithInterval.d.ts +13 -0
  325. package/dist/mjs/utils/helpers/tryWithInterval.js +35 -0
  326. package/dist/mjs/utils/resourceLoaders/BaseResourceLoader.d.ts +10 -0
  327. package/dist/mjs/utils/resourceLoaders/BaseResourceLoader.js +10 -0
  328. package/dist/mjs/utils/resourceLoaders/StorageProviderLoader.d.ts +18 -0
  329. package/dist/mjs/utils/resourceLoaders/StorageProviderLoader.js +53 -0
  330. package/dist/mjs/utils/resourceLoaders/UrlResourceLoader.d.ts +9 -0
  331. package/dist/mjs/utils/resourceLoaders/UrlResourceLoader.js +44 -0
  332. package/dist/mjs/utils/resourceLoaders/getResourceLoader.d.ts +5 -0
  333. package/dist/mjs/utils/resourceLoaders/getResourceLoader.js +11 -0
  334. package/dist/mjs/utils/resourceLoaders/index.d.ts +1 -0
  335. package/dist/mjs/utils/resourceLoaders/index.js +2 -0
  336. package/package.json +11 -4
  337. package/build/analytics/eventProviders/EventProvider.js +0 -14
  338. package/build/crypto/nodejs/NativeCrypto.js +0 -183
  339. package/build/polyfills.js +0 -7
  340. package/build/proto/Compression.js +0 -132
  341. package/build/proto/TRI.js +0 -293
  342. package/build/proto/TeeProperties.js +0 -401
  343. package/build/staticModels/Consensus.js +0 -247
  344. package/build/tee/helpers.js +0 -119
  345. package/build/utils/Monitoring.js +0 -48
  346. package/build/utils/PubSub.js +0 -37
  347. /package/{build → dist/cjs}/TIIGenerator.d.ts +0 -0
  348. /package/{build → dist/cjs}/analytics/Analytics.d.ts +0 -0
  349. /package/{build → dist/cjs}/analytics/AnalyticsError.d.ts +0 -0
  350. /package/{build → dist/cjs}/analytics/eventProviders/BrowserEventProvider.d.ts +0 -0
  351. /package/{build → dist/cjs}/analytics/eventProviders/EventProvider.d.ts +0 -0
  352. /package/{build → dist/cjs}/analytics/eventProviders/NodeEventProvider.d.ts +0 -0
  353. /package/{build → dist/cjs}/analytics/transports/AxiosTransport.d.ts +0 -0
  354. /package/{build → dist/cjs}/analytics/transports/FetchTransport.d.ts +0 -0
  355. /package/{build → dist/cjs}/analytics/types.d.ts +0 -0
  356. /package/{build → dist/cjs}/config.d.ts +0 -0
  357. /package/{build → dist/cjs}/connectors/BaseConnector.d.ts +0 -0
  358. /package/{build → dist/cjs}/connectors/BlockchainConnector.d.ts +0 -0
  359. /package/{build → dist/cjs}/connectors/BlockchainEventsListener.d.ts +0 -0
  360. /package/{build → dist/cjs}/connectors/index.d.ts +0 -0
  361. /package/{build → dist/cjs}/constants.d.ts +0 -0
  362. /package/{build → dist/cjs}/contracts/abi.d.ts +0 -0
  363. /package/{build → dist/cjs}/crypto/Crypto.d.ts +0 -0
  364. /package/{build → dist/cjs}/crypto/index.d.ts +0 -0
  365. /package/{build → dist/cjs}/crypto/nodejs/AES.d.ts +0 -0
  366. /package/{build → dist/cjs}/crypto/nodejs/ARIA.d.ts +0 -0
  367. /package/{build → dist/cjs}/crypto/nodejs/ECIES.d.ts +0 -0
  368. /package/{build → dist/cjs}/crypto/nodejs/NativeCrypto.d.ts +0 -0
  369. /package/{build → dist/cjs}/crypto/nodejs/RSA-Hybrid.d.ts +0 -0
  370. /package/{build → dist/cjs}/index.d.ts +0 -0
  371. /package/{build → dist/cjs}/logger.d.ts +0 -0
  372. /package/{build → dist/cjs}/models/EtlModel.d.ts +0 -0
  373. /package/{build → dist/cjs}/models/Offer.d.ts +0 -0
  374. /package/{build → dist/cjs}/models/Order.d.ts +0 -0
  375. /package/{build → dist/cjs}/models/Provider.d.ts +0 -0
  376. /package/{build → dist/cjs}/models/TCB.d.ts +0 -0
  377. /package/{build → dist/cjs}/models/TeeOffer.d.ts +0 -0
  378. /package/{build → dist/cjs}/models/index.d.ts +0 -0
  379. /package/{build → dist/cjs}/polyfills.d.ts +0 -0
  380. /package/{build → dist/cjs}/proto/Compression.d.ts +0 -0
  381. /package/{build → dist/cjs}/proto/TRI.d.ts +0 -0
  382. /package/{build → dist/cjs}/proto/TeeProperties.d.ts +0 -0
  383. /package/{build → dist/cjs}/providers/storage/ChunksDownloadDecorator.d.ts +0 -0
  384. /package/{build → dist/cjs}/providers/storage/IStorageProvider.d.ts +0 -0
  385. /package/{build → dist/cjs}/providers/storage/S3StorageProvider.d.ts +0 -0
  386. /package/{build → dist/cjs}/providers/storage/StorageAdapter.d.ts +0 -0
  387. /package/{build → dist/cjs}/providers/storage/StorageContentWriter.d.ts +0 -0
  388. /package/{build → dist/cjs}/providers/storage/StorageKeyValueAdapter.d.ts +0 -0
  389. /package/{build → dist/cjs}/providers/storage/StorageMetadataReader.d.ts +0 -0
  390. /package/{build → dist/cjs}/providers/storage/StorjAdapter.d.ts +0 -0
  391. /package/{build → dist/cjs}/providers/storage/StorjStorageProvider.d.ts +0 -0
  392. /package/{build → dist/cjs}/providers/storage/getStorageProvider.d.ts +0 -0
  393. /package/{build → dist/cjs}/providers/storage/types.d.ts +0 -0
  394. /package/{build → dist/cjs}/staticModels/ActiveOffers.d.ts +0 -0
  395. /package/{build → dist/cjs}/staticModels/ActiveOrders.d.ts +0 -0
  396. /package/{build → dist/cjs}/staticModels/Consensus.d.ts +0 -0
  397. /package/{build → dist/cjs}/staticModels/Deposits.d.ts +0 -0
  398. /package/{build → dist/cjs}/staticModels/Marks.d.ts +0 -0
  399. /package/{build → dist/cjs}/staticModels/ModelPackager.d.ts +0 -0
  400. /package/{build → dist/cjs}/staticModels/Offers.d.ts +0 -0
  401. /package/{build → dist/cjs}/staticModels/Orders.d.ts +0 -0
  402. /package/{build → dist/cjs}/staticModels/ProviderRegistry.d.ts +0 -0
  403. /package/{build → dist/cjs}/staticModels/StaticModel.d.ts +0 -0
  404. /package/{build → dist/cjs}/staticModels/Superpro.d.ts +0 -0
  405. /package/{build → dist/cjs}/staticModels/SuperproToken.d.ts +0 -0
  406. /package/{build → dist/cjs}/staticModels/TeeOffers.d.ts +0 -0
  407. /package/{build → dist/cjs}/store.d.ts +0 -0
  408. /package/{build → dist/cjs}/tee/QuoteParser.d.ts +0 -0
  409. /package/{build → dist/cjs}/tee/QuoteValidator.d.ts +0 -0
  410. /package/{build → dist/cjs}/tee/errors.d.ts +0 -0
  411. /package/{build → dist/cjs}/tee/helpers.d.ts +0 -0
  412. /package/{build → dist/cjs}/tee/interface.d.ts +0 -0
  413. /package/{build → dist/cjs}/tee/statuses.d.ts +0 -0
  414. /package/{build → dist/cjs}/tee/types.d.ts +0 -0
  415. /package/{build → dist/cjs}/types/Compressor.d.ts +0 -0
  416. /package/{build → dist/cjs}/types/Consensus.d.ts +0 -0
  417. /package/{build → dist/cjs}/types/DepositInfo.d.ts +0 -0
  418. /package/{build → dist/cjs}/types/EtlModel.d.ts +0 -0
  419. /package/{build → dist/cjs}/types/Events.d.ts +0 -0
  420. /package/{build → dist/cjs}/types/HardwareInfo.d.ts +0 -0
  421. /package/{build → dist/cjs}/types/Marks.d.ts +0 -0
  422. /package/{build → dist/cjs}/types/Offer.d.ts +0 -0
  423. /package/{build → dist/cjs}/types/OptionInfo.d.ts +0 -0
  424. /package/{build → dist/cjs}/types/Order.d.ts +0 -0
  425. /package/{build → dist/cjs}/types/OrderUsage.d.ts +0 -0
  426. /package/{build → dist/cjs}/types/Origins.d.ts +0 -0
  427. /package/{build → dist/cjs}/types/Provider.d.ts +0 -0
  428. /package/{build → dist/cjs}/types/ResourceLoader.d.ts +0 -0
  429. /package/{build → dist/cjs}/types/SlotInfo.d.ts +0 -0
  430. /package/{build → dist/cjs}/types/SlotUsage.d.ts +0 -0
  431. /package/{build → dist/cjs}/types/Superpro.d.ts +0 -0
  432. /package/{build → dist/cjs}/types/TeeOfferInfo.d.ts +0 -0
  433. /package/{build → dist/cjs}/types/TeeOfferOption.d.ts +0 -0
  434. /package/{build → dist/cjs}/types/TeeOfferSlot.d.ts +0 -0
  435. /package/{build → dist/cjs}/types/ValueOfferSlot.d.ts +0 -0
  436. /package/{build → dist/cjs}/types/Web3.d.ts +0 -0
  437. /package/{build → dist/cjs}/types/blockchainConnector/StorageAccess.d.ts +0 -0
  438. /package/{build → dist/cjs}/types/index.d.ts +0 -0
  439. /package/{build → dist/cjs}/types/storage/StorageAccess.d.ts +0 -0
  440. /package/{build → dist/cjs}/types/storage/StorageFileAccess.d.ts +0 -0
  441. /package/{build → dist/cjs}/types/storage/StorageObject.d.ts +0 -0
  442. /package/{build → dist/cjs}/utils/Monitoring.d.ts +0 -0
  443. /package/{build → dist/cjs}/utils/NonceTracker.d.ts +0 -0
  444. /package/{build → dist/cjs}/utils/PubSub.d.ts +0 -0
  445. /package/{build → dist/cjs}/utils/TxManager.d.ts +0 -0
  446. /package/{build → dist/cjs}/utils/compressors/GzipCompressor.d.ts +0 -0
  447. /package/{build → dist/cjs}/utils/compressors/UncompressedCompressor.d.ts +0 -0
  448. /package/{build → dist/cjs}/utils/compressors/index.d.ts +0 -0
  449. /package/{build → dist/cjs}/utils/helper.d.ts +0 -0
  450. /package/{build → dist/cjs}/utils/helpers/getStreamChunks.d.ts +0 -0
  451. /package/{build → dist/cjs}/utils/helpers/index.d.ts +0 -0
  452. /package/{build → dist/cjs}/utils/helpers/tryWithInterval.d.ts +0 -0
  453. /package/{build → dist/cjs}/utils/resourceLoaders/BaseResourceLoader.d.ts +0 -0
  454. /package/{build → dist/cjs}/utils/resourceLoaders/StorageProviderLoader.d.ts +0 -0
  455. /package/{build → dist/cjs}/utils/resourceLoaders/UrlResourceLoader.d.ts +0 -0
  456. /package/{build → dist/cjs}/utils/resourceLoaders/getResourceLoader.d.ts +0 -0
  457. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmFnZUtleVZhbHVlQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc3RvcmFnZS9TdG9yYWdlS2V5VmFsdWVBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFjLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHdkYsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLE1BQWtCLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sTUFBTSxNQUFNLHFCQUFxQixDQUFDO0FBTXpDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sc0JBQXNCO0lBQ3hCLGVBQWUsQ0FBbUI7SUFDbEMsTUFBTSxDQUFpQjtJQUV4QyxZQUFZLGFBQTRCLEVBQUUsTUFBcUM7UUFDN0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFzQixFQUFFLEdBQVc7UUFDdEQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsRCxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLEdBQVc7UUFDOUMsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUV0RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQyxJQUFJLEVBQUUsZUFBZSxDQUFDLEdBQUc7WUFDekIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3pCLEdBQUc7WUFDSCxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFnQjtRQUNoRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU3RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFnQjtRQUNyQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVyxFQUFFLEtBQWUsRUFBRSxVQUFrQjtRQUMxRSxJQUFJO1lBQ0YsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2xFO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLDRCQUE0QixDQUFDLENBQUM7WUFDMUQsTUFBTSxHQUFHLENBQUM7U0FDWDtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVc7UUFDckMsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsK0JBQStCLENBQUMsQ0FBQztTQUNuRTtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1lBQzFELE1BQU0sR0FBRyxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDM0QsSUFBSTtZQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztZQUVqRSxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUU3QixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUU5RSxPQUFPLGNBQWMsQ0FBQztTQUN2QjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQ2Y7Z0JBQ0UsR0FBRztnQkFDSCxHQUFHO2FBQ0osRUFDRCxrQ0FBa0MsQ0FDbkMsQ0FBQztZQUNGLE1BQU0sR0FBRyxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVc7UUFDeEMsSUFBSTtZQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQ2hCO2dCQUNFLElBQUksRUFBRSxXQUFXO2dCQUNqQixHQUFHO2FBQ0osRUFDRCxtQ0FBbUMsQ0FDcEMsQ0FBQztZQUVGLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbkQ7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUNmO2dCQUNFLEdBQUc7Z0JBQ0gsR0FBRzthQUNKLEVBQ0QsaUNBQWlDLENBQ2xDLENBQUM7WUFDRixNQUFNLEdBQUcsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWUsRUFBRSxVQUFrQjtRQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRiJ9
@@ -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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