@unchainedshop/plugins 3.0.0-alpha7 → 3.0.0-rc10

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 (402) hide show
  1. package/lib/delivery/pick-mup.js +1 -2
  2. package/lib/delivery/pick-mup.js.map +1 -1
  3. package/lib/delivery/post.js +2 -1
  4. package/lib/delivery/post.js.map +1 -1
  5. package/lib/delivery/send-message.js +2 -1
  6. package/lib/delivery/send-message.js.map +1 -1
  7. package/lib/delivery/stores.js +2 -1
  8. package/lib/delivery/stores.js.map +1 -1
  9. package/lib/enrollments/licensed.d.ts.map +1 -1
  10. package/lib/enrollments/licensed.js +1 -1
  11. package/lib/enrollments/licensed.js.map +1 -1
  12. package/lib/events/aws-eventbridge.d.ts +2 -0
  13. package/lib/events/aws-eventbridge.d.ts.map +1 -0
  14. package/lib/events/aws-eventbridge.js +36 -0
  15. package/lib/events/aws-eventbridge.js.map +1 -0
  16. package/lib/events/node-event-emitter.js +2 -3
  17. package/lib/events/node-event-emitter.js.map +1 -1
  18. package/lib/events/redis.js +4 -2
  19. package/lib/events/redis.js.map +1 -1
  20. package/lib/files/gridfs/gridfs-adapter.d.ts +7 -1
  21. package/lib/files/gridfs/gridfs-adapter.d.ts.map +1 -1
  22. package/lib/files/gridfs/gridfs-adapter.js +16 -8
  23. package/lib/files/gridfs/gridfs-adapter.js.map +1 -1
  24. package/lib/files/gridfs/gridfs-webhook.d.ts +1 -1
  25. package/lib/files/gridfs/gridfs-webhook.d.ts.map +1 -1
  26. package/lib/files/gridfs/gridfs-webhook.js +27 -8
  27. package/lib/files/gridfs/gridfs-webhook.js.map +1 -1
  28. package/lib/files/gridfs/index.d.ts +1 -0
  29. package/lib/files/gridfs/index.d.ts.map +1 -1
  30. package/lib/files/gridfs/sign.d.ts +1 -1
  31. package/lib/files/gridfs/sign.d.ts.map +1 -1
  32. package/lib/files/gridfs/sign.js +8 -7
  33. package/lib/files/gridfs/sign.js.map +1 -1
  34. package/lib/files/minio/minio-adapter.d.ts.map +1 -1
  35. package/lib/files/minio/minio-adapter.js +19 -32
  36. package/lib/files/minio/minio-adapter.js.map +1 -1
  37. package/lib/files/minio/minio-webhook.d.ts.map +1 -1
  38. package/lib/files/minio/minio-webhook.js +4 -3
  39. package/lib/files/minio/minio-webhook.js.map +1 -1
  40. package/lib/filters/local-search.d.ts +1 -1
  41. package/lib/filters/local-search.d.ts.map +1 -1
  42. package/lib/filters/local-search.js +1 -1
  43. package/lib/filters/local-search.js.map +1 -1
  44. package/lib/filters/strict-equal.js +1 -1
  45. package/lib/filters/strict-equal.js.map +1 -1
  46. package/lib/payment/apple-iap/adapter.d.ts.map +1 -1
  47. package/lib/payment/apple-iap/adapter.js +16 -21
  48. package/lib/payment/apple-iap/adapter.js.map +1 -1
  49. package/lib/payment/apple-iap/db/AppleTransactionsCollection.d.ts +1 -1
  50. package/lib/payment/apple-iap/db/AppleTransactionsCollection.d.ts.map +1 -1
  51. package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts +1 -1
  52. package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts.map +1 -1
  53. package/lib/payment/braintree.js +10 -8
  54. package/lib/payment/braintree.js.map +1 -1
  55. package/lib/payment/cryptopay/db/CryptopayTransactions.d.ts +1 -1
  56. package/lib/payment/cryptopay/db/CryptopayTransactions.d.ts.map +1 -1
  57. package/lib/payment/cryptopay/middleware.d.ts.map +1 -1
  58. package/lib/payment/cryptopay/middleware.js +4 -4
  59. package/lib/payment/cryptopay/middleware.js.map +1 -1
  60. package/lib/payment/cryptopay/plugin.d.ts +1 -1
  61. package/lib/payment/cryptopay/plugin.d.ts.map +1 -1
  62. package/lib/payment/cryptopay/plugin.js +8 -9
  63. package/lib/payment/cryptopay/plugin.js.map +1 -1
  64. package/lib/payment/datatrans-v2/api/authorize.d.ts +1 -1
  65. package/lib/payment/datatrans-v2/api/authorize.d.ts.map +1 -1
  66. package/lib/payment/datatrans-v2/api/authorizeAuthenticated.d.ts +1 -1
  67. package/lib/payment/datatrans-v2/api/authorizeAuthenticated.d.ts.map +1 -1
  68. package/lib/payment/datatrans-v2/api/cancel.d.ts +1 -1
  69. package/lib/payment/datatrans-v2/api/cancel.d.ts.map +1 -1
  70. package/lib/payment/datatrans-v2/api/init.d.ts +1 -1
  71. package/lib/payment/datatrans-v2/api/init.d.ts.map +1 -1
  72. package/lib/payment/datatrans-v2/api/makeFetcher.d.ts.map +1 -1
  73. package/lib/payment/datatrans-v2/api/makeFetcher.js +5 -10
  74. package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -1
  75. package/lib/payment/datatrans-v2/api/secureFields.d.ts +1 -1
  76. package/lib/payment/datatrans-v2/api/secureFields.d.ts.map +1 -1
  77. package/lib/payment/datatrans-v2/api/settle.d.ts +1 -1
  78. package/lib/payment/datatrans-v2/api/settle.d.ts.map +1 -1
  79. package/lib/payment/datatrans-v2/api/status.d.ts +1 -1
  80. package/lib/payment/datatrans-v2/api/status.d.ts.map +1 -1
  81. package/lib/payment/datatrans-v2/api/types.d.ts +260 -0
  82. package/lib/payment/datatrans-v2/api/types.d.ts.map +1 -0
  83. package/lib/payment/datatrans-v2/api/types.js +2 -0
  84. package/lib/payment/datatrans-v2/api/types.js.map +1 -0
  85. package/lib/payment/datatrans-v2/api/validate.d.ts +1 -1
  86. package/lib/payment/datatrans-v2/api/validate.d.ts.map +1 -1
  87. package/lib/payment/datatrans-v2/generateSignature.d.ts +1 -1
  88. package/lib/payment/datatrans-v2/generateSignature.d.ts.map +1 -1
  89. package/lib/payment/datatrans-v2/generateSignature.js +7 -4
  90. package/lib/payment/datatrans-v2/generateSignature.js.map +1 -1
  91. package/lib/payment/datatrans-v2/index.d.ts.map +1 -1
  92. package/lib/payment/datatrans-v2/index.js +31 -29
  93. package/lib/payment/datatrans-v2/index.js.map +1 -1
  94. package/lib/payment/datatrans-v2/middleware.d.ts.map +1 -1
  95. package/lib/payment/datatrans-v2/middleware.js +7 -5
  96. package/lib/payment/datatrans-v2/middleware.js.map +1 -1
  97. package/lib/payment/datatrans-v2/parseRegistrationData.d.ts +4 -4
  98. package/lib/payment/datatrans-v2/parseRegistrationData.d.ts.map +1 -1
  99. package/lib/payment/datatrans-v2/parseRegistrationData.js +5 -3
  100. package/lib/payment/datatrans-v2/parseRegistrationData.js.map +1 -1
  101. package/lib/payment/datatrans-v2/roundedAmountFromOrder.d.ts +1 -2
  102. package/lib/payment/datatrans-v2/roundedAmountFromOrder.d.ts.map +1 -1
  103. package/lib/payment/datatrans-v2/roundedAmountFromOrder.js +6 -2
  104. package/lib/payment/datatrans-v2/roundedAmountFromOrder.js.map +1 -1
  105. package/lib/payment/datatrans-v2/splitProperties.d.ts +0 -1
  106. package/lib/payment/datatrans-v2/splitProperties.d.ts.map +1 -1
  107. package/lib/payment/datatrans-v2/splitProperties.js +0 -3
  108. package/lib/payment/datatrans-v2/splitProperties.js.map +1 -1
  109. package/lib/payment/invoice-prepaid.js +4 -3
  110. package/lib/payment/invoice-prepaid.js.map +1 -1
  111. package/lib/payment/invoice.js +4 -3
  112. package/lib/payment/invoice.js.map +1 -1
  113. package/lib/payment/paypal-checkout.js +10 -6
  114. package/lib/payment/paypal-checkout.js.map +1 -1
  115. package/lib/payment/payrexx/api/makeFetcher.d.ts.map +1 -1
  116. package/lib/payment/payrexx/api/makeFetcher.js +9 -15
  117. package/lib/payment/payrexx/api/makeFetcher.js.map +1 -1
  118. package/lib/payment/payrexx/index.d.ts.map +1 -1
  119. package/lib/payment/payrexx/index.js +20 -14
  120. package/lib/payment/payrexx/index.js.map +1 -1
  121. package/lib/payment/payrexx/middleware.d.ts.map +1 -1
  122. package/lib/payment/payrexx/middleware.js +12 -9
  123. package/lib/payment/payrexx/middleware.js.map +1 -1
  124. package/lib/payment/postfinance-checkout/index.d.ts.map +1 -1
  125. package/lib/payment/postfinance-checkout/index.js +18 -13
  126. package/lib/payment/postfinance-checkout/index.js.map +1 -1
  127. package/lib/payment/postfinance-checkout/middleware.d.ts.map +1 -1
  128. package/lib/payment/postfinance-checkout/middleware.js +4 -3
  129. package/lib/payment/postfinance-checkout/middleware.js.map +1 -1
  130. package/lib/payment/postfinance-checkout/utils.d.ts +2 -2
  131. package/lib/payment/postfinance-checkout/utils.d.ts.map +1 -1
  132. package/lib/payment/postfinance-checkout/utils.js +6 -2
  133. package/lib/payment/postfinance-checkout/utils.js.map +1 -1
  134. package/lib/payment/saferpay/adapter.d.ts +1 -1
  135. package/lib/payment/saferpay/adapter.d.ts.map +1 -1
  136. package/lib/payment/saferpay/adapter.js +17 -11
  137. package/lib/payment/saferpay/adapter.js.map +1 -1
  138. package/lib/payment/saferpay/api/api/SaferpayConnection.d.ts.map +1 -1
  139. package/lib/payment/saferpay/api/api/SaferpayConnection.js +0 -1
  140. package/lib/payment/saferpay/api/api/SaferpayConnection.js.map +1 -1
  141. package/lib/payment/saferpay/api/models/TransactionCapture.d.ts +1 -1
  142. package/lib/payment/saferpay/api/models/TransactionCapture.d.ts.map +1 -1
  143. package/lib/payment/saferpay/db/SaferpayTransactionsCollection.d.ts +1 -1
  144. package/lib/payment/saferpay/db/SaferpayTransactionsCollection.d.ts.map +1 -1
  145. package/lib/payment/saferpay/middleware.d.ts.map +1 -1
  146. package/lib/payment/saferpay/middleware.js +4 -4
  147. package/lib/payment/saferpay/middleware.js.map +1 -1
  148. package/lib/payment/stripe/index.d.ts.map +1 -1
  149. package/lib/payment/stripe/index.js +17 -11
  150. package/lib/payment/stripe/index.js.map +1 -1
  151. package/lib/payment/stripe/middleware.d.ts.map +1 -1
  152. package/lib/payment/stripe/middleware.js +10 -10
  153. package/lib/payment/stripe/middleware.js.map +1 -1
  154. package/lib/payment/stripe/stripe.d.ts +3 -4
  155. package/lib/payment/stripe/stripe.d.ts.map +1 -1
  156. package/lib/payment/stripe/stripe.js +3 -1
  157. package/lib/payment/stripe/stripe.js.map +1 -1
  158. package/lib/pricing/delivery-swiss-tax.d.ts +1 -1
  159. package/lib/pricing/delivery-swiss-tax.d.ts.map +1 -1
  160. package/lib/pricing/delivery-swiss-tax.js +1 -2
  161. package/lib/pricing/delivery-swiss-tax.js.map +1 -1
  162. package/lib/pricing/discount-100-off.d.ts +1 -2
  163. package/lib/pricing/discount-100-off.d.ts.map +1 -1
  164. package/lib/pricing/discount-100-off.js +1 -1
  165. package/lib/pricing/discount-100-off.js.map +1 -1
  166. package/lib/pricing/discount-half-price-manual.d.ts +1 -2
  167. package/lib/pricing/discount-half-price-manual.d.ts.map +1 -1
  168. package/lib/pricing/discount-half-price-manual.js +1 -1
  169. package/lib/pricing/discount-half-price-manual.js.map +1 -1
  170. package/lib/pricing/discount-half-price.d.ts +1 -2
  171. package/lib/pricing/discount-half-price.d.ts.map +1 -1
  172. package/lib/pricing/discount-half-price.js +1 -1
  173. package/lib/pricing/discount-half-price.js.map +1 -1
  174. package/lib/pricing/free-delivery.d.ts +1 -1
  175. package/lib/pricing/free-delivery.d.ts.map +1 -1
  176. package/lib/pricing/free-delivery.js +1 -1
  177. package/lib/pricing/free-delivery.js.map +1 -1
  178. package/lib/pricing/free-payment.d.ts +1 -1
  179. package/lib/pricing/free-payment.d.ts.map +1 -1
  180. package/lib/pricing/free-payment.js +1 -1
  181. package/lib/pricing/free-payment.js.map +1 -1
  182. package/lib/pricing/order-delivery.d.ts +1 -1
  183. package/lib/pricing/order-delivery.d.ts.map +1 -1
  184. package/lib/pricing/order-delivery.js +6 -3
  185. package/lib/pricing/order-delivery.js.map +1 -1
  186. package/lib/pricing/order-discount.d.ts +1 -2
  187. package/lib/pricing/order-discount.d.ts.map +1 -1
  188. package/lib/pricing/order-discount.js +15 -8
  189. package/lib/pricing/order-discount.js.map +1 -1
  190. package/lib/pricing/order-items-discount.js +7 -4
  191. package/lib/pricing/order-items-discount.js.map +1 -1
  192. package/lib/pricing/order-items.js +7 -3
  193. package/lib/pricing/order-items.js.map +1 -1
  194. package/lib/pricing/order-payment.js +6 -3
  195. package/lib/pricing/order-payment.js.map +1 -1
  196. package/lib/pricing/order-round.d.ts +1 -1
  197. package/lib/pricing/order-round.d.ts.map +1 -1
  198. package/lib/pricing/order-round.js +1 -2
  199. package/lib/pricing/order-round.js.map +1 -1
  200. package/lib/pricing/product-catalog-price.d.ts +2 -2
  201. package/lib/pricing/product-catalog-price.d.ts.map +1 -1
  202. package/lib/pricing/product-catalog-price.js +7 -6
  203. package/lib/pricing/product-catalog-price.js.map +1 -1
  204. package/lib/pricing/product-discount.js +1 -2
  205. package/lib/pricing/product-discount.js.map +1 -1
  206. package/lib/pricing/product-price-rateconversion.d.ts +1 -1
  207. package/lib/pricing/product-price-rateconversion.d.ts.map +1 -1
  208. package/lib/pricing/product-price-rateconversion.js +1 -1
  209. package/lib/pricing/product-price-rateconversion.js.map +1 -1
  210. package/lib/pricing/product-round.d.ts +1 -1
  211. package/lib/pricing/product-round.d.ts.map +1 -1
  212. package/lib/pricing/product-round.js +1 -1
  213. package/lib/pricing/product-round.js.map +1 -1
  214. package/lib/pricing/product-swiss-tax.d.ts +4 -3
  215. package/lib/pricing/product-swiss-tax.d.ts.map +1 -1
  216. package/lib/pricing/product-swiss-tax.js +1 -2
  217. package/lib/pricing/product-swiss-tax.js.map +1 -1
  218. package/lib/quotations/manual.js +1 -1
  219. package/lib/quotations/manual.js.map +1 -1
  220. package/lib/warehousing/eth-minter.js +7 -4
  221. package/lib/warehousing/eth-minter.js.map +1 -1
  222. package/lib/warehousing/store.js +2 -1
  223. package/lib/warehousing/store.js.map +1 -1
  224. package/lib/worker/BaseWorker.d.ts +30 -0
  225. package/lib/worker/BaseWorker.d.ts.map +1 -0
  226. package/lib/worker/BaseWorker.js +81 -0
  227. package/lib/worker/BaseWorker.js.map +1 -0
  228. package/lib/worker/EventListenerWorker.d.ts +6 -0
  229. package/lib/worker/EventListenerWorker.d.ts.map +1 -0
  230. package/lib/worker/EventListenerWorker.js +46 -0
  231. package/lib/worker/EventListenerWorker.js.map +1 -0
  232. package/lib/worker/FailedRescheduler.d.ts +15 -0
  233. package/lib/worker/FailedRescheduler.d.ts.map +1 -0
  234. package/lib/worker/FailedRescheduler.js +45 -0
  235. package/lib/worker/FailedRescheduler.js.map +1 -0
  236. package/lib/worker/IntervalWorker.d.ts +10 -0
  237. package/lib/worker/IntervalWorker.d.ts.map +1 -0
  238. package/lib/worker/IntervalWorker.js +37 -0
  239. package/lib/worker/IntervalWorker.js.map +1 -0
  240. package/lib/worker/bulk-import.d.ts +1 -1
  241. package/lib/worker/bulk-import.d.ts.map +1 -1
  242. package/lib/worker/bulk-import.js +7 -8
  243. package/lib/worker/bulk-import.js.map +1 -1
  244. package/lib/worker/email.d.ts.map +1 -1
  245. package/lib/worker/email.js +18 -19
  246. package/lib/worker/email.js.map +1 -1
  247. package/lib/worker/enrollment-order-generator.d.ts.map +1 -1
  248. package/lib/worker/enrollment-order-generator.js +17 -15
  249. package/lib/worker/enrollment-order-generator.js.map +1 -1
  250. package/lib/worker/error-notifications.d.ts +1 -1
  251. package/lib/worker/error-notifications.d.ts.map +1 -1
  252. package/lib/worker/error-notifications.js +1 -1
  253. package/lib/worker/error-notifications.js.map +1 -1
  254. package/lib/worker/export-token.d.ts +1 -2
  255. package/lib/worker/export-token.d.ts.map +1 -1
  256. package/lib/worker/export-token.js +2 -1
  257. package/lib/worker/export-token.js.map +1 -1
  258. package/lib/worker/external.d.ts +1 -1
  259. package/lib/worker/external.d.ts.map +1 -1
  260. package/lib/worker/external.js +1 -1
  261. package/lib/worker/external.js.map +1 -1
  262. package/lib/worker/heartbeat.js +1 -1
  263. package/lib/worker/heartbeat.js.map +1 -1
  264. package/lib/worker/http-request.d.ts +1 -1
  265. package/lib/worker/http-request.d.ts.map +1 -1
  266. package/lib/worker/http-request.js +1 -5
  267. package/lib/worker/http-request.js.map +1 -1
  268. package/lib/worker/message.d.ts +2 -2
  269. package/lib/worker/message.d.ts.map +1 -1
  270. package/lib/worker/message.js +1 -5
  271. package/lib/worker/message.js.map +1 -1
  272. package/lib/worker/push-notification.js +1 -4
  273. package/lib/worker/push-notification.js.map +1 -1
  274. package/lib/worker/sms.js +1 -4
  275. package/lib/worker/sms.js.map +1 -1
  276. package/lib/worker/update-coinbase-rates.js +1 -1
  277. package/lib/worker/update-coinbase-rates.js.map +1 -1
  278. package/lib/worker/update-ecb-rates.js +1 -1
  279. package/lib/worker/update-ecb-rates.js.map +1 -1
  280. package/lib/worker/update-token-ownership.d.ts +1 -1
  281. package/lib/worker/update-token-ownership.d.ts.map +1 -1
  282. package/lib/worker/update-token-ownership.js +1 -1
  283. package/lib/worker/update-token-ownership.js.map +1 -1
  284. package/lib/worker/zombie-killer.d.ts +8 -2
  285. package/lib/worker/zombie-killer.d.ts.map +1 -1
  286. package/lib/worker/zombie-killer.js +12 -9
  287. package/lib/worker/zombie-killer.js.map +1 -1
  288. package/package.json +123 -85
  289. package/src/delivery/pick-mup.ts +2 -3
  290. package/src/delivery/post.ts +2 -2
  291. package/src/delivery/send-message.ts +2 -2
  292. package/src/delivery/stores.ts +2 -2
  293. package/src/enrollments/licensed.ts +1 -2
  294. package/src/events/aws-eventbridge.ts +43 -0
  295. package/src/events/node-event-emitter.ts +2 -3
  296. package/src/events/redis.ts +4 -2
  297. package/src/files/gridfs/gridfs-adapter.ts +29 -12
  298. package/src/files/gridfs/gridfs-webhook.ts +31 -11
  299. package/src/files/gridfs/index.ts +2 -0
  300. package/src/files/gridfs/sign.ts +20 -8
  301. package/src/files/minio/minio-adapter.ts +21 -37
  302. package/src/files/minio/minio-webhook.ts +5 -3
  303. package/src/filters/local-search.ts +1 -2
  304. package/src/filters/strict-equal.ts +1 -2
  305. package/src/payment/apple-iap/adapter.ts +23 -41
  306. package/src/payment/apple-iap/db/AppleTransactionsCollection.ts +1 -1
  307. package/src/payment/apple-iap/module/configureAppleTransactionsModule.ts +1 -1
  308. package/src/payment/braintree.ts +16 -9
  309. package/src/payment/cryptopay/db/CryptopayTransactions.ts +1 -1
  310. package/src/payment/cryptopay/middleware.ts +11 -8
  311. package/src/payment/cryptopay/plugin.ts +14 -11
  312. package/src/payment/datatrans-v2/api/authorize.ts +1 -1
  313. package/src/payment/datatrans-v2/api/authorizeAuthenticated.ts +1 -1
  314. package/src/payment/datatrans-v2/api/cancel.ts +1 -1
  315. package/src/payment/datatrans-v2/api/init.ts +1 -1
  316. package/src/payment/datatrans-v2/api/makeFetcher.ts +8 -12
  317. package/src/payment/datatrans-v2/api/secureFields.ts +1 -1
  318. package/src/payment/datatrans-v2/api/settle.ts +1 -1
  319. package/src/payment/datatrans-v2/api/status.ts +1 -1
  320. package/src/payment/datatrans-v2/api/validate.ts +1 -1
  321. package/src/payment/datatrans-v2/generateSignature.test.ts +15 -0
  322. package/src/payment/datatrans-v2/generateSignature.ts +18 -6
  323. package/src/payment/datatrans-v2/index.ts +41 -36
  324. package/src/payment/datatrans-v2/middleware.ts +8 -12
  325. package/src/payment/datatrans-v2/parseRegistrationData.ts +7 -5
  326. package/src/payment/datatrans-v2/roundedAmountFromOrder.ts +6 -6
  327. package/src/payment/datatrans-v2/splitProperties.ts +0 -5
  328. package/src/payment/invoice-prepaid.ts +4 -4
  329. package/src/payment/invoice.ts +4 -4
  330. package/src/payment/paypal-checkout.ts +16 -7
  331. package/src/payment/payrexx/api/makeFetcher.ts +12 -16
  332. package/src/payment/payrexx/index.ts +26 -15
  333. package/src/payment/payrexx/middleware.ts +14 -19
  334. package/src/payment/postfinance-checkout/index.ts +26 -17
  335. package/src/payment/postfinance-checkout/middleware.ts +6 -9
  336. package/src/payment/postfinance-checkout/utils.ts +6 -3
  337. package/src/payment/saferpay/adapter.ts +23 -13
  338. package/src/payment/saferpay/api/api/SaferpayConnection.ts +0 -1
  339. package/src/payment/saferpay/api/models/TransactionCapture.ts +1 -1
  340. package/src/payment/saferpay/db/SaferpayTransactionsCollection.ts +1 -1
  341. package/src/payment/saferpay/middleware.ts +6 -10
  342. package/src/payment/stripe/index.ts +23 -12
  343. package/src/payment/stripe/middleware.ts +15 -23
  344. package/src/payment/stripe/stripe.ts +6 -5
  345. package/src/pricing/delivery-swiss-tax.ts +6 -2
  346. package/src/pricing/discount-100-off.ts +2 -2
  347. package/src/pricing/discount-half-price-manual.ts +6 -3
  348. package/src/pricing/discount-half-price.ts +6 -3
  349. package/src/pricing/free-delivery.ts +1 -1
  350. package/src/pricing/free-payment.ts +1 -1
  351. package/src/pricing/order-delivery.ts +11 -8
  352. package/src/pricing/order-discount.ts +26 -11
  353. package/src/pricing/order-items-discount.ts +12 -5
  354. package/src/pricing/order-items.ts +12 -8
  355. package/src/pricing/order-payment.ts +11 -8
  356. package/src/pricing/order-round.ts +6 -2
  357. package/src/pricing/product-catalog-price.ts +12 -7
  358. package/src/pricing/product-discount.ts +5 -4
  359. package/src/pricing/product-price-rateconversion.ts +5 -2
  360. package/src/pricing/product-round.ts +5 -2
  361. package/src/pricing/product-swiss-tax.ts +5 -3
  362. package/src/quotations/manual.ts +1 -2
  363. package/src/warehousing/eth-minter.ts +11 -10
  364. package/src/warehousing/store.ts +2 -6
  365. package/src/worker/BaseWorker.ts +119 -0
  366. package/src/worker/EventListenerWorker.ts +61 -0
  367. package/src/worker/FailedRescheduler.ts +80 -0
  368. package/src/worker/IntervalWorker.ts +54 -0
  369. package/src/worker/bulk-import.ts +12 -13
  370. package/src/worker/email.ts +20 -22
  371. package/src/worker/enrollment-order-generator.ts +25 -34
  372. package/src/worker/error-notifications.ts +2 -2
  373. package/src/worker/export-token.ts +2 -8
  374. package/src/worker/external.ts +1 -2
  375. package/src/worker/heartbeat.ts +1 -2
  376. package/src/worker/http-request.ts +1 -8
  377. package/src/worker/message.ts +2 -6
  378. package/src/worker/push-notification.ts +1 -6
  379. package/src/worker/sms.ts +1 -7
  380. package/src/worker/update-coinbase-rates.ts +1 -3
  381. package/src/worker/update-ecb-rates.ts +1 -3
  382. package/src/worker/update-token-ownership.ts +1 -2
  383. package/src/worker/zombie-killer.ts +23 -23
  384. package/tests/mock/datatrans/v1/secure-fields.json +4 -0
  385. package/tests/mock/datatrans/v1/transactions/authorize.json +48 -0
  386. package/tests/mock/datatrans/v1/transactions/card_check_authorized.json +47 -0
  387. package/tests/mock/datatrans/v1/transactions/payment_alias_authorized/settle.json +1 -0
  388. package/tests/mock/datatrans/v1/transactions/payment_alias_authorized.json +48 -0
  389. package/tests/mock/datatrans/v1/transactions/payment_authorized/cancel.json +1 -0
  390. package/tests/mock/datatrans/v1/transactions/payment_authorized/settle.json +1 -0
  391. package/tests/mock/datatrans/v1/transactions/payment_authorized.json +48 -0
  392. package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount/cancel.json +1 -0
  393. package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount.json +48 -0
  394. package/tests/mock/datatrans/v1/transactions/validate.json +1 -0
  395. package/tests/mock/datatrans/v1/transactions.json +4 -0
  396. package/tests/mock/payrexx/Gateway/1000001.json +106 -0
  397. package/tests/mock/payrexx/Gateway.json +24 -0
  398. package/tests/mock/payrexx/transaction_example1.json +65 -0
  399. package/tests/mock/payrexx/transaction_example2.json +65 -0
  400. package/tests/mock/payrexx/transaction_example3.json +94 -0
  401. package/tsconfig.json +4 -5
  402. /package/src/payment/datatrans-v2/api/{types.d.ts → types.ts} +0 -0
