@openlup/platform 0.26.0 → 0.27.0

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 (520) hide show
  1. package/CHANGELOG.md +138 -218
  2. package/README.md +229 -16
  3. package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
  4. package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
  5. package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
  6. package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
  7. package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
  8. package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
  9. package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
  10. package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
  11. package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
  12. package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
  13. package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
  14. package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
  15. package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
  16. package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
  17. package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
  18. package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
  19. package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
  20. package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
  21. package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
  22. package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
  23. package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
  24. package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
  25. package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
  26. package/dist/commerce/adapters/managed/oms/types.js +7 -0
  27. package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
  28. package/dist/commerce/checkoutCommandSchemas.js +70 -0
  29. package/dist/commerce/checkoutHelpers.d.ts +21 -0
  30. package/dist/commerce/checkoutHelpers.js +29 -0
  31. package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
  32. package/dist/commerce/checkoutResumeSchemas.js +145 -0
  33. package/dist/commerce/checkoutSchemas.d.ts +158 -0
  34. package/dist/commerce/checkoutSchemas.js +161 -0
  35. package/dist/commerce/commerceReturnsPort.d.ts +97 -0
  36. package/dist/commerce/commerceReturnsPort.js +39 -0
  37. package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
  38. package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
  39. package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
  40. package/dist/commerce/configuratorIntentSchemas.js +43 -0
  41. package/dist/commerce/contractPrimitives.d.ts +50 -0
  42. package/dist/commerce/contractPrimitives.js +25 -0
  43. package/dist/commerce/contracts/availability.d.ts +23 -0
  44. package/dist/commerce/contracts/availability.js +1 -0
  45. package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
  46. package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
  47. package/dist/commerce/contracts/index.d.ts +13 -0
  48. package/dist/commerce/contracts/index.js +1 -0
  49. package/dist/commerce/contracts/intent.d.ts +86 -0
  50. package/dist/commerce/contracts/intent.js +1 -0
  51. package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
  52. package/dist/commerce/contracts/omsTypes.js +1 -0
  53. package/dist/commerce/contracts/order.d.ts +39 -0
  54. package/dist/commerce/contracts/order.js +1 -0
  55. package/dist/commerce/contracts/orderMoney.d.ts +52 -0
  56. package/dist/commerce/contracts/orderMoney.js +1 -0
  57. package/dist/commerce/contracts/ports.d.ts +113 -0
  58. package/dist/commerce/contracts/ports.js +1 -0
  59. package/dist/commerce/contracts/recovery.d.ts +11 -0
  60. package/dist/commerce/contracts/recovery.js +1 -0
  61. package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
  62. package/dist/commerce/contracts/runtimePorts.js +1 -0
  63. package/dist/commerce/contracts/state.d.ts +26 -0
  64. package/dist/commerce/contracts/state.js +43 -0
  65. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
  66. package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
  67. package/dist/commerce/errors.d.ts +18 -0
  68. package/dist/commerce/errors.js +36 -0
  69. package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
  70. package/dist/commerce/fulfillmentEligibility.js +31 -0
  71. package/dist/commerce/index.d.ts +72 -0
  72. package/dist/commerce/index.js +67 -0
  73. package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
  74. package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
  75. package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
  76. package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
  77. package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
  78. package/dist/commerce/model/omsAccountingVisibility.js +118 -0
  79. package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
  80. package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
  81. package/dist/commerce/model/omsCurrency.d.ts +4 -0
  82. package/dist/commerce/model/omsCurrency.js +5 -0
  83. package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
  84. package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
  85. package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
  86. package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
  87. package/dist/commerce/model/omsListTotals.d.ts +13 -0
  88. package/dist/commerce/model/omsListTotals.js +32 -0
  89. package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
  90. package/dist/commerce/model/omsOperationalLadder.js +158 -0
  91. package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
  92. package/dist/commerce/model/omsOrderLineMoney.js +25 -0
  93. package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
  94. package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
  95. package/dist/commerce/model/omsReadModel.d.ts +43 -0
  96. package/dist/commerce/model/omsReadModel.js +211 -0
  97. package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
  98. package/dist/commerce/model/omsReadModelCommunication.js +29 -0
  99. package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
  100. package/dist/commerce/model/omsReadModelHelpers.js +212 -0
  101. package/dist/commerce/model/omsReadModelList.d.ts +33 -0
  102. package/dist/commerce/model/omsReadModelList.js +50 -0
  103. package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
  104. package/dist/commerce/model/omsReadModelListSummary.js +13 -0
  105. package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
  106. package/dist/commerce/model/omsReadModelPricing.js +36 -0
  107. package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
  108. package/dist/commerce/model/omsReadModelProjections.js +1 -0
  109. package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
  110. package/dist/commerce/model/omsReadModelRowCore.js +149 -0
  111. package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
  112. package/dist/commerce/model/omsReadModelRows.js +6 -0
  113. package/dist/commerce/offerAvailability.d.ts +18 -0
  114. package/dist/commerce/offerAvailability.js +53 -0
  115. package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
  116. package/dist/commerce/offerAvailabilitySchemas.js +42 -0
  117. package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
  118. package/dist/commerce/offerEvidenceSchemas.js +13 -0
  119. package/dist/commerce/oms/omsContractBase.d.ts +130 -0
  120. package/dist/commerce/oms/omsContractBase.js +86 -0
  121. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
  122. package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
  123. package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
  124. package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
  125. package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
  126. package/dist/commerce/oms/omsContractRequests.js +118 -0
  127. package/dist/commerce/oms/omsContracts.d.ts +5 -0
  128. package/dist/commerce/oms/omsContracts.js +4 -0
  129. package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
  130. package/dist/commerce/oms/omsControlPlane.js +72 -0
  131. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
  132. package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
  133. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
  134. package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
  135. package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
  136. package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
  137. package/dist/commerce/oms/omsPorts.d.ts +84 -0
  138. package/dist/commerce/oms/omsPorts.js +148 -0
  139. package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
  140. package/dist/commerce/oms/omsPrimitives.js +3 -0
  141. package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
  142. package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
  143. package/dist/commerce/orderDraftErrors.d.ts +13 -0
  144. package/dist/commerce/orderDraftErrors.js +20 -0
  145. package/dist/commerce/orderEmailEligibility.d.ts +54 -0
  146. package/dist/commerce/orderEmailEligibility.js +123 -0
  147. package/dist/commerce/orderEmailLines.d.ts +12 -0
  148. package/dist/commerce/orderEmailLines.js +8 -0
  149. package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
  150. package/dist/commerce/orderFeedbackContracts.js +33 -0
  151. package/dist/commerce/orderMoney.d.ts +6 -0
  152. package/dist/commerce/orderMoney.js +168 -0
  153. package/dist/commerce/orderReviewContracts.d.ts +475 -0
  154. package/dist/commerce/orderReviewContracts.js +94 -0
  155. package/dist/commerce/orderReviewPorts.d.ts +140 -0
  156. package/dist/commerce/orderReviewPorts.js +1 -0
  157. package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
  158. package/dist/commerce/outboxDispatchContracts.js +1 -0
  159. package/dist/commerce/outboxEventSchemas.d.ts +162 -0
  160. package/dist/commerce/outboxEventSchemas.js +164 -0
  161. package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
  162. package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
  163. package/dist/commerce/paymentContinuation.d.ts +4 -0
  164. package/dist/commerce/paymentContinuation.js +4 -0
  165. package/dist/commerce/ports.d.ts +8 -0
  166. package/dist/commerce/ports.js +1 -0
  167. package/dist/commerce/recoveryDestination.d.ts +3 -0
  168. package/dist/commerce/recoveryDestination.js +17 -0
  169. package/dist/commerce/runtimeErrors.d.ts +8 -0
  170. package/dist/commerce/runtimeErrors.js +16 -0
  171. package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
  172. package/dist/commerce/salesChannelEnvelope.js +7 -0
  173. package/dist/commerce/schemas.d.ts +174 -0
  174. package/dist/commerce/schemas.js +84 -0
  175. package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
  176. package/dist/commerce/server/checkoutCompensation.js +32 -0
  177. package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
  178. package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
  179. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
  180. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
  181. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
  182. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
  183. package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
  184. package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
  185. package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
  186. package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
  187. package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
  188. package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
  189. package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
  190. package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
  191. package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
  192. package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
  193. package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
  194. package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
  195. package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
  196. package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
  197. package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
  198. package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
  199. package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
  200. package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
  201. package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
  202. package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
  203. package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
  204. package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
  205. package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
  206. package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
  207. package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
  208. package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
  209. package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
  210. package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
  211. package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
  212. package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
  213. package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
  214. package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
  215. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
  216. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
  217. package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
  218. package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
  219. package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
  220. package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
  221. package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
  222. package/dist/commerce/server/commerceCheckoutResume.js +81 -0
  223. package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
  224. package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
  225. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
  226. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
  227. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
  228. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
  229. package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
  230. package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
  231. package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
  232. package/dist/commerce/server/commerceDiagnostics.js +31 -0
  233. package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
  234. package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
  235. package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
  236. package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
  237. package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
  238. package/dist/commerce/server/commerceOmsHandlers.js +176 -0
  239. package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
  240. package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
  241. package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
  242. package/dist/commerce/server/commerceOrderDraft.js +92 -0
  243. package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
  244. package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
  245. package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
  246. package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
  247. package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
  248. package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
  249. package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
  250. package/dist/commerce/server/commerceRuntimePort.js +57 -0
  251. package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
  252. package/dist/commerce/server/commerceRuntimeService.js +186 -0
  253. package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
  254. package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
  255. package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
  256. package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
  257. package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
  258. package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
  259. package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
  260. package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
  261. package/dist/commerce/server/emailRuntime.d.ts +47 -0
  262. package/dist/commerce/server/emailRuntime.js +1 -0
  263. package/dist/commerce/server/handlerSupport.d.ts +68 -0
  264. package/dist/commerce/server/handlerSupport.js +1 -0
  265. package/dist/commerce/server/index.d.ts +178 -0
  266. package/dist/commerce/server/index.js +127 -0
  267. package/dist/commerce/server/offerAvailability.d.ts +21 -0
  268. package/dist/commerce/server/offerAvailability.js +163 -0
  269. package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
  270. package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
  271. package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
  272. package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
  273. package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
  274. package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
  275. package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
  276. package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
  277. package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
  278. package/dist/commerce/server/orderReviewHandlers.js +42 -0
  279. package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
  280. package/dist/commerce/server/orderReviewLifecycle.js +121 -0
  281. package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
  282. package/dist/commerce/server/orderReviewMedia.js +172 -0
  283. package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
  284. package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
  285. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
  286. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
  287. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
  288. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
  289. package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
  290. package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
  291. package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
  292. package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
  293. package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
  294. package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
  295. package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
  296. package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
  297. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
  298. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
  299. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
  300. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
  301. package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
  302. package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
  303. package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
  304. package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
  305. package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
  306. package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
  307. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
  308. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
  309. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
  310. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
  311. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
  312. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
  313. package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
  314. package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
  315. package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
  316. package/dist/commerce/server/reservationSweepPort.js +45 -0
  317. package/dist/commerce/server/starterTermsPort.d.ts +22 -0
  318. package/dist/commerce/server/starterTermsPort.js +1 -0
  319. package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
  320. package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
  321. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  322. package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
  323. package/dist/composition/commerceContribution.d.ts +21 -0
  324. package/dist/composition/commerceContribution.js +27 -0
  325. package/dist/composition/index.d.ts +1 -0
  326. package/dist/composition/index.js +1 -0
  327. package/dist/fulfillment/handlerSchemas.d.ts +41 -41
  328. package/dist/fulfillment/index.d.ts +1 -1
  329. package/dist/fulfillment/index.js +1 -1
  330. package/dist/fulfillment/paidHandoff.d.ts +12 -1
  331. package/dist/fulfillment/paidHandoff.js +2 -2
  332. package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
  333. package/dist/identity/customerContracts.d.ts +2 -2
  334. package/dist/inventory/bindings.d.ts +3 -0
  335. package/dist/inventory/bindings.js +10 -4
  336. package/dist/inventory/index.d.ts +1 -0
  337. package/dist/inventory/index.js +1 -0
  338. package/dist/inventory/managedStockAvailability.d.ts +15 -0
  339. package/dist/inventory/managedStockAvailability.js +16 -0
  340. package/dist/inventory/postgresStockAvailability.js +2 -25
  341. package/dist/inventory/schemas.d.ts +1 -1
  342. package/dist/inventory/stockReadResponse.d.ts +4 -0
  343. package/dist/inventory/stockReadResponse.js +27 -0
  344. package/dist/pricing/browser/index.d.ts +6 -0
  345. package/dist/pricing/browser/index.js +6 -0
  346. package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
  347. package/dist/subscriptions/index.d.ts +3 -2
  348. package/dist/subscriptions/index.js +3 -2
  349. package/package.json +22 -2
  350. package/release-gates.json +63 -8
  351. package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
  352. package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
  353. package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
  354. package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
  355. package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
  356. package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
  357. package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
  358. package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
  359. package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
  360. package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
  361. package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
  362. package/src/commerce/adapters/managed/oms/types.ts +9 -0
  363. package/src/commerce/checkoutCommandSchemas.ts +93 -0
  364. package/src/commerce/checkoutHelpers.ts +47 -0
  365. package/src/commerce/checkoutResumeSchemas.ts +164 -0
  366. package/src/commerce/checkoutSchemas.ts +182 -0
  367. package/src/commerce/commerceReturnsPort.ts +67 -0
  368. package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
  369. package/src/commerce/configuratorIntentSchemas.ts +47 -0
  370. package/src/commerce/contractPrimitives.ts +30 -0
  371. package/src/commerce/contracts/availability.ts +21 -0
  372. package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
  373. package/src/commerce/contracts/index.ts +17 -0
  374. package/src/commerce/contracts/intent.ts +58 -0
  375. package/src/commerce/contracts/omsTypes.ts +1217 -0
  376. package/src/commerce/contracts/order.ts +44 -0
  377. package/src/commerce/contracts/orderMoney.ts +75 -0
  378. package/src/commerce/contracts/ports.ts +124 -0
  379. package/src/commerce/contracts/recovery.ts +24 -0
  380. package/src/commerce/contracts/runtimePorts.ts +201 -0
  381. package/src/commerce/contracts/state.ts +64 -0
  382. package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
  383. package/src/commerce/errors.ts +53 -0
  384. package/src/commerce/fulfillmentEligibility.ts +32 -0
  385. package/src/commerce/index.ts +82 -0
  386. package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
  387. package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
  388. package/src/commerce/model/omsAccountingVisibility.ts +135 -0
  389. package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
  390. package/src/commerce/model/omsCurrency.ts +8 -0
  391. package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
  392. package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
  393. package/src/commerce/model/omsListTotals.ts +38 -0
  394. package/src/commerce/model/omsOperationalLadder.ts +181 -0
  395. package/src/commerce/model/omsOrderLineMoney.ts +34 -0
  396. package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
  397. package/src/commerce/model/omsReadModel.ts +302 -0
  398. package/src/commerce/model/omsReadModelCommunication.ts +32 -0
  399. package/src/commerce/model/omsReadModelHelpers.ts +279 -0
  400. package/src/commerce/model/omsReadModelList.ts +90 -0
  401. package/src/commerce/model/omsReadModelListSummary.ts +19 -0
  402. package/src/commerce/model/omsReadModelPricing.ts +57 -0
  403. package/src/commerce/model/omsReadModelProjections.ts +1 -0
  404. package/src/commerce/model/omsReadModelRowCore.ts +193 -0
  405. package/src/commerce/model/omsReadModelRows.ts +7 -0
  406. package/src/commerce/offerAvailability.ts +75 -0
  407. package/src/commerce/offerAvailabilitySchemas.ts +56 -0
  408. package/src/commerce/offerEvidenceSchemas.ts +17 -0
  409. package/src/commerce/oms/omsContractBase.ts +92 -0
  410. package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
  411. package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
  412. package/src/commerce/oms/omsContractRequests.ts +143 -0
  413. package/src/commerce/oms/omsContracts.ts +6 -0
  414. package/src/commerce/oms/omsControlPlane.ts +85 -0
  415. package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
  416. package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
  417. package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
  418. package/src/commerce/oms/omsPorts.ts +165 -0
  419. package/src/commerce/oms/omsPrimitives.ts +3 -0
  420. package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
  421. package/src/commerce/orderDraftErrors.ts +28 -0
  422. package/src/commerce/orderEmailEligibility.ts +131 -0
  423. package/src/commerce/orderEmailLines.ts +22 -0
  424. package/src/commerce/orderFeedbackContracts.ts +47 -0
  425. package/src/commerce/orderMoney.ts +207 -0
  426. package/src/commerce/orderReviewContracts.ts +124 -0
  427. package/src/commerce/orderReviewPorts.ts +94 -0
  428. package/src/commerce/outboxDispatchContracts.ts +30 -0
  429. package/src/commerce/outboxEventSchemas.ts +230 -0
  430. package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
  431. package/src/commerce/paymentContinuation.ts +5 -0
  432. package/src/commerce/ports.ts +7 -0
  433. package/src/commerce/recoveryDestination.ts +23 -0
  434. package/src/commerce/runtimeErrors.ts +19 -0
  435. package/src/commerce/salesChannelEnvelope.ts +28 -0
  436. package/src/commerce/schemas.ts +104 -0
  437. package/src/commerce/server/checkoutCompensation.ts +49 -0
  438. package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
  439. package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
  440. package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
  441. package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
  442. package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
  443. package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
  444. package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
  445. package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
  446. package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
  447. package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
  448. package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
  449. package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
  450. package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
  451. package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
  452. package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
  453. package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
  454. package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
  455. package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
  456. package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
  457. package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
  458. package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
  459. package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
  460. package/src/commerce/server/commerceCheckoutResume.ts +132 -0
  461. package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
  462. package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
  463. package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
  464. package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
  465. package/src/commerce/server/commerceDiagnostics.ts +37 -0
  466. package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
  467. package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
  468. package/src/commerce/server/commerceOmsHandlers.ts +275 -0
  469. package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
  470. package/src/commerce/server/commerceOrderDraft.ts +131 -0
  471. package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
  472. package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
  473. package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
  474. package/src/commerce/server/commerceRuntimePort.ts +75 -0
  475. package/src/commerce/server/commerceRuntimeService.ts +229 -0
  476. package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
  477. package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
  478. package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
  479. package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
  480. package/src/commerce/server/emailRuntime.ts +30 -0
  481. package/src/commerce/server/handlerSupport.ts +22 -0
  482. package/src/commerce/server/index.ts +181 -0
  483. package/src/commerce/server/offerAvailability.ts +275 -0
  484. package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
  485. package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
  486. package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
  487. package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
  488. package/src/commerce/server/orderReviewHandlers.ts +57 -0
  489. package/src/commerce/server/orderReviewLifecycle.ts +129 -0
  490. package/src/commerce/server/orderReviewMedia.ts +170 -0
  491. package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
  492. package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
  493. package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
  494. package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
  495. package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
  496. package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
  497. package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
  498. package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
  499. package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
  500. package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
  501. package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
  502. package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
  503. package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
  504. package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
  505. package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
  506. package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
  507. package/src/commerce/server/reservationSweepPort.ts +67 -0
  508. package/src/commerce/server/starterTermsPort.ts +22 -0
  509. package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
  510. package/src/composition/commerceContribution.ts +35 -0
  511. package/src/composition/index.ts +1 -0
  512. package/src/fulfillment/index.ts +1 -1
  513. package/src/fulfillment/paidHandoff.ts +2 -2
  514. package/src/inventory/bindings.ts +12 -4
  515. package/src/inventory/index.ts +1 -0
  516. package/src/inventory/managedStockAvailability.ts +23 -0
  517. package/src/inventory/postgresStockAvailability.ts +2 -21
  518. package/src/inventory/stockReadResponse.ts +25 -0
  519. package/src/pricing/browser/index.ts +6 -0
  520. package/src/subscriptions/index.ts +3 -2
