@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.
- package/lib/delivery/pick-mup.js +1 -2
- package/lib/delivery/pick-mup.js.map +1 -1
- package/lib/delivery/post.js +2 -1
- package/lib/delivery/post.js.map +1 -1
- package/lib/delivery/send-message.js +2 -1
- package/lib/delivery/send-message.js.map +1 -1
- package/lib/delivery/stores.js +2 -1
- package/lib/delivery/stores.js.map +1 -1
- package/lib/enrollments/licensed.d.ts.map +1 -1
- package/lib/enrollments/licensed.js +1 -1
- package/lib/enrollments/licensed.js.map +1 -1
- package/lib/events/aws-eventbridge.d.ts +2 -0
- package/lib/events/aws-eventbridge.d.ts.map +1 -0
- package/lib/events/aws-eventbridge.js +36 -0
- package/lib/events/aws-eventbridge.js.map +1 -0
- package/lib/events/node-event-emitter.js +2 -3
- package/lib/events/node-event-emitter.js.map +1 -1
- package/lib/events/redis.js +4 -2
- package/lib/events/redis.js.map +1 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts +7 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts.map +1 -1
- package/lib/files/gridfs/gridfs-adapter.js +16 -8
- package/lib/files/gridfs/gridfs-adapter.js.map +1 -1
- package/lib/files/gridfs/gridfs-webhook.d.ts +1 -1
- package/lib/files/gridfs/gridfs-webhook.d.ts.map +1 -1
- package/lib/files/gridfs/gridfs-webhook.js +27 -8
- package/lib/files/gridfs/gridfs-webhook.js.map +1 -1
- package/lib/files/gridfs/index.d.ts +1 -0
- package/lib/files/gridfs/index.d.ts.map +1 -1
- package/lib/files/gridfs/sign.d.ts +1 -1
- package/lib/files/gridfs/sign.d.ts.map +1 -1
- package/lib/files/gridfs/sign.js +8 -7
- package/lib/files/gridfs/sign.js.map +1 -1
- package/lib/files/minio/minio-adapter.d.ts.map +1 -1
- package/lib/files/minio/minio-adapter.js +19 -32
- package/lib/files/minio/minio-adapter.js.map +1 -1
- package/lib/files/minio/minio-webhook.d.ts.map +1 -1
- package/lib/files/minio/minio-webhook.js +4 -3
- package/lib/files/minio/minio-webhook.js.map +1 -1
- package/lib/filters/local-search.d.ts +1 -1
- package/lib/filters/local-search.d.ts.map +1 -1
- package/lib/filters/local-search.js +1 -1
- package/lib/filters/local-search.js.map +1 -1
- package/lib/filters/strict-equal.js +1 -1
- package/lib/filters/strict-equal.js.map +1 -1
- package/lib/payment/apple-iap/adapter.d.ts.map +1 -1
- package/lib/payment/apple-iap/adapter.js +16 -21
- package/lib/payment/apple-iap/adapter.js.map +1 -1
- package/lib/payment/apple-iap/db/AppleTransactionsCollection.d.ts +1 -1
- package/lib/payment/apple-iap/db/AppleTransactionsCollection.d.ts.map +1 -1
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts +1 -1
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts.map +1 -1
- package/lib/payment/braintree.js +10 -8
- package/lib/payment/braintree.js.map +1 -1
- package/lib/payment/cryptopay/db/CryptopayTransactions.d.ts +1 -1
- package/lib/payment/cryptopay/db/CryptopayTransactions.d.ts.map +1 -1
- package/lib/payment/cryptopay/middleware.d.ts.map +1 -1
- package/lib/payment/cryptopay/middleware.js +4 -4
- package/lib/payment/cryptopay/middleware.js.map +1 -1
- package/lib/payment/cryptopay/plugin.d.ts +1 -1
- package/lib/payment/cryptopay/plugin.d.ts.map +1 -1
- package/lib/payment/cryptopay/plugin.js +8 -9
- package/lib/payment/cryptopay/plugin.js.map +1 -1
- package/lib/payment/datatrans-v2/api/authorize.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/authorize.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/authorizeAuthenticated.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/authorizeAuthenticated.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/cancel.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/cancel.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/init.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/init.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.js +5 -10
- package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -1
- package/lib/payment/datatrans-v2/api/secureFields.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/secureFields.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/settle.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/settle.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/status.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/status.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/types.d.ts +260 -0
- package/lib/payment/datatrans-v2/api/types.d.ts.map +1 -0
- package/lib/payment/datatrans-v2/api/types.js +2 -0
- package/lib/payment/datatrans-v2/api/types.js.map +1 -0
- package/lib/payment/datatrans-v2/api/validate.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/validate.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/generateSignature.d.ts +1 -1
- package/lib/payment/datatrans-v2/generateSignature.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/generateSignature.js +7 -4
- package/lib/payment/datatrans-v2/generateSignature.js.map +1 -1
- package/lib/payment/datatrans-v2/index.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/index.js +31 -29
- package/lib/payment/datatrans-v2/index.js.map +1 -1
- package/lib/payment/datatrans-v2/middleware.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/middleware.js +7 -5
- package/lib/payment/datatrans-v2/middleware.js.map +1 -1
- package/lib/payment/datatrans-v2/parseRegistrationData.d.ts +4 -4
- package/lib/payment/datatrans-v2/parseRegistrationData.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/parseRegistrationData.js +5 -3
- package/lib/payment/datatrans-v2/parseRegistrationData.js.map +1 -1
- package/lib/payment/datatrans-v2/roundedAmountFromOrder.d.ts +1 -2
- package/lib/payment/datatrans-v2/roundedAmountFromOrder.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/roundedAmountFromOrder.js +6 -2
- package/lib/payment/datatrans-v2/roundedAmountFromOrder.js.map +1 -1
- package/lib/payment/datatrans-v2/splitProperties.d.ts +0 -1
- package/lib/payment/datatrans-v2/splitProperties.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/splitProperties.js +0 -3
- package/lib/payment/datatrans-v2/splitProperties.js.map +1 -1
- package/lib/payment/invoice-prepaid.js +4 -3
- package/lib/payment/invoice-prepaid.js.map +1 -1
- package/lib/payment/invoice.js +4 -3
- package/lib/payment/invoice.js.map +1 -1
- package/lib/payment/paypal-checkout.js +10 -6
- package/lib/payment/paypal-checkout.js.map +1 -1
- package/lib/payment/payrexx/api/makeFetcher.d.ts.map +1 -1
- package/lib/payment/payrexx/api/makeFetcher.js +9 -15
- package/lib/payment/payrexx/api/makeFetcher.js.map +1 -1
- package/lib/payment/payrexx/index.d.ts.map +1 -1
- package/lib/payment/payrexx/index.js +20 -14
- package/lib/payment/payrexx/index.js.map +1 -1
- package/lib/payment/payrexx/middleware.d.ts.map +1 -1
- package/lib/payment/payrexx/middleware.js +12 -9
- package/lib/payment/payrexx/middleware.js.map +1 -1
- package/lib/payment/postfinance-checkout/index.d.ts.map +1 -1
- package/lib/payment/postfinance-checkout/index.js +18 -13
- package/lib/payment/postfinance-checkout/index.js.map +1 -1
- package/lib/payment/postfinance-checkout/middleware.d.ts.map +1 -1
- package/lib/payment/postfinance-checkout/middleware.js +4 -3
- package/lib/payment/postfinance-checkout/middleware.js.map +1 -1
- package/lib/payment/postfinance-checkout/utils.d.ts +2 -2
- package/lib/payment/postfinance-checkout/utils.d.ts.map +1 -1
- package/lib/payment/postfinance-checkout/utils.js +6 -2
- package/lib/payment/postfinance-checkout/utils.js.map +1 -1
- package/lib/payment/saferpay/adapter.d.ts +1 -1
- package/lib/payment/saferpay/adapter.d.ts.map +1 -1
- package/lib/payment/saferpay/adapter.js +17 -11
- package/lib/payment/saferpay/adapter.js.map +1 -1
- package/lib/payment/saferpay/api/api/SaferpayConnection.d.ts.map +1 -1
- package/lib/payment/saferpay/api/api/SaferpayConnection.js +0 -1
- package/lib/payment/saferpay/api/api/SaferpayConnection.js.map +1 -1
- package/lib/payment/saferpay/api/models/TransactionCapture.d.ts +1 -1
- package/lib/payment/saferpay/api/models/TransactionCapture.d.ts.map +1 -1
- package/lib/payment/saferpay/db/SaferpayTransactionsCollection.d.ts +1 -1
- package/lib/payment/saferpay/db/SaferpayTransactionsCollection.d.ts.map +1 -1
- package/lib/payment/saferpay/middleware.d.ts.map +1 -1
- package/lib/payment/saferpay/middleware.js +4 -4
- package/lib/payment/saferpay/middleware.js.map +1 -1
- package/lib/payment/stripe/index.d.ts.map +1 -1
- package/lib/payment/stripe/index.js +17 -11
- package/lib/payment/stripe/index.js.map +1 -1
- package/lib/payment/stripe/middleware.d.ts.map +1 -1
- package/lib/payment/stripe/middleware.js +10 -10
- package/lib/payment/stripe/middleware.js.map +1 -1
- package/lib/payment/stripe/stripe.d.ts +3 -4
- package/lib/payment/stripe/stripe.d.ts.map +1 -1
- package/lib/payment/stripe/stripe.js +3 -1
- package/lib/payment/stripe/stripe.js.map +1 -1
- package/lib/pricing/delivery-swiss-tax.d.ts +1 -1
- package/lib/pricing/delivery-swiss-tax.d.ts.map +1 -1
- package/lib/pricing/delivery-swiss-tax.js +1 -2
- package/lib/pricing/delivery-swiss-tax.js.map +1 -1
- package/lib/pricing/discount-100-off.d.ts +1 -2
- package/lib/pricing/discount-100-off.d.ts.map +1 -1
- package/lib/pricing/discount-100-off.js +1 -1
- package/lib/pricing/discount-100-off.js.map +1 -1
- package/lib/pricing/discount-half-price-manual.d.ts +1 -2
- package/lib/pricing/discount-half-price-manual.d.ts.map +1 -1
- package/lib/pricing/discount-half-price-manual.js +1 -1
- package/lib/pricing/discount-half-price-manual.js.map +1 -1
- package/lib/pricing/discount-half-price.d.ts +1 -2
- package/lib/pricing/discount-half-price.d.ts.map +1 -1
- package/lib/pricing/discount-half-price.js +1 -1
- package/lib/pricing/discount-half-price.js.map +1 -1
- package/lib/pricing/free-delivery.d.ts +1 -1
- package/lib/pricing/free-delivery.d.ts.map +1 -1
- package/lib/pricing/free-delivery.js +1 -1
- package/lib/pricing/free-delivery.js.map +1 -1
- package/lib/pricing/free-payment.d.ts +1 -1
- package/lib/pricing/free-payment.d.ts.map +1 -1
- package/lib/pricing/free-payment.js +1 -1
- package/lib/pricing/free-payment.js.map +1 -1
- package/lib/pricing/order-delivery.d.ts +1 -1
- package/lib/pricing/order-delivery.d.ts.map +1 -1
- package/lib/pricing/order-delivery.js +6 -3
- package/lib/pricing/order-delivery.js.map +1 -1
- package/lib/pricing/order-discount.d.ts +1 -2
- package/lib/pricing/order-discount.d.ts.map +1 -1
- package/lib/pricing/order-discount.js +15 -8
- package/lib/pricing/order-discount.js.map +1 -1
- package/lib/pricing/order-items-discount.js +7 -4
- package/lib/pricing/order-items-discount.js.map +1 -1
- package/lib/pricing/order-items.js +7 -3
- package/lib/pricing/order-items.js.map +1 -1
- package/lib/pricing/order-payment.js +6 -3
- package/lib/pricing/order-payment.js.map +1 -1
- package/lib/pricing/order-round.d.ts +1 -1
- package/lib/pricing/order-round.d.ts.map +1 -1
- package/lib/pricing/order-round.js +1 -2
- package/lib/pricing/order-round.js.map +1 -1
- package/lib/pricing/product-catalog-price.d.ts +2 -2
- package/lib/pricing/product-catalog-price.d.ts.map +1 -1
- package/lib/pricing/product-catalog-price.js +7 -6
- package/lib/pricing/product-catalog-price.js.map +1 -1
- package/lib/pricing/product-discount.js +1 -2
- package/lib/pricing/product-discount.js.map +1 -1
- package/lib/pricing/product-price-rateconversion.d.ts +1 -1
- package/lib/pricing/product-price-rateconversion.d.ts.map +1 -1
- package/lib/pricing/product-price-rateconversion.js +1 -1
- package/lib/pricing/product-price-rateconversion.js.map +1 -1
- package/lib/pricing/product-round.d.ts +1 -1
- package/lib/pricing/product-round.d.ts.map +1 -1
- package/lib/pricing/product-round.js +1 -1
- package/lib/pricing/product-round.js.map +1 -1
- package/lib/pricing/product-swiss-tax.d.ts +4 -3
- package/lib/pricing/product-swiss-tax.d.ts.map +1 -1
- package/lib/pricing/product-swiss-tax.js +1 -2
- package/lib/pricing/product-swiss-tax.js.map +1 -1
- package/lib/quotations/manual.js +1 -1
- package/lib/quotations/manual.js.map +1 -1
- package/lib/warehousing/eth-minter.js +7 -4
- package/lib/warehousing/eth-minter.js.map +1 -1
- package/lib/warehousing/store.js +2 -1
- package/lib/warehousing/store.js.map +1 -1
- package/lib/worker/BaseWorker.d.ts +30 -0
- package/lib/worker/BaseWorker.d.ts.map +1 -0
- package/lib/worker/BaseWorker.js +81 -0
- package/lib/worker/BaseWorker.js.map +1 -0
- package/lib/worker/EventListenerWorker.d.ts +6 -0
- package/lib/worker/EventListenerWorker.d.ts.map +1 -0
- package/lib/worker/EventListenerWorker.js +46 -0
- package/lib/worker/EventListenerWorker.js.map +1 -0
- package/lib/worker/FailedRescheduler.d.ts +15 -0
- package/lib/worker/FailedRescheduler.d.ts.map +1 -0
- package/lib/worker/FailedRescheduler.js +45 -0
- package/lib/worker/FailedRescheduler.js.map +1 -0
- package/lib/worker/IntervalWorker.d.ts +10 -0
- package/lib/worker/IntervalWorker.d.ts.map +1 -0
- package/lib/worker/IntervalWorker.js +37 -0
- package/lib/worker/IntervalWorker.js.map +1 -0
- package/lib/worker/bulk-import.d.ts +1 -1
- package/lib/worker/bulk-import.d.ts.map +1 -1
- package/lib/worker/bulk-import.js +7 -8
- package/lib/worker/bulk-import.js.map +1 -1
- package/lib/worker/email.d.ts.map +1 -1
- package/lib/worker/email.js +18 -19
- package/lib/worker/email.js.map +1 -1
- package/lib/worker/enrollment-order-generator.d.ts.map +1 -1
- package/lib/worker/enrollment-order-generator.js +17 -15
- package/lib/worker/enrollment-order-generator.js.map +1 -1
- package/lib/worker/error-notifications.d.ts +1 -1
- package/lib/worker/error-notifications.d.ts.map +1 -1
- package/lib/worker/error-notifications.js +1 -1
- package/lib/worker/error-notifications.js.map +1 -1
- package/lib/worker/export-token.d.ts +1 -2
- package/lib/worker/export-token.d.ts.map +1 -1
- package/lib/worker/export-token.js +2 -1
- package/lib/worker/export-token.js.map +1 -1
- package/lib/worker/external.d.ts +1 -1
- package/lib/worker/external.d.ts.map +1 -1
- package/lib/worker/external.js +1 -1
- package/lib/worker/external.js.map +1 -1
- package/lib/worker/heartbeat.js +1 -1
- package/lib/worker/heartbeat.js.map +1 -1
- package/lib/worker/http-request.d.ts +1 -1
- package/lib/worker/http-request.d.ts.map +1 -1
- package/lib/worker/http-request.js +1 -5
- package/lib/worker/http-request.js.map +1 -1
- package/lib/worker/message.d.ts +2 -2
- package/lib/worker/message.d.ts.map +1 -1
- package/lib/worker/message.js +1 -5
- package/lib/worker/message.js.map +1 -1
- package/lib/worker/push-notification.js +1 -4
- package/lib/worker/push-notification.js.map +1 -1
- package/lib/worker/sms.js +1 -4
- package/lib/worker/sms.js.map +1 -1
- package/lib/worker/update-coinbase-rates.js +1 -1
- package/lib/worker/update-coinbase-rates.js.map +1 -1
- package/lib/worker/update-ecb-rates.js +1 -1
- package/lib/worker/update-ecb-rates.js.map +1 -1
- package/lib/worker/update-token-ownership.d.ts +1 -1
- package/lib/worker/update-token-ownership.d.ts.map +1 -1
- package/lib/worker/update-token-ownership.js +1 -1
- package/lib/worker/update-token-ownership.js.map +1 -1
- package/lib/worker/zombie-killer.d.ts +8 -2
- package/lib/worker/zombie-killer.d.ts.map +1 -1
- package/lib/worker/zombie-killer.js +12 -9
- package/lib/worker/zombie-killer.js.map +1 -1
- package/package.json +123 -85
- package/src/delivery/pick-mup.ts +2 -3
- package/src/delivery/post.ts +2 -2
- package/src/delivery/send-message.ts +2 -2
- package/src/delivery/stores.ts +2 -2
- package/src/enrollments/licensed.ts +1 -2
- package/src/events/aws-eventbridge.ts +43 -0
- package/src/events/node-event-emitter.ts +2 -3
- package/src/events/redis.ts +4 -2
- package/src/files/gridfs/gridfs-adapter.ts +29 -12
- package/src/files/gridfs/gridfs-webhook.ts +31 -11
- package/src/files/gridfs/index.ts +2 -0
- package/src/files/gridfs/sign.ts +20 -8
- package/src/files/minio/minio-adapter.ts +21 -37
- package/src/files/minio/minio-webhook.ts +5 -3
- package/src/filters/local-search.ts +1 -2
- package/src/filters/strict-equal.ts +1 -2
- package/src/payment/apple-iap/adapter.ts +23 -41
- package/src/payment/apple-iap/db/AppleTransactionsCollection.ts +1 -1
- package/src/payment/apple-iap/module/configureAppleTransactionsModule.ts +1 -1
- package/src/payment/braintree.ts +16 -9
- package/src/payment/cryptopay/db/CryptopayTransactions.ts +1 -1
- package/src/payment/cryptopay/middleware.ts +11 -8
- package/src/payment/cryptopay/plugin.ts +14 -11
- package/src/payment/datatrans-v2/api/authorize.ts +1 -1
- package/src/payment/datatrans-v2/api/authorizeAuthenticated.ts +1 -1
- package/src/payment/datatrans-v2/api/cancel.ts +1 -1
- package/src/payment/datatrans-v2/api/init.ts +1 -1
- package/src/payment/datatrans-v2/api/makeFetcher.ts +8 -12
- package/src/payment/datatrans-v2/api/secureFields.ts +1 -1
- package/src/payment/datatrans-v2/api/settle.ts +1 -1
- package/src/payment/datatrans-v2/api/status.ts +1 -1
- package/src/payment/datatrans-v2/api/validate.ts +1 -1
- package/src/payment/datatrans-v2/generateSignature.test.ts +15 -0
- package/src/payment/datatrans-v2/generateSignature.ts +18 -6
- package/src/payment/datatrans-v2/index.ts +41 -36
- package/src/payment/datatrans-v2/middleware.ts +8 -12
- package/src/payment/datatrans-v2/parseRegistrationData.ts +7 -5
- package/src/payment/datatrans-v2/roundedAmountFromOrder.ts +6 -6
- package/src/payment/datatrans-v2/splitProperties.ts +0 -5
- package/src/payment/invoice-prepaid.ts +4 -4
- package/src/payment/invoice.ts +4 -4
- package/src/payment/paypal-checkout.ts +16 -7
- package/src/payment/payrexx/api/makeFetcher.ts +12 -16
- package/src/payment/payrexx/index.ts +26 -15
- package/src/payment/payrexx/middleware.ts +14 -19
- package/src/payment/postfinance-checkout/index.ts +26 -17
- package/src/payment/postfinance-checkout/middleware.ts +6 -9
- package/src/payment/postfinance-checkout/utils.ts +6 -3
- package/src/payment/saferpay/adapter.ts +23 -13
- package/src/payment/saferpay/api/api/SaferpayConnection.ts +0 -1
- package/src/payment/saferpay/api/models/TransactionCapture.ts +1 -1
- package/src/payment/saferpay/db/SaferpayTransactionsCollection.ts +1 -1
- package/src/payment/saferpay/middleware.ts +6 -10
- package/src/payment/stripe/index.ts +23 -12
- package/src/payment/stripe/middleware.ts +15 -23
- package/src/payment/stripe/stripe.ts +6 -5
- package/src/pricing/delivery-swiss-tax.ts +6 -2
- package/src/pricing/discount-100-off.ts +2 -2
- package/src/pricing/discount-half-price-manual.ts +6 -3
- package/src/pricing/discount-half-price.ts +6 -3
- package/src/pricing/free-delivery.ts +1 -1
- package/src/pricing/free-payment.ts +1 -1
- package/src/pricing/order-delivery.ts +11 -8
- package/src/pricing/order-discount.ts +26 -11
- package/src/pricing/order-items-discount.ts +12 -5
- package/src/pricing/order-items.ts +12 -8
- package/src/pricing/order-payment.ts +11 -8
- package/src/pricing/order-round.ts +6 -2
- package/src/pricing/product-catalog-price.ts +12 -7
- package/src/pricing/product-discount.ts +5 -4
- package/src/pricing/product-price-rateconversion.ts +5 -2
- package/src/pricing/product-round.ts +5 -2
- package/src/pricing/product-swiss-tax.ts +5 -3
- package/src/quotations/manual.ts +1 -2
- package/src/warehousing/eth-minter.ts +11 -10
- package/src/warehousing/store.ts +2 -6
- package/src/worker/BaseWorker.ts +119 -0
- package/src/worker/EventListenerWorker.ts +61 -0
- package/src/worker/FailedRescheduler.ts +80 -0
- package/src/worker/IntervalWorker.ts +54 -0
- package/src/worker/bulk-import.ts +12 -13
- package/src/worker/email.ts +20 -22
- package/src/worker/enrollment-order-generator.ts +25 -34
- package/src/worker/error-notifications.ts +2 -2
- package/src/worker/export-token.ts +2 -8
- package/src/worker/external.ts +1 -2
- package/src/worker/heartbeat.ts +1 -2
- package/src/worker/http-request.ts +1 -8
- package/src/worker/message.ts +2 -6
- package/src/worker/push-notification.ts +1 -6
- package/src/worker/sms.ts +1 -7
- package/src/worker/update-coinbase-rates.ts +1 -3
- package/src/worker/update-ecb-rates.ts +1 -3
- package/src/worker/update-token-ownership.ts +1 -2
- package/src/worker/zombie-killer.ts +23 -23
- package/tests/mock/datatrans/v1/secure-fields.json +4 -0
- package/tests/mock/datatrans/v1/transactions/authorize.json +48 -0
- package/tests/mock/datatrans/v1/transactions/card_check_authorized.json +47 -0
- package/tests/mock/datatrans/v1/transactions/payment_alias_authorized/settle.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_alias_authorized.json +48 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized/cancel.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized/settle.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized.json +48 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount/cancel.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount.json +48 -0
- package/tests/mock/datatrans/v1/transactions/validate.json +1 -0
- package/tests/mock/datatrans/v1/transactions.json +4 -0
- package/tests/mock/payrexx/Gateway/1000001.json +106 -0
- package/tests/mock/payrexx/Gateway.json +24 -0
- package/tests/mock/payrexx/transaction_example1.json +65 -0
- package/tests/mock/payrexx/transaction_example2.json +65 -0
- package/tests/mock/payrexx/transaction_example3.json +94 -0
- package/tsconfig.json +4 -5
- /package/src/payment/datatrans-v2/api/{types.d.ts → types.ts} +0 -0
package/src/delivery/pick-mup.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { DeliveryProviderType
|
|
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`;
|
package/src/delivery/post.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IDeliveryAdapter } from '@unchainedshop/core
|
|
2
|
-
import {
|
|
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
|
|
2
|
-
import {
|
|
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,
|
package/src/delivery/stores.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IDeliveryAdapter } from '@unchainedshop/core
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
19
|
-
setEmitAdapter(adapter);
|
|
18
|
+
setEmitAdapter(NodeEventEmitter());
|
package/src/events/redis.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
32
|
+
if (REDIS_HOST && REDIS_PORT && REDIS_DB) {
|
|
33
|
+
setEmitAdapter(RedisEventEmitter());
|
|
34
|
+
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
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 }
|
|
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 }
|
|
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 }
|
|
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
|
-
|
|
120
|
+
logger.warn(e);
|
|
101
121
|
res.statusCode = 404;
|
|
102
122
|
res.end(e.message);
|
|
103
123
|
} else {
|
|
104
|
-
|
|
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
|
}
|
package/src/files/gridfs/sign.ts
CHANGED
|
@@ -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
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
2
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
+
readable,
|
|
222
206
|
undefined,
|
|
223
207
|
metaData,
|
|
224
208
|
);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
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 }
|
|
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
|
-
|
|
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
|
|
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,
|