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