@@ -1,6 +1,5 @@
1
- /// <reference lib="dom" />
2
- import { DeliveryProviderType, IDeliveryAdapter } from '@unchainedshop/core-delivery';
3
- import { DeliveryAdapter, DeliveryDirector, DeliveryError } from '@unchainedshop/core-delivery';
1
+ import { DeliveryAdapter, DeliveryDirector, DeliveryError, IDeliveryAdapter } from '@unchainedshop/core';
2
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
4
3
 
5
4
  const fetchPickMupLocations = async (key: string, idsFilter?: string) => {
6
5
  // const pickMupUrl = `https://web-api.migros.ch/widgets/stores?key=${key}&verbosity=detail&limit=5000&aggregation_options%5Bempty_buckets%5D=true&filters%5Bmarkets%5D%5B0%5D%5B%5D=super&filters%5Bmarkets%5D%5B0%5D%5B%5D=mno&filters%5Bmarkets%5D%5B0%5D%5B%5D=voi&filters%5Bmarkets%5D%5B0%5D%5B%5D=mp&filters%5Bmarkets%5D%5B0%5D%5B%5D=out&filters%5Bmarkets%5D%5B0%5D%5B%5D=spx&filters%5Bmarkets%5D%5B0%5D%5B%5D=doi&filters%5Bmarkets%5D%5B0%5D%5B%5D=mec&filters%5Bmarkets%5D%5B0%5D%5B%5D=mica&filters%5Bmarkets%5D%5B0%5D%5B%5D=res&filters%5Bmarkets%5D%5B0%5D%5B%5D=flori&filters%5Bmarkets%5D%5B0%5D%5B%5D=gour&filters%5Bmarkets%5D%5B0%5D%5B%5D=alna&filters%5Bmarkets%5D%5B0%5D%5B%5D=cof&filters%5Bmarkets%5D%5B0%5D%5B%5D=chng&filters%5Bservices%5D%5Bsub_type%5D%5B%5D=pickmup&aggregation_groups%5B_custom%5D%5Bopen_on%5D%5Bnow%5D=20190923T11%3A45&aggregation_groups%5B_custom%5D%5Bopen_on%5D%5Bafter_1900%5D=20190923T19%3A01&aggregation_groups%5B_custom%5D%5Bopen_on%5D%5Bsundays%5D=sunday&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=super&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=voi&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=mp&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=mec&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=spx&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=doi&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=mica&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=out&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=flori&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=alna&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=res&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=gour&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=cof&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=res&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=gour&aggregation_groups%5Bmarkets%5D%5B_terms%5D%5B%5D=cof&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=market-service-mig_clean&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=market-service-mig_online&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=pickmup&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=post-service-point&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=subito-selfscanning&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=subito-selfcheckout&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=market-service-mig_bakery&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=counter-mez&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=counter-fisch&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=counter-kaes&aggregation_groups%5Bservices%5D%5Bsub_type%5D%5B_terms%5D%5B%5D=srv`;
@@ -1,5 +1,5 @@
1
- import { IDeliveryAdapter } from '@unchainedshop/core-delivery';
2
- import { DeliveryAdapter, DeliveryDirector, DeliveryProviderType } from '@unchainedshop/core-delivery';
1
+ import { IDeliveryAdapter, DeliveryAdapter, DeliveryDirector } from '@unchainedshop/core';
2
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
3
3
 
4
4
  const Post: IDeliveryAdapter = {
5
5
  ...DeliveryAdapter,
@@ -1,5 +1,5 @@
1
- import { IDeliveryAdapter } from '@unchainedshop/core-delivery';
2
- import { DeliveryAdapter, DeliveryDirector, DeliveryProviderType } from '@unchainedshop/core-delivery';
1
+ import { DeliveryAdapter, DeliveryDirector, IDeliveryAdapter } from '@unchainedshop/core';
2
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
3
3
 
4
4
  const SendMessage: IDeliveryAdapter = {
5
5
  ...DeliveryAdapter,
@@ -1,5 +1,5 @@
1
- import { IDeliveryAdapter } from '@unchainedshop/core-delivery';
2
- import { DeliveryAdapter, DeliveryDirector, DeliveryProviderType } from '@unchainedshop/core-delivery';
1
+ import { DeliveryAdapter, DeliveryDirector, IDeliveryAdapter } from '@unchainedshop/core';
2
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
3
3
 
4
4
  const PickMup: IDeliveryAdapter = {
5
5
  ...DeliveryAdapter,
@@ -1,5 +1,4 @@
1
- import { IEnrollmentAdapter } from '@unchainedshop/core-enrollments';
2
- import { EnrollmentDirector, EnrollmentAdapter } from '@unchainedshop/core-enrollments';
1
+ import { IEnrollmentAdapter, EnrollmentDirector, EnrollmentAdapter } from '@unchainedshop/core';
3
2
 
4
3
  export const rangeMatcher = (date = new Date()) => {
5
4
  const timestamp = date.getTime();
@@ -0,0 +1,43 @@
1
+ import { EmitAdapter, setEmitAdapter } from '@unchainedshop/events';
2
+ import { EventBridgeClient, PutEventsCommand, PutEventsRequestEntry } from '@aws-sdk/client-eventbridge';
3
+ import { createLogger } from '@unchainedshop/logger';
4
+
5
+ const logger = createLogger('unchained:eventbridge');
6
+
7
+ const EventBridgeEventEmitter = ({ region, source, busName }): EmitAdapter => {
8
+ const ebClient = new EventBridgeClient({ region });
9
+
10
+ return {
11
+ publish: (eventName, payload) => {
12
+ const entry: PutEventsRequestEntry = {
13
+ Source: source,
14
+ DetailType: eventName,
15
+ EventBusName: busName,
16
+ Detail: JSON.stringify(payload),
17
+ };
18
+ ebClient
19
+ .send(
20
+ new PutEventsCommand({
21
+ Entries: [entry],
22
+ }),
23
+ )
24
+ .catch((e) => {
25
+ logger.warn(e);
26
+ });
27
+ },
28
+ subscribe: () => {
29
+ throw new Error("You can't subscribe to EventBridge connected Events");
30
+ },
31
+ };
32
+ };
33
+
34
+ const { EVENT_BRIDGE_REGION, EVENT_BRIDGE_SOURCE, EVENT_BRIDGE_BUS_NAME } = process.env;
35
+ if (EVENT_BRIDGE_REGION && EVENT_BRIDGE_SOURCE && EVENT_BRIDGE_BUS_NAME) {
36
+ setEmitAdapter(
37
+ EventBridgeEventEmitter({
38
+ source: EVENT_BRIDGE_SOURCE,
39
+ region: EVENT_BRIDGE_REGION,
40
+ busName: EVENT_BRIDGE_BUS_NAME,
41
+ }),
42
+ );
43
+ }
@@ -1,4 +1,4 @@
1
- import { EventEmitter } from 'events';
1
+ import { EventEmitter } from 'node:events';
2
2
  import { setEmitAdapter, EmitAdapter } from '@unchainedshop/events';
3
3
 
4
4
  const NodeEventEmitter = (): EmitAdapter => {
@@ -15,5 +15,4 @@ const NodeEventEmitter = (): EmitAdapter => {
15
15
  };
16
16
  };
17
17
 
18
- const adapter = NodeEventEmitter();
19
- setEmitAdapter(adapter);
18
+ setEmitAdapter(NodeEventEmitter());
@@ -1,7 +1,7 @@
1
1
  import { createClient } from '@redis/client';
2
2
  import { setEmitAdapter, EmitAdapter } from '@unchainedshop/events';
3
3
 
4
- const { REDIS_PORT = '6379', REDIS_HOST = '127.0.0.1', REDIS_DB = '0' } = process.env;
4
+ const { REDIS_PORT = '6379', REDIS_HOST, REDIS_DB = '0' } = process.env;
5
5
 
6
6
  const subscribedEvents = new Set();
7
7
 
@@ -29,4 +29,6 @@ const RedisEventEmitter = (): EmitAdapter => {
29
29
  };
30
30
  };
31
31
 
32
- setEmitAdapter(RedisEventEmitter());
32
+ if (REDIS_HOST && REDIS_PORT && REDIS_DB) {
33
+ setEmitAdapter(RedisEventEmitter());
34
+ }
@@ -1,7 +1,5 @@
1
- /// <reference lib="dom" />
2
- import { URL } from 'url';
3
- import { Readable, PassThrough } from 'stream';
4
- import { pipeline } from 'stream/promises';
1
+ import { Readable, PassThrough } from 'node:stream';
2
+ import { pipeline } from 'node:stream/promises';
5
3
  import mimeType from 'mime-types';
6
4
  import {
7
5
  FileAdapter,
@@ -12,6 +10,9 @@ import {
12
10
  } from '@unchainedshop/file-upload';
13
11
  import { UploadFileData } from '@unchainedshop/file-upload';
14
12
  import sign from './sign.js';
13
+ import { filesSettings } from '@unchainedshop/core-files';
14
+ import { UnchainedCore } from '@unchainedshop/core';
15
+ import { GridFSFileUploadsModule } from './index.js';
15
16
 
16
17
  const { ROOT_URL } = process.env;
17
18
 
@@ -23,17 +24,33 @@ const bufferToStream = (buffer: any) => {
23
24
  return stream;
24
25
  };
25
26
 
26
- export const GridFSAdapter: IFileAdapter = {
27
+ export const GridFSAdapter: IFileAdapter<
28
+ UnchainedCore & {
29
+ modules: {
30
+ gridfsFileUploads: GridFSFileUploadsModule;
31
+ };
32
+ }
33
+ > = {
27
34
  key: 'shop.unchained.file-upload-plugin.gridfs',
28
35
  label: 'Uploads files to Database using GridFS',
29
36
  version: '1.0.0',
30
37
 
31
38
  ...FileAdapter,
39
+ async createDownloadURL(file, expiry) {
40
+ // If public, just return the stored path from the db
41
+ if (!file.meta?.isPrivate) return file?.url;
32
42
 
43
+ const expiryTimestamp =
44
+ expiry ||
45
+ new Date(new Date().getTime() + (filesSettings?.privateFileSharingMaxAge || 0)).getTime();
46
+
47
+ const signature = await sign(file.path, file._id, expiryTimestamp);
48
+ return `${file.url}?s=${signature}&e=${expiryTimestamp}`;
49
+ },
33
50
  async createSignedURL(directoryName, fileName) {
34
51
  const expiryDate = resolveExpirationDate();
35
- const hashedFilename = buildHashedFilename(directoryName, fileName, expiryDate);
36
- const signature = sign(directoryName, hashedFilename, expiryDate.getTime());
52
+ const hashedFilename = await buildHashedFilename(directoryName, fileName, expiryDate);
53
+ const signature = await sign(directoryName, hashedFilename, expiryDate.getTime());
37
54
 
38
55
  const putURL = new URL(
39
56
  `/gridfs/${directoryName}/${encodeURIComponent(
@@ -54,8 +71,8 @@ export const GridFSAdapter: IFileAdapter = {
54
71
  } as UploadFileData & { putURL: string };
55
72
  },
56
73
 
57
- async uploadFileFromStream(directoryName: string, rawFile: any, { modules }: any) {
58
- let stream;
74
+ async uploadFileFromStream(directoryName: string, rawFile: any, { modules }) {
75
+ let stream: Readable;
59
76
  let fileName;
60
77
  if (rawFile instanceof Promise) {
61
78
  const { filename: f, createReadStream } = await rawFile;
@@ -67,7 +84,7 @@ export const GridFSAdapter: IFileAdapter = {
67
84
  }
68
85
 
69
86
  const expiryDate = resolveExpirationDate();
70
- const hashedFilename = buildHashedFilename(directoryName, fileName, expiryDate);
87
+ const hashedFilename = await buildHashedFilename(directoryName, fileName, expiryDate);
71
88
  const type = mimeType.lookup(fileName) || (await Promise.resolve(rawFile)).mimetype;
72
89
 
73
90
  const writeStream = await modules.gridfsFileUploads.createWriteStream(
@@ -94,13 +111,13 @@ export const GridFSAdapter: IFileAdapter = {
94
111
  async uploadFileFromURL(
95
112
  directoryName: string,
96
113
  { fileLink, fileName: fname, fileId, headers }: any,
97
- { modules }: any,
114
+ { modules },
98
115
  ) {
99
116
  const { href } = new URL(fileLink);
100
117
  const fileName = decodeURIComponent(fname || href.split('/').pop());
101
118
 
102
119
  const expiryDate = resolveExpirationDate();
103
- const hashedFilename = buildHashedFilename(directoryName, fileName, expiryDate);
120
+ const hashedFilename = await buildHashedFilename(directoryName, fileName, expiryDate);
104
121
 
105
122
  const response = await fetch(href, { headers });
106
123
  if (!response.ok) throw new Error(`Unexpected response for ${href}: ${response.statusText}`);
@@ -1,14 +1,17 @@
1
- import { pipeline, finished } from 'stream/promises';
2
- import { PassThrough } from 'stream';
3
- import { log, LogLevel } from '@unchainedshop/logger';
1
+ import { pipeline, finished } from 'node:stream/promises';
2
+ import { PassThrough } from 'node:stream';
4
3
  import { buildHashedFilename } from '@unchainedshop/file-upload';
5
- import { Context } from '@unchainedshop/api';
6
4
  import express from 'express';
7
5
  import sign from './sign.js';
8
6
  import { configureGridFSFileUploadModule } from './index.js';
7
+ import { Context } from '@unchainedshop/api';
8
+ import { createLogger } from '@unchainedshop/logger';
9
+ import { getFileAdapter } from '@unchainedshop/core-files';
9
10
 
10
11
  const { ROOT_URL } = process.env;
11
12
 
13
+ const logger = createLogger('unchained:plugins:gridfs');
14
+
12
15
  export const gridfsHandler = async (
13
16
  req: express.Request & {
14
17
  unchainedContext: Context & {
@@ -39,15 +42,14 @@ export const gridfsHandler = async (
39
42
  if (req.method === 'PUT') {
40
43
  const { s: signature, e: expiryTimestamp } = req.query;
41
44
  const expiryDate = new Date(parseInt(expiryTimestamp as string, 10));
42
- const fileId = buildHashedFilename(directoryName, fileName, expiryDate);
43
- if (sign(directoryName, fileId, expiryDate.getTime()) === signature) {
45
+ const fileId = await buildHashedFilename(directoryName, fileName, expiryDate);
46
+ if ((await sign(directoryName, fileId, expiryDate.getTime())) === signature) {
44
47
  const file = await modules.files.findFile({ fileId });
45
48
  if (file.expires === null) {
46
49
  res.statusCode = 400;
47
50
  res.end('File already linked');
48
51
  return;
49
52
  }
50
-
51
53
  // If the type is octet-stream, prefer mimetype lookup from the filename
52
54
  // Else prefer the content-type header
53
55
  const type =
@@ -64,7 +66,7 @@ export const gridfsHandler = async (
64
66
  await pipeline(req, new PassThrough(), writeStream);
65
67
 
66
68
  const { length } = writeStream;
67
- await services.files.linkFile({ fileId, size: length, type }, req.unchainedContext);
69
+ await services.files.linkFile({ fileId, size: length, type });
68
70
 
69
71
  res.statusCode = 200;
70
72
  res.end();
@@ -77,8 +79,26 @@ export const gridfsHandler = async (
77
79
 
78
80
  if (req.method === 'GET') {
79
81
  const fileId = fileName;
80
-
82
+ const { s: signature, e: expiryTimestamp } = req.query;
81
83
  const file = await modules.gridfsFileUploads.getFileInfo(directoryName, fileId);
84
+ const fileDocument = await modules.files.findFile({ fileId });
85
+ if (fileDocument?.meta?.isPrivate) {
86
+ const expiry = parseInt(expiryTimestamp as string, 10);
87
+ if (expiry <= Date.now()) {
88
+ res.statusCode = 403;
89
+ res.end('Access restricted: Expired.');
90
+ return;
91
+ }
92
+
93
+ const fileUploadAdapter = getFileAdapter();
94
+ const signedUrl = await fileUploadAdapter.createDownloadURL(fileDocument, expiry);
95
+
96
+ if (new URL(signedUrl, 'file://').searchParams.get('s') !== signature) {
97
+ res.statusCode = 403;
98
+ res.end('Access restricted: Invalid signature.');
99
+ return;
100
+ }
101
+ }
82
102
  if (file?.metadata?.['content-type']) {
83
103
  res.setHeader('Content-Type', file.metadata['content-type']);
84
104
  }
@@ -97,11 +117,11 @@ export const gridfsHandler = async (
97
117
  res.end();
98
118
  } catch (e) {
99
119
  if (e.code === 'ENOENT') {
100
- log(e.message, { level: LogLevel.Warning });
120
+ logger.warn(e);
101
121
  res.statusCode = 404;
102
122
  res.end(e.message);
103
123
  } else {
104
- log(e.message, { level: LogLevel.Error });
124
+ logger.warn(e);
105
125
  res.statusCode = 503;
106
126
  res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
107
127
  }
@@ -27,3 +27,5 @@ export const configureGridFSFileUploadModule = ({ db }) => {
27
27
  },
28
28
  };
29
29
  };
30
+
31
+ export type GridFSFileUploadsModule = ReturnType<typeof configureGridFSFileUploadModule>;
@@ -1,16 +1,28 @@
1
- import crypto from 'crypto';
2
-
3
1
  const { UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET } = process.env;
4
2
 
5
- const sign = (directoryName, hash, expiryTimestamp) => {
3
+ const sign = async (directoryName, hash, expiryTimestamp) => {
6
4
  if (!UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET)
7
5
  throw new Error(
8
- 'To enable PUT based uploads you have to provide a random UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET environment variable',
6
+ 'To enable PUT based uploads or signed downloads you have to provide a random UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET environment variable',
9
7
  );
10
- const hmac = crypto.createHmac('sha256', UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET);
11
- const signature = [directoryName, hash, expiryTimestamp].join(':');
12
- hmac.update(signature);
13
- return hmac.digest('hex');
8
+
9
+ const key = await crypto.subtle.importKey(
10
+ 'raw',
11
+ new TextEncoder().encode(UNCHAINED_GRIDFS_PUT_UPLOAD_SECRET),
12
+ { name: 'HMAC', hash: 'SHA-256' },
13
+ false,
14
+ ['sign'],
15
+ );
16
+ const signatureBinary = await crypto.subtle.sign(
17
+ 'HMAC',
18
+ key,
19
+ new TextEncoder().encode([directoryName, hash, expiryTimestamp].join(':')),
20
+ );
21
+
22
+ const hmacSubtle = Array.from(new Uint8Array(signatureBinary))
23
+ .map((byte) => byte.toString(16).padStart(2, '0'))
24
+ .join('');
25
+ return hmacSubtle;
14
26
  };
15
27
 
16
28
  export default sign;
@@ -1,7 +1,5 @@
1
- import https from 'https';
2
- import http, { OutgoingHttpHeaders } from 'http';
3
- import { Readable } from 'stream';
4
- import { URL } from 'url';
1
+ import { Readable } from 'node:stream';
2
+ import type { ReadableStream } from 'node:stream/web';
5
3
  import { UploadFileData } from '@unchainedshop/file-upload';
6
4
  import {
7
5
  FileAdapter,
@@ -10,12 +8,13 @@ import {
10
8
  resolveExpirationDate,
11
9
  IFileAdapter,
12
10
  } from '@unchainedshop/file-upload';
13
-
14
- import { log, LogLevel } from '@unchainedshop/logger';
15
11
  import mimeType from 'mime-types';
16
12
  import { Client } from 'minio';
17
13
  import { AssumeRoleProvider } from 'minio/dist/esm/AssumeRoleProvider.mjs';
18
- import { expiryOffsetInMs } from '@unchainedshop/file-upload/put-expiration.js';
14
+ import { expiryOffsetInMs } from '@unchainedshop/file-upload/lib/put-expiration.js';
15
+ import { createLogger } from '@unchainedshop/logger';
16
+
17
+ const logger = createLogger('unchained:plugins:minio');
19
18
 
20
19
  const {
21
20
  MINIO_ACCESS_KEY,
@@ -33,9 +32,8 @@ let client: Client;
33
32
 
34
33
  export async function connectToMinio() {
35
34
  if (!MINIO_ENDPOINT || !MINIO_BUCKET_NAME) {
36
- log(
35
+ logger.error(
37
36
  'Please configure Minio/S3 by providing MINIO_ENDPOINT & MINIO_BUCKET_NAME to use upload features',
38
- { level: LogLevel.Error },
39
37
  );
40
38
  return null;
41
39
  }
@@ -67,9 +65,7 @@ export async function connectToMinio() {
67
65
  }
68
66
  return minioClient;
69
67
  } catch (error) {
70
- log(`Exception while creating Minio client: ${error.message}`, {
71
- level: LogLevel.Error,
72
- });
68
+ logger.error(`Exception while creating Minio client: ${error.message}`);
73
69
  }
74
70
  return null;
75
71
  }
@@ -87,24 +83,6 @@ connectToMinio().then(function setClient(c) {
87
83
  client = c;
88
84
  });
89
85
 
90
- const createHttpDownloadStream = async (
91
- fileUrl: string,
92
- headers: OutgoingHttpHeaders,
93
- ): Promise<http.IncomingMessage> => {
94
- const { href, protocol } = new URL(fileUrl);
95
- return new Promise((resolve, reject) => {
96
- try {
97
- if (protocol === 'http:') {
98
- http.get(href, { headers }, resolve);
99
- } else {
100
- https.get(href, { headers }, resolve);
101
- }
102
- } catch (e) {
103
- reject(e);
104
- }
105
- });
106
- };
107
-
108
86
  const getObjectStats = async (fileName: string) => {
109
87
  if (!client) throw new Error('Minio not connected, check env variables');
110
88
 
@@ -126,11 +104,16 @@ export const MinioAdapter: IFileAdapter = {
126
104
 
127
105
  ...FileAdapter,
128
106
 
107
+ async createDownloadURL(file) {
108
+ if (file.meta?.isPrivate) throw new Error("Minio Plugin doesn't support private files yet");
109
+ return generateMinioUrl(file.name, file._id);
110
+ },
111
+
129
112
  async createSignedURL(directoryName, fileName) {
130
113
  if (!client) throw new Error('Minio not connected, check env variables');
131
114
 
132
115
  const expiryDate = resolveExpirationDate();
133
- const _id = buildHashedFilename(directoryName, fileName, expiryDate);
116
+ const _id = await buildHashedFilename(directoryName, fileName, expiryDate);
134
117
 
135
118
  const url = await client.presignedPutObject(
136
119
  MINIO_BUCKET_NAME,
@@ -173,7 +156,7 @@ export const MinioAdapter: IFileAdapter = {
173
156
  stream = bufferToStream(Buffer.from(rawFile.buffer, 'base64'));
174
157
  }
175
158
 
176
- const _id = buildHashedFilename(directoryName, fileName, new Date());
159
+ const _id = await buildHashedFilename(directoryName, fileName, new Date());
177
160
  const type = mimeType.lookup(fileName) || (await Promise.resolve(rawFile)).mimetype;
178
161
 
179
162
  const metaData = {
@@ -206,11 +189,12 @@ export const MinioAdapter: IFileAdapter = {
206
189
 
207
190
  const { href } = new URL(fileLink);
208
191
  const fileName = fname || href.split('/').pop();
209
- const hashedFilename = buildHashedFilename(directoryName, fileName, new Date());
210
-
211
- const stream = await createHttpDownloadStream(fileLink, headers);
212
- const type = mimeType.lookup(fileName) || stream.headers['content-type'];
192
+ const hashedFilename = await buildHashedFilename(directoryName, fileName, new Date());
213
193
 
194
+ const url = new URL(fileLink);
195
+ const response = await fetch(url, { headers });
196
+ const type = mimeType.lookup(fileName) || response.headers['content-type'];
197
+ const readable = Readable.fromWeb(response.body as ReadableStream<Uint8Array<ArrayBufferLike>>);
214
198
  const metaData = {
215
199
  'Content-Type': type,
216
200
  };
@@ -218,7 +202,7 @@ export const MinioAdapter: IFileAdapter = {
218
202
  await client.putObject(
219
203
  MINIO_BUCKET_NAME,
220
204
  generateMinioPath(directoryName, hashedFilename),
221
- stream,
205
+ readable,
222
206
  undefined,
223
207
  metaData,
224
208
  );
@@ -1,4 +1,6 @@
1
- import { log, LogLevel } from '@unchainedshop/logger';
1
+ import { createLogger } from '@unchainedshop/logger';
2
+
3
+ const logger = createLogger('unchained:plugins:minio');
2
4
 
3
5
  const { MINIO_WEBHOOK_AUTH_TOKEN } = process.env;
4
6
 
@@ -18,7 +20,7 @@ export const minioHandler = async (req, res) => {
18
20
  const { size, contentType: type } = object;
19
21
  const [fileId] = object.key.split('.');
20
22
  const { services } = req.unchainedContext;
21
- await services.files.linkFile({ fileId, type, size }, req.unchainedContext);
23
+ await services.files.linkFile({ fileId, type, size });
22
24
  res.writeHead(200);
23
25
  res.end();
24
26
  return;
@@ -27,7 +29,7 @@ export const minioHandler = async (req, res) => {
27
29
  res.writeHead(404);
28
30
  res.end();
29
31
  } catch (e) {
30
- log(e.message, { level: LogLevel.Error });
32
+ logger.error(e);
31
33
  res.writeHead(503);
32
34
  res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
33
35
  }
@@ -1,8 +1,7 @@
1
- import { FilterDirector, FilterAdapter } from '@unchainedshop/core-filters';
2
- import { IFilterAdapter } from '@unchainedshop/core-filters';
3
1
  import { mongodb } from '@unchainedshop/mongodb';
4
2
  import { ProductText } from '@unchainedshop/core-products';
5
3
  import { AssortmentText } from '@unchainedshop/core-assortments';
4
+ import { FilterDirector, FilterAdapter, IFilterAdapter } from '@unchainedshop/core';
6
5
 
7
6
  function escapeStringRegexp(string) {
8
7
  if (typeof string !== 'string') {
@@ -1,5 +1,4 @@
1
- import { IFilterAdapter } from '@unchainedshop/core-filters';
2
- import { FilterDirector, FilterAdapter } from '@unchainedshop/core-filters';
1
+ import { IFilterAdapter, FilterDirector, FilterAdapter } from '@unchainedshop/core';
3
2
 
4
3
  const StrictQualFilter: IFilterAdapter = {
5
4
  ...FilterAdapter,