@@ -0,0 +1,40 @@
1
+ import type { HttpRequest, HttpResponse } from "../../http/index.js";
2
+ export type OrderReviewMediaMime = "image/jpeg" | "image/png" | "image/webp";
3
+ export interface OrderReviewRawUploadSession {
4
+ upload(input: {
5
+ body: AsyncIterable<Uint8Array>;
6
+ signal: AbortSignal;
7
+ }): Promise<OrderReviewRawUploadResult>;
8
+ }
9
+ export interface OrderReviewRawUploadBinding {
10
+ admit(input: {
11
+ capabilityDigest: string;
12
+ declaredMime: OrderReviewMediaMime;
13
+ declaredBytes: number;
14
+ }): Promise<OrderReviewRawUploadSession | OrderReviewRawUploadResult>;
15
+ }
16
+ export type OrderReviewRawUploadResult = {
17
+ kind: "complete";
18
+ status: 200 | 201;
19
+ mediaRef: string;
20
+ } | {
21
+ kind: "refused";
22
+ status: 404 | 409 | 413 | 415 | 503;
23
+ code: string;
24
+ };
25
+ export type OrderReviewRawUploadBindingState = {
26
+ kind: "direct";
27
+ binding: OrderReviewRawUploadBinding;
28
+ } | {
29
+ kind: "hosted";
30
+ } | {
31
+ kind: "unbound";
32
+ };
33
+ export declare function createOrderReviewRawUploadHandler(options: {
34
+ resolveBinding: () => OrderReviewRawUploadBindingState | Promise<OrderReviewRawUploadBindingState>;
35
+ timeoutMs?: number;
36
+ }): (req: HttpRequest, res: HttpResponse) => Promise<void>;
37
+ export declare function inspectImageHeader(mime: OrderReviewMediaMime, bytes: Uint8Array, declaredBytes: number): {
38
+ width: number;
39
+ height: number;
40
+ } | null;
@@ -0,0 +1,316 @@
1
+ import { createHash } from "node:crypto";
2
+ import { crc32 } from "node:zlib";
3
+ const MAX_UPLOAD_BYTES = 20 * 1024 * 1024;
4
+ const MAX_IMAGE_HEADER_BYTES = 64 * 1024;
5
+ const MAX_DIMENSION = 8192;
6
+ const MAX_PIXELS = 40_000_000;
7
+ const CAPABILITY_HEADER = "authorization";
8
+ const ALLOWED_MIME = new Set(["image/jpeg", "image/png", "image/webp"]);
9
+ export function createOrderReviewRawUploadHandler(options) {
10
+ return async function orderReviewRawUpload(req, res) {
11
+ if (req.method !== "PUT")
12
+ return sendError(res, 405, "METHOD_NOT_ALLOWED");
13
+ let state;
14
+ try {
15
+ state = await options.resolveBinding();
16
+ }
17
+ catch {
18
+ return sendError(res, 503, "ORDER_REVIEW_MEDIA_UNAVAILABLE");
19
+ }
20
+ if (state.kind === "hosted")
21
+ return sendError(res, 405, "METHOD_NOT_ALLOWED");
22
+ if (state.kind === "unbound")
23
+ return sendError(res, 503, "ORDER_REVIEW_MEDIA_UNAVAILABLE");
24
+ let headers;
25
+ try {
26
+ headers = validateHeaders(req);
27
+ }
28
+ catch (error) {
29
+ const input = asInputError(error);
30
+ return sendError(res, input.status, input.code);
31
+ }
32
+ let admission;
33
+ try {
34
+ admission = await state.binding.admit({
35
+ capabilityDigest: headers.capabilityDigest,
36
+ declaredMime: headers.mime,
37
+ declaredBytes: headers.bytes,
38
+ });
39
+ }
40
+ catch {
41
+ return sendError(res, 503, "ORDER_REVIEW_MEDIA_UNAVAILABLE");
42
+ }
43
+ if (isResult(admission)) {
44
+ if (admission.kind === "refused")
45
+ req.resume();
46
+ return sendResult(res, admission);
47
+ }
48
+ const abort = new AbortController();
49
+ const timeout = setTimeout(() => {
50
+ abort.abort(new Error("raw upload deadline exceeded"));
51
+ req.destroy();
52
+ }, options.timeoutMs ?? 30_000);
53
+ timeout.unref?.();
54
+ const onAborted = () => abort.abort(new Error("raw upload aborted"));
55
+ req.once("aborted", onAborted);
56
+ try {
57
+ const result = await admission.upload({
58
+ body: validatedImageBody(req, headers.mime, headers.bytes, abort.signal),
59
+ signal: abort.signal,
60
+ });
61
+ return sendResult(res, result);
62
+ }
63
+ catch (error) {
64
+ if (error instanceof InputError)
65
+ return sendError(res, error.status, error.code);
66
+ if (abort.signal.aborted)
67
+ return sendError(res, 400, "UPLOAD_ABORTED");
68
+ return sendError(res, 503, "ORDER_REVIEW_MEDIA_UNAVAILABLE");
69
+ }
70
+ finally {
71
+ clearTimeout(timeout);
72
+ req.off("aborted", onAborted);
73
+ }
74
+ };
75
+ }
76
+ function validateHeaders(req) {
77
+ if (headerValues(req, "transfer-encoding").length > 0)
78
+ fail(400, "TRANSFER_ENCODING_REFUSED");
79
+ if (headerValues(req, "content-encoding").length > 0)
80
+ fail(400, "CONTENT_ENCODING_REFUSED");
81
+ if (headerValues(req, "range").length > 0)
82
+ fail(400, "RANGE_REFUSED");
83
+ const lengths = headerValues(req, "content-length");
84
+ if (lengths.length !== 1 || !/^[1-9][0-9]*$/.test(lengths[0]) || lengths[0].includes(",")) {
85
+ fail(400, "INVALID_CONTENT_LENGTH");
86
+ }
87
+ const bytes = Number(lengths[0]);
88
+ if (!Number.isSafeInteger(bytes))
89
+ fail(400, "INVALID_CONTENT_LENGTH");
90
+ if (bytes > MAX_UPLOAD_BYTES)
91
+ fail(413, "UPLOAD_TOO_LARGE");
92
+ const contentTypes = headerValues(req, "content-type");
93
+ if (contentTypes.length !== 1 || contentTypes[0].includes(";") || contentTypes[0].includes(",")) {
94
+ fail(415, "UNSUPPORTED_MEDIA_TYPE");
95
+ }
96
+ const mime = contentTypes[0].trim().toLowerCase();
97
+ if (!ALLOWED_MIME.has(mime))
98
+ fail(415, "UNSUPPORTED_MEDIA_TYPE");
99
+ const authorizations = headerValues(req, CAPABILITY_HEADER);
100
+ if (authorizations.length !== 1)
101
+ fail(404, "ORDER_REVIEW_MEDIA_NOT_FOUND");
102
+ const match = /^Bearer (order-review-upload:[a-f0-9-]{36})$/.exec(authorizations[0]);
103
+ if (!match)
104
+ fail(404, "ORDER_REVIEW_MEDIA_NOT_FOUND");
105
+ const capabilityDigest = createHash("sha256").update(match[1], "utf8").digest("hex");
106
+ return { capabilityDigest, mime: mime, bytes };
107
+ }
108
+ function headerValues(req, name) {
109
+ const values = [];
110
+ const raw = req.rawHeaders ?? [];
111
+ for (let index = 0; index < raw.length; index += 2) {
112
+ if (raw[index]?.toLowerCase() === name)
113
+ values.push(raw[index + 1] ?? "");
114
+ }
115
+ if (values.length > 0)
116
+ return values;
117
+ const fallback = req.headers[name];
118
+ if (fallback === undefined)
119
+ return [];
120
+ return Array.isArray(fallback) ? fallback : [String(fallback)];
121
+ }
122
+ async function* validatedImageBody(source, mime, declaredBytes, signal) {
123
+ const header = Buffer.alloc(MAX_IMAGE_HEADER_BYTES);
124
+ const pending = [];
125
+ let headerBytes = 0;
126
+ let seen = 0;
127
+ let accepted = false;
128
+ for await (const value of source) {
129
+ if (signal.aborted)
130
+ fail(400, "UPLOAD_ABORTED");
131
+ const chunk = toBytes(value);
132
+ seen += chunk.byteLength;
133
+ if (seen > declaredBytes || seen > MAX_UPLOAD_BYTES)
134
+ fail(413, "UPLOAD_TOO_LARGE");
135
+ if (!accepted) {
136
+ pending.push(chunk);
137
+ const copyBytes = Math.min(chunk.byteLength, header.byteLength - headerBytes);
138
+ if (copyBytes > 0) {
139
+ header.set(chunk.subarray(0, copyBytes), headerBytes);
140
+ headerBytes += copyBytes;
141
+ }
142
+ const dimensions = inspectImageHeader(mime, header.subarray(0, headerBytes), declaredBytes);
143
+ if (dimensions) {
144
+ assertDimensions(dimensions.width, dimensions.height);
145
+ accepted = true;
146
+ for (const buffered of pending)
147
+ yield buffered;
148
+ pending.length = 0;
149
+ }
150
+ else if (headerBytes === MAX_IMAGE_HEADER_BYTES) {
151
+ fail(415, "INVALID_IMAGE");
152
+ }
153
+ }
154
+ else {
155
+ yield chunk;
156
+ }
157
+ }
158
+ if (signal.aborted)
159
+ fail(400, "UPLOAD_ABORTED");
160
+ if (seen !== declaredBytes)
161
+ fail(400, "CONTENT_LENGTH_MISMATCH");
162
+ if (!accepted)
163
+ fail(415, "INVALID_IMAGE");
164
+ }
165
+ export function inspectImageHeader(mime, bytes, declaredBytes) {
166
+ if (mime === "image/png") {
167
+ if (bytes.length < 33) {
168
+ if (bytes.length === declaredBytes)
169
+ fail(415, "INVALID_IMAGE");
170
+ return null;
171
+ }
172
+ if (!matches(bytes, 0, [137, 80, 78, 71, 13, 10, 26, 10]) || readU32BE(bytes, 8) !== 13
173
+ || ascii(bytes, 12, 4) !== "IHDR" || declaredBytes < 57 || crc32(bytes.subarray(12, 29)) !== readU32BE(bytes, 29)) {
174
+ fail(415, "INVALID_IMAGE");
175
+ }
176
+ const depths = { 0: [1, 2, 4, 8, 16], 2: [8, 16], 3: [1, 2, 4, 8], 4: [8, 16], 6: [8, 16] };
177
+ if (!depths[bytes[25]]?.includes(bytes[24]) || bytes[26] !== 0 || bytes[27] !== 0 || bytes[28] > 1)
178
+ fail(415, "INVALID_IMAGE");
179
+ return { width: readU32BE(bytes, 16), height: readU32BE(bytes, 20) };
180
+ }
181
+ if (mime === "image/webp")
182
+ return inspectWebp(bytes, declaredBytes);
183
+ return inspectJpeg(bytes);
184
+ }
185
+ function inspectWebp(bytes, declaredBytes) {
186
+ if (bytes.length < 16)
187
+ return null;
188
+ if (ascii(bytes, 0, 4) !== "RIFF" || ascii(bytes, 8, 4) !== "WEBP")
189
+ fail(415, "INVALID_IMAGE");
190
+ if (readU32LE(bytes, 4) + 8 !== declaredBytes)
191
+ fail(415, "INVALID_IMAGE");
192
+ const kind = ascii(bytes, 12, 4);
193
+ const chunkBytes = readU32LE(bytes, 16);
194
+ if (kind === "VP8X") {
195
+ if (bytes.length < 38) {
196
+ if (bytes.length === declaredBytes)
197
+ fail(415, "INVALID_IMAGE");
198
+ return null;
199
+ }
200
+ if (chunkBytes !== 10 || !["VP8 ", "VP8L", "ALPH"].includes(ascii(bytes, 30, 4)))
201
+ fail(415, "INVALID_IMAGE");
202
+ return { width: 1 + readU24LE(bytes, 24), height: 1 + readU24LE(bytes, 27) };
203
+ }
204
+ if (kind === "VP8L") {
205
+ if (bytes.length < 25)
206
+ return null;
207
+ if (bytes[20] !== 0x2f || chunkBytes < 6 || 20 + chunkBytes + (chunkBytes & 1) !== declaredBytes)
208
+ fail(415, "INVALID_IMAGE");
209
+ return {
210
+ width: 1 + (((bytes[22] & 0x3f) << 8) | bytes[21]),
211
+ height: 1 + (((bytes[24] & 0x0f) << 10) | (bytes[23] << 2) | ((bytes[22] & 0xc0) >> 6)),
212
+ };
213
+ }
214
+ if (kind === "VP8 ") {
215
+ if (bytes.length < 30)
216
+ return null;
217
+ if (!matches(bytes, 23, [0x9d, 0x01, 0x2a]) || chunkBytes < 10
218
+ || 20 + chunkBytes + (chunkBytes & 1) !== declaredBytes)
219
+ fail(415, "INVALID_IMAGE");
220
+ return { width: readU16LE(bytes, 26) & 0x3fff, height: readU16LE(bytes, 28) & 0x3fff };
221
+ }
222
+ fail(415, "INVALID_IMAGE");
223
+ }
224
+ function inspectJpeg(bytes) {
225
+ if (bytes.length < 4)
226
+ return null;
227
+ if (bytes[0] !== 0xff || bytes[1] !== 0xd8)
228
+ fail(415, "INVALID_IMAGE");
229
+ let offset = 2;
230
+ while (offset + 3 < bytes.length) {
231
+ if (bytes[offset] !== 0xff)
232
+ fail(415, "INVALID_IMAGE");
233
+ while (bytes[offset] === 0xff)
234
+ offset += 1;
235
+ if (offset >= bytes.length)
236
+ return null;
237
+ const marker = bytes[offset++];
238
+ if (marker === 0xd9 || marker === 0xda)
239
+ fail(415, "INVALID_IMAGE");
240
+ if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7))
241
+ continue;
242
+ if (offset + 1 >= bytes.length)
243
+ return null;
244
+ const length = (bytes[offset] << 8) | bytes[offset + 1];
245
+ if (length < 2)
246
+ fail(415, "INVALID_IMAGE");
247
+ if (isStartOfFrame(marker)) {
248
+ if (length < 11)
249
+ fail(415, "INVALID_IMAGE");
250
+ if (offset + length > bytes.length)
251
+ return null;
252
+ const components = bytes[offset + 7];
253
+ if (bytes[offset + 2] !== 8 || components < 1 || components > 4 || length !== 8 + 3 * components)
254
+ fail(415, "INVALID_IMAGE");
255
+ return {
256
+ height: (bytes[offset + 3] << 8) | bytes[offset + 4],
257
+ width: (bytes[offset + 5] << 8) | bytes[offset + 6],
258
+ };
259
+ }
260
+ if (offset + length > bytes.length)
261
+ return null;
262
+ offset += length;
263
+ }
264
+ return null;
265
+ }
266
+ function isStartOfFrame(marker) {
267
+ return marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker);
268
+ }
269
+ function assertDimensions(width, height) {
270
+ if (width < 1 || height < 1 || width > MAX_DIMENSION || height > MAX_DIMENSION || width * height > MAX_PIXELS) {
271
+ fail(415, "INVALID_IMAGE_DIMENSIONS");
272
+ }
273
+ }
274
+ function toBytes(value) {
275
+ if (typeof value === "string")
276
+ return Buffer.from(value);
277
+ if (value instanceof Uint8Array)
278
+ return value;
279
+ fail(400, "INVALID_BODY_CHUNK");
280
+ }
281
+ class InputError extends Error {
282
+ status;
283
+ code;
284
+ constructor(status, code) {
285
+ super(code);
286
+ this.status = status;
287
+ this.code = code;
288
+ }
289
+ }
290
+ function fail(status, code) { throw new InputError(status, code); }
291
+ function asInputError(error) {
292
+ return error instanceof InputError ? error : new InputError(400, "INVALID_UPLOAD_BODY");
293
+ }
294
+ function isResult(value) {
295
+ return "kind" in value;
296
+ }
297
+ function sendResult(res, result) {
298
+ if (result.kind === "complete") {
299
+ res.status(result.status).json({ data: { mediaRef: result.mediaRef } });
300
+ }
301
+ else
302
+ sendError(res, result.status, result.code);
303
+ }
304
+ function sendError(res, status, code) {
305
+ res.status(status).json({ error: { code, message: "Order review media request refused" } });
306
+ }
307
+ function matches(bytes, offset, expected) {
308
+ return expected.every((value, index) => bytes[offset + index] === value);
309
+ }
310
+ function ascii(bytes, offset, length) {
311
+ return String.fromCharCode(...bytes.subarray(offset, offset + length));
312
+ }
313
+ function readU16LE(bytes, offset) { return bytes[offset] | (bytes[offset + 1] << 8); }
314
+ function readU24LE(bytes, offset) { return readU16LE(bytes, offset) | (bytes[offset + 2] << 16); }
315
+ function readU32LE(bytes, offset) { return (readU16LE(bytes, offset) | (readU16LE(bytes, offset + 2) << 16)) >>> 0; }
316
+ function readU32BE(bytes, offset) { return ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0; }
@@ -0,0 +1,14 @@
1
+ import type { CommerceEmailRuntime } from "./emailRuntime.js";
2
+ import type { OutboxHandler } from "../outboxDispatchContracts.js";
3
+ import { OUTBOX_CHECKOUT_EXPIRED_TEMPLATE_SLUG, type OrderPaymentLifecyclePort, type OrderRecipientPort, type TransactionalEmailPort } from "../outboxOrderDraftEmailPorts.js";
4
+ export { OUTBOX_CHECKOUT_EXPIRED_TEMPLATE_SLUG };
5
+ export declare const outboxCheckoutExpiredEmailDescriptor: Readonly<{
6
+ eventType: "commerce.checkout.expired";
7
+ timeoutMs: 10000;
8
+ }>;
9
+ export declare function createOutboxCheckoutExpiredEmailHandler<Locale extends string>(deps: {
10
+ runtime: Pick<CommerceEmailRuntime<Locale>, "formatMoney" | "mapSendOutcome" | "parseOutboxPayload" | "resolveLocale">;
11
+ emailPort: TransactionalEmailPort<Locale>;
12
+ recipientPort: OrderRecipientPort;
13
+ lifecyclePort: OrderPaymentLifecyclePort;
14
+ }): OutboxHandler;
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { COMMERCE_CHECKOUT_EXPIRED_EVENT_TYPE } from "../outboxEventSchemas.js";
3
+ import { OUTBOX_CHECKOUT_EXPIRED_TEMPLATE_SLUG, } from "../outboxOrderDraftEmailPorts.js";
4
+ import { shouldSkipCheckoutExpired } from "../orderEmailEligibility.js";
5
+ export { OUTBOX_CHECKOUT_EXPIRED_TEMPLATE_SLUG };
6
+ const HANDLER_TIMEOUT_MS = 10_000;
7
+ export const outboxCheckoutExpiredEmailDescriptor = Object.freeze({
8
+ eventType: COMMERCE_CHECKOUT_EXPIRED_EVENT_TYPE, timeoutMs: HANDLER_TIMEOUT_MS,
9
+ });
10
+ const payloadSubsetSchema = z
11
+ .object({
12
+ orderUuid: z.guid(),
13
+ orderId: z.string().min(1),
14
+ totalCents: z.number().int().nonnegative().optional(),
15
+ currency: z.string().trim().min(1).optional(),
16
+ recoveryToken: z.string().trim().min(1).optional(),
17
+ })
18
+ .passthrough();
19
+ export function createOutboxCheckoutExpiredEmailHandler(deps) {
20
+ return {
21
+ ...outboxCheckoutExpiredEmailDescriptor,
22
+ async handle(row, signal) {
23
+ const parsed = deps.runtime.parseOutboxPayload(payloadSubsetSchema, row.payload);
24
+ if (parsed.ok === false) {
25
+ return parsed.outcome;
26
+ }
27
+ const lifecycle = await deps.lifecyclePort.read(parsed.data.orderUuid, signal);
28
+ const skipReason = shouldSkipCheckoutExpired(lifecycle);
29
+ if (skipReason) {
30
+ return { kind: "processed", detail: { skipped: skipReason } };
31
+ }
32
+ const recipient = await deps.recipientPort.resolve(parsed.data.orderUuid, signal);
33
+ if (recipient === null) {
34
+ return { kind: "processed", detail: { skipped: "recipient_unresolved" } };
35
+ }
36
+ const alreadySent = await deps.emailPort.findExistingSend(OUTBOX_CHECKOUT_EXPIRED_TEMPLATE_SLUG, row.id);
37
+ if (alreadySent) {
38
+ return { kind: "processed", detail: { dedupe: "email_already_sent" } };
39
+ }
40
+ const payload = parsed.data;
41
+ const amountLabel = payload.totalCents !== undefined && payload.currency !== undefined
42
+ ? deps.runtime.formatMoney(payload.totalCents, payload.currency)
43
+ : null;
44
+ const outcome = await deps.emailPort.sendCheckoutExpiredNotice({
45
+ to: recipient.email,
46
+ firstName: recipient.firstName,
47
+ orderId: payload.orderId,
48
+ amountLabel,
49
+ recoveryToken: payload.recoveryToken ?? null,
50
+ outboxEventId: row.id,
51
+ locale: deps.runtime.resolveLocale(recipient.country ?? null),
52
+ signal,
53
+ });
54
+ return deps.runtime.mapSendOutcome(outcome);
55
+ },
56
+ };
57
+ }
@@ -0,0 +1,13 @@
1
+ import type { CommerceEmailRuntime } from "./emailRuntime.js";
2
+ import { type OrderPaymentLifecyclePort, type TransactionalEmailPort, type OrderRecipientPort } from "../outboxOrderDraftEmailPorts.js";
3
+ import type { OutboxHandler } from "../outboxDispatchContracts.js";
4
+ export declare const outboxCheckoutRecoveryEmailDescriptor: Readonly<{
5
+ eventType: "commerce.checkout_recovery";
6
+ timeoutMs: 10000;
7
+ }>;
8
+ export declare function createOutboxCheckoutRecoveryEmailHandler<Locale extends string>(deps: {
9
+ runtime: Pick<CommerceEmailRuntime<Locale>, "mapSendOutcome" | "parseOutboxPayload" | "resolveLocale">;
10
+ emailPort: TransactionalEmailPort<Locale>;
11
+ recipientPort: OrderRecipientPort;
12
+ lifecyclePort: OrderPaymentLifecyclePort;
13
+ }): OutboxHandler;
@@ -0,0 +1,150 @@
1
+ // Checkout-recovery email handler (W3, transactional). Consumes the
2
+ // commerce.checkout_recovery outbox events produced by the W2 enqueue cron and
3
+ // sends a "finish your payment" email with a signed deep-link to complete payment
4
+ // for the SAME unpaid order. Transactional: NO marketing-consent gate. Promotes
5
+ // the W2 producer from dormant to runtime-gated.
6
+ //
7
+ // Three producers feed this one handler: the W2 cron, the operator payment-link
8
+ // command (`operatorIssued: true`), and the buyer's own escape hatch off a payment
9
+ // step that will not finish (`buyerRequested: true`). They differ in one place
10
+ // only — which eligibility question is asked below — and share the template, the
11
+ // dedupe ledger and the deep-link build.
12
+ //
13
+ // handle() flow: parse the minimal payload -> resolve recipient by order ->
14
+ // dedupe on the email_sends ledger -> build the localized deep-link from the raw
15
+ // recovery token -> send -> map the provider outcome to a worker outcome.
16
+ import { z } from "zod";
17
+ import { COMMERCE_CHECKOUT_RECOVERY_EVENT_TYPE } from "../outboxEventSchemas.js";
18
+ import { OUTBOX_CHECKOUT_RECOVERY_TEMPLATE_SLUG, } from "../outboxOrderDraftEmailPorts.js";
19
+ import { PAYMENT_SESSION_ACTIVE, shouldSkipCheckoutRecovery, shouldSkipOperatorCheckoutRecovery, } from "../orderEmailEligibility.js";
20
+ const HANDLER_TIMEOUT_MS = 10_000;
21
+ export const outboxCheckoutRecoveryEmailDescriptor = Object.freeze({
22
+ eventType: COMMERCE_CHECKOUT_RECOVERY_EVENT_TYPE, timeoutMs: HANDLER_TIMEOUT_MS,
23
+ });
24
+ // Deferrals allowed before a nudge blocked by a live payment session retires.
25
+ // The dispatcher's default backoff is 60 s doubling to a 3600 s cap, so five
26
+ // attempts span ~31 min — past the 15 min activity window that produced the
27
+ // skip, and well inside the 120 min subscription sweep that would cancel the
28
+ // order anyway. It also sits under the default `maxAttempts` of 8: exhausting
29
+ // retries routes a row to the terminal DLQ as `discarded`, which records a
30
+ // dispatch failure for a reminder that was merely untimely. Retiring as
31
+ // `processed` keeps it an honest deliberate skip. A deployment that configures
32
+ // `maxAttempts` below this ceiling has chosen fewer retries globally, and gets
33
+ // that choice here too.
34
+ const PAYMENT_SESSION_RETRY_CEILING = 5;
35
+ // Frozen minimal parse: orderId (recipient + linkage) and recoveryToken (the
36
+ // deep-link) are load-bearing; mode/reminderHours degrade to safe defaults so a
37
+ // producer tweak never retro-DLQs an in-flight reminder.
38
+ //
39
+ // `operatorIssued` says a human minted this link on the operator surface rather
40
+ // than the cron finding an abandoned order. `buyerRequested` says the BUYER asked
41
+ // for it, from inside the payment step they are stuck on. Both optional, and
42
+ // absent means the cron: every row already in flight when either shipped keeps
43
+ // its exact behaviour.
44
+ const payloadSubsetSchema = z
45
+ .object({
46
+ orderId: z.guid(),
47
+ recoveryToken: z.string().min(1),
48
+ mode: z.string().optional(),
49
+ reminderHours: z.number().int().positive().optional(),
50
+ operatorIssued: z.boolean().optional(),
51
+ buyerRequested: z.boolean().optional(),
52
+ })
53
+ .passthrough();
54
+ export function createOutboxCheckoutRecoveryEmailHandler(deps) {
55
+ return {
56
+ ...outboxCheckoutRecoveryEmailDescriptor,
57
+ async handle(row, signal) {
58
+ const parsed = deps.runtime.parseOutboxPayload(payloadSubsetSchema, row.payload);
59
+ if (parsed.ok === false) {
60
+ return parsed.outcome;
61
+ }
62
+ const lifecycle = await deps.lifecyclePort.read(parsed.data.orderId, signal);
63
+ // Three producers, three questions. The cron asks "is this order still
64
+ // sitting unpaid", and going quiet once it is not is right. An
65
+ // operator-issued link is a decision a human already made about an order
66
+ // that has usually left `pending_payment` — expired is the ordinary case —
67
+ // and the redeem rail recreates it when the customer opens the link.
68
+ // Judging that by the cron's rule would skip it as
69
+ // `order_not_pending_payment` and no-send in silence.
70
+ const skipReason = parsed.data.buyerRequested
71
+ ? skipReasonForBuyerRequestedRecovery(lifecycle)
72
+ : parsed.data.operatorIssued
73
+ ? shouldSkipOperatorCheckoutRecovery(lifecycle)
74
+ : shouldSkipCheckoutRecovery(lifecycle);
75
+ if (skipReason === PAYMENT_SESSION_ACTIVE) {
76
+ // A live payment session is temporary. The producer key is unique per
77
+ // event, so settling it as processed would consume the only reminder
78
+ // without sending. Defer until the session settles, subject to the
79
+ // retry ceiling below.
80
+ //
81
+ // Read `attempts` defensively: `undefined < n` is false, which would
82
+ // retire the nudge on its FIRST deferral — the precise opposite of the
83
+ // intent here, and silent.
84
+ const attempts = Number.isFinite(row.attempts) ? row.attempts : 0;
85
+ if (attempts < PAYMENT_SESSION_RETRY_CEILING) {
86
+ return { kind: "retry", reason: PAYMENT_SESSION_ACTIVE };
87
+ }
88
+ // Past the ceiling, retire deliberately. Letting retries run out routes
89
+ // the row to the terminal DLQ as `discarded`, which reads as a dispatch
90
+ // failure for a reminder that was only untimely.
91
+ return { kind: "processed", detail: { skipped: "payment_session_exhausted" } };
92
+ }
93
+ if (skipReason) {
94
+ return { kind: "processed", detail: { skipped: skipReason } };
95
+ }
96
+ const recipient = await deps.recipientPort.resolve(parsed.data.orderId, signal);
97
+ if (recipient === null) {
98
+ // No client on the order (or unreadable) — nothing to send, never retry.
99
+ return { kind: "processed", detail: { skipped: "recipient_unresolved" } };
100
+ }
101
+ const alreadySent = await deps.emailPort.findExistingSend(OUTBOX_CHECKOUT_RECOVERY_TEMPLATE_SLUG, row.id);
102
+ if (alreadySent) {
103
+ return { kind: "processed", detail: { dedupe: "email_already_sent" } };
104
+ }
105
+ const locale = deps.runtime.resolveLocale(recipient.country ?? null);
106
+ const outcome = await deps.emailPort.sendCheckoutRecovery({
107
+ to: recipient.email,
108
+ firstName: recipient.firstName,
109
+ contextName: recipient.contextName ?? null,
110
+ orderId: parsed.data.orderId,
111
+ recoveryToken: parsed.data.recoveryToken,
112
+ mode: parsed.data.mode ?? "one_time",
113
+ reminderHours: parsed.data.reminderHours ?? 1,
114
+ outboxEventId: row.id,
115
+ // Marks the deep-link as the one the buyer mailed themselves off a stuck
116
+ // payment step, so the landing page can tell that arrival apart from a
117
+ // cron nudge. Absent for every other producer, which keeps their URLs
118
+ // byte-identical to what they were.
119
+ linkSource: parsed.data.buyerRequested ? "buyer_hatch" : undefined,
120
+ locale,
121
+ signal,
122
+ });
123
+ return deps.runtime.mapSendOutcome(outcome);
124
+ },
125
+ };
126
+ }
127
+ /**
128
+ * Eligibility for a link the BUYER asked for, from inside the payment step.
129
+ *
130
+ * Everything the operator rule suppresses is suppressed here too — the order is
131
+ * gone, or the money is already in — because those make the email actively wrong
132
+ * rather than merely late. Exactly ONE rule is lifted:
133
+ * `payment_session_active`.
134
+ *
135
+ * That rule is a politeness rule: do not remind someone to pay while they are
136
+ * paying. For this producer it is not merely unhelpful, it is inverted. A buyer
137
+ * who taps this control is BY CONSTRUCTION inside a live payment session — that
138
+ * session is the thing that will not finish, and asking for a way out of it is
139
+ * the whole request. Deferring on it would defer every buyer row through the
140
+ * retry ceiling and then retire it as `payment_session_exhausted`, so the hatch
141
+ * would send nothing, ever, and nothing would report a failure.
142
+ *
143
+ * Written here rather than as a fourth predicate in `orderEmailEligibility`: it
144
+ * is not a different question from the operator's, it is the operator's question
145
+ * with its one transient answer already decided by who is asking.
146
+ */
147
+ function skipReasonForBuyerRequestedRecovery(lifecycle) {
148
+ const reason = shouldSkipOperatorCheckoutRecovery(lifecycle);
149
+ return reason === PAYMENT_SESSION_ACTIVE ? null : reason;
150
+ }
@@ -0,0 +1,46 @@
1
+ import type { CommerceEmailRuntime } from "./emailRuntime.js";
2
+ import type { OutboxHandlerDescriptor } from "@openlup/core/outbox";
3
+ import type { OutboxHandler, OutboxHandlerRegistry } from "../outboxDispatchContracts.js";
4
+ import type { OrderPaymentLifecyclePort, OrderPaidLinesPort, OrderRecipientPort, TransactionalEmailPort } from "../outboxOrderDraftEmailPorts.js";
5
+ import { type OrderPaidParcelNoteReader } from "./outboxOrderPaidEmailHandler.js";
6
+ import { type DeliveredEmailProviderKindReader } from "./outboxShipmentDeliveredEmailHandler.js";
7
+ import type { OrderPaidFulfillmentPort } from "./outboxOrderPaidFulfillmentPorts.js";
8
+ import { type OrderPaidRiskAssessmentPort } from "./outboxOrderPaidFulfillmentHandler.js";
9
+ import { type OrderBuyerCommsPolicy } from "../salesChannelEnvelope.js";
10
+ /**
11
+ * Reads the sales-source buyer-comms policy for one order. `null` is
12
+ * the answer for an order that names no channel — a storefront order, or one
13
+ * that predates the source axis.
14
+ *
15
+ * Read on every event so changes to `sales_channels.buyer_comms_owner` take
16
+ * effect on the next dispatch. A cached policy could keep sending after
17
+ * ownership has changed.
18
+ */
19
+ export interface OrderBuyerCommsPolicyReader {
20
+ readOrderBuyerCommsPolicy(orderUuid: string): Promise<OrderBuyerCommsPolicy | null>;
21
+ }
22
+ export type TransactionalEmailRegistryDeps<Locale extends string = string> = {
23
+ runtime: CommerceEmailRuntime<Locale>;
24
+ emailPort: TransactionalEmailPort<Locale>;
25
+ recipientPort: OrderRecipientPort;
26
+ lifecyclePort: OrderPaymentLifecyclePort;
27
+ orderPaidLinesPort: OrderPaidLinesPort;
28
+ orderPaidParcelNote?: OrderPaidParcelNoteReader<Locale>;
29
+ deliveredProviderKindReader?: DeliveredEmailProviderKindReader;
30
+ buyerCommsPolicyReader?: OrderBuyerCommsPolicyReader;
31
+ };
32
+ export declare function describeCoreOutboxHandlers(selection: {
33
+ transactionalEmail: boolean;
34
+ fulfillmentEnabled: boolean;
35
+ }): OutboxHandlerDescriptor[];
36
+ export declare function createOutboxDispatchRegistry<Locale extends string>(deps: {
37
+ /** Bind the existing outbox rail's composition; commerce owns no second rail. */
38
+ uniqueRegistry(handlers: readonly OutboxHandler[]): OutboxHandlerRegistry;
39
+ transactionalEmail?: TransactionalEmailRegistryDeps<Locale>;
40
+ fulfillmentPort?: OrderPaidFulfillmentPort;
41
+ riskPort?: OrderPaidRiskAssessmentPort;
42
+ riskEnabled?: boolean;
43
+ fulfillmentEnabled: boolean;
44
+ extraHandlers?: readonly OutboxHandler[];
45
+ expectedDescriptors?: () => readonly OutboxHandlerDescriptor[];
46
+ }): OutboxHandlerRegistry;