@shopfront/bridge 1.20.5 → 2.0.1
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/.idea/codeStyles/Project.xml +10 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/git_toolbox_blame.xml +6 -0
- package/.idea/git_toolbox_prj.xml +15 -0
- package/.idea/inspectionProfiles/Project_Default.xml +5 -0
- package/.idea/jsLinters/eslint.xml +6 -0
- package/.idea/misc.xml +6 -0
- package/.idea/php.xml +15 -1
- package/.idea/shopfront-embedded-bridge.iml +3 -1
- package/.idea/vcs.xml +1 -1
- package/eslint.config.js +16 -0
- package/jest.config.js +8 -0
- package/lib/APIs/Database/BaseDatabase.d.ts +28 -0
- package/lib/APIs/Database/BaseDatabase.js +5 -0
- package/lib/APIs/Database/Database.d.ts +19 -7
- package/lib/APIs/Database/Database.js +22 -12
- package/lib/APIs/Database/types/BaseBarcodeTemplateRepository.d.ts +8 -0
- package/lib/APIs/Database/types/BaseBarcodeTemplateRepository.js +1 -0
- package/lib/APIs/Database/types/BaseClassificationRepository.d.ts +11 -0
- package/lib/APIs/Database/types/BaseClassificationRepository.js +1 -0
- package/lib/APIs/Database/types/BaseCustomerDisplayRepository.d.ts +10 -0
- package/lib/APIs/Database/types/BaseCustomerDisplayRepository.js +1 -0
- package/lib/APIs/Database/types/BaseCustomerGroupRepository.d.ts +24 -0
- package/lib/APIs/Database/types/BaseCustomerGroupRepository.js +1 -0
- package/lib/APIs/Database/types/BaseCustomerRepository.d.ts +76 -0
- package/lib/APIs/Database/types/BaseCustomerRepository.js +1 -0
- package/lib/APIs/Database/types/BaseEnterpriseRepository.d.ts +8 -0
- package/lib/APIs/Database/types/BaseEnterpriseRepository.js +1 -0
- package/lib/APIs/Database/types/BaseGiftCardRepository.d.ts +18 -0
- package/lib/APIs/Database/types/BaseGiftCardRepository.js +1 -0
- package/lib/APIs/Database/types/BaseKitchenOrderRepository.d.ts +41 -0
- package/lib/APIs/Database/types/BaseKitchenOrderRepository.js +1 -0
- package/lib/APIs/Database/types/BaseKitchenScreenRepository.d.ts +16 -0
- package/lib/APIs/Database/types/BaseKitchenScreenRepository.js +1 -0
- package/lib/APIs/Database/types/BaseLockedResourceRepository.d.ts +12 -0
- package/lib/APIs/Database/types/BaseLockedResourceRepository.js +1 -0
- package/lib/APIs/Database/types/BaseLoyaltyRepository.d.ts +16 -0
- package/lib/APIs/Database/types/BaseLoyaltyRepository.js +1 -0
- package/lib/APIs/Database/types/BaseMovementRepository.d.ts +16 -0
- package/lib/APIs/Database/types/BaseMovementRepository.js +1 -0
- package/lib/APIs/Database/types/BaseOutletRepository.d.ts +19 -0
- package/lib/APIs/Database/types/BaseOutletRepository.js +1 -0
- package/lib/APIs/Database/types/BasePaymentMethodRepository.d.ts +27 -0
- package/lib/APIs/Database/types/BasePaymentMethodRepository.js +1 -0
- package/lib/APIs/Database/types/BasePriceListRepository.d.ts +40 -0
- package/lib/APIs/Database/types/BasePriceListRepository.js +1 -0
- package/lib/APIs/Database/types/BasePriceSetRepository.d.ts +6 -0
- package/lib/APIs/Database/types/BasePriceSetRepository.js +1 -0
- package/lib/APIs/Database/types/BaseProductRepository.d.ts +160 -0
- package/lib/APIs/Database/types/BaseProductRepository.js +1 -0
- package/lib/APIs/Database/types/BasePromotionCategoryRepository.d.ts +10 -0
- package/lib/APIs/Database/types/BasePromotionCategoryRepository.js +1 -0
- package/lib/APIs/Database/types/BasePromotionRepository.d.ts +72 -0
- package/lib/APIs/Database/types/BasePromotionRepository.js +1 -0
- package/lib/APIs/Database/types/BaseReceiptRepository.d.ts +31 -0
- package/lib/APIs/Database/types/BaseReceiptRepository.js +1 -0
- package/lib/APIs/Database/types/BaseRegisterRepository.d.ts +56 -0
- package/lib/APIs/Database/types/BaseRegisterRepository.js +1 -0
- package/lib/APIs/Database/types/BaseRepository.d.ts +41 -0
- package/lib/APIs/Database/types/BaseRepository.js +1 -0
- package/lib/APIs/Database/types/BaseSalesKeyRepository.d.ts +37 -0
- package/lib/APIs/Database/types/BaseSalesKeyRepository.js +1 -0
- package/lib/APIs/Database/types/BaseSalesRepository.d.ts +123 -0
- package/lib/APIs/Database/types/BaseSalesRepository.js +1 -0
- package/lib/APIs/Database/types/BaseSearchableRepository.d.ts +8 -0
- package/lib/APIs/Database/types/BaseSearchableRepository.js +1 -0
- package/lib/APIs/Database/types/BaseStocktakeAccumulatedRepository.d.ts +16 -0
- package/lib/APIs/Database/types/BaseStocktakeAccumulatedRepository.js +1 -0
- package/lib/APIs/Database/types/BaseStocktakeRepository.d.ts +8 -0
- package/lib/APIs/Database/types/BaseStocktakeRepository.js +1 -0
- package/lib/APIs/Database/types/BaseStocktakeScannedRepository.d.ts +24 -0
- package/lib/APIs/Database/types/BaseStocktakeScannedRepository.js +1 -0
- package/lib/APIs/Database/types/BaseSupplierRepository.d.ts +35 -0
- package/lib/APIs/Database/types/BaseSupplierRepository.js +1 -0
- package/lib/APIs/Database/types/BaseTakingsRepository.d.ts +13 -0
- package/lib/APIs/Database/types/BaseTakingsRepository.js +1 -0
- package/lib/APIs/Database/types/BaseTaxRateRepository.d.ts +9 -0
- package/lib/APIs/Database/types/BaseTaxRateRepository.js +1 -0
- package/lib/APIs/Database/types/BaseTransfereeRepository.d.ts +12 -0
- package/lib/APIs/Database/types/BaseTransfereeRepository.js +1 -0
- package/lib/APIs/Database/types/BaseVendorConnectionRepository.d.ts +7 -0
- package/lib/APIs/Database/types/BaseVendorConnectionRepository.js +1 -0
- package/lib/APIs/Database/types/DataSourceTables.d.ts +61 -0
- package/lib/APIs/Database/types/DataSourceTables.js +1 -0
- package/lib/APIs/Fulfilment/FulfilmentTypes.d.ts +2 -2
- package/lib/APIs/Fulfilment/FulfilmentTypes.js +1 -2
- package/lib/APIs/InternalMessages/InternalMessageSource.d.ts +6 -3
- package/lib/APIs/InternalMessages/InternalMessageSource.js +6 -7
- package/lib/APIs/Sale/BaseCurrentSale.d.ts +83 -0
- package/lib/APIs/Sale/BaseCurrentSale.js +13 -0
- package/lib/APIs/Sale/BaseSale.d.ts +3 -38
- package/lib/APIs/Sale/BaseSale.js +1 -40
- package/lib/APIs/Sale/CurrentSale.d.ts +19 -84
- package/lib/APIs/Sale/CurrentSale.js +32 -102
- package/lib/APIs/Sale/Exceptions.d.ts +3 -0
- package/lib/APIs/Sale/Exceptions.js +7 -7
- package/lib/APIs/Sale/Sale.d.ts +39 -7
- package/lib/APIs/Sale/Sale.js +41 -13
- package/lib/APIs/Sale/SaleCustomer.d.ts +0 -2
- package/lib/APIs/Sale/SaleCustomer.js +1 -7
- package/lib/APIs/Sale/SalePayment.d.ts +3 -22
- package/lib/APIs/Sale/SalePayment.js +7 -33
- package/lib/APIs/Sale/SaleProduct.d.ts +6 -46
- package/lib/APIs/Sale/SaleProduct.js +6 -53
- package/lib/APIs/Sale/ShopfrontSaleState.d.ts +7 -9
- package/lib/APIs/Sale/ShopfrontSaleState.js +1 -2
- package/lib/APIs/Sale/index.d.ts +9 -9
- package/lib/APIs/Sale/index.js +7 -39
- package/lib/Actions/BaseAction.d.ts +21 -5
- package/lib/Actions/BaseAction.js +155 -97
- package/lib/Actions/Button.d.ts +2 -2
- package/lib/Actions/Button.js +3 -7
- package/lib/Actions/CustomerListOption.d.ts +2 -2
- package/lib/Actions/CustomerListOption.js +2 -6
- package/lib/Actions/Dialog.d.ts +4 -4
- package/lib/Actions/Dialog.js +2 -6
- package/lib/Actions/Redirect.d.ts +2 -2
- package/lib/Actions/Redirect.js +7 -9
- package/lib/Actions/SaleKey.d.ts +2 -2
- package/lib/Actions/SaleKey.js +3 -7
- package/lib/Actions/SaleUpdate.d.ts +3 -3
- package/lib/Actions/SaleUpdate.js +3 -7
- package/lib/Actions/Toast.d.ts +3 -3
- package/lib/Actions/Toast.js +2 -6
- package/lib/Application.d.ts +114 -78
- package/lib/Application.js +199 -164
- package/lib/ApplicationEvents.d.ts +55 -54
- package/lib/ApplicationEvents.js +9 -6
- package/lib/BaseApplication.d.ts +169 -0
- package/lib/BaseApplication.js +40 -0
- package/lib/BaseBridge.d.ts +33 -0
- package/lib/BaseBridge.js +16 -0
- package/lib/Bridge.d.ts +46 -9
- package/lib/Bridge.js +42 -54
- package/lib/Common/EventEmitter.d.ts +10 -1
- package/lib/Common/EventEmitter.js +10 -5
- package/lib/Common/Serializable.d.ts +8 -6
- package/lib/Common/Serializable.js +1 -2
- package/lib/EmitableEvents/BaseEmitableEvent.d.ts +7 -1
- package/lib/EmitableEvents/BaseEmitableEvent.js +7 -5
- package/lib/EmitableEvents/Fulfilment/Options.d.ts +1 -1
- package/lib/EmitableEvents/Fulfilment/Options.js +4 -8
- package/lib/EmitableEvents/Fulfilment/OrderCancel.d.ts +1 -1
- package/lib/EmitableEvents/Fulfilment/OrderCancel.js +4 -8
- package/lib/EmitableEvents/Fulfilment/OrderCreate.d.ts +2 -2
- package/lib/EmitableEvents/Fulfilment/OrderCreate.js +4 -8
- package/lib/EmitableEvents/Fulfilment/OrderUpdate.d.ts +2 -2
- package/lib/EmitableEvents/Fulfilment/OrderUpdate.js +4 -8
- package/lib/EmitableEvents/Fulfilment/OrdersSync.d.ts +2 -2
- package/lib/EmitableEvents/Fulfilment/OrdersSync.js +4 -8
- package/lib/EmitableEvents/Fulfilment/RegisterIntent.d.ts +2 -2
- package/lib/EmitableEvents/Fulfilment/RegisterIntent.js +4 -8
- package/lib/EmitableEvents/Fulfilment/index.d.ts +7 -7
- package/lib/EmitableEvents/Fulfilment/index.js +6 -15
- package/lib/EmitableEvents/InternalMessage.d.ts +2 -2
- package/lib/EmitableEvents/InternalMessage.js +4 -8
- package/lib/EmitableEvents/SellScreenOption.d.ts +2 -2
- package/lib/EmitableEvents/SellScreenOption.js +7 -11
- package/lib/EmitableEvents/SellScreenPromotionApplicable.d.ts +1 -1
- package/lib/EmitableEvents/SellScreenPromotionApplicable.js +4 -8
- package/lib/EmitableEvents/TableUpdate.d.ts +2 -2
- package/lib/EmitableEvents/TableUpdate.js +4 -8
- package/lib/Events/AudioPermissionChange.d.ts +5 -2
- package/lib/Events/AudioPermissionChange.js +6 -7
- package/lib/Events/AudioReady.d.ts +5 -2
- package/lib/Events/AudioReady.js +6 -7
- package/lib/Events/BaseEvent.d.ts +8 -3
- package/lib/Events/BaseEvent.js +1 -6
- package/lib/Events/Callback.d.ts +5 -2
- package/lib/Events/Callback.js +5 -6
- package/lib/Events/FormatIntegratedProduct.d.ts +27 -32
- package/lib/Events/FormatIntegratedProduct.js +12 -9
- package/lib/Events/FulfilmentCollectOrder.d.ts +5 -2
- package/lib/Events/FulfilmentCollectOrder.js +5 -6
- package/lib/Events/FulfilmentCompleteOrder.d.ts +5 -2
- package/lib/Events/FulfilmentCompleteOrder.js +5 -6
- package/lib/Events/FulfilmentGetOrder.d.ts +12 -6
- package/lib/Events/FulfilmentGetOrder.js +10 -8
- package/lib/Events/FulfilmentOrderApproval.d.ts +5 -2
- package/lib/Events/FulfilmentOrderApproval.js +5 -6
- package/lib/Events/FulfilmentProcessOrder.d.ts +12 -10
- package/lib/Events/FulfilmentProcessOrder.js +7 -8
- package/lib/Events/FulfilmentVoidOrder.d.ts +5 -2
- package/lib/Events/FulfilmentVoidOrder.js +5 -6
- package/lib/Events/GiftCardCodeCheck.d.ts +16 -11
- package/lib/Events/GiftCardCodeCheck.js +11 -9
- package/lib/Events/InternalPageMessage.d.ts +10 -4
- package/lib/Events/InternalPageMessage.js +12 -10
- package/lib/Events/PaymentMethodsEnabled.d.ts +16 -11
- package/lib/Events/PaymentMethodsEnabled.js +10 -8
- package/lib/Events/Ready.d.ts +12 -7
- package/lib/Events/Ready.js +5 -6
- package/lib/Events/RegisterChanged.d.ts +12 -6
- package/lib/Events/RegisterChanged.js +6 -7
- package/lib/Events/RequestButtons.d.ts +17 -12
- package/lib/Events/RequestButtons.js +13 -11
- package/lib/Events/RequestCustomerListOptions.d.ts +11 -5
- package/lib/Events/RequestCustomerListOptions.js +12 -11
- package/lib/Events/RequestSaleKeys.d.ts +12 -6
- package/lib/Events/RequestSaleKeys.js +13 -11
- package/lib/Events/RequestSellScreenOptions.d.ts +18 -5
- package/lib/Events/RequestSellScreenOptions.js +17 -9
- package/lib/Events/RequestSettings.d.ts +11 -5
- package/lib/Events/RequestSettings.js +12 -10
- package/lib/Events/RequestTableColumns.d.ts +16 -11
- package/lib/Events/RequestTableColumns.js +12 -9
- package/lib/Events/SaleComplete.d.ts +15 -18
- package/lib/Events/SaleComplete.js +6 -7
- package/lib/Events/UIPipeline.d.ts +17 -5
- package/lib/Events/UIPipeline.js +17 -10
- package/lib/Mocks/APIs/Sale/MockCurrentSale.d.ts +99 -0
- package/lib/Mocks/APIs/Sale/MockCurrentSale.js +326 -0
- package/lib/Mocks/Database/MockDatabase.d.ts +96 -0
- package/lib/Mocks/Database/MockDatabase.js +89 -0
- package/lib/Mocks/MockApplication.d.ts +154 -0
- package/lib/Mocks/MockApplication.js +482 -0
- package/lib/Mocks/MockBridge.d.ts +31 -0
- package/lib/Mocks/MockBridge.js +77 -0
- package/lib/Mocks/index.d.ts +7 -0
- package/lib/Mocks/index.js +15 -0
- package/lib/Utilities/ActionEventRegistrar.d.ts +19 -4
- package/lib/Utilities/ActionEventRegistrar.js +19 -3
- package/lib/Utilities/MiscTypes.d.ts +6 -4
- package/lib/Utilities/MiscTypes.js +1 -2
- package/lib/Utilities/SaleCreate.d.ts +6 -2
- package/lib/Utilities/SaleCreate.js +10 -6
- package/lib/Utilities/Static.d.ts +3 -0
- package/lib/Utilities/Static.js +5 -7
- package/lib/Utilities/UUID.d.ts +9 -3
- package/lib/Utilities/UUID.js +10 -7
- package/lib/index.d.ts +16 -14
- package/lib/index.js +14 -49
- package/package.json +12 -10
- package/lib/Events/CheckGiftCardCollision.d.ts +0 -14
- package/lib/Events/CheckGiftCardCollision.js +0 -25
package/lib/Application.js
CHANGED
|
@@ -1,76 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const CurrentSale_1 = require("./APIs/Sale/CurrentSale");
|
|
33
|
-
const SaleCreate_1 = require("./Utilities/SaleCreate");
|
|
34
|
-
const AudioReady_1 = require("./Events/AudioReady");
|
|
35
|
-
const GiftCardCodeCheck_1 = require("./Events/GiftCardCodeCheck");
|
|
36
|
-
class ShopfrontTokenDecodingError extends Error {
|
|
37
|
-
}
|
|
38
|
-
exports.ShopfrontTokenDecodingError = ShopfrontTokenDecodingError;
|
|
39
|
-
class ShopfrontTokenRequestError extends Error {
|
|
40
|
-
}
|
|
41
|
-
exports.ShopfrontTokenRequestError = ShopfrontTokenRequestError;
|
|
42
|
-
// noinspection JSUnusedGlobalSymbols
|
|
43
|
-
class Application {
|
|
1
|
+
import { Button } from "./Actions/Button.js";
|
|
2
|
+
import { Database } from "./APIs/Database/Database.js";
|
|
3
|
+
import { CurrentSale } from "./APIs/Sale/CurrentSale.js";
|
|
4
|
+
import { isDirectShopfrontEvent, ToShopfront, } from "./ApplicationEvents.js";
|
|
5
|
+
import { BaseApplication, ShopfrontTokenDecodingError, ShopfrontTokenRequestError, } from "./BaseApplication.js";
|
|
6
|
+
import { BaseEmitableEvent } from "./EmitableEvents/BaseEmitableEvent.js";
|
|
7
|
+
import { AudioPermissionChange } from "./Events/AudioPermissionChange.js";
|
|
8
|
+
import { AudioReady } from "./Events/AudioReady.js";
|
|
9
|
+
import { FormatIntegratedProduct } from "./Events/FormatIntegratedProduct.js";
|
|
10
|
+
import { FulfilmentCollectOrder } from "./Events/FulfilmentCollectOrder.js";
|
|
11
|
+
import { FulfilmentCompleteOrder } from "./Events/FulfilmentCompleteOrder.js";
|
|
12
|
+
import { FulfilmentGetOrder } from "./Events/FulfilmentGetOrder.js";
|
|
13
|
+
import { FulfilmentOrderApproval } from "./Events/FulfilmentOrderApproval.js";
|
|
14
|
+
import { FulfilmentProcessOrder } from "./Events/FulfilmentProcessOrder.js";
|
|
15
|
+
import { FulfilmentVoidOrder } from "./Events/FulfilmentVoidOrder.js";
|
|
16
|
+
import { GiftCardCodeCheck } from "./Events/GiftCardCodeCheck.js";
|
|
17
|
+
import { InternalPageMessage } from "./Events/InternalPageMessage.js";
|
|
18
|
+
import { PaymentMethodsEnabled } from "./Events/PaymentMethodsEnabled.js";
|
|
19
|
+
import { Ready } from "./Events/Ready.js";
|
|
20
|
+
import { RegisterChanged } from "./Events/RegisterChanged.js";
|
|
21
|
+
import { RequestButtons } from "./Events/RequestButtons.js";
|
|
22
|
+
import { RequestCustomerListOptions } from "./Events/RequestCustomerListOptions.js";
|
|
23
|
+
import { RequestSaleKeys } from "./Events/RequestSaleKeys.js";
|
|
24
|
+
import { RequestSellScreenOptions } from "./Events/RequestSellScreenOptions.js";
|
|
25
|
+
import { RequestSettings } from "./Events/RequestSettings.js";
|
|
26
|
+
import { RequestTableColumns } from "./Events/RequestTableColumns.js";
|
|
27
|
+
import { SaleComplete } from "./Events/SaleComplete.js";
|
|
28
|
+
import { UIPipeline } from "./Events/UIPipeline.js";
|
|
29
|
+
import ActionEventRegistrar from "./Utilities/ActionEventRegistrar.js";
|
|
30
|
+
import { buildSaleData } from "./Utilities/SaleCreate.js";
|
|
31
|
+
export class Application extends BaseApplication {
|
|
44
32
|
constructor(bridge) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
REQUEST_TABLE_COLUMNS: new Map(),
|
|
50
|
-
REQUEST_SELL_SCREEN_OPTIONS: new Map(),
|
|
51
|
-
INTERNAL_PAGE_MESSAGE: new Map(),
|
|
52
|
-
REGISTER_CHANGED: new Map(),
|
|
53
|
-
FORMAT_INTEGRATED_PRODUCT: new Map(),
|
|
54
|
-
REQUEST_CUSTOMER_LIST_OPTIONS: new Map(),
|
|
55
|
-
REQUEST_SALE_KEYS: new Map(),
|
|
56
|
-
SALE_COMPLETE: new Map(),
|
|
57
|
-
UI_PIPELINE: new Map(),
|
|
58
|
-
PAYMENT_METHODS_ENABLED: new Map(),
|
|
59
|
-
AUDIO_PERMISSION_CHANGE: new Map(),
|
|
60
|
-
AUDIO_READY: new Map(),
|
|
61
|
-
FULFILMENT_GET_ORDER: new Map(),
|
|
62
|
-
FULFILMENT_PROCESS_ORDER: new Map(),
|
|
63
|
-
FULFILMENT_VOID_ORDER: new Map(),
|
|
64
|
-
FULFILMENT_ORDER_APPROVAL: new Map(),
|
|
65
|
-
FULFILMENT_ORDER_COLLECTED: new Map(),
|
|
66
|
-
FULFILMENT_ORDER_COMPLETED: new Map(),
|
|
67
|
-
GIFT_CARD_CODE_CHECK: new Map(),
|
|
68
|
-
};
|
|
69
|
-
this.directListeners = {};
|
|
33
|
+
super(bridge, new Database(bridge));
|
|
34
|
+
/**
|
|
35
|
+
* Handles an application event
|
|
36
|
+
*/
|
|
70
37
|
this.handleEvent = (event, data, id) => {
|
|
71
38
|
if (event === "READY") {
|
|
72
39
|
this.isReady = true;
|
|
73
40
|
this.key = data.key;
|
|
41
|
+
this.outlet = data.outlet;
|
|
42
|
+
this.register = data.register;
|
|
74
43
|
data = {
|
|
75
44
|
outlet: data.outlet,
|
|
76
45
|
register: data.register,
|
|
@@ -89,7 +58,7 @@ class Application {
|
|
|
89
58
|
}
|
|
90
59
|
else if (event === "LOCATION_CHANGED") {
|
|
91
60
|
// Unregister all serialized listeners as they're no longer displayed
|
|
92
|
-
|
|
61
|
+
ActionEventRegistrar.clear();
|
|
93
62
|
return;
|
|
94
63
|
}
|
|
95
64
|
else if (event === "RESPONSE_CURRENT_SALE" ||
|
|
@@ -104,42 +73,39 @@ class Application {
|
|
|
104
73
|
}
|
|
105
74
|
this.emit(event, data, id);
|
|
106
75
|
};
|
|
107
|
-
this.bridge = bridge;
|
|
108
|
-
this.isReady = false;
|
|
109
|
-
this.key = '';
|
|
110
|
-
this.register = null;
|
|
111
|
-
this.outlet = null;
|
|
112
|
-
this.user = null;
|
|
113
|
-
this.database = new Database_1.Database(this.bridge);
|
|
114
76
|
this.bridge.addEventListener(this.handleEvent);
|
|
115
77
|
this.addEventListener("REGISTER_CHANGED", this.handleLocationChanged);
|
|
116
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* @inheritDoc
|
|
81
|
+
*/
|
|
117
82
|
destroy() {
|
|
118
83
|
this.bridge.destroy();
|
|
119
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Calls any registered listeners for the received event
|
|
87
|
+
*/
|
|
120
88
|
emit(event, data = {}, id) {
|
|
121
|
-
if (
|
|
122
|
-
event = event;
|
|
89
|
+
if (isDirectShopfrontEvent(event)) {
|
|
123
90
|
const listeners = this.directListeners[event];
|
|
124
91
|
if (typeof listeners === "undefined") {
|
|
125
|
-
return this.bridge.sendMessage(
|
|
92
|
+
return this.bridge.sendMessage(ToShopfront.NOT_LISTENING_TO_EVENT);
|
|
126
93
|
}
|
|
127
94
|
const results = [];
|
|
128
95
|
for (const e of listeners.values()) {
|
|
129
|
-
results.push(e(
|
|
96
|
+
results.push(e());
|
|
130
97
|
}
|
|
131
98
|
return Promise.all(results)
|
|
132
99
|
.then(() => {
|
|
133
100
|
// Ensure void is returned
|
|
134
101
|
});
|
|
135
102
|
}
|
|
136
|
-
event = event;
|
|
137
103
|
let results = [];
|
|
138
104
|
if (typeof this.listeners[event] === "undefined") {
|
|
139
|
-
return this.bridge.sendMessage(
|
|
105
|
+
return this.bridge.sendMessage(ToShopfront.UNSUPPORTED_EVENT, event, id);
|
|
140
106
|
}
|
|
141
107
|
if (this.listeners[event].size === 0) {
|
|
142
|
-
return this.bridge.sendMessage(
|
|
108
|
+
return this.bridge.sendMessage(ToShopfront.NOT_LISTENING_TO_EVENT, event, id);
|
|
143
109
|
}
|
|
144
110
|
for (const e of this.listeners[event].values()) {
|
|
145
111
|
results.push(e.emit(data, this.bridge));
|
|
@@ -150,69 +116,71 @@ class Application {
|
|
|
150
116
|
results = results;
|
|
151
117
|
return Promise.all(results)
|
|
152
118
|
.then((res) => {
|
|
153
|
-
return
|
|
119
|
+
return RequestButtons.respond(this.bridge, res.flat(), id);
|
|
154
120
|
});
|
|
155
121
|
case "REQUEST_SETTINGS":
|
|
156
122
|
results = results;
|
|
157
123
|
return Promise.all(results)
|
|
158
124
|
.then((res) => {
|
|
159
|
-
return
|
|
125
|
+
return RequestSettings.respond(this.bridge, res.flat(), id);
|
|
160
126
|
});
|
|
161
127
|
case "REQUEST_TABLE_COLUMNS":
|
|
162
128
|
results = results;
|
|
163
129
|
return Promise.all(results)
|
|
164
130
|
.then((res) => {
|
|
165
|
-
return
|
|
131
|
+
return RequestTableColumns.respond(this.bridge, res.flat(), id);
|
|
166
132
|
});
|
|
167
133
|
case "REQUEST_SELL_SCREEN_OPTIONS":
|
|
168
134
|
results = results;
|
|
169
135
|
return Promise.all(results)
|
|
170
136
|
.then((res) => {
|
|
171
|
-
return
|
|
137
|
+
return RequestSellScreenOptions.respond(this.bridge, res.flat(), id);
|
|
172
138
|
});
|
|
173
139
|
case "FORMAT_INTEGRATED_PRODUCT":
|
|
174
140
|
results = results;
|
|
175
141
|
return Promise.all(results)
|
|
176
142
|
.then((res) => {
|
|
177
|
-
return
|
|
143
|
+
return FormatIntegratedProduct.respond(this.bridge, res.flat(), id);
|
|
178
144
|
});
|
|
179
145
|
case "REQUEST_CUSTOMER_LIST_OPTIONS":
|
|
180
146
|
results = results;
|
|
181
147
|
return Promise.all(results)
|
|
182
|
-
.then(res =>
|
|
148
|
+
.then(res => RequestCustomerListOptions.respond(this.bridge, res.flat(), id));
|
|
183
149
|
case "REQUEST_SALE_KEYS":
|
|
184
150
|
results = results;
|
|
185
151
|
return Promise.all(results)
|
|
186
|
-
.then(res =>
|
|
152
|
+
.then(res => RequestSaleKeys.respond(this.bridge, res.flat(), id));
|
|
187
153
|
case "UI_PIPELINE":
|
|
188
154
|
results = results;
|
|
189
155
|
return Promise.all(results)
|
|
190
156
|
.then(res => {
|
|
191
|
-
return
|
|
157
|
+
return UIPipeline.respond(this.bridge, res.flat(), id);
|
|
192
158
|
});
|
|
193
159
|
case "GIFT_CARD_CODE_CHECK":
|
|
194
160
|
results = results;
|
|
195
161
|
return Promise.all(results)
|
|
196
162
|
.then(res => {
|
|
197
|
-
return
|
|
163
|
+
return GiftCardCodeCheck.respond(this.bridge, res[0], id);
|
|
198
164
|
});
|
|
199
165
|
case "PAYMENT_METHODS_ENABLED":
|
|
200
166
|
results = results;
|
|
201
167
|
return Promise.all(results)
|
|
202
168
|
.then(res => {
|
|
203
|
-
return
|
|
169
|
+
return PaymentMethodsEnabled.respond(this.bridge, res.flat(), id);
|
|
204
170
|
});
|
|
205
171
|
case "FULFILMENT_GET_ORDER":
|
|
206
172
|
results = results;
|
|
207
173
|
return Promise.all(results)
|
|
208
174
|
.then(res => {
|
|
209
|
-
return
|
|
175
|
+
return FulfilmentGetOrder.respond(this.bridge, res[0], id);
|
|
210
176
|
});
|
|
211
177
|
}
|
|
212
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* @inheritDoc
|
|
181
|
+
*/
|
|
213
182
|
addEventListener(event, callback) {
|
|
214
|
-
if (
|
|
215
|
-
event = event;
|
|
183
|
+
if (isDirectShopfrontEvent(event)) {
|
|
216
184
|
if (typeof this.directListeners[event] === "undefined") {
|
|
217
185
|
this.directListeners[event] = new Set();
|
|
218
186
|
}
|
|
@@ -222,97 +190,96 @@ class Application {
|
|
|
222
190
|
}
|
|
223
191
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
224
192
|
let c;
|
|
225
|
-
event = event;
|
|
226
193
|
switch (event) {
|
|
227
194
|
case "READY":
|
|
228
|
-
c = new
|
|
195
|
+
c = new Ready(callback);
|
|
229
196
|
this.listeners[event].set(callback, c);
|
|
230
197
|
break;
|
|
231
198
|
case "REQUEST_SETTINGS":
|
|
232
|
-
c = new
|
|
199
|
+
c = new RequestSettings(callback);
|
|
233
200
|
this.listeners[event].set(callback, c);
|
|
234
201
|
break;
|
|
235
202
|
case "REQUEST_BUTTONS":
|
|
236
|
-
c = new
|
|
203
|
+
c = new RequestButtons(callback);
|
|
237
204
|
this.listeners[event].set(callback, c);
|
|
238
205
|
break;
|
|
239
206
|
case "REQUEST_TABLE_COLUMNS":
|
|
240
|
-
c = new
|
|
207
|
+
c = new RequestTableColumns(callback);
|
|
241
208
|
this.listeners[event].set(callback, c);
|
|
242
209
|
break;
|
|
243
210
|
case "REQUEST_SELL_SCREEN_OPTIONS":
|
|
244
|
-
c = new
|
|
211
|
+
c = new RequestSellScreenOptions(callback);
|
|
245
212
|
this.listeners[event].set(callback, c);
|
|
246
213
|
break;
|
|
247
214
|
case "INTERNAL_PAGE_MESSAGE":
|
|
248
|
-
c = new
|
|
215
|
+
c = new InternalPageMessage(callback, this);
|
|
249
216
|
this.listeners[event].set(callback, c);
|
|
250
217
|
break;
|
|
251
218
|
case "REGISTER_CHANGED":
|
|
252
|
-
c = new
|
|
219
|
+
c = new RegisterChanged(callback);
|
|
253
220
|
this.listeners[event].set(callback, c);
|
|
254
221
|
break;
|
|
255
222
|
case "REQUEST_CUSTOMER_LIST_OPTIONS":
|
|
256
|
-
c = new
|
|
223
|
+
c = new RequestCustomerListOptions(callback);
|
|
257
224
|
this.listeners[event].set(callback, c);
|
|
258
225
|
break;
|
|
259
226
|
case "FORMAT_INTEGRATED_PRODUCT":
|
|
260
|
-
c = new
|
|
227
|
+
c = new FormatIntegratedProduct(callback);
|
|
261
228
|
this.listeners[event].set(callback, c);
|
|
262
229
|
break;
|
|
263
230
|
case "REQUEST_SALE_KEYS":
|
|
264
|
-
c = new
|
|
231
|
+
c = new RequestSaleKeys(callback);
|
|
265
232
|
this.listeners[event].set(callback, c);
|
|
266
233
|
break;
|
|
267
234
|
case "SALE_COMPLETE":
|
|
268
|
-
c = new
|
|
235
|
+
c = new SaleComplete(callback);
|
|
269
236
|
this.listeners[event].set(callback, c);
|
|
270
237
|
break;
|
|
271
238
|
case "UI_PIPELINE":
|
|
272
|
-
c = new
|
|
239
|
+
c = new UIPipeline(callback);
|
|
273
240
|
this.listeners[event].set(callback, c);
|
|
274
241
|
break;
|
|
275
242
|
case "PAYMENT_METHODS_ENABLED":
|
|
276
|
-
c = new
|
|
243
|
+
c = new PaymentMethodsEnabled(callback);
|
|
277
244
|
this.listeners[event].set(callback, c);
|
|
278
245
|
break;
|
|
279
246
|
case "AUDIO_READY":
|
|
280
|
-
c = new
|
|
247
|
+
c = new AudioReady(callback);
|
|
281
248
|
this.listeners[event].set(callback, c);
|
|
282
249
|
break;
|
|
283
250
|
case "AUDIO_PERMISSION_CHANGE":
|
|
284
|
-
c = new
|
|
251
|
+
c = new AudioPermissionChange(callback);
|
|
285
252
|
this.listeners[event].set(callback, c);
|
|
286
253
|
break;
|
|
287
254
|
case "FULFILMENT_GET_ORDER":
|
|
288
255
|
if (this.listeners[event].size !== 0) {
|
|
289
256
|
throw new TypeError("Application already has 'FULFILMENT_GET_ORDER' event listener registered.");
|
|
290
257
|
}
|
|
291
|
-
c = new
|
|
258
|
+
c = new FulfilmentGetOrder(callback);
|
|
292
259
|
this.listeners[event].set(callback, c);
|
|
293
260
|
break;
|
|
294
261
|
case "FULFILMENT_VOID_ORDER":
|
|
295
|
-
c = new
|
|
262
|
+
c = new FulfilmentVoidOrder(callback);
|
|
296
263
|
this.listeners[event].set(callback, c);
|
|
297
264
|
break;
|
|
298
265
|
case "FULFILMENT_PROCESS_ORDER":
|
|
299
|
-
c = new
|
|
266
|
+
c = new FulfilmentProcessOrder(callback);
|
|
300
267
|
this.listeners[event].set(callback, c);
|
|
301
268
|
break;
|
|
302
269
|
case "FULFILMENT_ORDER_APPROVAL":
|
|
303
|
-
c = new
|
|
270
|
+
c = new FulfilmentOrderApproval(callback);
|
|
304
271
|
this.listeners[event].set(callback, c);
|
|
305
272
|
break;
|
|
306
273
|
case "FULFILMENT_ORDER_COLLECTED":
|
|
307
|
-
c = new
|
|
274
|
+
c = new FulfilmentCollectOrder(callback);
|
|
308
275
|
this.listeners[event].set(callback, c);
|
|
309
276
|
break;
|
|
310
277
|
case "FULFILMENT_ORDER_COMPLETED":
|
|
311
|
-
c = new
|
|
278
|
+
c = new FulfilmentCompleteOrder(callback);
|
|
312
279
|
this.listeners[event].set(callback, c);
|
|
313
280
|
break;
|
|
314
281
|
case "GIFT_CARD_CODE_CHECK":
|
|
315
|
-
c = new
|
|
282
|
+
c = new GiftCardCodeCheck(callback);
|
|
316
283
|
this.listeners[event].set(callback, c);
|
|
317
284
|
break;
|
|
318
285
|
}
|
|
@@ -328,65 +295,90 @@ class Application {
|
|
|
328
295
|
});
|
|
329
296
|
}
|
|
330
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* @inheritDoc
|
|
300
|
+
*/
|
|
331
301
|
removeEventListener(event, callback) {
|
|
332
|
-
if (
|
|
302
|
+
if (isDirectShopfrontEvent(event)) {
|
|
333
303
|
this.directListeners[event]?.delete(callback);
|
|
334
304
|
return;
|
|
335
305
|
}
|
|
336
306
|
this.listeners[event].delete(callback);
|
|
337
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* @inheritDoc
|
|
310
|
+
*/
|
|
338
311
|
send(item) {
|
|
339
|
-
if (item instanceof
|
|
312
|
+
if (item instanceof Button) {
|
|
340
313
|
throw new TypeError("You cannot send Buttons to Shopfront without Shopfront requesting them");
|
|
341
314
|
}
|
|
342
|
-
if (item instanceof
|
|
315
|
+
if (item instanceof BaseEmitableEvent) {
|
|
343
316
|
this.bridge.sendMessage(item.getEvent(), item.getData());
|
|
344
317
|
}
|
|
345
318
|
else {
|
|
346
319
|
const serialized = item.serialize();
|
|
347
|
-
this.bridge.sendMessage(
|
|
320
|
+
this.bridge.sendMessage(ToShopfront.SERIALIZED, serialized);
|
|
348
321
|
}
|
|
349
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* @inheritDoc
|
|
325
|
+
*/
|
|
350
326
|
download(file) {
|
|
351
|
-
this.bridge.sendMessage(
|
|
327
|
+
this.bridge.sendMessage(ToShopfront.DOWNLOAD, file);
|
|
352
328
|
}
|
|
329
|
+
/**
|
|
330
|
+
* @inheritDoc
|
|
331
|
+
*/
|
|
353
332
|
redirect(toLocation, externalRedirect = true) {
|
|
354
|
-
this.bridge.sendMessage(
|
|
333
|
+
this.bridge.sendMessage(ToShopfront.REDIRECT, {
|
|
355
334
|
to: toLocation,
|
|
356
335
|
external: externalRedirect,
|
|
357
336
|
});
|
|
358
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* @inheritDoc
|
|
340
|
+
*/
|
|
359
341
|
load() {
|
|
360
|
-
this.bridge.sendMessage(
|
|
361
|
-
return () => this.bridge.sendMessage(
|
|
342
|
+
this.bridge.sendMessage(ToShopfront.LOAD, true);
|
|
343
|
+
return () => this.bridge.sendMessage(ToShopfront.LOAD, false);
|
|
362
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Handles an event callback via the `ActionEventRegistrar`
|
|
347
|
+
*/
|
|
363
348
|
handleEventCallback(data) {
|
|
364
349
|
if (typeof data.id === "undefined") {
|
|
365
350
|
return;
|
|
366
351
|
}
|
|
367
352
|
const id = data.id;
|
|
368
|
-
|
|
353
|
+
ActionEventRegistrar.fire(id, data.data);
|
|
369
354
|
}
|
|
355
|
+
/**
|
|
356
|
+
* Updates the cached location data
|
|
357
|
+
*/
|
|
370
358
|
handleLocationChanged(data) {
|
|
371
359
|
this.register = data.register;
|
|
372
360
|
this.outlet = data.outlet;
|
|
373
361
|
this.user = data.user;
|
|
374
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* @inheritDoc
|
|
365
|
+
*/
|
|
375
366
|
getAuthenticationKey() {
|
|
376
367
|
return this.key;
|
|
377
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* Checks whether `data` is formatted as a sale event
|
|
371
|
+
*/
|
|
378
372
|
dataIsSaleEvent(data) {
|
|
379
373
|
return typeof data.requestId === "string" && (data.saleState === false || typeof data.saleState === "object");
|
|
380
374
|
}
|
|
381
375
|
/**
|
|
382
|
-
*
|
|
383
|
-
* then this will return false.
|
|
384
|
-
*
|
|
385
|
-
* @returns {Promise<CurrentSale | boolean>}
|
|
376
|
+
* @inheritDoc
|
|
386
377
|
*/
|
|
387
378
|
async getCurrentSale() {
|
|
388
379
|
const saleRequest = `SaleRequest-${Date.now().toString()}`;
|
|
389
380
|
const promise = new Promise(res => {
|
|
381
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
390
382
|
const listener = (event, data) => {
|
|
391
383
|
if (event !== "RESPONSE_CURRENT_SALE") {
|
|
392
384
|
return;
|
|
@@ -402,28 +394,30 @@ class Application {
|
|
|
402
394
|
};
|
|
403
395
|
this.bridge.addEventListener(listener);
|
|
404
396
|
});
|
|
405
|
-
this.bridge.sendMessage(
|
|
397
|
+
this.bridge.sendMessage(ToShopfront.REQUEST_CURRENT_SALE, {
|
|
406
398
|
requestId: saleRequest,
|
|
407
399
|
});
|
|
408
400
|
const saleState = await promise;
|
|
409
401
|
if (saleState === false) {
|
|
410
402
|
return saleState;
|
|
411
403
|
}
|
|
412
|
-
return new
|
|
404
|
+
return new CurrentSale(this, saleState);
|
|
413
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* Checks whether `data` is formatted as response data from a 'create sale' request
|
|
408
|
+
*/
|
|
414
409
|
dataIsCreateEvent(data) {
|
|
415
410
|
return typeof data.requestId === "string" &&
|
|
416
|
-
typeof data.success === "boolean" &&
|
|
417
|
-
typeof data.message === "string");
|
|
411
|
+
typeof data.success === "boolean" &&
|
|
412
|
+
(typeof data.message === "undefined" || typeof data.message === "string");
|
|
418
413
|
}
|
|
419
414
|
/**
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
* @param sale
|
|
415
|
+
* @inheritDoc
|
|
423
416
|
*/
|
|
424
417
|
async createSale(sale) {
|
|
425
418
|
const createSaleRequest = `CreateSaleRequest-${Date.now().toString()}`;
|
|
426
419
|
const promise = new Promise(res => {
|
|
420
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
427
421
|
const listener = (event, data) => {
|
|
428
422
|
if (event !== "RESPONSE_CREATE_SALE") {
|
|
429
423
|
return;
|
|
@@ -442,12 +436,15 @@ class Application {
|
|
|
442
436
|
};
|
|
443
437
|
this.bridge.addEventListener(listener);
|
|
444
438
|
});
|
|
445
|
-
this.bridge.sendMessage(
|
|
439
|
+
this.bridge.sendMessage(ToShopfront.CREATE_SALE, {
|
|
446
440
|
requestId: createSaleRequest,
|
|
447
|
-
sale:
|
|
441
|
+
sale: buildSaleData(sale),
|
|
448
442
|
});
|
|
449
443
|
return promise;
|
|
450
444
|
}
|
|
445
|
+
/**
|
|
446
|
+
* Checks whether `data` is formatted as location data
|
|
447
|
+
*/
|
|
451
448
|
dataIsLocation(data) {
|
|
452
449
|
return typeof data.requestId === "string" &&
|
|
453
450
|
(typeof data.register === "string" || data.register === null) &&
|
|
@@ -455,11 +452,12 @@ class Application {
|
|
|
455
452
|
(typeof data.user === "string" || data.user === null);
|
|
456
453
|
}
|
|
457
454
|
/**
|
|
458
|
-
*
|
|
455
|
+
* @inheritDoc
|
|
459
456
|
*/
|
|
460
457
|
async getLocation() {
|
|
461
458
|
const locationRequest = `LocationRequest-${Date.now().toString()}`;
|
|
462
459
|
const promise = new Promise(res => {
|
|
460
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
463
461
|
const listener = (event, data) => {
|
|
464
462
|
if (event !== "RESPONSE_LOCATION") {
|
|
465
463
|
return;
|
|
@@ -475,7 +473,7 @@ class Application {
|
|
|
475
473
|
};
|
|
476
474
|
this.bridge.addEventListener(listener);
|
|
477
475
|
});
|
|
478
|
-
this.bridge.sendMessage(
|
|
476
|
+
this.bridge.sendMessage(ToShopfront.REQUEST_LOCATION, {
|
|
479
477
|
requestId: locationRequest,
|
|
480
478
|
});
|
|
481
479
|
const location = await promise;
|
|
@@ -485,30 +483,47 @@ class Application {
|
|
|
485
483
|
user: location.user,
|
|
486
484
|
};
|
|
487
485
|
}
|
|
486
|
+
/**
|
|
487
|
+
* @inheritDoc
|
|
488
|
+
*/
|
|
488
489
|
printReceipt(content) {
|
|
489
|
-
this.bridge.sendMessage(
|
|
490
|
+
this.bridge.sendMessage(ToShopfront.PRINT_RECEIPT, {
|
|
490
491
|
content,
|
|
491
492
|
type: "text",
|
|
492
493
|
});
|
|
493
494
|
}
|
|
495
|
+
/**
|
|
496
|
+
* @inheritDoc
|
|
497
|
+
*/
|
|
494
498
|
changeSellScreenActionMode(mode) {
|
|
495
|
-
this.bridge.sendMessage(
|
|
496
|
-
mode
|
|
499
|
+
this.bridge.sendMessage(ToShopfront.CHANGE_SELL_SCREEN_ACTION_MODE, {
|
|
500
|
+
mode,
|
|
497
501
|
});
|
|
498
502
|
}
|
|
503
|
+
/**
|
|
504
|
+
* @inheritDoc
|
|
505
|
+
*/
|
|
499
506
|
changeSellScreenSummaryMode(mode) {
|
|
500
|
-
this.bridge.sendMessage(
|
|
501
|
-
mode
|
|
507
|
+
this.bridge.sendMessage(ToShopfront.CHANGE_SELL_SCREEN_SUMMARY_MODE, {
|
|
508
|
+
mode,
|
|
502
509
|
});
|
|
503
510
|
}
|
|
511
|
+
/**
|
|
512
|
+
* Checks whether `data` is formatted as an audio response
|
|
513
|
+
*/
|
|
504
514
|
dataIsAudioResponse(data) {
|
|
505
515
|
return typeof data.requestId === "string" &&
|
|
506
|
-
typeof data.success === "boolean" &&
|
|
507
|
-
typeof data.message === "
|
|
516
|
+
typeof data.success === "boolean" &&
|
|
517
|
+
(typeof data.message === "string" ||
|
|
518
|
+
typeof data.message === "undefined");
|
|
508
519
|
}
|
|
520
|
+
/**
|
|
521
|
+
* Sends an audio request to Shopfront
|
|
522
|
+
*/
|
|
509
523
|
sendAudioRequest(type, data) {
|
|
510
524
|
const request = `AudioRequest-${type}-${Date.now().toString()}`;
|
|
511
525
|
const promise = new Promise(res => {
|
|
526
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
512
527
|
const listener = (event, data) => {
|
|
513
528
|
if (event !== "RESPONSE_AUDIO_REQUEST") {
|
|
514
529
|
return;
|
|
@@ -534,35 +549,40 @@ class Application {
|
|
|
534
549
|
return promise;
|
|
535
550
|
}
|
|
536
551
|
/**
|
|
537
|
-
*
|
|
552
|
+
* @inheritDoc
|
|
538
553
|
*/
|
|
539
554
|
requestAudioPermission() {
|
|
540
|
-
return this.sendAudioRequest(
|
|
555
|
+
return this.sendAudioRequest(ToShopfront.AUDIO_REQUEST_PERMISSION);
|
|
541
556
|
}
|
|
542
557
|
/**
|
|
543
|
-
*
|
|
544
|
-
* @param url
|
|
558
|
+
* @inheritDoc
|
|
545
559
|
*/
|
|
546
560
|
audioPreload(url) {
|
|
547
|
-
return this.sendAudioRequest(
|
|
548
|
-
url
|
|
561
|
+
return this.sendAudioRequest(ToShopfront.AUDIO_PRELOAD, {
|
|
562
|
+
url,
|
|
549
563
|
});
|
|
550
564
|
}
|
|
551
565
|
/**
|
|
552
|
-
*
|
|
553
|
-
* @param url
|
|
566
|
+
* @inheritDoc
|
|
554
567
|
*/
|
|
555
568
|
audioPlay(url) {
|
|
556
|
-
return this.sendAudioRequest(
|
|
557
|
-
url
|
|
569
|
+
return this.sendAudioRequest(ToShopfront.AUDIO_PLAY, {
|
|
570
|
+
url,
|
|
558
571
|
});
|
|
559
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* Checks whether `data` is formatted as response data to a 'get option' request
|
|
575
|
+
*/
|
|
560
576
|
dataIsOption(data) {
|
|
561
577
|
return typeof data.requestId === "string" && typeof data.option === "string";
|
|
562
578
|
}
|
|
579
|
+
/**
|
|
580
|
+
* @inheritDoc
|
|
581
|
+
*/
|
|
563
582
|
async getOption(option, defaultValue) {
|
|
564
583
|
const request = `OptionRequest-${Date.now().toString()}`;
|
|
565
584
|
const promise = new Promise(res => {
|
|
585
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
566
586
|
const listener = (event, data) => {
|
|
567
587
|
if (event !== "RESPONSE_OPTION") {
|
|
568
588
|
return;
|
|
@@ -578,7 +598,7 @@ class Application {
|
|
|
578
598
|
};
|
|
579
599
|
this.bridge.addEventListener(listener);
|
|
580
600
|
});
|
|
581
|
-
this.bridge.sendMessage(
|
|
601
|
+
this.bridge.sendMessage(ToShopfront.GET_OPTION, {
|
|
582
602
|
requestId: request,
|
|
583
603
|
option,
|
|
584
604
|
});
|
|
@@ -588,9 +608,15 @@ class Application {
|
|
|
588
608
|
}
|
|
589
609
|
return optionValue;
|
|
590
610
|
}
|
|
611
|
+
/**
|
|
612
|
+
* Checks whether `data` is formatted as response data to an embedded token request
|
|
613
|
+
*/
|
|
591
614
|
dataIsEmbeddedToken(data) {
|
|
592
615
|
return typeof data.requestId === "string" && typeof data.data === "object" && data.data !== null;
|
|
593
616
|
}
|
|
617
|
+
/**
|
|
618
|
+
* Generates a signing key and sends it to Shopfront
|
|
619
|
+
*/
|
|
594
620
|
async generateSigningKey() {
|
|
595
621
|
if (typeof this.signingKey !== "undefined") {
|
|
596
622
|
return;
|
|
@@ -599,8 +625,11 @@ class Application {
|
|
|
599
625
|
name: "ECDSA",
|
|
600
626
|
namedCurve: "P-384",
|
|
601
627
|
}, true, ["sign", "verify"]);
|
|
602
|
-
this.bridge.sendMessage(
|
|
628
|
+
this.bridge.sendMessage(ToShopfront.ROTATE_SIGNING_KEY, await crypto.subtle.exportKey("jwk", this.signingKey.privateKey));
|
|
603
629
|
}
|
|
630
|
+
/**
|
|
631
|
+
* Decodes the embedded token response from Shopfront using the signing key
|
|
632
|
+
*/
|
|
604
633
|
async decodeToken(signature, data, returnTokenObject) {
|
|
605
634
|
if (typeof this.signingKey === "undefined") {
|
|
606
635
|
// Not possible to decode
|
|
@@ -626,16 +655,23 @@ class Application {
|
|
|
626
655
|
}
|
|
627
656
|
return decoded.auth;
|
|
628
657
|
}
|
|
658
|
+
/**
|
|
659
|
+
* Checks whether `data` is an error response from an embedded token request
|
|
660
|
+
*/
|
|
629
661
|
tokenDataContainsErrors(data) {
|
|
630
662
|
if (!data || typeof data !== "object") {
|
|
631
663
|
return false;
|
|
632
664
|
}
|
|
633
665
|
return "error" in data && "type" in data;
|
|
634
666
|
}
|
|
667
|
+
/**
|
|
668
|
+
* @inheritDoc
|
|
669
|
+
*/
|
|
635
670
|
async getToken(returnTokenObject) {
|
|
636
671
|
await this.generateSigningKey();
|
|
637
672
|
const request = `TokenRequest-${Date.now().toString()}`;
|
|
638
673
|
const promise = new Promise(res => {
|
|
674
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
639
675
|
const listener = (event, data) => {
|
|
640
676
|
if (event !== "RESPONSE_SECURE_KEY") {
|
|
641
677
|
return;
|
|
@@ -651,7 +687,7 @@ class Application {
|
|
|
651
687
|
};
|
|
652
688
|
this.bridge.addEventListener(listener);
|
|
653
689
|
});
|
|
654
|
-
this.bridge.sendMessage(
|
|
690
|
+
this.bridge.sendMessage(ToShopfront.REQUEST_SECURE_KEY, {
|
|
655
691
|
requestId: request,
|
|
656
692
|
});
|
|
657
693
|
const [signature, data] = await promise;
|
|
@@ -662,4 +698,3 @@ class Application {
|
|
|
662
698
|
return this.decodeToken(signature, data, returnTokenObject);
|
|
663
699
|
}
|
|
664
700
|
}
|
|
665
|
-
exports.Application = Application;
|