@aglyn/plugins-commerce 1.0.0-beta.285 → 1.0.0-beta.288
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/README.md +1 -1
- package/package.json +13 -13
- package/src/lib/components/cart.js +25 -12
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/commerce-console-page.js +70 -13
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +2 -1
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -1
- package/src/lib/components/console/payment-methods-card.component.js +1 -1
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
- package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
- package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.js +50 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
- package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
- package/src/lib/components/console/pos-cellular-control.component.js +211 -0
- package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
- package/src/lib/components/console/pos-devices-card.component.js +47 -15
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
- package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-display-page.component.js +44 -2
- package/src/lib/components/console/pos-display-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
- package/src/lib/components/console/pos-hardware-card.component.js +157 -36
- package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
- package/src/lib/components/console/pos-page.component.d.ts +1 -1
- package/src/lib/components/console/pos-page.component.js +63 -12
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
- package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
- package/src/lib/components/console/product-check-in-fields.component.js +60 -14
- package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +44 -1
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
- package/src/lib/components/console/product-register-fields.component.js +31 -2
- package/src/lib/components/console/product-register-fields.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +11 -2
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
- package/src/lib/components/console/register-hardware-card.component.js +56 -27
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +9 -0
- package/src/lib/components/console/reservations-card.component.js +158 -23
- package/src/lib/components/console/reservations-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
- package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
- package/src/lib/components/console/shipstation-card.component.js +3 -3
- package/src/lib/components/console/shipstation-card.component.js.map +1 -1
- package/src/lib/components/product-detail.d.ts +4 -0
- package/src/lib/components/product-detail.js +40 -5
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/product-reviews.js +28 -11
- package/src/lib/components/product-reviews.js.map +1 -1
- package/src/lib/components/reservation-widget.js +28 -5
- package/src/lib/components/reservation-widget.js.map +1 -1
- package/src/lib/components/use-day-picker.d.ts +25 -0
- package/src/lib/components/use-day-picker.js +57 -0
- package/src/lib/components/use-day-picker.js.map +1 -0
- package/src/lib/constants/operator-alerts.d.ts +55 -0
- package/src/lib/constants/operator-alerts.js +156 -1
- package/src/lib/constants/operator-alerts.js.map +1 -1
- package/src/lib/declarations.console-server.js +54 -1
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +4 -2
- package/src/lib/declarations.js +15 -4
- package/src/lib/declarations.js.map +1 -1
- package/src/lib/declarations.server.js +9 -0
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/commerce-cart.d.ts +9 -1
- package/src/lib/model/commerce-cart.js +4 -3
- package/src/lib/model/commerce-cart.js.map +1 -1
- package/src/lib/model/commerce-check-in-product.d.ts +26 -0
- package/src/lib/model/commerce-check-in-product.js +64 -2
- package/src/lib/model/commerce-check-in-product.js.map +1 -1
- package/src/lib/model/commerce-check-in-record.d.ts +127 -0
- package/src/lib/model/commerce-check-in-record.js +36 -0
- package/src/lib/model/commerce-check-in-record.js.map +1 -0
- package/src/lib/model/commerce-check-in.d.ts +91 -87
- package/src/lib/model/commerce-check-in.js +186 -62
- package/src/lib/model/commerce-check-in.js.map +1 -1
- package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
- package/src/lib/model/commerce-kiosk-offer.js +35 -0
- package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +76 -0
- package/src/lib/model/commerce-orders.js +6 -0
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
- package/src/lib/model/commerce-pos-day-report.js +39 -2
- package/src/lib/model/commerce-pos-day-report.js.map +1 -1
- package/src/lib/model/commerce-pos-offline.d.ts +1 -1
- package/src/lib/model/commerce-pos-offline.js +6 -1
- package/src/lib/model/commerce-pos-offline.js.map +1 -1
- package/src/lib/model/commerce-pos-ops.js +3 -2
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +36 -3
- package/src/lib/model/commerce-pos.js +14 -6
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-receipt.js +3 -2
- package/src/lib/model/commerce-receipt.js.map +1 -1
- package/src/lib/model/commerce-reservations.d.ts +69 -4
- package/src/lib/model/commerce-reservations.js +57 -5
- package/src/lib/model/commerce-reservations.js.map +1 -1
- package/src/lib/model/commerce.d.ts +66 -0
- package/src/lib/model/commerce.js +15 -0
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/order-list-fields.d.ts +11 -0
- package/src/lib/model/order-list-fields.js +17 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/own-store-tax-summary.d.ts +152 -0
- package/src/lib/model/own-store-tax-summary.js +288 -0
- package/src/lib/model/own-store-tax-summary.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +74 -0
- package/src/lib/model/plugin-permissions.js +224 -7
- package/src/lib/model/plugin-permissions.js.map +1 -1
- package/src/lib/model/pos-cellular.d.ts +223 -0
- package/src/lib/model/pos-cellular.js +293 -0
- package/src/lib/model/pos-cellular.js.map +1 -0
- package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
- package/src/lib/model/pos-hardware-in-person.js +224 -0
- package/src/lib/model/pos-hardware-in-person.js.map +1 -0
- package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
- package/src/lib/model/pos-hardware-tax-summary.js +225 -0
- package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
- package/src/lib/model/pos-hardware-terms.d.ts +74 -0
- package/src/lib/model/pos-hardware-terms.js +115 -0
- package/src/lib/model/pos-hardware-terms.js.map +1 -0
- package/src/lib/model/pos-hardware.d.ts +349 -7
- package/src/lib/model/pos-hardware.js +291 -20
- package/src/lib/model/pos-hardware.js.map +1 -1
- package/src/lib/model/product-write.d.ts +10 -0
- package/src/lib/model/product-write.js +4 -2
- package/src/lib/model/product-write.js.map +1 -1
- package/src/lib/model/workspace-site-permissions.d.ts +26 -0
- package/src/lib/model/workspace-site-permissions.js +81 -0
- package/src/lib/model/workspace-site-permissions.js.map +1 -0
- package/src/lib/plugin.js +16 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/billing-webhook.js +25 -1
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +7 -5
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/cart-checkout.js +20 -8
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/cart.js +29 -0
- package/src/lib/server/cart.js.map +1 -1
- package/src/lib/server/checkout.js +42 -13
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/collection-membership.d.ts +4 -0
- package/src/lib/server/collection-membership.js +5 -10
- package/src/lib/server/collection-membership.js.map +1 -1
- package/src/lib/server/commerce-site-keys.d.ts +48 -0
- package/src/lib/server/commerce-site-keys.js +61 -0
- package/src/lib/server/commerce-site-keys.js.map +1 -0
- package/src/lib/server/draft-order.js +8 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.js +7 -5
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/gift-cards.js +8 -5
- package/src/lib/server/gift-cards.js.map +1 -1
- package/src/lib/server/local-fulfillment-status.js +9 -6
- package/src/lib/server/local-fulfillment-status.js.map +1 -1
- package/src/lib/server/member-post.js +6 -5
- package/src/lib/server/member-post.js.map +1 -1
- package/src/lib/server/membership-admin-password.d.ts +4 -2
- package/src/lib/server/membership-admin-password.js +10 -8
- package/src/lib/server/membership-admin-password.js.map +1 -1
- package/src/lib/server/membership-admin-remove.d.ts +7 -5
- package/src/lib/server/membership-admin-remove.js +9 -9
- package/src/lib/server/membership-admin-remove.js.map +1 -1
- package/src/lib/server/order-notifications.js +5 -2
- package/src/lib/server/order-notifications.js.map +1 -1
- package/src/lib/server/order-print.js +7 -5
- package/src/lib/server/order-print.js.map +1 -1
- package/src/lib/server/order-receipt-send.js +8 -5
- package/src/lib/server/order-receipt-send.js.map +1 -1
- package/src/lib/server/order-webhooks.js +8 -8
- package/src/lib/server/order-webhooks.js.map +1 -1
- package/src/lib/server/orders-shipping-prepare.js +9 -6
- package/src/lib/server/orders-shipping-prepare.js.map +1 -1
- package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
- package/src/lib/server/own-store-tax-return-source.js +312 -0
- package/src/lib/server/own-store-tax-return-source.js.map +1 -0
- package/src/lib/server/payment-methods.js +13 -9
- package/src/lib/server/payment-methods.js.map +1 -1
- package/src/lib/server/pos-auth.d.ts +37 -6
- package/src/lib/server/pos-auth.js +40 -15
- package/src/lib/server/pos-auth.js.map +1 -1
- package/src/lib/server/pos-cellular-billing.d.ts +81 -0
- package/src/lib/server/pos-cellular-billing.js +711 -0
- package/src/lib/server/pos-cellular-billing.js.map +1 -0
- package/src/lib/server/pos-cellular-notify.d.ts +47 -0
- package/src/lib/server/pos-cellular-notify.js +150 -0
- package/src/lib/server/pos-cellular-notify.js.map +1 -0
- package/src/lib/server/pos-cellular.d.ts +88 -0
- package/src/lib/server/pos-cellular.js +339 -0
- package/src/lib/server/pos-cellular.js.map +1 -0
- package/src/lib/server/pos-check-in.d.ts +5 -1
- package/src/lib/server/pos-check-in.js +296 -28
- package/src/lib/server/pos-check-in.js.map +1 -1
- package/src/lib/server/pos-day-report.js +29 -3
- package/src/lib/server/pos-day-report.js.map +1 -1
- package/src/lib/server/pos-display.d.ts +16 -0
- package/src/lib/server/pos-display.js +129 -2
- package/src/lib/server/pos-display.js.map +1 -1
- package/src/lib/server/pos-hardware-admin.d.ts +10 -1
- package/src/lib/server/pos-hardware-admin.js +250 -84
- package/src/lib/server/pos-hardware-admin.js.map +1 -1
- package/src/lib/server/pos-hardware-attach.d.ts +105 -0
- package/src/lib/server/pos-hardware-attach.js +443 -0
- package/src/lib/server/pos-hardware-attach.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
- package/src/lib/server/pos-hardware-buyer-record.js +86 -0
- package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
- package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
- package/src/lib/server/pos-hardware-cancel.js +147 -0
- package/src/lib/server/pos-hardware-cancel.js.map +1 -0
- package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
- package/src/lib/server/pos-hardware-closure-notices.js +85 -0
- package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
- package/src/lib/server/pos-hardware-closure.d.ts +60 -0
- package/src/lib/server/pos-hardware-closure.js +153 -0
- package/src/lib/server/pos-hardware-closure.js.map +1 -0
- package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
- package/src/lib/server/pos-hardware-in-person.js +236 -0
- package/src/lib/server/pos-hardware-in-person.js.map +1 -0
- package/src/lib/server/pos-hardware-notify.d.ts +40 -2
- package/src/lib/server/pos-hardware-notify.js +195 -14
- package/src/lib/server/pos-hardware-notify.js.map +1 -1
- package/src/lib/server/pos-hardware-readers.d.ts +115 -0
- package/src/lib/server/pos-hardware-readers.js +430 -0
- package/src/lib/server/pos-hardware-readers.js.map +1 -0
- package/src/lib/server/pos-hardware-returns.d.ts +116 -0
- package/src/lib/server/pos-hardware-returns.js +502 -0
- package/src/lib/server/pos-hardware-returns.js.map +1 -0
- package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
- package/src/lib/server/pos-hardware-sale-fields.js +44 -0
- package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
- package/src/lib/server/pos-hardware-sale.d.ts +54 -0
- package/src/lib/server/pos-hardware-sale.js +369 -0
- package/src/lib/server/pos-hardware-sale.js.map +1 -0
- package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
- package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
- package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
- package/src/lib/server/pos-hardware-terms.d.ts +64 -0
- package/src/lib/server/pos-hardware-terms.js +154 -0
- package/src/lib/server/pos-hardware-terms.js.map +1 -0
- package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
- package/src/lib/server/pos-hardware-user-eraser.js +31 -7
- package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
- package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
- package/src/lib/server/pos-hardware-webhook.js +51 -6
- package/src/lib/server/pos-hardware-webhook.js.map +1 -1
- package/src/lib/server/pos-hardware.d.ts +74 -1
- package/src/lib/server/pos-hardware.js +175 -10
- package/src/lib/server/pos-hardware.js.map +1 -1
- package/src/lib/server/pos-kiosk.d.ts +2 -0
- package/src/lib/server/pos-kiosk.js +17 -12
- package/src/lib/server/pos-kiosk.js.map +1 -1
- package/src/lib/server/pos-offline-card-order.d.ts +64 -0
- package/src/lib/server/pos-offline-card-order.js +102 -0
- package/src/lib/server/pos-offline-card-order.js.map +1 -0
- package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
- package/src/lib/server/pos-offline-card-reconcile.js +215 -18
- package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
- package/src/lib/server/pos-offline-sync.d.ts +39 -0
- package/src/lib/server/pos-offline-sync.js +190 -55
- package/src/lib/server/pos-offline-sync.js.map +1 -1
- package/src/lib/server/pos-ops-gate.d.ts +28 -9
- package/src/lib/server/pos-ops-gate.js +50 -19
- package/src/lib/server/pos-ops-gate.js.map +1 -1
- package/src/lib/server/pos-ops-routes.js +24 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -1
- package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
- package/src/lib/server/pos-order-refund-ids.js +31 -0
- package/src/lib/server/pos-order-refund-ids.js.map +1 -0
- package/src/lib/server/pos-order.js +52 -49
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.js +1 -1
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-reader-splash-admin.js +30 -32
- package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
- package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
- package/src/lib/server/pos-reader-splash-images-route.js +113 -0
- package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
- package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
- package/src/lib/server/pos-reader-splash-images.js +123 -0
- package/src/lib/server/pos-reader-splash-images.js.map +1 -0
- package/src/lib/server/pos-reader-splash.d.ts +68 -1
- package/src/lib/server/pos-reader-splash.js +182 -11
- package/src/lib/server/pos-reader-splash.js.map +1 -1
- package/src/lib/server/pos-readers.d.ts +29 -0
- package/src/lib/server/pos-readers.js +134 -35
- package/src/lib/server/pos-readers.js.map +1 -1
- package/src/lib/server/pos-refund-authority.d.ts +3 -1
- package/src/lib/server/pos-refund-authority.js +3 -2
- package/src/lib/server/pos-refund-authority.js.map +1 -1
- package/src/lib/server/pos-return.d.ts +10 -0
- package/src/lib/server/pos-return.js +29 -7
- package/src/lib/server/pos-return.js.map +1 -1
- package/src/lib/server/pos-sale.js +6 -1
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-shift.js +11 -0
- package/src/lib/server/pos-shift.js.map +1 -1
- package/src/lib/server/pos-staff-pin.js +29 -24
- package/src/lib/server/pos-staff-pin.js.map +1 -1
- package/src/lib/server/pos-terminal.d.ts +14 -4
- package/src/lib/server/pos-terminal.js +34 -38
- package/src/lib/server/pos-terminal.js.map +1 -1
- package/src/lib/server/printers.d.ts +7 -3
- package/src/lib/server/printers.js +18 -12
- package/src/lib/server/printers.js.map +1 -1
- package/src/lib/server/product-drafts.d.ts +11 -1
- package/src/lib/server/product-drafts.js +12 -8
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product.d.ts +15 -1
- package/src/lib/server/product.js +16 -3
- package/src/lib/server/product.js.map +1 -1
- package/src/lib/server/products-write.d.ts +26 -2
- package/src/lib/server/products-write.js +19 -7
- package/src/lib/server/products-write.js.map +1 -1
- package/src/lib/server/refund.js +55 -42
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reservation-availability-query.d.ts +8 -0
- package/src/lib/server/reservation-availability-query.js +11 -1
- package/src/lib/server/reservation-availability-query.js.map +1 -1
- package/src/lib/server/reservation-availability.d.ts +1 -1
- package/src/lib/server/reservation-availability.js +7 -2
- package/src/lib/server/reservation-availability.js.map +1 -1
- package/src/lib/server/reservation-guests.d.ts +32 -0
- package/src/lib/server/reservation-guests.js +285 -0
- package/src/lib/server/reservation-guests.js.map +1 -0
- package/src/lib/server/reservation-walk-in.d.ts +11 -1
- package/src/lib/server/reservation-walk-in.js +56 -12
- package/src/lib/server/reservation-walk-in.js.map +1 -1
- package/src/lib/server/reserve.js +18 -5
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/returns.js +9 -6
- package/src/lib/server/returns.js.map +1 -1
- package/src/lib/server/reviews.d.ts +22 -2
- package/src/lib/server/reviews.js +88 -20
- package/src/lib/server/reviews.js.map +1 -1
- package/src/lib/server/shipping-connectors.js +10 -11
- package/src/lib/server/shipping-connectors.js.map +1 -1
- package/src/lib/server/site-page-resolver.js +20 -3
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/store-day.d.ts +33 -0
- package/src/lib/server/store-day.js +46 -0
- package/src/lib/server/store-day.js.map +1 -0
- package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
- package/src/lib/server/store-setup-ai-writer.js +5 -6
- package/src/lib/server/store-setup-ai-writer.js.map +1 -1
- package/src/lib/server/storefront-tax.d.ts +13 -0
- package/src/lib/server/storefront-tax.js +8 -1
- package/src/lib/server/storefront-tax.js.map +1 -1
- package/src/lib/server/tax-return-source.d.ts +32 -3
- package/src/lib/server/tax-return-source.js +99 -20
- package/src/lib/server/tax-return-source.js.map +1 -1
- package/src/lib/server.js +100 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/fake-firestore.js +58 -16
- package/src/lib/testing/fake-firestore.js.map +1 -1
- package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
- package/src/lib/testing/site-register-permissions.d.ts +29 -0
- package/src/lib/testing/site-register-permissions.js +38 -0
- package/src/lib/testing/site-register-permissions.js.map +1 -0
- package/src/lib/transfer/tracking.server.js +8 -5
- package/src/lib/transfer/tracking.server.js.map +1 -1
- package/src/lib/utils/add-to-cart.d.ts +2 -0
- package/src/lib/utils/add-to-cart.js +6 -3
- package/src/lib/utils/add-to-cart.js.map +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { POS_READER_SPLASH_MAX_BYTES } from "../model/pos-reader-splash.js";
|
|
17
|
+
import { drawAndUploadPosReaderSplash, ownerOrgOf, planPosReaderSplash, terminalConfigRef } from "./pos-reader-splash.js";
|
|
18
|
+
import { posReaderSplashImageFacts, PosReaderSplashRenderError } from "./pos-reader-splash-render.js";
|
|
19
|
+
import { POS_READER_SPLASH_IMAGES_SIGNATURE, verifyPosReaderSplashImagesRequest } from "./pos-reader-splash-images.js";
|
|
20
|
+
/*==========================================
|
|
21
|
+
* `POST /api/plugin-images/commerce/pos-reader-splash-images` (AGL-4048):
|
|
22
|
+
* the start-up screen's image work, in the one function that ships `sharp`'s
|
|
23
|
+
* native library (the console's plugins' image function; see
|
|
24
|
+
* `pos-reader-splash-images.ts` for why).
|
|
25
|
+
*
|
|
26
|
+
* {op: 'draw', hostId, key} the store's plan is read again here, and
|
|
27
|
+
* drawn and uploaded only while its key is
|
|
28
|
+
* still the one the caller asked for:
|
|
29
|
+
* `{fileIds}`, or 409 when it moved on
|
|
30
|
+
* {op: 'facts', dataBase64} an uploaded screen's format and size:
|
|
31
|
+
* `{facts}` (null when it is not an image)
|
|
32
|
+
*
|
|
33
|
+
* A machine's door: no session, a signature over the moment and the body
|
|
34
|
+
* (401 without one). A screen the store must hear about is 422 with its
|
|
35
|
+
* words; anything else is 500, and the caller records the failure as before.
|
|
36
|
+
*=========================================*/ const DOCUMENT_ID = /^[A-Za-z0-9_-]{1,128}$/;
|
|
37
|
+
function json(body, status = 200) {
|
|
38
|
+
return Response.json(body, {
|
|
39
|
+
status,
|
|
40
|
+
headers: {
|
|
41
|
+
'Cache-Control': 'no-store'
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export async function posReaderSplashImagesRoute(request) {
|
|
46
|
+
if (request.method !== 'POST') return json({
|
|
47
|
+
error: 'Method not allowed'
|
|
48
|
+
}, 405);
|
|
49
|
+
const raw = await request.text();
|
|
50
|
+
if (!verifyPosReaderSplashImagesRequest(request.headers.get(POS_READER_SPLASH_IMAGES_SIGNATURE), raw)) {
|
|
51
|
+
return json({
|
|
52
|
+
error: 'Unauthenticated'
|
|
53
|
+
}, 401);
|
|
54
|
+
}
|
|
55
|
+
let body;
|
|
56
|
+
try {
|
|
57
|
+
body = JSON.parse(raw);
|
|
58
|
+
} catch (unused) {
|
|
59
|
+
return json({
|
|
60
|
+
error: 'Bad request'
|
|
61
|
+
}, 400);
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
var _body_hostId, _body_key;
|
|
65
|
+
if (body['op'] === 'facts') {
|
|
66
|
+
var _body_dataBase64;
|
|
67
|
+
const data = String((_body_dataBase64 = body['dataBase64']) != null ? _body_dataBase64 : '');
|
|
68
|
+
// A base64 body is 4/3 of the file; anything longer cannot be under 2 MB.
|
|
69
|
+
if (!data || data.length > Math.ceil(POS_READER_SPLASH_MAX_BYTES * 4 / 3) + 4) {
|
|
70
|
+
return json({
|
|
71
|
+
facts: null
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const { loadSharp } = await import("./pos-reader-splash-server.js");
|
|
75
|
+
return json({
|
|
76
|
+
facts: await posReaderSplashImageFacts(await loadSharp(), Buffer.from(data, 'base64'))
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (body['op'] !== 'draw') return json({
|
|
80
|
+
error: 'Unknown op'
|
|
81
|
+
}, 400);
|
|
82
|
+
const hostId = String((_body_hostId = body['hostId']) != null ? _body_hostId : '');
|
|
83
|
+
const key = String((_body_key = body['key']) != null ? _body_key : '');
|
|
84
|
+
if (!DOCUMENT_ID.test(hostId) || !key) return json({
|
|
85
|
+
error: 'Bad request'
|
|
86
|
+
}, 400);
|
|
87
|
+
const config = (await terminalConfigRef(hostId).get()).data();
|
|
88
|
+
if (!(config == null ? void 0 : config['stripeLocationId'])) return json({
|
|
89
|
+
error: 'This store has no card reader location.'
|
|
90
|
+
}, 409);
|
|
91
|
+
const plan = await planPosReaderSplash(hostId, await ownerOrgOf(hostId), config);
|
|
92
|
+
// Drawn only for the screen the caller decided on: a save that landed
|
|
93
|
+
// in between is the next pass's to draw.
|
|
94
|
+
if (plan.key !== key || !plan.source) {
|
|
95
|
+
return json({
|
|
96
|
+
error: 'The start-up screen changed while it was being drawn. Try again.'
|
|
97
|
+
}, 409);
|
|
98
|
+
}
|
|
99
|
+
return json({
|
|
100
|
+
fileIds: await drawAndUploadPosReaderSplash(hostId, plan.source)
|
|
101
|
+
});
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (error instanceof PosReaderSplashRenderError) return json({
|
|
104
|
+
error: error.message
|
|
105
|
+
}, 422);
|
|
106
|
+
console.error('[pos-reader-splash-images]', body['op'], error);
|
|
107
|
+
return json({
|
|
108
|
+
error: 'The start-up screen could not be drawn.'
|
|
109
|
+
}, 500);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=pos-reader-splash-images-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-reader-splash-images-route.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { POS_READER_SPLASH_MAX_BYTES } from '../model/pos-reader-splash'\nimport {\n drawAndUploadPosReaderSplash,\n ownerOrgOf,\n planPosReaderSplash,\n terminalConfigRef,\n} from './pos-reader-splash'\nimport { posReaderSplashImageFacts, PosReaderSplashRenderError } from './pos-reader-splash-render'\nimport { POS_READER_SPLASH_IMAGES_SIGNATURE, verifyPosReaderSplashImagesRequest } from './pos-reader-splash-images'\n\n/*==========================================\n * `POST /api/plugin-images/commerce/pos-reader-splash-images` (AGL-4048):\n * the start-up screen's image work, in the one function that ships `sharp`'s\n * native library (the console's plugins' image function; see\n * `pos-reader-splash-images.ts` for why).\n *\n * {op: 'draw', hostId, key} the store's plan is read again here, and\n * drawn and uploaded only while its key is\n * still the one the caller asked for:\n * `{fileIds}`, or 409 when it moved on\n * {op: 'facts', dataBase64} an uploaded screen's format and size:\n * `{facts}` (null when it is not an image)\n *\n * A machine's door: no session, a signature over the moment and the body\n * (401 without one). A screen the store must hear about is 422 with its\n * words; anything else is 500, and the caller records the failure as before.\n *=========================================*/\n\nconst DOCUMENT_ID = /^[A-Za-z0-9_-]{1,128}$/\n\nfunction json(body: unknown, status = 200): Response {\n return Response.json(body, { status, headers: { 'Cache-Control': 'no-store' } })\n}\n\nexport async function posReaderSplashImagesRoute(request: Request): Promise<Response> {\n if (request.method !== 'POST') return json({ error: 'Method not allowed' }, 405)\n const raw = await request.text()\n if (!verifyPosReaderSplashImagesRequest(request.headers.get(POS_READER_SPLASH_IMAGES_SIGNATURE), raw)) {\n return json({ error: 'Unauthenticated' }, 401)\n }\n let body: Record<string, unknown>\n try {\n body = JSON.parse(raw) as Record<string, unknown>\n } catch {\n return json({ error: 'Bad request' }, 400)\n }\n try {\n if (body['op'] === 'facts') {\n const data = String(body['dataBase64'] ?? '')\n // A base64 body is 4/3 of the file; anything longer cannot be under 2 MB.\n if (!data || data.length > Math.ceil((POS_READER_SPLASH_MAX_BYTES * 4) / 3) + 4) {\n return json({ facts: null })\n }\n const { loadSharp } = await import('./pos-reader-splash-server')\n return json({ facts: await posReaderSplashImageFacts((await loadSharp()) as never, Buffer.from(data, 'base64')) })\n }\n if (body['op'] !== 'draw') return json({ error: 'Unknown op' }, 400)\n const hostId = String(body['hostId'] ?? '')\n const key = String(body['key'] ?? '')\n if (!DOCUMENT_ID.test(hostId) || !key) return json({ error: 'Bad request' }, 400)\n const config = (await terminalConfigRef(hostId).get()).data() as Record<string, unknown> | undefined\n if (!config?.['stripeLocationId']) return json({ error: 'This store has no card reader location.' }, 409)\n const plan = await planPosReaderSplash(hostId, await ownerOrgOf(hostId), config as Record<string, any>)\n // Drawn only for the screen the caller decided on: a save that landed\n // in between is the next pass's to draw.\n if (plan.key !== key || !plan.source) {\n return json({ error: 'The start-up screen changed while it was being drawn. Try again.' }, 409)\n }\n return json({ fileIds: await drawAndUploadPosReaderSplash(hostId, plan.source) })\n } catch (error) {\n if (error instanceof PosReaderSplashRenderError) return json({ error: error.message }, 422)\n console.error('[pos-reader-splash-images]', body['op'], error)\n return json({ error: 'The start-up screen could not be drawn.' }, 500)\n }\n}\n"],"names":["POS_READER_SPLASH_MAX_BYTES","drawAndUploadPosReaderSplash","ownerOrgOf","planPosReaderSplash","terminalConfigRef","posReaderSplashImageFacts","PosReaderSplashRenderError","POS_READER_SPLASH_IMAGES_SIGNATURE","verifyPosReaderSplashImagesRequest","DOCUMENT_ID","json","body","status","Response","headers","posReaderSplashImagesRoute","request","method","error","raw","text","get","JSON","parse","data","String","length","Math","ceil","facts","loadSharp","Buffer","from","hostId","key","test","config","plan","source","fileIds","message","console"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,2BAA2B,QAAQ,gCAA4B;AACxE,SACEC,4BAA4B,EAC5BC,UAAU,EACVC,mBAAmB,EACnBC,iBAAiB,QACZ,yBAAqB;AAC5B,SAASC,yBAAyB,EAAEC,0BAA0B,QAAQ,gCAA4B;AAClG,SAASC,kCAAkC,EAAEC,kCAAkC,QAAQ,gCAA4B;AAEnH;;;;;;;;;;;;;;;;2CAgB2C,GAE3C,MAAMC,cAAc;AAEpB,SAASC,KAAKC,IAAa,EAAEC,SAAS,GAAG;IACvC,OAAOC,SAASH,IAAI,CAACC,MAAM;QAAEC;QAAQE,SAAS;YAAE,iBAAiB;QAAW;IAAE;AAChF;AAEA,OAAO,eAAeC,2BAA2BC,OAAgB;IAC/D,IAAIA,QAAQC,MAAM,KAAK,QAAQ,OAAOP,KAAK;QAAEQ,OAAO;IAAqB,GAAG;IAC5E,MAAMC,MAAM,MAAMH,QAAQI,IAAI;IAC9B,IAAI,CAACZ,mCAAmCQ,QAAQF,OAAO,CAACO,GAAG,CAACd,qCAAqCY,MAAM;QACrG,OAAOT,KAAK;YAAEQ,OAAO;QAAkB,GAAG;IAC5C;IACA,IAAIP;IACJ,IAAI;QACFA,OAAOW,KAAKC,KAAK,CAACJ;IACpB,EAAE,eAAM;QACN,OAAOT,KAAK;YAAEQ,OAAO;QAAc,GAAG;IACxC;IACA,IAAI;YAWoBP,cACHA;QAXnB,IAAIA,IAAI,CAAC,KAAK,KAAK,SAAS;gBACNA;YAApB,MAAMa,OAAOC,QAAOd,mBAAAA,IAAI,CAAC,aAAa,YAAlBA,mBAAsB;YAC1C,0EAA0E;YAC1E,IAAI,CAACa,QAAQA,KAAKE,MAAM,GAAGC,KAAKC,IAAI,CAAC,AAAC5B,8BAA8B,IAAK,KAAK,GAAG;gBAC/E,OAAOU,KAAK;oBAAEmB,OAAO;gBAAK;YAC5B;YACA,MAAM,EAAEC,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC;YACnC,OAAOpB,KAAK;gBAAEmB,OAAO,MAAMxB,0BAA2B,MAAMyB,aAAuBC,OAAOC,IAAI,CAACR,MAAM;YAAW;QAClH;QACA,IAAIb,IAAI,CAAC,KAAK,KAAK,QAAQ,OAAOD,KAAK;YAAEQ,OAAO;QAAa,GAAG;QAChE,MAAMe,SAASR,QAAOd,eAAAA,IAAI,CAAC,SAAS,YAAdA,eAAkB;QACxC,MAAMuB,MAAMT,QAAOd,YAAAA,IAAI,CAAC,MAAM,YAAXA,YAAe;QAClC,IAAI,CAACF,YAAY0B,IAAI,CAACF,WAAW,CAACC,KAAK,OAAOxB,KAAK;YAAEQ,OAAO;QAAc,GAAG;QAC7E,MAAMkB,SAAS,AAAC,CAAA,MAAMhC,kBAAkB6B,QAAQZ,GAAG,EAAC,EAAGG,IAAI;QAC3D,IAAI,EAACY,0BAAAA,MAAQ,CAAC,mBAAmB,GAAE,OAAO1B,KAAK;YAAEQ,OAAO;QAA0C,GAAG;QACrG,MAAMmB,OAAO,MAAMlC,oBAAoB8B,QAAQ,MAAM/B,WAAW+B,SAASG;QACzE,sEAAsE;QACtE,yCAAyC;QACzC,IAAIC,KAAKH,GAAG,KAAKA,OAAO,CAACG,KAAKC,MAAM,EAAE;YACpC,OAAO5B,KAAK;gBAAEQ,OAAO;YAAmE,GAAG;QAC7F;QACA,OAAOR,KAAK;YAAE6B,SAAS,MAAMtC,6BAA6BgC,QAAQI,KAAKC,MAAM;QAAE;IACjF,EAAE,OAAOpB,OAAO;QACd,IAAIA,iBAAiBZ,4BAA4B,OAAOI,KAAK;YAAEQ,OAAOA,MAAMsB,OAAO;QAAC,GAAG;QACvFC,QAAQvB,KAAK,CAAC,8BAA8BP,IAAI,CAAC,KAAK,EAAEO;QACxD,OAAOR,KAAK;YAAEQ,OAAO;QAA0C,GAAG;IACpE;AACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/** The images route's registered path, served under `/api/plugin-images/`. */
|
|
18
|
+
export declare const POS_READER_SPLASH_IMAGES_PATH = "commerce/pos-reader-splash-images";
|
|
19
|
+
/** The request header that carries the signature: `t=<ms>,v1=<hex>`. */
|
|
20
|
+
export declare const POS_READER_SPLASH_IMAGES_SIGNATURE = "x-aglyn-images-signature";
|
|
21
|
+
/** How far a signed request's moment may be from the function's clock. */
|
|
22
|
+
export declare const POS_READER_SPLASH_IMAGES_WINDOW_MS: number;
|
|
23
|
+
/** Test seam. */
|
|
24
|
+
export declare function setPosReaderSplashImagesSecretForTests(secret: (() => string) | null): void;
|
|
25
|
+
/** The header value for a body signed now. Throws on a deploy with no signing secret. */
|
|
26
|
+
export declare function signPosReaderSplashImagesRequest(body: string, nowMs?: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a request's signature is ours, over this body, and recent. False
|
|
29
|
+
* for anything else, a deploy with no signing secret included (fail closed).
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyPosReaderSplashImagesRequest(header: string | null | undefined, body: string, nowMs?: number): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Where to ask for the image work, or `null` to do it in this process. On
|
|
34
|
+
* Vercel only the images function ships libvips, so every other function
|
|
35
|
+
* asks it, at the console's own address; anywhere else this process can draw.
|
|
36
|
+
*/
|
|
37
|
+
export declare function posReaderSplashImagesOrigin(): string | null;
|
|
38
|
+
/** The function refused the work with words meant for the store (`422`), or the store moved on (`409`). */
|
|
39
|
+
export declare class PosReaderSplashImagesRefusal extends Error {
|
|
40
|
+
readonly status: number;
|
|
41
|
+
constructor(message: string, status: number);
|
|
42
|
+
}
|
|
43
|
+
/** Asks the images function for one piece of work, signed. */
|
|
44
|
+
export declare function requestPosReaderSplashImages<T>(origin: string, payload: {
|
|
45
|
+
op: 'draw';
|
|
46
|
+
hostId: string;
|
|
47
|
+
key: string;
|
|
48
|
+
} | {
|
|
49
|
+
op: 'facts';
|
|
50
|
+
dataBase64: string;
|
|
51
|
+
}): Promise<T>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { createHash, createHmac, timingSafeEqual } from "node:crypto";
|
|
18
|
+
import { PLUGIN_IMAGES_API_PREFIX } from "@aglyn/aglyn/app-utils/api-plugins";
|
|
19
|
+
import { platformConsoleOrigin } from "@aglyn/aglyn/app-utils/platform-brand";
|
|
20
|
+
import { tokenSigningSecret } from "@aglyn/tenant-data-admin/server/media-signing";
|
|
21
|
+
/*==========================================
|
|
22
|
+
* THE START-UP SCREEN'S IMAGE WORK HAS ITS OWN FUNCTION (AGL-4048).
|
|
23
|
+
*
|
|
24
|
+
* Drawing a card reader's start-up screen takes `sharp`, and `sharp` takes
|
|
25
|
+
* libvips, a 17 MB native library the plugin API's function would otherwise
|
|
26
|
+
* carry into every cold start of every plugin door. So the drawing is a
|
|
27
|
+
* route of its own, registered to draw images (`images: true`), which the
|
|
28
|
+
* console serves only from the plugins' image function at
|
|
29
|
+
* `/api/plugin-images/commerce/pos-reader-splash-images`
|
|
30
|
+
* (`pos-reader-splash-images-route.ts`), the one function that ships
|
|
31
|
+
* libvips; on Vercel everything else that needs a screen drawn, or an
|
|
32
|
+
* uploaded screen read, asks it over HTTP:
|
|
33
|
+
*
|
|
34
|
+
* draw {hostId, key} draw the store's screen for the plan with that
|
|
35
|
+
* key and upload each family's file to Stripe:
|
|
36
|
+
* `{fileIds}` back
|
|
37
|
+
* facts {dataBase64} an uploaded image's format and size: `{facts}`
|
|
38
|
+
*
|
|
39
|
+
* The caller signs each request with the platform's signing secret, over
|
|
40
|
+
* the moment and the body, so nobody else spends the function's time and no
|
|
41
|
+
* request is replayed later. Off Vercel (a self-hosted server, a developer's
|
|
42
|
+
* machine, a spec) one process holds every route and libvips with it, so
|
|
43
|
+
* the work runs where it is asked for, exactly as before.
|
|
44
|
+
*=========================================*/ /** The images route's registered path, served under `/api/plugin-images/`. */ export const POS_READER_SPLASH_IMAGES_PATH = 'commerce/pos-reader-splash-images';
|
|
45
|
+
/** The request header that carries the signature: `t=<ms>,v1=<hex>`. */ export const POS_READER_SPLASH_IMAGES_SIGNATURE = 'x-aglyn-images-signature';
|
|
46
|
+
/** How far a signed request's moment may be from the function's clock. */ export const POS_READER_SPLASH_IMAGES_WINDOW_MS = 5 * 60 * 1000;
|
|
47
|
+
/** How long a caller waits for the function: inside its own 60 seconds. */ const REQUEST_TIMEOUT_MS = 55000;
|
|
48
|
+
let secretOverride = null;
|
|
49
|
+
/** Test seam. */ export function setPosReaderSplashImagesSecretForTests(secret) {
|
|
50
|
+
secretOverride = secret;
|
|
51
|
+
}
|
|
52
|
+
function signature(at, body) {
|
|
53
|
+
const digest = createHash('sha256').update(body).digest('hex');
|
|
54
|
+
return createHmac('sha256', (secretOverride != null ? secretOverride : tokenSigningSecret)()).update(`pos-reader-splash-images:${at}.${digest}`).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
/** The header value for a body signed now. Throws on a deploy with no signing secret. */ export function signPosReaderSplashImagesRequest(body, nowMs = Date.now()) {
|
|
57
|
+
return `t=${nowMs},v1=${signature(nowMs, body)}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether a request's signature is ours, over this body, and recent. False
|
|
61
|
+
* for anything else, a deploy with no signing secret included (fail closed).
|
|
62
|
+
*/ export function verifyPosReaderSplashImagesRequest(header, body, nowMs = Date.now()) {
|
|
63
|
+
var _parts_v1;
|
|
64
|
+
const parts = Object.fromEntries(String(header != null ? header : '').split(',').map((part)=>part.trim().split('=')).filter((pair)=>pair.length === 2));
|
|
65
|
+
const at = Number(parts['t']);
|
|
66
|
+
const given = String((_parts_v1 = parts['v1']) != null ? _parts_v1 : '');
|
|
67
|
+
if (!Number.isFinite(at) || !/^[a-f0-9]{64}$/.test(given)) return false;
|
|
68
|
+
if (Math.abs(nowMs - at) > POS_READER_SPLASH_IMAGES_WINDOW_MS) return false;
|
|
69
|
+
let expected;
|
|
70
|
+
try {
|
|
71
|
+
expected = signature(at, body);
|
|
72
|
+
} catch (unused) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return timingSafeEqual(Buffer.from(given), Buffer.from(expected));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Where to ask for the image work, or `null` to do it in this process. On
|
|
79
|
+
* Vercel only the images function ships libvips, so every other function
|
|
80
|
+
* asks it, at the console's own address; anywhere else this process can draw.
|
|
81
|
+
*/ export function posReaderSplashImagesOrigin() {
|
|
82
|
+
if (process.env['VERCEL'] !== '1') return null;
|
|
83
|
+
return platformConsoleOrigin();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The headers that get our own request past our own edge, when configured:
|
|
87
|
+
* the same pair the render monitor sends (AGL-3571).
|
|
88
|
+
*/ function edgeBypassHeaders() {
|
|
89
|
+
var _process_env_AGLYN_PROBE_TOKEN;
|
|
90
|
+
const probe = String((_process_env_AGLYN_PROBE_TOKEN = process.env['AGLYN_PROBE_TOKEN']) != null ? _process_env_AGLYN_PROBE_TOKEN : '').trim();
|
|
91
|
+
const bypass = String(process.env['AGLYN_VERCEL_BYPASS'] || process.env['VERCEL_AUTOMATION_BYPASS_SECRET'] || '').trim();
|
|
92
|
+
return _extends({}, probe ? {
|
|
93
|
+
'x-aglyn-probe': probe
|
|
94
|
+
} : {}, bypass ? {
|
|
95
|
+
'x-vercel-protection-bypass': bypass
|
|
96
|
+
} : {});
|
|
97
|
+
}
|
|
98
|
+
/** The function refused the work with words meant for the store (`422`), or the store moved on (`409`). */ export class PosReaderSplashImagesRefusal extends Error {
|
|
99
|
+
constructor(message, status){
|
|
100
|
+
super(message), this.status = status;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Asks the images function for one piece of work, signed. */ export async function requestPosReaderSplashImages(origin, payload) {
|
|
104
|
+
const body = JSON.stringify(payload);
|
|
105
|
+
const response = await fetch(`${origin}/api/${PLUGIN_IMAGES_API_PREFIX}/${POS_READER_SPLASH_IMAGES_PATH}`, {
|
|
106
|
+
method: 'POST',
|
|
107
|
+
headers: _extends({
|
|
108
|
+
'content-type': 'application/json',
|
|
109
|
+
[POS_READER_SPLASH_IMAGES_SIGNATURE]: signPosReaderSplashImagesRequest(body)
|
|
110
|
+
}, edgeBypassHeaders()),
|
|
111
|
+
body,
|
|
112
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
113
|
+
});
|
|
114
|
+
const answer = await response.json().catch(()=>({}));
|
|
115
|
+
if (response.status === 422 || response.status === 409) {
|
|
116
|
+
var _ref;
|
|
117
|
+
throw new PosReaderSplashImagesRefusal(String((_ref = answer == null ? void 0 : answer.error) != null ? _ref : 'That image could not be read.'), response.status);
|
|
118
|
+
}
|
|
119
|
+
if (!response.ok) throw new Error(`the start-up screen's images function answered ${response.status}`);
|
|
120
|
+
return answer;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=pos-reader-splash-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/pos-reader-splash-images.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createHash, createHmac, timingSafeEqual } from 'node:crypto'\nimport { PLUGIN_IMAGES_API_PREFIX } from '@aglyn/aglyn/app-utils/api-plugins'\nimport { platformConsoleOrigin } from '@aglyn/aglyn/app-utils/platform-brand'\nimport { tokenSigningSecret } from '@aglyn/tenant-data-admin/server/media-signing'\n\n/*==========================================\n * THE START-UP SCREEN'S IMAGE WORK HAS ITS OWN FUNCTION (AGL-4048).\n *\n * Drawing a card reader's start-up screen takes `sharp`, and `sharp` takes\n * libvips, a 17 MB native library the plugin API's function would otherwise\n * carry into every cold start of every plugin door. So the drawing is a\n * route of its own, registered to draw images (`images: true`), which the\n * console serves only from the plugins' image function at\n * `/api/plugin-images/commerce/pos-reader-splash-images`\n * (`pos-reader-splash-images-route.ts`), the one function that ships\n * libvips; on Vercel everything else that needs a screen drawn, or an\n * uploaded screen read, asks it over HTTP:\n *\n * draw {hostId, key} draw the store's screen for the plan with that\n * key and upload each family's file to Stripe:\n * `{fileIds}` back\n * facts {dataBase64} an uploaded image's format and size: `{facts}`\n *\n * The caller signs each request with the platform's signing secret, over\n * the moment and the body, so nobody else spends the function's time and no\n * request is replayed later. Off Vercel (a self-hosted server, a developer's\n * machine, a spec) one process holds every route and libvips with it, so\n * the work runs where it is asked for, exactly as before.\n *=========================================*/\n\n/** The images route's registered path, served under `/api/plugin-images/`. */\nexport const POS_READER_SPLASH_IMAGES_PATH = 'commerce/pos-reader-splash-images'\n\n/** The request header that carries the signature: `t=<ms>,v1=<hex>`. */\nexport const POS_READER_SPLASH_IMAGES_SIGNATURE = 'x-aglyn-images-signature'\n\n/** How far a signed request's moment may be from the function's clock. */\nexport const POS_READER_SPLASH_IMAGES_WINDOW_MS = 5 * 60 * 1000\n\n/** How long a caller waits for the function: inside its own 60 seconds. */\nconst REQUEST_TIMEOUT_MS = 55_000\n\nlet secretOverride: (() => string) | null = null\n\n/** Test seam. */\nexport function setPosReaderSplashImagesSecretForTests(secret: (() => string) | null): void {\n secretOverride = secret\n}\n\nfunction signature(at: number, body: string): string {\n const digest = createHash('sha256').update(body).digest('hex')\n return createHmac('sha256', (secretOverride ?? tokenSigningSecret)())\n .update(`pos-reader-splash-images:${at}.${digest}`)\n .digest('hex')\n}\n\n/** The header value for a body signed now. Throws on a deploy with no signing secret. */\nexport function signPosReaderSplashImagesRequest(body: string, nowMs: number = Date.now()): string {\n return `t=${nowMs},v1=${signature(nowMs, body)}`\n}\n\n/**\n * Whether a request's signature is ours, over this body, and recent. False\n * for anything else, a deploy with no signing secret included (fail closed).\n */\nexport function verifyPosReaderSplashImagesRequest(\n header: string | null | undefined,\n body: string,\n nowMs: number = Date.now(),\n): boolean {\n const parts = Object.fromEntries(\n String(header ?? '')\n .split(',')\n .map((part) => part.trim().split('=') as [string, string])\n .filter((pair) => pair.length === 2),\n )\n const at = Number(parts['t'])\n const given = String(parts['v1'] ?? '')\n if (!Number.isFinite(at) || !/^[a-f0-9]{64}$/.test(given)) return false\n if (Math.abs(nowMs - at) > POS_READER_SPLASH_IMAGES_WINDOW_MS) return false\n let expected: string\n try {\n expected = signature(at, body)\n } catch {\n return false\n }\n return timingSafeEqual(Buffer.from(given), Buffer.from(expected))\n}\n\n/**\n * Where to ask for the image work, or `null` to do it in this process. On\n * Vercel only the images function ships libvips, so every other function\n * asks it, at the console's own address; anywhere else this process can draw.\n */\nexport function posReaderSplashImagesOrigin(): string | null {\n if (process.env['VERCEL'] !== '1') return null\n return platformConsoleOrigin()\n}\n\n/**\n * The headers that get our own request past our own edge, when configured:\n * the same pair the render monitor sends (AGL-3571).\n */\nfunction edgeBypassHeaders(): Record<string, string> {\n const probe = String(process.env['AGLYN_PROBE_TOKEN'] ?? '').trim()\n const bypass = String(\n process.env['AGLYN_VERCEL_BYPASS'] || process.env['VERCEL_AUTOMATION_BYPASS_SECRET'] || '',\n ).trim()\n return {\n ...(probe ? { 'x-aglyn-probe': probe } : {}),\n ...(bypass ? { 'x-vercel-protection-bypass': bypass } : {}),\n }\n}\n\n/** The function refused the work with words meant for the store (`422`), or the store moved on (`409`). */\nexport class PosReaderSplashImagesRefusal extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message)\n }\n}\n\n/** Asks the images function for one piece of work, signed. */\nexport async function requestPosReaderSplashImages<T>(\n origin: string,\n payload: { op: 'draw'; hostId: string; key: string } | { op: 'facts'; dataBase64: string },\n): Promise<T> {\n const body = JSON.stringify(payload)\n const response = await fetch(`${origin}/api/${PLUGIN_IMAGES_API_PREFIX}/${POS_READER_SPLASH_IMAGES_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n [POS_READER_SPLASH_IMAGES_SIGNATURE]: signPosReaderSplashImagesRequest(body),\n ...edgeBypassHeaders(),\n },\n body,\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n })\n const answer = (await response.json().catch(() => ({}))) as T & { error?: string }\n if (response.status === 422 || response.status === 409) {\n throw new PosReaderSplashImagesRefusal(String(answer?.error ?? 'That image could not be read.'), response.status)\n }\n if (!response.ok) throw new Error(`the start-up screen's images function answered ${response.status}`)\n return answer\n}\n"],"names":["createHash","createHmac","timingSafeEqual","PLUGIN_IMAGES_API_PREFIX","platformConsoleOrigin","tokenSigningSecret","POS_READER_SPLASH_IMAGES_PATH","POS_READER_SPLASH_IMAGES_SIGNATURE","POS_READER_SPLASH_IMAGES_WINDOW_MS","REQUEST_TIMEOUT_MS","secretOverride","setPosReaderSplashImagesSecretForTests","secret","signature","at","body","digest","update","signPosReaderSplashImagesRequest","nowMs","Date","now","verifyPosReaderSplashImagesRequest","header","parts","Object","fromEntries","String","split","map","part","trim","filter","pair","length","Number","given","isFinite","test","Math","abs","expected","Buffer","from","posReaderSplashImagesOrigin","process","env","edgeBypassHeaders","probe","bypass","PosReaderSplashImagesRefusal","Error","message","status","requestPosReaderSplashImages","origin","payload","JSON","stringify","response","fetch","method","headers","signal","AbortSignal","timeout","answer","json","catch","error","ok"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,UAAU,EAAEC,UAAU,EAAEC,eAAe,QAAQ,cAAa;AACrE,SAASC,wBAAwB,QAAQ,qCAAoC;AAC7E,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,kBAAkB,QAAQ,gDAA+C;AAElF;;;;;;;;;;;;;;;;;;;;;;;2CAuB2C,GAE3C,4EAA4E,GAC5E,OAAO,MAAMC,gCAAgC,oCAAmC;AAEhF,sEAAsE,GACtE,OAAO,MAAMC,qCAAqC,2BAA0B;AAE5E,wEAAwE,GACxE,OAAO,MAAMC,qCAAqC,IAAI,KAAK,KAAI;AAE/D,yEAAyE,GACzE,MAAMC,qBAAqB;AAE3B,IAAIC,iBAAwC;AAE5C,eAAe,GACf,OAAO,SAASC,uCAAuCC,MAA6B;IAClFF,iBAAiBE;AACnB;AAEA,SAASC,UAAUC,EAAU,EAAEC,IAAY;IACzC,MAAMC,SAAShB,WAAW,UAAUiB,MAAM,CAACF,MAAMC,MAAM,CAAC;IACxD,OAAOf,WAAW,UAAU,CAACS,yBAAAA,iBAAkBL,uBAC5CY,MAAM,CAAC,CAAC,yBAAyB,EAAEH,GAAG,CAAC,EAAEE,QAAQ,EACjDA,MAAM,CAAC;AACZ;AAEA,uFAAuF,GACvF,OAAO,SAASE,iCAAiCH,IAAY,EAAEI,QAAgBC,KAAKC,GAAG,EAAE;IACvF,OAAO,CAAC,EAAE,EAAEF,MAAM,IAAI,EAAEN,UAAUM,OAAOJ,OAAO;AAClD;AAEA;;;CAGC,GACD,OAAO,SAASO,mCACdC,MAAiC,EACjCR,IAAY,EACZI,QAAgBC,KAAKC,GAAG,EAAE;QASLG;IAPrB,MAAMA,QAAQC,OAAOC,WAAW,CAC9BC,OAAOJ,iBAAAA,SAAU,IACdK,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC,OAASA,KAAKC,IAAI,GAAGH,KAAK,CAAC,MAChCI,MAAM,CAAC,CAACC,OAASA,KAAKC,MAAM,KAAK;IAEtC,MAAMpB,KAAKqB,OAAOX,KAAK,CAAC,IAAI;IAC5B,MAAMY,QAAQT,QAAOH,YAAAA,KAAK,CAAC,KAAK,YAAXA,YAAe;IACpC,IAAI,CAACW,OAAOE,QAAQ,CAACvB,OAAO,CAAC,iBAAiBwB,IAAI,CAACF,QAAQ,OAAO;IAClE,IAAIG,KAAKC,GAAG,CAACrB,QAAQL,MAAMN,oCAAoC,OAAO;IACtE,IAAIiC;IACJ,IAAI;QACFA,WAAW5B,UAAUC,IAAIC;IAC3B,EAAE,eAAM;QACN,OAAO;IACT;IACA,OAAOb,gBAAgBwC,OAAOC,IAAI,CAACP,QAAQM,OAAOC,IAAI,CAACF;AACzD;AAEA;;;;CAIC,GACD,OAAO,SAASG;IACd,IAAIC,QAAQC,GAAG,CAAC,SAAS,KAAK,KAAK,OAAO;IAC1C,OAAO1C;AACT;AAEA;;;CAGC,GACD,SAAS2C;QACcF;IAArB,MAAMG,QAAQrB,QAAOkB,iCAAAA,QAAQC,GAAG,CAAC,oBAAoB,YAAhCD,iCAAoC,IAAId,IAAI;IACjE,MAAMkB,SAAStB,OACbkB,QAAQC,GAAG,CAAC,sBAAsB,IAAID,QAAQC,GAAG,CAAC,kCAAkC,IAAI,IACxFf,IAAI;IACN,OAAO,aACDiB,QAAQ;QAAE,iBAAiBA;IAAM,IAAI,CAAC,GACtCC,SAAS;QAAE,8BAA8BA;IAAO,IAAI,CAAC;AAE7D;AAEA,yGAAyG,GACzG,OAAO,MAAMC,qCAAqCC;IAChD,YACEC,OAAe,EACf,AAASC,MAAc,CACvB;QACA,KAAK,CAACD,eAFGC,SAAAA;IAGX;AACF;AAEA,4DAA4D,GAC5D,OAAO,eAAeC,6BACpBC,MAAc,EACdC,OAA0F;IAE1F,MAAMzC,OAAO0C,KAAKC,SAAS,CAACF;IAC5B,MAAMG,WAAW,MAAMC,MAAM,GAAGL,OAAO,KAAK,EAAEpD,yBAAyB,CAAC,EAAEG,+BAA+B,EAAE;QACzGuD,QAAQ;QACRC,SAAS;YACP,gBAAgB;YAChB,CAACvD,mCAAmC,EAAEW,iCAAiCH;WACpEgC;QAELhC;QACAgD,QAAQC,YAAYC,OAAO,CAACxD;IAC9B;IACA,MAAMyD,SAAU,MAAMP,SAASQ,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;IACpD,IAAIT,SAASN,MAAM,KAAK,OAAOM,SAASN,MAAM,KAAK,KAAK;;QACtD,MAAM,IAAIH,6BAA6BvB,eAAOuC,0BAAAA,OAAQG,KAAK,mBAAI,kCAAkCV,SAASN,MAAM;IAClH;IACA,IAAI,CAACM,SAASW,EAAE,EAAE,MAAM,IAAInB,MAAM,CAAC,+CAA+C,EAAEQ,SAASN,MAAM,EAAE;IACrG,OAAOa;AACT"}
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { type MediaCdnScope } from '@aglyn/aglyn/app-utils/media-cdn-scope';
|
|
18
18
|
import type { PluginApiHandler } from '@aglyn/aglyn/server';
|
|
19
|
+
import type { PluginEventPayloads } from '@aglyn/aglyn/plugin-manager/plugin-events';
|
|
20
|
+
import type { PluginJobHostGate } from '@aglyn/aglyn/server';
|
|
19
21
|
import { type PosReaderSplashChoice, type PosReaderSplashFamilyId } from '../model/pos-reader-splash';
|
|
20
22
|
/** `platformSettings/posReaderSplash`: staff's default screen. */
|
|
21
23
|
export declare const POS_READER_SPLASH_SETTINGS_ID = "posReaderSplash";
|
|
@@ -32,6 +34,7 @@ export interface PlatformSplashDoc {
|
|
|
32
34
|
families?: Partial<Record<PosReaderSplashFamilyId, PlatformSplashImage>>;
|
|
33
35
|
updatedAtMs?: number;
|
|
34
36
|
}
|
|
37
|
+
export declare function terminalConfigRef(hostId: string): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
35
38
|
export declare function platformSplashRef(): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
36
39
|
export declare function posReaderSplashBucket(): import("@google-cloud/storage").Bucket;
|
|
37
40
|
export declare function readPlatformSplash(): Promise<PlatformSplashDoc>;
|
|
@@ -59,7 +62,7 @@ type LocatedSource = LocatedAsset | LocatedUrl;
|
|
|
59
62
|
* workspace without a brand, so its `logoUrl` is not read here.
|
|
60
63
|
*/
|
|
61
64
|
export declare function workspaceLogoValue(org: Record<string, any> | null, whiteLabel: boolean): string | null;
|
|
62
|
-
type SplashSource = {
|
|
65
|
+
export type SplashSource = {
|
|
63
66
|
mode: 'platform';
|
|
64
67
|
doc: PlatformSplashDoc;
|
|
65
68
|
} | {
|
|
@@ -83,6 +86,12 @@ export interface PosReaderSplashPlan {
|
|
|
83
86
|
source: SplashSource | null;
|
|
84
87
|
}
|
|
85
88
|
export declare function planPosReaderSplash(hostId: string, org: Record<string, any> | null, config: Record<string, any> | undefined, platform?: PlatformSplashDoc): Promise<PosReaderSplashPlan>;
|
|
89
|
+
/**
|
|
90
|
+
* Draws each reader family's screen from the plan's source and uploads it to
|
|
91
|
+
* Stripe: the image work, which needs `sharp`. Runs in the images function
|
|
92
|
+
* on Vercel (`pos-reader-splash-images-route.ts`), and in any process off it.
|
|
93
|
+
*/
|
|
94
|
+
export declare function drawAndUploadPosReaderSplash(hostId: string, source: SplashSource): Promise<Record<PosReaderSplashFamilyId, string>>;
|
|
86
95
|
/** The org that owns the site, with its id on it (`planPosReaderSplash` reads it). */
|
|
87
96
|
export declare function ownerOrgOf(hostId: string): Promise<Record<string, any> | null>;
|
|
88
97
|
export interface PosReaderSplashApplyResult {
|
|
@@ -100,6 +109,64 @@ export declare function applyPosReaderSplash(hostId: string, options?: {
|
|
|
100
109
|
org?: Record<string, any> | null;
|
|
101
110
|
platform?: PlatformSplashDoc;
|
|
102
111
|
force?: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Leave a screen that failed to apply alone until this long after the
|
|
114
|
+
* failure, when it is still the same screen: a background pass must not
|
|
115
|
+
* draw and upload a logo Stripe keeps refusing on every beat. The card
|
|
116
|
+
* passes none, so opening it always tries again.
|
|
117
|
+
*/
|
|
118
|
+
retryFailedAfterMs?: number;
|
|
103
119
|
}): Promise<PosReaderSplashApplyResult>;
|
|
120
|
+
/** How many stores one pass reaches, and how many it works on at once. */
|
|
121
|
+
export declare const POS_READER_SPLASH_SWEEP_WINDOW = 400;
|
|
122
|
+
export interface PosReaderSplashSweep {
|
|
123
|
+
applied: number;
|
|
124
|
+
unchanged: number;
|
|
125
|
+
failed: number;
|
|
126
|
+
/** Locked stores, and screens still inside their failure's retry wait. */
|
|
127
|
+
skipped: number;
|
|
128
|
+
/** More stores have readers than one pass reaches. */
|
|
129
|
+
more: boolean;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Brings every store with a Location up to date with
|
|
133
|
+
* {@link applyPosReaderSplash}, the call the POS devices card makes: a store
|
|
134
|
+
* whose screen key has not moved costs reads and no Stripe call, and one
|
|
135
|
+
* that moved gets exactly one round of uploads. At most
|
|
136
|
+
* {@link POS_READER_SPLASH_SWEEP_WINDOW} stores a pass.
|
|
137
|
+
*/
|
|
138
|
+
export declare function applyPosReaderSplashToStores(options?: {
|
|
139
|
+
platform?: PlatformSplashDoc;
|
|
140
|
+
/** Asked before each store; a locked store is left as it is. */
|
|
141
|
+
isLocked?: (hostId: string) => Promise<boolean>;
|
|
142
|
+
retryFailedAfterMs?: number;
|
|
143
|
+
}): Promise<PosReaderSplashSweep>;
|
|
144
|
+
/** How long a background pass leaves a screen Stripe refused before trying it again. */
|
|
145
|
+
export declare const POS_READER_SPLASH_RETRY_FAILED_AFTER_MS: number;
|
|
146
|
+
/**
|
|
147
|
+
* The `pos-reader-splash-refresh` beat (AGL-4048): a logo changed on the
|
|
148
|
+
* organization profile or the white-label brand, or the logo's file replaced
|
|
149
|
+
* in the media library, reaches the store's readers without anybody opening
|
|
150
|
+
* the POS devices card. The screen's key already moves with each of those,
|
|
151
|
+
* so the beat only has to ask; nothing waits on it, and a save never waits
|
|
152
|
+
* on Stripe. Asks the runner's lockdown gate for every store.
|
|
153
|
+
*/
|
|
154
|
+
export declare function refreshPosReaderSplashes(gate: {
|
|
155
|
+
isLocked: (hostId: string) => Promise<boolean>;
|
|
156
|
+
}): Promise<PosReaderSplashSweep>;
|
|
157
|
+
/**
|
|
158
|
+
* Core's `org.logo.changed` (AGL-4048): a logo saved on the organization
|
|
159
|
+
* profile or the white-label brand reaches the readers of every store of
|
|
160
|
+
* that workspace now, not on the next beat. Raised after the save has
|
|
161
|
+
* answered, so nobody waits on it.
|
|
162
|
+
*
|
|
163
|
+
* {@link applyPosReaderSplash} for each store, the call the POS devices card
|
|
164
|
+
* makes: a store with no Location, or whose screen does not show the logo
|
|
165
|
+
* that moved (a dark-mode logo, a store showing its own image), costs reads
|
|
166
|
+
* and no Stripe call. A store that is locked is left alone, and a screen
|
|
167
|
+
* Stripe refused waits as it does on the beat; the beat, which stays, is
|
|
168
|
+
* the backstop for anything this misses. Never throws.
|
|
169
|
+
*/
|
|
170
|
+
export declare function onOrgLogoChanged(payload: Pick<PluginEventPayloads['org.logo.changed'], 'orgId'>, gate?: PluginJobHostGate): Promise<PosReaderSplashSweep>;
|
|
104
171
|
export declare const posReaderSplashHandler: PluginApiHandler;
|
|
105
172
|
export {};
|