@ledgerhq/device-management-kit 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/package.json +1 -2
- package/lib/cjs/src/api/Error.js +1 -1
- package/lib/cjs/src/api/Error.js.map +3 -3
- package/lib/cjs/src/api/command/Errors.js +1 -1
- package/lib/cjs/src/api/command/Errors.js.map +3 -3
- package/lib/cjs/src/api/command/model/CommandResult.js +1 -1
- package/lib/cjs/src/api/command/model/CommandResult.js.map +3 -3
- package/lib/cjs/src/api/command/os/BackupStorageCommand.js +2 -0
- package/lib/cjs/src/api/command/os/BackupStorageCommand.js.map +7 -0
- package/lib/cjs/src/api/command/os/BackupStorageCommand.test.js +2 -0
- package/lib/cjs/src/api/command/os/BackupStorageCommand.test.js.map +7 -0
- package/lib/cjs/src/api/command/os/DeleteLanguagePackCommand.js +2 -0
- package/lib/cjs/src/api/command/os/DeleteLanguagePackCommand.js.map +7 -0
- package/lib/cjs/src/api/command/os/DeleteLanguagePackCommand.test.js +2 -0
- package/lib/cjs/src/api/command/os/DeleteLanguagePackCommand.test.js.map +7 -0
- package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.js +2 -0
- package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.js.map +7 -0
- package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.test.js +2 -0
- package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.test.js.map +7 -0
- package/lib/cjs/src/api/command/os/GetBatteryStatusCommand.js +1 -1
- package/lib/cjs/src/api/command/os/GetBatteryStatusCommand.js.map +3 -3
- package/lib/cjs/src/api/command/os/GetBatteryStatusCommand.test.js +1 -1
- package/lib/cjs/src/api/command/os/GetBatteryStatusCommand.test.js.map +3 -3
- package/lib/cjs/src/api/command/os/ListLanguagePackCommand.js.map +2 -2
- package/lib/cjs/src/api/command/use-case/SendCommandUseCase.test.js +1 -1
- package/lib/cjs/src/api/command/use-case/SendCommandUseCase.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.js.map +2 -2
- package/lib/cjs/src/api/device-action/os/Errors.js +1 -1
- package/lib/cjs/src/api/device-action/os/Errors.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceMetadata/types.js.map +2 -2
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.js +2 -0
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.js.map +7 -0
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.js +2 -0
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.js.map +7 -0
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/types.js +2 -0
- package/lib/cjs/src/api/device-action/os/InstallLanguagePackage/types.js.map +7 -0
- package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.js +2 -0
- package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.js.map +7 -0
- package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.test.js +2 -0
- package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.test.js.map +7 -0
- package/lib/cjs/src/api/device-action/task/Errors.js +2 -0
- package/lib/cjs/src/api/device-action/task/Errors.js.map +7 -0
- package/lib/cjs/src/api/device-action/task/GetApplicationsMetadataTask.js +1 -1
- package/lib/cjs/src/api/device-action/task/GetApplicationsMetadataTask.js.map +3 -3
- package/lib/cjs/src/api/device-action/task/GetApplicationsMetadataTask.test.js +1 -1
- package/lib/cjs/src/api/device-action/task/GetApplicationsMetadataTask.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/task/GetFirmwareMetadataTask.js +1 -1
- package/lib/cjs/src/api/device-action/task/GetFirmwareMetadataTask.js.map +3 -3
- package/lib/cjs/src/api/device-action/task/GetFirmwareMetadataTask.test.js +1 -1
- package/lib/cjs/src/api/device-action/task/GetFirmwareMetadataTask.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/task/InstallLanguagePackageTask.js +2 -0
- package/lib/cjs/src/api/device-action/task/InstallLanguagePackageTask.js.map +7 -0
- package/lib/cjs/src/api/device-action/task/InstallLanguagePackageTask.test.js +9 -0
- package/lib/cjs/src/api/device-action/task/InstallLanguagePackageTask.test.js.map +7 -0
- package/lib/cjs/src/api/device-action/xstate-utils/XStateDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/xstate-utils/XStateDeviceAction.js.map +2 -2
- package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js +1 -1
- package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js.map +3 -3
- package/lib/cjs/src/api/index.js +1 -1
- package/lib/cjs/src/api/index.js.map +3 -3
- package/lib/cjs/src/api/model/DmkResult.js +2 -0
- package/lib/cjs/src/api/model/DmkResult.js.map +7 -0
- package/lib/cjs/src/api/model/DmkResult.test.js +2 -0
- package/lib/cjs/src/api/model/DmkResult.test.js.map +7 -0
- package/lib/cjs/src/api/network/DmkNetworkClient.js +2 -0
- package/lib/cjs/src/api/network/DmkNetworkClient.js.map +7 -0
- package/lib/cjs/src/api/network/DmkNetworkClient.test.js +2 -0
- package/lib/cjs/src/api/network/DmkNetworkClient.test.js.map +7 -0
- package/lib/cjs/src/api/network/DmkNetworkClientError.js +2 -0
- package/lib/cjs/src/api/network/DmkNetworkClientError.js.map +7 -0
- package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js +2 -0
- package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js.map +7 -0
- package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js +2 -0
- package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js.map +7 -0
- package/lib/cjs/src/api/storage/KeyValueStorage.js +2 -0
- package/lib/cjs/src/api/storage/KeyValueStorage.js.map +7 -0
- package/lib/cjs/src/api/types.js +1 -1
- package/lib/cjs/src/api/types.js.map +1 -1
- package/lib/cjs/src/internal/device-session/service/DefaultDeviceSessionService.test.js +1 -1
- package/lib/cjs/src/internal/device-session/service/DefaultDeviceSessionService.test.js.map +3 -3
- package/lib/cjs/src/internal/device-session/use-case/CloseSessionsUseCase.test.js +1 -1
- package/lib/cjs/src/internal/device-session/use-case/CloseSessionsUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/device-session/use-case/GetDeviceSessionStateUseCase.test.js +1 -1
- package/lib/cjs/src/internal/device-session/use-case/GetDeviceSessionStateUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/discovery/use-case/DisconnectUseCase.test.js +1 -1
- package/lib/cjs/src/internal/discovery/use-case/DisconnectUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/discovery/use-case/GetConnectedDeviceUseCase.test.js +1 -1
- package/lib/cjs/src/internal/discovery/use-case/GetConnectedDeviceUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/discovery/use-case/ListConnectedDevicesUseCase.test.js +1 -1
- package/lib/cjs/src/internal/discovery/use-case/ListConnectedDevicesUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/discovery/use-case/ListenToConnectedDeviceUseCase.test.js +1 -1
- package/lib/cjs/src/internal/discovery/use-case/ListenToConnectedDeviceUseCase.test.js.map +3 -3
- package/lib/cjs/src/internal/manager-api/data/HttpManagerApiDataSource.js +2 -0
- package/lib/cjs/src/internal/manager-api/data/HttpManagerApiDataSource.js.map +7 -0
- package/lib/cjs/src/internal/manager-api/data/HttpManagerApiDataSource.test.js +2 -0
- package/lib/cjs/src/internal/manager-api/data/HttpManagerApiDataSource.test.js.map +7 -0
- package/lib/cjs/src/internal/manager-api/data/__mocks__/HttpManagerApiDataSource.js +2 -0
- package/lib/cjs/src/internal/manager-api/data/__mocks__/HttpManagerApiDataSource.js.map +7 -0
- package/lib/cjs/src/internal/manager-api/di/managerApiModule.js +1 -1
- package/lib/cjs/src/internal/manager-api/di/managerApiModule.js.map +3 -3
- package/lib/cjs/src/internal/manager-api/di/managerApiModule.test.js +1 -1
- package/lib/cjs/src/internal/manager-api/di/managerApiModule.test.js.map +3 -3
- package/lib/cjs/src/internal/manager-api/service/DefaultManagerApiService.test.js +1 -1
- package/lib/cjs/src/internal/manager-api/service/DefaultManagerApiService.test.js.map +3 -3
- package/lib/esm/package.json +1 -2
- package/lib/esm/src/api/Error.js +1 -1
- package/lib/esm/src/api/Error.js.map +3 -3
- package/lib/esm/src/api/command/Errors.js +1 -1
- package/lib/esm/src/api/command/Errors.js.map +3 -3
- package/lib/esm/src/api/command/model/CommandResult.js +1 -1
- package/lib/esm/src/api/command/model/CommandResult.js.map +3 -3
- package/lib/esm/src/api/command/os/BackupStorageCommand.js +2 -0
- package/lib/esm/src/api/command/os/BackupStorageCommand.js.map +7 -0
- package/lib/esm/src/api/command/os/BackupStorageCommand.test.js +2 -0
- package/lib/esm/src/api/command/os/BackupStorageCommand.test.js.map +7 -0
- package/lib/esm/src/api/command/os/DeleteLanguagePackCommand.js +2 -0
- package/lib/esm/src/api/command/os/DeleteLanguagePackCommand.js.map +7 -0
- package/lib/esm/src/api/command/os/DeleteLanguagePackCommand.test.js +2 -0
- package/lib/esm/src/api/command/os/DeleteLanguagePackCommand.test.js.map +7 -0
- package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.js +2 -0
- package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.js.map +7 -0
- package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.test.js +2 -0
- package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.test.js.map +7 -0
- package/lib/esm/src/api/command/os/GetBatteryStatusCommand.js +1 -1
- package/lib/esm/src/api/command/os/GetBatteryStatusCommand.js.map +3 -3
- package/lib/esm/src/api/command/os/GetBatteryStatusCommand.test.js +1 -1
- package/lib/esm/src/api/command/os/GetBatteryStatusCommand.test.js.map +3 -3
- package/lib/esm/src/api/command/os/ListLanguagePackCommand.js.map +2 -2
- package/lib/esm/src/api/command/use-case/SendCommandUseCase.test.js +1 -1
- package/lib/esm/src/api/command/use-case/SendCommandUseCase.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.js.map +2 -2
- package/lib/esm/src/api/device-action/os/Errors.js +1 -1
- package/lib/esm/src/api/device-action/os/Errors.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/types.js.map +2 -2
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.js +2 -0
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.js.map +7 -0
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.js +2 -0
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.js.map +7 -0
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/types.js +2 -0
- package/lib/esm/src/api/device-action/os/InstallLanguagePackage/types.js.map +7 -0
- package/lib/esm/src/api/device-action/task/BackupAppStorageTask.js +2 -0
- package/lib/esm/src/api/device-action/task/BackupAppStorageTask.js.map +7 -0
- package/lib/esm/src/api/device-action/task/BackupAppStorageTask.test.js +2 -0
- package/lib/esm/src/api/device-action/task/BackupAppStorageTask.test.js.map +7 -0
- package/lib/esm/src/api/device-action/task/Errors.js +2 -0
- package/lib/esm/src/api/device-action/task/Errors.js.map +7 -0
- package/lib/esm/src/api/device-action/task/GetApplicationsMetadataTask.js +1 -1
- package/lib/esm/src/api/device-action/task/GetApplicationsMetadataTask.js.map +3 -3
- package/lib/esm/src/api/device-action/task/GetApplicationsMetadataTask.test.js +1 -1
- package/lib/esm/src/api/device-action/task/GetApplicationsMetadataTask.test.js.map +3 -3
- package/lib/esm/src/api/device-action/task/GetFirmwareMetadataTask.js +1 -1
- package/lib/esm/src/api/device-action/task/GetFirmwareMetadataTask.js.map +3 -3
- package/lib/esm/src/api/device-action/task/GetFirmwareMetadataTask.test.js +1 -1
- package/lib/esm/src/api/device-action/task/GetFirmwareMetadataTask.test.js.map +3 -3
- package/lib/esm/src/api/device-action/task/InstallLanguagePackageTask.js +2 -0
- package/lib/esm/src/api/device-action/task/InstallLanguagePackageTask.js.map +7 -0
- package/lib/esm/src/api/device-action/task/InstallLanguagePackageTask.test.js +9 -0
- package/lib/esm/src/api/device-action/task/InstallLanguagePackageTask.test.js.map +7 -0
- package/lib/esm/src/api/device-action/xstate-utils/XStateDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/xstate-utils/XStateDeviceAction.js.map +2 -2
- package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js +1 -1
- package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js.map +3 -3
- package/lib/esm/src/api/index.js +1 -1
- package/lib/esm/src/api/index.js.map +3 -3
- package/lib/esm/src/api/model/DmkResult.js +2 -0
- package/lib/esm/src/api/model/DmkResult.js.map +7 -0
- package/lib/esm/src/api/model/DmkResult.test.js +2 -0
- package/lib/esm/src/api/model/DmkResult.test.js.map +7 -0
- package/lib/esm/src/api/network/DmkNetworkClient.js +2 -0
- package/lib/esm/src/api/network/DmkNetworkClient.js.map +7 -0
- package/lib/esm/src/api/network/DmkNetworkClient.test.js +2 -0
- package/lib/esm/src/api/network/DmkNetworkClient.test.js.map +7 -0
- package/lib/esm/src/api/network/DmkNetworkClientError.js +2 -0
- package/lib/esm/src/api/network/DmkNetworkClientError.js.map +7 -0
- package/lib/esm/src/api/network/DmkNetworkClientHelpers.js +2 -0
- package/lib/esm/src/api/network/DmkNetworkClientHelpers.js.map +7 -0
- package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js +2 -0
- package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js.map +7 -0
- package/lib/esm/src/api/storage/KeyValueStorage.js +2 -0
- package/lib/esm/src/api/storage/KeyValueStorage.js.map +7 -0
- package/lib/esm/src/internal/device-session/service/DefaultDeviceSessionService.test.js +1 -1
- package/lib/esm/src/internal/device-session/service/DefaultDeviceSessionService.test.js.map +3 -3
- package/lib/esm/src/internal/device-session/use-case/CloseSessionsUseCase.test.js +1 -1
- package/lib/esm/src/internal/device-session/use-case/CloseSessionsUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/device-session/use-case/GetDeviceSessionStateUseCase.test.js +1 -1
- package/lib/esm/src/internal/device-session/use-case/GetDeviceSessionStateUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/discovery/use-case/DisconnectUseCase.test.js +1 -1
- package/lib/esm/src/internal/discovery/use-case/DisconnectUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/discovery/use-case/GetConnectedDeviceUseCase.test.js +1 -1
- package/lib/esm/src/internal/discovery/use-case/GetConnectedDeviceUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/discovery/use-case/ListConnectedDevicesUseCase.test.js +1 -1
- package/lib/esm/src/internal/discovery/use-case/ListConnectedDevicesUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/discovery/use-case/ListenToConnectedDeviceUseCase.test.js +1 -1
- package/lib/esm/src/internal/discovery/use-case/ListenToConnectedDeviceUseCase.test.js.map +3 -3
- package/lib/esm/src/internal/manager-api/data/HttpManagerApiDataSource.js +2 -0
- package/lib/esm/src/internal/manager-api/data/HttpManagerApiDataSource.js.map +7 -0
- package/lib/esm/src/internal/manager-api/data/HttpManagerApiDataSource.test.js +2 -0
- package/lib/esm/src/internal/manager-api/data/HttpManagerApiDataSource.test.js.map +7 -0
- package/lib/esm/src/internal/manager-api/data/__mocks__/{AxiosManagerApiDataSource.js → HttpManagerApiDataSource.js} +2 -2
- package/lib/esm/src/internal/manager-api/data/__mocks__/HttpManagerApiDataSource.js.map +7 -0
- package/lib/esm/src/internal/manager-api/di/managerApiModule.js +1 -1
- package/lib/esm/src/internal/manager-api/di/managerApiModule.js.map +3 -3
- package/lib/esm/src/internal/manager-api/di/managerApiModule.test.js +1 -1
- package/lib/esm/src/internal/manager-api/di/managerApiModule.test.js.map +3 -3
- package/lib/esm/src/internal/manager-api/service/DefaultManagerApiService.test.js +1 -1
- package/lib/esm/src/internal/manager-api/service/DefaultManagerApiService.test.js.map +3 -3
- package/lib/types/src/api/Error.d.ts +5 -0
- package/lib/types/src/api/Error.d.ts.map +1 -1
- package/lib/types/src/api/command/Errors.d.ts +0 -20
- package/lib/types/src/api/command/Errors.d.ts.map +1 -1
- package/lib/types/src/api/command/model/CommandResult.d.ts +11 -17
- package/lib/types/src/api/command/model/CommandResult.d.ts.map +1 -1
- package/lib/types/src/api/command/os/BackupStorageCommand.d.ts +23 -0
- package/lib/types/src/api/command/os/BackupStorageCommand.d.ts.map +1 -0
- package/lib/types/src/api/command/os/BackupStorageCommand.test.d.ts +2 -0
- package/lib/types/src/api/command/os/BackupStorageCommand.test.d.ts.map +1 -0
- package/lib/types/src/api/command/os/DeleteLanguagePackCommand.d.ts +24 -0
- package/lib/types/src/api/command/os/DeleteLanguagePackCommand.d.ts.map +1 -0
- package/lib/types/src/api/command/os/DeleteLanguagePackCommand.test.d.ts +2 -0
- package/lib/types/src/api/command/os/DeleteLanguagePackCommand.test.d.ts.map +1 -0
- package/lib/types/src/api/command/os/GetAppStorageInfoCommand.d.ts +31 -0
- package/lib/types/src/api/command/os/GetAppStorageInfoCommand.d.ts.map +1 -0
- package/lib/types/src/api/command/os/GetAppStorageInfoCommand.test.d.ts +2 -0
- package/lib/types/src/api/command/os/GetAppStorageInfoCommand.test.d.ts.map +1 -0
- package/lib/types/src/api/command/os/GetBatteryStatusCommand.d.ts.map +1 -1
- package/lib/types/src/api/command/os/ListLanguagePackCommand.d.ts +1 -1
- package/lib/types/src/api/command/os/ListLanguagePackCommand.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.d.ts +9 -6
- package/lib/types/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.d.ts +7 -6
- package/lib/types/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/Errors.d.ts +20 -0
- package/lib/types/src/api/device-action/os/Errors.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GetDeviceMetadata/GetDeviceMetadataDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GetDeviceMetadata/types.d.ts +3 -2
- package/lib/types/src/api/device-action/os/GetDeviceMetadata/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.d.ts +23 -0
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.d.ts.map +1 -0
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.d.ts +2 -0
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/InstallLanguagePackageDeviceAction.test.d.ts.map +1 -0
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/types.d.ts +27 -0
- package/lib/types/src/api/device-action/os/InstallLanguagePackage/types.d.ts.map +1 -0
- package/lib/types/src/api/device-action/task/BackupAppStorageTask.d.ts +23 -0
- package/lib/types/src/api/device-action/task/BackupAppStorageTask.d.ts.map +1 -0
- package/lib/types/src/api/device-action/task/BackupAppStorageTask.test.d.ts +2 -0
- package/lib/types/src/api/device-action/task/BackupAppStorageTask.test.d.ts.map +1 -0
- package/lib/types/src/api/device-action/task/Errors.d.ts +12 -0
- package/lib/types/src/api/device-action/task/Errors.d.ts.map +1 -0
- package/lib/types/src/api/device-action/task/GetApplicationsMetadataTask.d.ts +5 -3
- package/lib/types/src/api/device-action/task/GetApplicationsMetadataTask.d.ts.map +1 -1
- package/lib/types/src/api/device-action/task/GetFirmwareMetadataTask.d.ts +7 -3
- package/lib/types/src/api/device-action/task/GetFirmwareMetadataTask.d.ts.map +1 -1
- package/lib/types/src/api/device-action/task/InstallLanguagePackageTask.d.ts +19 -0
- package/lib/types/src/api/device-action/task/InstallLanguagePackageTask.d.ts.map +1 -0
- package/lib/types/src/api/device-action/task/InstallLanguagePackageTask.test.d.ts +2 -0
- package/lib/types/src/api/device-action/task/InstallLanguagePackageTask.test.d.ts.map +1 -0
- package/lib/types/src/api/device-action/xstate-utils/XStateDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/index.d.ts +14 -2
- package/lib/types/src/api/index.d.ts.map +1 -1
- package/lib/types/src/api/model/DmkResult.d.ts +24 -0
- package/lib/types/src/api/model/DmkResult.d.ts.map +1 -0
- package/lib/types/src/api/model/DmkResult.test.d.ts +2 -0
- package/lib/types/src/api/model/DmkResult.test.d.ts.map +1 -0
- package/lib/types/src/api/network/DmkNetworkClient.d.ts +97 -0
- package/lib/types/src/api/network/DmkNetworkClient.d.ts.map +1 -0
- package/lib/types/src/api/network/DmkNetworkClient.test.d.ts +2 -0
- package/lib/types/src/api/network/DmkNetworkClient.test.d.ts.map +1 -0
- package/lib/types/src/api/network/DmkNetworkClientError.d.ts +33 -0
- package/lib/types/src/api/network/DmkNetworkClientError.d.ts.map +1 -0
- package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts +94 -0
- package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts.map +1 -0
- package/lib/types/src/api/network/DmkNetworkClientHelpers.test.d.ts +2 -0
- package/lib/types/src/api/network/DmkNetworkClientHelpers.test.d.ts.map +1 -0
- package/lib/types/src/api/storage/KeyValueStorage.d.ts +7 -0
- package/lib/types/src/api/storage/KeyValueStorage.d.ts.map +1 -0
- package/lib/types/src/api/types.d.ts +2 -0
- package/lib/types/src/api/types.d.ts.map +1 -1
- package/lib/types/src/internal/manager-api/data/{AxiosManagerApiDataSource.d.ts → HttpManagerApiDataSource.d.ts} +3 -3
- package/lib/types/src/internal/manager-api/data/HttpManagerApiDataSource.d.ts.map +1 -0
- package/lib/types/src/internal/manager-api/data/HttpManagerApiDataSource.test.d.ts +2 -0
- package/lib/types/src/internal/manager-api/data/HttpManagerApiDataSource.test.d.ts.map +1 -0
- package/lib/types/src/internal/manager-api/data/__mocks__/{AxiosManagerApiDataSource.d.ts → HttpManagerApiDataSource.d.ts} +2 -2
- package/lib/types/src/internal/manager-api/data/__mocks__/HttpManagerApiDataSource.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +2 -3
- package/lib/cjs/src/internal/manager-api/data/AxiosManagerApiDataSource.js +0 -2
- package/lib/cjs/src/internal/manager-api/data/AxiosManagerApiDataSource.js.map +0 -7
- package/lib/cjs/src/internal/manager-api/data/AxiosManagerApiDataSource.test.js +0 -2
- package/lib/cjs/src/internal/manager-api/data/AxiosManagerApiDataSource.test.js.map +0 -7
- package/lib/cjs/src/internal/manager-api/data/__mocks__/AxiosManagerApiDataSource.js +0 -2
- package/lib/cjs/src/internal/manager-api/data/__mocks__/AxiosManagerApiDataSource.js.map +0 -7
- package/lib/esm/src/internal/manager-api/data/AxiosManagerApiDataSource.js +0 -2
- package/lib/esm/src/internal/manager-api/data/AxiosManagerApiDataSource.js.map +0 -7
- package/lib/esm/src/internal/manager-api/data/AxiosManagerApiDataSource.test.js +0 -2
- package/lib/esm/src/internal/manager-api/data/AxiosManagerApiDataSource.test.js.map +0 -7
- package/lib/esm/src/internal/manager-api/data/__mocks__/AxiosManagerApiDataSource.js.map +0 -7
- package/lib/types/src/internal/manager-api/data/AxiosManagerApiDataSource.d.ts.map +0 -1
- package/lib/types/src/internal/manager-api/data/AxiosManagerApiDataSource.test.d.ts +0 -2
- package/lib/types/src/internal/manager-api/data/AxiosManagerApiDataSource.test.d.ts.map +0 -1
- package/lib/types/src/internal/manager-api/data/__mocks__/AxiosManagerApiDataSource.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorResult,\n isSuccessCommandResult,\n} from \"@api/command/model/CommandResult\";\nimport {\n BackupStorageCommand,\n type BackupStorageCommandErrorCodes,\n} from \"@api/command/os/BackupStorageCommand\";\nimport {\n GetAppStorageInfoCommand,\n type GetAppStorageInfoCommandErrorCodes,\n} from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type DmkResult, DmkResultFactory } from \"@api/model/DmkResult\";\nimport { bufferToHexaString, type HexaString } from \"@api/utils/HexaString\";\n\nexport type BackupAppStorageTaskArgs = {\n appName: string;\n};\n\nexport type BackupAppStorageTaskResponse = {\n appStorageData: HexaString;\n};\n\nexport type BackupAppStorageTaskErrorCodes =\n | GetAppStorageInfoCommandErrorCodes\n | BackupStorageCommandErrorCodes;\n\nexport type BackupAppStorageTaskError =\n | CommandErrorResult<GetAppStorageInfoCommandErrorCodes>[\"error\"]\n | CommandErrorResult<BackupStorageCommandErrorCodes>[\"error\"];\n\nexport class BackupAppStorageTask {\n constructor(\n private readonly args: BackupAppStorageTaskArgs,\n private readonly api: InternalApi,\n private readonly logger: LoggerPublisherService,\n ) {}\n\n public async run(): Promise<\n DmkResult<BackupAppStorageTaskResponse, BackupAppStorageTaskError>\n > {\n this.logger.debug(\"[run] Starting BackupAppStorageTask\", {\n data: {\n appName: this.args.appName,\n },\n });\n\n const { appName } = this.args;\n\n const getAppStorageInfo = await this.api.sendCommand(\n new GetAppStorageInfoCommand({\n appName,\n }),\n );\n\n if (!isSuccessCommandResult(getAppStorageInfo)) {\n this.logger.debug(\"[run] Failed to get app storage info\", {\n data: { error: getAppStorageInfo.error },\n });\n return DmkResultFactory({\n error: getAppStorageInfo.error,\n });\n }\n\n const { storageSize } = getAppStorageInfo.data;\n let offset = 0;\n let appStorageDataBytes = new Uint8Array(0);\n\n while (offset < storageSize) {\n const backupStorage = await this.api.sendCommand(\n new BackupStorageCommand(),\n );\n if (!isSuccessCommandResult(backupStorage)) {\n this.logger.debug(\"[run] Failed to backup app storage\", {\n data: { error: backupStorage.error },\n });\n return DmkResultFactory({\n error: backupStorage.error,\n });\n }\n\n const { chunkData, chunkSize } = backupStorage.data;\n appStorageDataBytes = Uint8Array.from([\n ...appStorageDataBytes,\n ...chunkData,\n ]);\n offset += chunkSize;\n }\n\n const appStorageData = bufferToHexaString(appStorageDataBytes);\n this.logger.debug(\"[run] App storage data backed up successfully\", {\n data: {\n appStorageData,\n },\n });\n\n return DmkResultFactory({\n data: {\n appStorageData,\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,4CACPC,EAGO,gDACPC,EAGO,oDAGPC,EAAiD,gCACjDC,EAAoD,iCAkB7C,MAAMN,CAAqB,CAChC,YACmBO,EACAC,EACAC,EACjB,CAHiB,UAAAF,EACA,SAAAC,EACA,YAAAC,CAChB,CAEH,MAAa,KAEX,CACA,KAAK,OAAO,MAAM,sCAAuC,CACvD,KAAM,CACJ,QAAS,KAAK,KAAK,OACrB,CACF,CAAC,EAED,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEnBC,EAAoB,MAAM,KAAK,IAAI,YACvC,IAAI,2BAAyB,CAC3B,QAAAD,CACF,CAAC,CACH,EAEA,GAAI,IAAC,0BAAuBC,CAAiB,EAC3C,YAAK,OAAO,MAAM,uCAAwC,CACxD,KAAM,CAAE,MAAOA,EAAkB,KAAM,CACzC,CAAC,KACM,oBAAiB,CACtB,MAAOA,EAAkB,KAC3B,CAAC,EAGH,KAAM,CAAE,YAAAC,CAAY,EAAID,EAAkB,KAC1C,IAAIE,EAAS,EACTC,EAAsB,IAAI,WAAW,CAAC,EAE1C,KAAOD,EAASD,GAAa,CAC3B,MAAMG,EAAgB,MAAM,KAAK,IAAI,YACnC,IAAI,sBACN,EACA,GAAI,IAAC,0BAAuBA,CAAa,EACvC,YAAK,OAAO,MAAM,qCAAsC,CACtD,KAAM,CAAE,MAAOA,EAAc,KAAM,CACrC,CAAC,KACM,oBAAiB,CACtB,MAAOA,EAAc,KACvB,CAAC,EAGH,KAAM,CAAE,UAAAC,EAAW,UAAAC,CAAU,EAAIF,EAAc,KAC/CD,EAAsB,WAAW,KAAK,CACpC,GAAGA,EACH,GAAGE,CACL,CAAC,EACDH,GAAUI,CACZ,CAEA,MAAMC,KAAiB,sBAAmBJ,CAAmB,EAC7D,YAAK,OAAO,MAAM,gDAAiD,CACjE,KAAM,CACJ,eAAAI,CACF,CACF,CAAC,KAEM,oBAAiB,CACtB,KAAM,CACJ,eAAAA,CACF,CACF,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["BackupAppStorageTask_exports", "__export", "BackupAppStorageTask", "__toCommonJS", "import_CommandResult", "import_BackupStorageCommand", "import_GetAppStorageInfoCommand", "import_DmkResult", "import_HexaString", "args", "api", "logger", "appName", "getAppStorageInfo", "storageSize", "offset", "appStorageDataBytes", "backupStorage", "chunkData", "chunkSize", "appStorageData"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=require("../../command/os/BackupStorageCommand"),p=require("../../command/os/GetAppStorageInfoCommand"),n=require("../../device-action/task/BackupAppStorageTask"),e=require("../../index");describe("BackupAppStorageTask",()=>{let o,t;const s=vi.fn();beforeEach(()=>{vi.clearAllMocks(),o={sendCommand:s},t={debug:vi.fn()}}),describe("Success",()=>{it("should backup app storage data successfully",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{storageSize:15}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([1,35,69,103,137]),chunkSize:5}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([10,11,12,13,14]),chunkSize:5}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([15,16,17,18,19]),chunkSize:5}}));const a=await r.run();expect((0,e.isSuccessDmkResult)(a)).toBe(!0),expect(a.data.appStorageData).toBe("0x01234567890a0b0c0d0e0f10111213")})}),describe("Error",()=>{it("should return error when getting app storage info fails",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new p.GetAppStorageInfoCommandError({message:"Application not found.",errorCode:"5123"})}));const a=await r.run();expect(a).toStrictEqual((0,e.DmkResultFactory)({error:new p.GetAppStorageInfoCommandError({message:"Application not found.",errorCode:"5123"})}))}),it("should return error when backing up app storage data fails",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{storageSize:100}})).mockResolvedValueOnce((0,e.CommandResultFactory)({error:new c.BackupStorageCommandError({message:"Failed to backup app storage data.",errorCode:"541c"})}));const a=await r.run();expect((0,e.isSuccessDmkResult)(a)).toBe(!1),expect(a.error).toBeInstanceOf(c.BackupStorageCommandError),expect(a.error.message).toBe("Failed to backup app storage data.")})})});
|
|
2
|
+
//# sourceMappingURL=BackupAppStorageTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { BackupStorageCommandError } from \"@api/command/os/BackupStorageCommand\";\nimport { GetAppStorageInfoCommandError } from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport {\n BackupAppStorageTask,\n type BackupAppStorageTaskResponse,\n} from \"@api/device-action/task/BackupAppStorageTask\";\nimport {\n CommandResultFactory,\n DmkResultFactory,\n isSuccessDmkResult,\n} from \"@api/index\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\n\ndescribe(\"BackupAppStorageTask\", () => {\n let api: InternalApi;\n let logger: LoggerPublisherService;\n const sendCommand = vi.fn();\n\n beforeEach(() => {\n vi.clearAllMocks();\n api = {\n sendCommand,\n } as unknown as InternalApi;\n logger = {\n debug: vi.fn(),\n } as unknown as LoggerPublisherService;\n });\n\n describe(\"Success\", () => {\n it(\"should backup app storage data successfully\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 15 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x01, 0x23, 0x45, 0x67, 0x89]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0a, 0x0b, 0x0c, 0x0d, 0x0e]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0f, 0x10, 0x11, 0x12, 0x13]),\n chunkSize: 5,\n },\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(true);\n expect(\n (result as { data: BackupAppStorageTaskResponse }).data.appStorageData,\n ).toBe(\"0x01234567890a0b0c0d0e0f10111213\");\n });\n });\n\n describe(\"Error\", () => {\n it(\"should return error when getting app storage info fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n });\n\n it(\"should return error when backing up app storage data fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 100 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new BackupStorageCommandError({\n message: \"Failed to backup app storage data.\",\n errorCode: \"541c\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(false);\n expect(\n (result as { error: BackupStorageCommandError }).error,\n ).toBeInstanceOf(BackupStorageCommandError);\n expect(\n (result as { error: BackupStorageCommandError }).error.message,\n ).toBe(\"Failed to backup app storage data.\");\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA0C,gDAC1CC,EAA8C,oDAE9CC,EAGO,wDACPC,EAIO,sBAGP,SAAS,uBAAwB,IAAM,CACrC,IAAIC,EACAC,EACJ,MAAMC,EAAc,GAAG,GAAG,EAE1B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBF,EAAM,CACJ,YAAAE,CACF,EACAD,EAAS,CACP,MAAO,GAAG,GAAG,CACf,CACF,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,8CAA+C,SAAY,CAE5D,MAAME,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EACG,yBACC,wBAAqB,CAAE,KAAM,CAAE,YAAa,EAAG,CAAE,CAAC,CACpD,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,EAAM,GAAM,GAAM,IAAM,GAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EAGF,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,UAAO,sBAAmBC,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5C,OACGA,EAAkD,KAAK,cAC1D,EAAE,KAAK,kCAAkC,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,0DAA2D,SAAY,CAExE,MAAMD,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EAAY,yBACV,wBAAqB,CACnB,MAAO,IAAI,gCAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGA,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,OAAOC,CAAM,EAAE,iBACb,oBAAiB,CACf,MAAO,IAAI,gCAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED,GAAG,6DAA8D,SAAY,CAE3E,MAAMD,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EACG,yBACC,wBAAqB,CAAE,KAAM,CAAE,YAAa,GAAI,CAAE,CAAC,CACrD,EACC,yBACC,wBAAqB,CACnB,MAAO,IAAI,4BAA0B,CACnC,QAAS,qCACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGF,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,UAAO,sBAAmBC,CAAM,CAAC,EAAE,KAAK,EAAK,EAC7C,OACGA,EAAgD,KACnD,EAAE,eAAe,2BAAyB,EAC1C,OACGA,EAAgD,MAAM,OACzD,EAAE,KAAK,oCAAoC,CAC7C,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_BackupStorageCommand", "import_GetAppStorageInfoCommand", "import_BackupAppStorageTask", "import_api", "api", "logger", "sendCommand", "task", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(a,r)=>{for(var t in r)e(a,t,{get:r[t],enumerable:!0})},E=(a,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of s(r))!l.call(a,o)&&o!==t&&e(a,o,{get:()=>r[o],enumerable:!(i=n(r,o))||i.enumerable});return a};var d=a=>E(e({},"__esModule",{value:!0}),a);var g={};p(g,{GetApplicationsMetadataTaskError:()=>c,InvalidGetFirmwareMetadataResponseError:()=>m});module.exports=d(g);class m{_tag="InvalidGetFirmwareMetadataResponseError";originalError;constructor(r){this.originalError=new Error(r??"Invalid Firmware Metadata response error.")}}class c{_tag="GetApplicationsMetadataTaskError";originalError;constructor(r){this.originalError=new Error(r??"Failed to get applications metadata.")}}0&&(module.exports={GetApplicationsMetadataTaskError,InvalidGetFirmwareMetadataResponseError});
|
|
2
|
+
//# sourceMappingURL=Errors.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/api/device-action/task/Errors.ts"],
|
|
4
|
+
"sourcesContent": ["import { type DmkError } from \"@api/Error\";\n\nexport class InvalidGetFirmwareMetadataResponseError implements DmkError {\n readonly _tag = \"InvalidGetFirmwareMetadataResponseError\";\n readonly originalError: Error;\n\n constructor(message?: string) {\n this.originalError = new Error(\n message ?? \"Invalid Firmware Metadata response error.\",\n );\n }\n}\n\nexport class GetApplicationsMetadataTaskError implements DmkError {\n readonly _tag = \"GetApplicationsMetadataTaskError\";\n readonly originalError: Error;\n\n constructor(message?: string) {\n this.originalError = new Error(\n message ?? \"Failed to get applications metadata.\",\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sCAAAE,EAAA,4CAAAC,IAAA,eAAAC,EAAAJ,GAEO,MAAMG,CAA4D,CAC9D,KAAO,0CACP,cAET,YAAYE,EAAkB,CAC5B,KAAK,cAAgB,IAAI,MACvBA,GAAW,2CACb,CACF,CACF,CAEO,MAAMH,CAAqD,CACvD,KAAO,mCACP,cAET,YAAYG,EAAkB,CAC5B,KAAK,cAAgB,IAAI,MACvBA,GAAW,sCACb,CACF,CACF",
|
|
6
|
+
"names": ["Errors_exports", "__export", "GetApplicationsMetadataTaskError", "InvalidGetFirmwareMetadataResponseError", "__toCommonJS", "message"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var
|
|
1
|
+
"use strict";var d=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var G=(s,t)=>{for(var i in t)d(s,i,{get:t[i],enumerable:!0})},T=(s,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of L(t))!R.call(s,n)&&n!==i&&d(s,n,{get:()=>t[n],enumerable:!(o=M(t,n))||o.enumerable});return s};var I=s=>T(d({},"__esModule",{value:!0}),s);var P={};G(P,{GetApplicationsMetadataTask:()=>F});module.exports=I(P);var h=require("semver"),k=require("../../command/model/CommandResult"),y=require("../../command/os/ListLanguagePackCommand"),m=require("../../device-action/task/Errors"),p=require("../../model/DmkResult");const V="0000000000000000000000000000000000000000000000000000000000000000";class F{constructor(t,i){this.api=t;this.args=i}async run(){const t=this.args.installedApps.filter(a=>this.isApplication(a)),i=this.api.getManagerApiService(),o=t.map(a=>a.hash),n=await i.getAppsByHash(o).chain(a=>i.getAppList(this.args.firmwareVersion.metadata).map(e=>({applications:a,catalog:e})));if(n.isLeft())return(0,p.DmkResultFactory)({error:new m.GetApplicationsMetadataTaskError("Cannot get the application catalog")});const{applications:u,catalog:l}=n.unsafeCoerce(),v=u.reduce((a,e,r)=>{if(e!==null)return[...a,e];const g=t[r],f=l.find(C=>C.versionName===g.name);return f?[...a,f]:a},[]),w=u.filter(a=>a!==null).reduce((a,e)=>{const r=l.find(g=>g.versionName===e.versionName);return r&&(0,h.gt)(r.version,e.version)?[...a,r]:a},[]);let c=[];for(let a=0;;a++){const e=await this.api.sendCommand(new y.ListLanguagePackCommand({firstChunk:a===0}));if(!(0,k.isSuccessCommandResult)(e)||e.data===void 0)break;c=[...c,e.data]}const A=await i.getLanguagePackages(this.args.deviceVersion,this.args.firmware);return A.isRight()?(0,p.DmkResultFactory)({data:{applications:v,applicationsUpdates:w,installedLanguages:c,catalog:{applications:l,languagePackages:A.extract()}}}):(0,p.DmkResultFactory)({error:new m.GetApplicationsMetadataTaskError("Cannot get the languages catalog")})}isApplication(t){return t.hashCode!==V}}0&&(module.exports={GetApplicationsMetadataTask});
|
|
2
2
|
//# sourceMappingURL=GetApplicationsMetadataTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/task/GetApplicationsMetadataTask.ts"],
|
|
4
|
-
"sourcesContent": ["import { gt } from \"semver\";\n\nimport {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmB,kBAEnBC,EAAuC
|
|
6
|
-
"names": ["GetApplicationsMetadataTask_exports", "__export", "GetApplicationsMetadataTask", "__toCommonJS", "import_semver", "
|
|
4
|
+
"sourcesContent": ["import { gt } from \"semver\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { ListLanguagePackCommand } from \"@api/command/os/ListLanguagePackCommand\";\nimport type { InternalApi } from \"@api/device-action/DeviceAction\";\nimport { GetApplicationsMetadataTaskError } from \"@api/device-action/task/Errors\";\nimport {\n type Catalog,\n type FirmwareVersion,\n type InstalledLanguagePackage,\n} from \"@api/device-session/DeviceSessionState\";\nimport { type DmkResult, DmkResultFactory } from \"@api/model/DmkResult\";\nimport { type Application } from \"@internal/manager-api/model/Application\";\nimport { type DeviceVersion } from \"@internal/manager-api/model/Device\";\nimport { type FinalFirmware } from \"@internal/manager-api/model/Firmware\";\n\nexport type InstalledApp = {\n hash: string;\n hashCode: string;\n name: string;\n};\n\nexport type GetApplicationsMetadataTaskArgs = {\n deviceVersion: DeviceVersion;\n firmware: FinalFirmware;\n firmwareVersion: FirmwareVersion;\n installedApps: InstalledApp[];\n};\n\nexport type GetApplicationsMetadataTaskResponse = {\n applications: Application[];\n applicationsUpdates: Application[];\n installedLanguages: InstalledLanguagePackage[];\n catalog: Catalog;\n};\n\nexport type GetApplicationsMetadataTaskResult = DmkResult<\n GetApplicationsMetadataTaskResponse,\n GetApplicationsMetadataTaskError\n>;\n\nconst ZERO_HASH =\n \"0000000000000000000000000000000000000000000000000000000000000000\";\n\nexport class GetApplicationsMetadataTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: GetApplicationsMetadataTaskArgs,\n ) {}\n\n async run(): Promise<GetApplicationsMetadataTaskResult> {\n // Get applications metadata\n const installedApps = this.args.installedApps.filter((app) =>\n this.isApplication(app),\n );\n const manager = this.api.getManagerApiService();\n const appHashes = installedApps.map((app) => app.hash);\n const result = await manager\n .getAppsByHash(appHashes)\n .chain((applications) =>\n manager\n .getAppList(this.args.firmwareVersion.metadata!)\n .map((catalog) => ({ applications, catalog })),\n );\n if (result.isLeft()) {\n return DmkResultFactory({\n error: new GetApplicationsMetadataTaskError(\n \"Cannot get the application catalog\",\n ),\n });\n }\n const { applications, catalog } = result.unsafeCoerce();\n\n // Complete applications metadata using the catalog if needed\n const appsWithMetadata = applications.reduce((apps, app, index) => {\n if (app !== null) {\n // Is the app hash was found in app store, append its metadata\n return [...apps, app];\n }\n // For apps with non-deterministic hash (ie. Security Key, sideloaded app, ...),\n // use metadata of latest version from the catalog\n const installedApp = installedApps[index]!;\n const catalogApp = catalog.find(\n (c) => c.versionName === installedApp.name,\n );\n return catalogApp ? [...apps, catalogApp] : apps;\n }, [] as Application[]);\n\n // Filter apps metadata and catalog\n const filteredApps = applications.filter((app) => app !== null);\n const filteredCatalog = filteredApps.reduce((apps, app) => {\n const catalogApp = catalog.find((c) => c.versionName === app.versionName);\n if (catalogApp && gt(catalogApp.version, app.version)) {\n return [...apps, catalogApp];\n }\n return apps;\n }, [] as Application[]);\n\n // Get install language packages\n let installedLanguages: InstalledLanguagePackage[] = [];\n for (let i = 0; ; i++) {\n const language = await this.api.sendCommand(\n new ListLanguagePackCommand({ firstChunk: i === 0 }),\n );\n if (!isSuccessCommandResult(language) || language.data === undefined) {\n break;\n }\n installedLanguages = [...installedLanguages, language.data];\n }\n\n // Get all the available language packs for the device\n const languages = await manager.getLanguagePackages(\n this.args.deviceVersion,\n this.args.firmware,\n );\n if (languages.isRight()) {\n // Return the application metadata\n return DmkResultFactory({\n data: {\n applications: appsWithMetadata,\n applicationsUpdates: filteredCatalog,\n installedLanguages,\n catalog: {\n applications: catalog,\n languagePackages: languages.extract(),\n },\n },\n });\n } else {\n return DmkResultFactory({\n error: new GetApplicationsMetadataTaskError(\n \"Cannot get the languages catalog\",\n ),\n });\n }\n }\n\n private isApplication(app: InstalledApp): boolean {\n // Applications with no \"code\" hash are not real applications\n // (typically a language package).\n return app.hashCode !== ZERO_HASH;\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmB,kBAEnBC,EAAuC,4CACvCC,EAAwC,mDAExCC,EAAiD,0CAMjDC,EAAiD,gCA8BjD,MAAMC,EACJ,mEAEK,MAAMP,CAA4B,CACvC,YACmBQ,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAkD,CAEtD,MAAMC,EAAgB,KAAK,KAAK,cAAc,OAAQC,GACpD,KAAK,cAAcA,CAAG,CACxB,EACMC,EAAU,KAAK,IAAI,qBAAqB,EACxCC,EAAYH,EAAc,IAAKC,GAAQA,EAAI,IAAI,EAC/CG,EAAS,MAAMF,EAClB,cAAcC,CAAS,EACvB,MAAOE,GACNH,EACG,WAAW,KAAK,KAAK,gBAAgB,QAAS,EAC9C,IAAKI,IAAa,CAAE,aAAAD,EAAc,QAAAC,CAAQ,EAAE,CACjD,EACF,GAAIF,EAAO,OAAO,EAChB,SAAO,oBAAiB,CACtB,MAAO,IAAI,mCACT,oCACF,CACF,CAAC,EAEH,KAAM,CAAE,aAAAC,EAAc,QAAAC,CAAQ,EAAIF,EAAO,aAAa,EAGhDG,EAAmBF,EAAa,OAAO,CAACG,EAAMP,EAAKQ,IAAU,CACjE,GAAIR,IAAQ,KAEV,MAAO,CAAC,GAAGO,EAAMP,CAAG,EAItB,MAAMS,EAAeV,EAAcS,CAAK,EAClCE,EAAaL,EAAQ,KACxBM,GAAMA,EAAE,cAAgBF,EAAa,IACxC,EACA,OAAOC,EAAa,CAAC,GAAGH,EAAMG,CAAU,EAAIH,CAC9C,EAAG,CAAC,CAAkB,EAIhBK,EADeR,EAAa,OAAQJ,GAAQA,IAAQ,IAAI,EACzB,OAAO,CAACO,EAAMP,IAAQ,CACzD,MAAMU,EAAaL,EAAQ,KAAMM,GAAMA,EAAE,cAAgBX,EAAI,WAAW,EACxE,OAAIU,MAAc,MAAGA,EAAW,QAASV,EAAI,OAAO,EAC3C,CAAC,GAAGO,EAAMG,CAAU,EAEtBH,CACT,EAAG,CAAC,CAAkB,EAGtB,IAAIM,EAAiD,CAAC,EACtD,QAASC,EAAI,GAAKA,IAAK,CACrB,MAAMC,EAAW,MAAM,KAAK,IAAI,YAC9B,IAAI,0BAAwB,CAAE,WAAYD,IAAM,CAAE,CAAC,CACrD,EACA,GAAI,IAAC,0BAAuBC,CAAQ,GAAKA,EAAS,OAAS,OACzD,MAEFF,EAAqB,CAAC,GAAGA,EAAoBE,EAAS,IAAI,CAC5D,CAGA,MAAMC,EAAY,MAAMf,EAAQ,oBAC9B,KAAK,KAAK,cACV,KAAK,KAAK,QACZ,EACA,OAAIe,EAAU,QAAQ,KAEb,oBAAiB,CACtB,KAAM,CACJ,aAAcV,EACd,oBAAqBM,EACrB,mBAAAC,EACA,QAAS,CACP,aAAcR,EACd,iBAAkBW,EAAU,QAAQ,CACtC,CACF,CACF,CAAC,KAEM,oBAAiB,CACtB,MAAO,IAAI,mCACT,kCACF,CACF,CAAC,CAEL,CAEQ,cAAchB,EAA4B,CAGhD,OAAOA,EAAI,WAAaJ,CAC1B,CACF",
|
|
6
|
+
"names": ["GetApplicationsMetadataTask_exports", "__export", "GetApplicationsMetadataTask", "__toCommonJS", "import_semver", "import_CommandResult", "import_ListLanguagePackCommand", "import_Errors", "import_DmkResult", "ZERO_HASH", "api", "args", "installedApps", "app", "manager", "appHashes", "result", "applications", "catalog", "appsWithMetadata", "apps", "index", "installedApp", "catalogApp", "c", "filteredCatalog", "installedLanguages", "i", "language", "languages"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=require("purify-ts"),g=require("../../command/model/CommandResult"),c=require("../../device-action/__test-utils__/data"),d=require("../../device-action/__test-utils__/makeInternalApi"),m=require("../../device-action/task/Errors"),s=require("../../model/DmkResult"),o=require("./GetApplicationsMetadataTask");describe("GetApplicationsMetadataTask",()=>{const e=(0,d.makeDeviceActionInternalApiMock)(),h={id:7},A={id:361,version:"1.6.0",perso:"perso_11"},w={mcu:"mcu_version",bootloader:"bl_version",os:"se_version",metadata:"metadata"},k=[{name:"Ethereum",hash:"hash2",hashCode:"hashCode"},{name:"Language",hash:"hash3",hashCode:"0000000000000000000000000000000000000000000000000000000000000000"}],u=[c.ETH_APP_METADATA],p=[c.BTC_APP_METADATA,c.ETH_APP_METADATA],l=["fr","eng","it"],i={deviceVersion:h,firmware:A,firmwareVersion:w,installedApps:k},t={getAppsByHash:vi.fn(),getAppList:vi.fn(),getLanguagePackages:vi.fn()};beforeEach(()=>{vi.clearAllMocks(),e.sendCommand.mockResolvedValue((0,g.CommandResultFactory)({data:void 0})),e.getManagerApiService.mockReturnValue(t),t.getAppsByHash.mockReturnValue((0,n.EitherAsync)(async()=>u)),t.getAppList.mockReturnValue((0,n.EitherAsync)(async()=>p)),t.getLanguagePackages.mockReturnValue((0,n.EitherAsync)(async()=>l))}),it("Success without updates",async()=>{const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({data:{applications:u,applicationsUpdates:[],installedLanguages:[],catalog:{applications:p,languagePackages:l}}}))}),it("Success without languages",async()=>{e.sendCommand.mockResolvedValueOnce((0,g.CommandResultFactory)({data:{id:1,size:15}})).mockResolvedValueOnce((0,g.CommandResultFactory)({data:{id:2,size:17}}));const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({data:{applications:u,applicationsUpdates:[],installedLanguages:[{id:1,size:15},{id:2,size:17}],catalog:{applications:p,languagePackages:l}}}))}),it("Success with an available update",async()=>{const a={...c.BTC_APP_METADATA,version:"1.0.0"};t.getAppsByHash.mockReturnValue((0,n.EitherAsync)(async()=>[a]));const r=await new o.GetApplicationsMetadataTask(e,i).run();expect(r).toStrictEqual((0,s.DmkResultFactory)({data:{applications:[a],applicationsUpdates:[c.BTC_APP_METADATA],installedLanguages:[],catalog:{applications:p,languagePackages:l}}})),expect(t.getAppsByHash).toHaveBeenCalledWith(["hash2"])}),it("Success with app hash not found",async()=>{t.getAppsByHash.mockReturnValue((0,n.EitherAsync)(async()=>[null]));const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({data:{applications:u,applicationsUpdates:[],installedLanguages:[],catalog:{applications:p,languagePackages:l}}}))}),it("should fail when apps hash cannot by retrieved",async()=>{t.getAppsByHash.mockReturnValueOnce((0,n.EitherAsync)(async({throwE:r})=>{r(new Error("error"))}));const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({error:new m.GetApplicationsMetadataTaskError("Cannot get the application catalog")}))}),it("should fail when apps list cannot by retrieved",async()=>{t.getAppList.mockReturnValueOnce((0,n.EitherAsync)(async({throwE:r})=>{r(new Error("error"))}));const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({error:new m.GetApplicationsMetadataTaskError("Cannot get the application catalog")}))}),it("should fail when languages cannot by retrieved",async()=>{t.getLanguagePackages.mockReturnValueOnce((0,n.EitherAsync)(async({throwE:r})=>{r(new Error("error"))}));const a=await new o.GetApplicationsMetadataTask(e,i).run();expect(a).toStrictEqual((0,s.DmkResultFactory)({error:new m.GetApplicationsMetadataTaskError("Cannot get the languages catalog")}))})});
|
|
2
2
|
//# sourceMappingURL=GetApplicationsMetadataTask.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/task/GetApplicationsMetadataTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { EitherAsync } from \"purify-ts\";\n\nimport {
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAA4B,qBAE5BC,
|
|
6
|
-
"names": ["import_purify_ts", "
|
|
4
|
+
"sourcesContent": ["import { EitherAsync } from \"purify-ts\";\n\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport {\n BTC_APP_METADATA,\n ETH_APP_METADATA,\n} from \"@api/device-action/__test-utils__/data\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { GetApplicationsMetadataTaskError } from \"@api/device-action/task/Errors\";\nimport { type FirmwareVersion } from \"@api/device-session/DeviceSessionState\";\nimport { DmkResultFactory } from \"@api/model/DmkResult\";\nimport { type DeviceVersion } from \"@internal/manager-api/model/Device\";\nimport { type FinalFirmware } from \"@internal/manager-api/model/Firmware\";\nimport { type LanguagePackage } from \"@internal/manager-api/model/Language\";\nimport { type ManagerApiService } from \"@internal/manager-api/service/ManagerApiService\";\n\nimport { GetApplicationsMetadataTask } from \"./GetApplicationsMetadataTask\";\n\ndescribe(\"GetApplicationsMetadataTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n\n const DEVICE_VERSION = {\n id: 7,\n } as DeviceVersion;\n\n const FIRMWARE = {\n id: 361,\n version: \"1.6.0\",\n perso: \"perso_11\",\n } as FinalFirmware;\n\n const FIRMWARE_VERSION = {\n mcu: \"mcu_version\",\n bootloader: \"bl_version\",\n os: \"se_version\",\n metadata: \"metadata\",\n } as unknown as FirmwareVersion;\n\n const INSTALLED_APPS = [\n { name: \"Ethereum\", hash: \"hash2\", hashCode: \"hashCode\" },\n {\n name: \"Language\",\n hash: \"hash3\",\n hashCode:\n \"0000000000000000000000000000000000000000000000000000000000000000\",\n },\n ];\n\n const APPS = [ETH_APP_METADATA];\n\n const CATALOG = [BTC_APP_METADATA, ETH_APP_METADATA];\n\n const LANGUAGES = [\"fr\", \"eng\", \"it\"] as unknown as LanguagePackage[];\n\n const ARGS = {\n deviceVersion: DEVICE_VERSION,\n firmware: FIRMWARE,\n firmwareVersion: FIRMWARE_VERSION,\n installedApps: INSTALLED_APPS,\n };\n\n const MANAGER_MOCK = {\n getAppsByHash: vi.fn(),\n getAppList: vi.fn(),\n getLanguagePackages: vi.fn(),\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n apiMock.getManagerApiService.mockReturnValue(\n MANAGER_MOCK as unknown as ManagerApiService,\n );\n MANAGER_MOCK.getAppsByHash.mockReturnValue(EitherAsync(async () => APPS));\n MANAGER_MOCK.getAppList.mockReturnValue(EitherAsync(async () => CATALOG));\n MANAGER_MOCK.getLanguagePackages.mockReturnValue(\n EitherAsync(async () => LANGUAGES),\n );\n });\n\n it(\"Success without updates\", async () => {\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n applications: APPS,\n applicationsUpdates: [],\n installedLanguages: [],\n catalog: {\n applications: CATALOG,\n languagePackages: LANGUAGES,\n },\n },\n }),\n );\n });\n\n it(\"Success without languages\", async () => {\n // WHEN\n apiMock.sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { id: 1, size: 15 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { id: 2, size: 17 } }),\n );\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n applications: APPS,\n applicationsUpdates: [],\n installedLanguages: [\n { id: 1, size: 15 },\n { id: 2, size: 17 },\n ],\n catalog: {\n applications: CATALOG,\n languagePackages: LANGUAGES,\n },\n },\n }),\n );\n });\n\n it(\"Success with an available update\", async () => {\n // GIVEN\n const app = {\n ...BTC_APP_METADATA,\n version: \"1.0.0\",\n };\n MANAGER_MOCK.getAppsByHash.mockReturnValue(EitherAsync(async () => [app]));\n\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n applications: [app],\n applicationsUpdates: [BTC_APP_METADATA],\n installedLanguages: [],\n catalog: {\n applications: CATALOG,\n languagePackages: LANGUAGES,\n },\n },\n }),\n );\n expect(MANAGER_MOCK.getAppsByHash).toHaveBeenCalledWith([\"hash2\"]);\n });\n\n it(\"Success with app hash not found\", async () => {\n // GIVEN\n MANAGER_MOCK.getAppsByHash.mockReturnValue(EitherAsync(async () => [null]));\n\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n applications: APPS,\n applicationsUpdates: [],\n installedLanguages: [],\n catalog: {\n applications: CATALOG,\n languagePackages: LANGUAGES,\n },\n },\n }),\n );\n });\n\n it(\"should fail when apps hash cannot by retrieved\", async () => {\n // GIVEN\n MANAGER_MOCK.getAppsByHash.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetApplicationsMetadataTaskError(\n \"Cannot get the application catalog\",\n ),\n }),\n );\n });\n\n it(\"should fail when apps list cannot by retrieved\", async () => {\n // GIVEN\n MANAGER_MOCK.getAppList.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetApplicationsMetadataTaskError(\n \"Cannot get the application catalog\",\n ),\n }),\n );\n });\n\n it(\"should fail when languages cannot by retrieved\", async () => {\n // GIVEN\n MANAGER_MOCK.getLanguagePackages.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetApplicationsMetadataTask(apiMock, ARGS).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetApplicationsMetadataTaskError(\n \"Cannot get the languages catalog\",\n ),\n }),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_purify_ts", "import_CommandResult", "import_data", "import_makeInternalApi", "import_Errors", "import_DmkResult", "import_GetApplicationsMetadataTask", "apiMock", "DEVICE_VERSION", "FIRMWARE", "FIRMWARE_VERSION", "INSTALLED_APPS", "APPS", "CATALOG", "LANGUAGES", "ARGS", "MANAGER_MOCK", "result", "app", "throwE"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var p=Object.defineProperty;var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var G=(r,e)=>{for(var o in e)p(r,o,{get:e[o],enumerable:!0})},M=(r,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of k(e))!v.call(r,t)&&t!==o&&p(r,t,{get:()=>e[t],enumerable:!(a=R(e,t))||a.enumerable});return r};var I=r=>M(p({},"__esModule",{value:!0}),r);var U={};G(U,{GetFirmwareMetadataTask:()=>x});module.exports=I(U);var c=require("../../command/model/CommandResult"),F=require("../../command/os/GetBackgroundImageSizeCommand"),l=require("../../command/os/GetOsVersionCommand"),V=require("../../device-action/task/Errors"),s=require("../../model/DmkResult");class x{constructor(e){this.api=e}async run(){const e=await this.api.sendCommand(new l.GetOsVersionCommand);if(!(0,c.isSuccessCommandResult)(e))return(0,s.DmkResultFactory)({error:e.error});const o={mcu:e.data.mcuSephVersion,bootloader:e.data.mcuBootloaderVersion,os:e.data.seVersion,metadata:e.data},a=this.api.getManagerApiService(),t=await a.getDeviceVersion(e.data).chain(i=>a.getFirmwareVersion(e.data,i).map(n=>({deviceVersion:i,currentFirmware:n})));if(t.isLeft())return(0,s.DmkResultFactory)({error:new V.InvalidGetFirmwareMetadataResponseError});const{deviceVersion:w,currentFirmware:d}=t.unsafeCoerce(),g=(await a.getLatestFirmwareVersion(d,w).chain(i=>a.getNextFirmwareVersion(i).chain(n=>a.getMcuList().map(m=>m.find(C=>C.name===o.mcu)).map(m=>m===void 0||!n.mcuVersions.includes(m.id)).map(m=>({osuFirmware:i,finalFirmware:n,mcuUpdateRequired:m}))))).caseOf({Right:i=>i,Left:i=>{}}),y={currentFirmware:d,availableUpdate:g};let u={};const f=await this.api.sendCommand(new F.GetBackgroundImageSizeCommand);return(0,c.isSuccessCommandResult)(f)&&(u={size:f.data}),(0,s.DmkResultFactory)({data:{deviceVersion:w,firmware:d,firmwareVersion:o,firmwareUpdateContext:y,customImage:u}})}}0&&(module.exports={GetFirmwareMetadataTask});
|
|
2
2
|
//# sourceMappingURL=GetFirmwareMetadataTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/task/GetFirmwareMetadataTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,
|
|
6
|
-
"names": ["GetFirmwareMetadataTask_exports", "__export", "GetFirmwareMetadataTask", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorResult,\n isSuccessCommandResult,\n} from \"@api/command/model/CommandResult\";\nimport { GetBackgroundImageSizeCommand } from \"@api/command/os/GetBackgroundImageSizeCommand\";\nimport { GetOsVersionCommand } from \"@api/command/os/GetOsVersionCommand\";\nimport type { InternalApi } from \"@api/device-action/DeviceAction\";\nimport { InvalidGetFirmwareMetadataResponseError } from \"@api/device-action/task/Errors\";\nimport {\n type CustomImage,\n type FirmwareUpdate,\n type FirmwareUpdateContext,\n type FirmwareVersion,\n} from \"@api/device-session/DeviceSessionState\";\nimport { type DmkResult, DmkResultFactory } from \"@api/model/DmkResult\";\nimport { type DeviceVersion } from \"@internal/manager-api/model/Device\";\nimport { type FinalFirmware } from \"@internal/manager-api/model/Firmware\";\n\nexport type GetFirmwareMetadataTaskResponse = {\n deviceVersion: DeviceVersion;\n firmware: FinalFirmware;\n firmwareVersion: FirmwareVersion;\n firmwareUpdateContext: FirmwareUpdateContext;\n customImage: CustomImage;\n};\n\nexport type GetFirmwareMetadataTaskError =\n | CommandErrorResult[\"error\"]\n | InvalidGetFirmwareMetadataResponseError;\n\nexport type GetFirmwareMetadataTaskResult = DmkResult<\n GetFirmwareMetadataTaskResponse,\n GetFirmwareMetadataTaskError\n>;\n\nexport class GetFirmwareMetadataTask {\n constructor(private readonly api: InternalApi) {}\n\n async run(): Promise<GetFirmwareMetadataTaskResult> {\n // Get installed firmware metadata\n const osVersion = await this.api.sendCommand(new GetOsVersionCommand());\n if (!isSuccessCommandResult(osVersion)) {\n return DmkResultFactory({\n error: osVersion.error,\n });\n }\n const firmwareVersion: FirmwareVersion = {\n mcu: osVersion.data.mcuSephVersion,\n bootloader: osVersion.data.mcuBootloaderVersion,\n os: osVersion.data.seVersion,\n metadata: osVersion.data,\n };\n\n // Fetch current firmware metadata from app store\n const manager = this.api.getManagerApiService();\n const result = await manager\n .getDeviceVersion(osVersion.data)\n .chain((deviceVersion) =>\n manager\n .getFirmwareVersion(osVersion.data, deviceVersion)\n .map((currentFirmware) => ({ deviceVersion, currentFirmware })),\n );\n if (result.isLeft()) {\n return DmkResultFactory({\n error: new InvalidGetFirmwareMetadataResponseError(),\n });\n }\n const { deviceVersion, currentFirmware } = result.unsafeCoerce();\n\n // Fetch latest firmware available, if any\n const maybeUpdate = await manager\n .getLatestFirmwareVersion(currentFirmware, deviceVersion)\n .chain((osuFirmware) =>\n manager.getNextFirmwareVersion(osuFirmware).chain((finalFirmware) =>\n manager\n .getMcuList()\n .map((mcus) => mcus.find((mcu) => mcu.name === firmwareVersion.mcu))\n .map(\n (mcu) =>\n mcu === undefined ||\n !finalFirmware.mcuVersions.includes(mcu.id),\n )\n .map((mcuUpdateRequired) => ({\n osuFirmware,\n finalFirmware,\n mcuUpdateRequired,\n })),\n ),\n );\n const availableUpdate: FirmwareUpdate | undefined = maybeUpdate.caseOf({\n Right: (data) => data,\n Left: (_error) => undefined,\n });\n const firmwareUpdateContext = {\n currentFirmware,\n availableUpdate,\n };\n\n // Get custom image metadata\n let customImage: CustomImage = {};\n const imageSize = await this.api.sendCommand(\n new GetBackgroundImageSizeCommand(),\n );\n if (isSuccessCommandResult(imageSize)) {\n customImage = { size: imageSize.data };\n }\n\n // Return firmware metadata\n return DmkResultFactory({\n data: {\n deviceVersion,\n firmware: currentFirmware,\n firmwareVersion,\n firmwareUpdateContext,\n customImage,\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,4CACPC,EAA8C,yDAC9CC,EAAoC,+CAEpCC,EAAwD,0CAOxDC,EAAiD,gCAqB1C,MAAMN,CAAwB,CACnC,YAA6BO,EAAkB,CAAlB,SAAAA,CAAmB,CAEhD,MAAM,KAA8C,CAElD,MAAMC,EAAY,MAAM,KAAK,IAAI,YAAY,IAAI,qBAAqB,EACtE,GAAI,IAAC,0BAAuBA,CAAS,EACnC,SAAO,oBAAiB,CACtB,MAAOA,EAAU,KACnB,CAAC,EAEH,MAAMC,EAAmC,CACvC,IAAKD,EAAU,KAAK,eACpB,WAAYA,EAAU,KAAK,qBAC3B,GAAIA,EAAU,KAAK,UACnB,SAAUA,EAAU,IACtB,EAGME,EAAU,KAAK,IAAI,qBAAqB,EACxCC,EAAS,MAAMD,EAClB,iBAAiBF,EAAU,IAAI,EAC/B,MAAOI,GACNF,EACG,mBAAmBF,EAAU,KAAMI,CAAa,EAChD,IAAKC,IAAqB,CAAE,cAAAD,EAAe,gBAAAC,CAAgB,EAAE,CAClE,EACF,GAAIF,EAAO,OAAO,EAChB,SAAO,oBAAiB,CACtB,MAAO,IAAI,yCACb,CAAC,EAEH,KAAM,CAAE,cAAAC,EAAe,gBAAAC,CAAgB,EAAIF,EAAO,aAAa,EAsBzDG,GAnBc,MAAMJ,EACvB,yBAAyBG,EAAiBD,CAAa,EACvD,MAAOG,GACNL,EAAQ,uBAAuBK,CAAW,EAAE,MAAOC,GACjDN,EACG,WAAW,EACX,IAAKO,GAASA,EAAK,KAAMC,GAAQA,EAAI,OAAST,EAAgB,GAAG,CAAC,EAClE,IACES,GACCA,IAAQ,QACR,CAACF,EAAc,YAAY,SAASE,EAAI,EAAE,CAC9C,EACC,IAAKC,IAAuB,CAC3B,YAAAJ,EACA,cAAAC,EACA,kBAAAG,CACF,EAAE,CACN,CACF,GAC8D,OAAO,CACrE,MAAQC,GAASA,EACjB,KAAOC,GAAQ,EACjB,CAAC,EACKC,EAAwB,CAC5B,gBAAAT,EACA,gBAAAC,CACF,EAGA,IAAIS,EAA2B,CAAC,EAChC,MAAMC,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAI,+BACN,EACA,SAAI,0BAAuBA,CAAS,IAClCD,EAAc,CAAE,KAAMC,EAAU,IAAK,MAIhC,oBAAiB,CACtB,KAAM,CACJ,cAAAZ,EACA,SAAUC,EACV,gBAAAJ,EACA,sBAAAa,EACA,YAAAC,CACF,CACF,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["GetFirmwareMetadataTask_exports", "__export", "GetFirmwareMetadataTask", "__toCommonJS", "import_CommandResult", "import_GetBackgroundImageSizeCommand", "import_GetOsVersionCommand", "import_Errors", "import_DmkResult", "api", "osVersion", "firmwareVersion", "manager", "result", "deviceVersion", "currentFirmware", "availableUpdate", "osuFirmware", "finalFirmware", "mcus", "mcu", "mcuUpdateRequired", "data", "_error", "firmwareUpdateContext", "customImage", "imageSize"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=require("purify-ts"),l=require("../../command/Errors"),i=require("../../command/model/CommandResult"),V=require("../../device-action/__test-utils__/makeInternalApi"),v=require("../../device-action/task/Errors"),c=require("../../model/DmkResult"),m=require("./GetFirmwareMetadataTask");describe("GetFirmwareMetadataTask",()=>{const r=(0,V.makeDeviceActionInternalApiMock)(),t={mcuSephVersion:"mcu_version",mcuBootloaderVersion:"bl_version",seVersion:"se_version"},p=97,u={id:7},n={id:361,version:"1.6.0",perso:"perso_11"},d={id:362,perso:"perso_11"},w={id:363,version:"1.7.0",perso:"perso_11",mcuVersions:[1]},f=[{id:3,name:"other_version"},{id:1,name:"mcu_version"}],e={getDeviceVersion:vi.fn(),getFirmwareVersion:vi.fn(),getLatestFirmwareVersion:vi.fn(),getNextFirmwareVersion:vi.fn(),getMcuList:vi.fn()};beforeEach(()=>{vi.clearAllMocks(),r.getManagerApiService.mockReturnValue(e),e.getDeviceVersion.mockReturnValue((0,o.EitherAsync)(async()=>u)),e.getFirmwareVersion.mockReturnValue((0,o.EitherAsync)(async()=>n)),e.getLatestFirmwareVersion.mockReturnValue((0,o.EitherAsync)(async()=>d)),e.getNextFirmwareVersion.mockReturnValue((0,o.EitherAsync)(async()=>w)),e.getMcuList.mockReturnValue((0,o.EitherAsync)(async()=>f))}),it("success with no firmware update available",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({data:t})).mockResolvedValueOnce((0,i.CommandResultFactory)({data:p})),e.getLatestFirmwareVersion.mockReturnValueOnce((0,o.EitherAsync)(async({throwE:s})=>{s(new Error("error"))}));const a=await new m.GetFirmwareMetadataTask(r).run();expect(a).toStrictEqual((0,c.DmkResultFactory)({data:{deviceVersion:u,firmware:n,firmwareVersion:{mcu:"mcu_version",bootloader:"bl_version",os:"se_version",metadata:t},firmwareUpdateContext:{currentFirmware:n,availableUpdate:void 0},customImage:{size:p}}}))}),it("success with a firmware update available",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({data:t})).mockResolvedValueOnce((0,i.CommandResultFactory)({error:new l.InvalidStatusWordError("error")}));const a=await new m.GetFirmwareMetadataTask(r).run();expect(a).toStrictEqual((0,c.DmkResultFactory)({data:{deviceVersion:u,firmware:n,firmwareVersion:{mcu:"mcu_version",bootloader:"bl_version",os:"se_version",metadata:t},firmwareUpdateContext:{currentFirmware:n,availableUpdate:{osuFirmware:d,finalFirmware:w,mcuUpdateRequired:!1}},customImage:{}}})),expect(e.getDeviceVersion).toHaveBeenCalledWith(t),expect(e.getFirmwareVersion).toHaveBeenCalledWith(t,u),expect(e.getLatestFirmwareVersion).toHaveBeenCalledWith(n,u),expect(e.getNextFirmwareVersion).toHaveBeenCalledWith(d)}),it("success with a firmware update available and MCU update",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({data:t})).mockResolvedValueOnce((0,i.CommandResultFactory)({error:new l.InvalidStatusWordError("error")}));const a={...w,mcuVersions:[3]};e.getNextFirmwareVersion.mockReturnValue((0,o.EitherAsync)(async()=>a));const s=await new m.GetFirmwareMetadataTask(r).run();expect(s).toStrictEqual((0,c.DmkResultFactory)({data:{deviceVersion:u,firmware:n,firmwareVersion:{mcu:"mcu_version",bootloader:"bl_version",os:"se_version",metadata:t},firmwareUpdateContext:{currentFirmware:n,availableUpdate:{osuFirmware:d,finalFirmware:a,mcuUpdateRequired:!0}},customImage:{}}}))}),it("should fail when OS version cannot be retrieved",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({error:new l.InvalidStatusWordError("error")}));const a=await new m.GetFirmwareMetadataTask(r).run();expect(a).toStrictEqual((0,c.DmkResultFactory)({error:new l.InvalidStatusWordError("error")}))}),it("should fail if device version cannot be fetched with InvalidGetFirmwareMetadataResponseError",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({data:t})),e.getDeviceVersion.mockReturnValueOnce((0,o.EitherAsync)(async({throwE:s})=>{s(new Error("error"))}));const a=await new m.GetFirmwareMetadataTask(r).run();expect(a).toStrictEqual((0,c.DmkResultFactory)({error:new v.InvalidGetFirmwareMetadataResponseError}))}),it("should fail if firmware version cannot be fetched with InvalidGetFirmwareMetadataResponseError",async()=>{r.sendCommand.mockResolvedValueOnce((0,i.CommandResultFactory)({data:t})),e.getFirmwareVersion.mockReturnValueOnce((0,o.EitherAsync)(async({throwE:s})=>{s(new Error("error"))}));const a=await new m.GetFirmwareMetadataTask(r).run();expect(a).toStrictEqual((0,c.DmkResultFactory)({error:new v.InvalidGetFirmwareMetadataResponseError}))})});
|
|
2
2
|
//# sourceMappingURL=GetFirmwareMetadataTask.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/task/GetFirmwareMetadataTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { EitherAsync } from \"purify-ts\";\n\nimport {
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAA4B,qBAE5BC,
|
|
6
|
-
"names": ["import_purify_ts", "import_Errors", "import_CommandResult", "import_makeInternalApi", "import_GetFirmwareMetadataTask", "apiMock", "OS_VERSION", "CUSTOM_IMAGE_SIZE", "DEVICE_VERSION", "FIRMWARE_VERSION", "OSU_VERSION", "NEXT_FIRMWARE_VERSION", "MCUS", "MANAGER_MOCK", "throwE", "result", "nextFirmware"]
|
|
4
|
+
"sourcesContent": ["import { EitherAsync } from \"purify-ts\";\n\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport { type GetOsVersionResponse } from \"@api/command/os/GetOsVersionCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { InvalidGetFirmwareMetadataResponseError } from \"@api/device-action/task/Errors\";\nimport { DmkResultFactory } from \"@api/model/DmkResult\";\nimport {\n type FinalFirmware,\n type McuFirmware,\n type OsuFirmware,\n} from \"@internal/manager-api/model/Firmware\";\nimport { type ManagerApiService } from \"@internal/manager-api/service/ManagerApiService\";\n\nimport { GetFirmwareMetadataTask } from \"./GetFirmwareMetadataTask\";\n\ndescribe(\"GetFirmwareMetadataTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const OS_VERSION = {\n mcuSephVersion: \"mcu_version\",\n mcuBootloaderVersion: \"bl_version\",\n seVersion: \"se_version\",\n } as GetOsVersionResponse;\n\n const CUSTOM_IMAGE_SIZE = 97;\n\n const DEVICE_VERSION = {\n id: 7,\n };\n\n const FIRMWARE_VERSION = {\n id: 361,\n version: \"1.6.0\",\n perso: \"perso_11\",\n } as FinalFirmware;\n\n const OSU_VERSION = {\n id: 362,\n perso: \"perso_11\",\n } as OsuFirmware;\n\n const NEXT_FIRMWARE_VERSION = {\n id: 363,\n version: \"1.7.0\",\n perso: \"perso_11\",\n mcuVersions: [1],\n } as FinalFirmware;\n\n const MCUS = [\n {\n id: 3,\n name: \"other_version\",\n },\n {\n id: 1,\n name: \"mcu_version\",\n },\n ] as McuFirmware[];\n\n const MANAGER_MOCK = {\n getDeviceVersion: vi.fn(),\n getFirmwareVersion: vi.fn(),\n getLatestFirmwareVersion: vi.fn(),\n getNextFirmwareVersion: vi.fn(),\n getMcuList: vi.fn(),\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n apiMock.getManagerApiService.mockReturnValue(\n MANAGER_MOCK as unknown as ManagerApiService,\n );\n MANAGER_MOCK.getDeviceVersion.mockReturnValue(\n EitherAsync(async () => DEVICE_VERSION),\n );\n MANAGER_MOCK.getFirmwareVersion.mockReturnValue(\n EitherAsync(async () => FIRMWARE_VERSION),\n );\n MANAGER_MOCK.getLatestFirmwareVersion.mockReturnValue(\n EitherAsync(async () => OSU_VERSION),\n );\n MANAGER_MOCK.getNextFirmwareVersion.mockReturnValue(\n EitherAsync(async () => NEXT_FIRMWARE_VERSION),\n );\n MANAGER_MOCK.getMcuList.mockReturnValue(EitherAsync(async () => MCUS));\n });\n\n it(\"success with no firmware update available\", async () => {\n // GIVEN\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: OS_VERSION }))\n .mockResolvedValueOnce(CommandResultFactory({ data: CUSTOM_IMAGE_SIZE }));\n MANAGER_MOCK.getLatestFirmwareVersion.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n deviceVersion: DEVICE_VERSION,\n firmware: FIRMWARE_VERSION,\n firmwareVersion: {\n mcu: \"mcu_version\",\n bootloader: \"bl_version\",\n os: \"se_version\",\n metadata: OS_VERSION,\n },\n firmwareUpdateContext: {\n currentFirmware: FIRMWARE_VERSION,\n availableUpdate: undefined,\n },\n customImage: { size: CUSTOM_IMAGE_SIZE },\n },\n }),\n );\n });\n\n it(\"success with a firmware update available\", async () => {\n // GIVEN\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: OS_VERSION }))\n .mockResolvedValueOnce(\n CommandResultFactory({ error: new InvalidStatusWordError(\"error\") }),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n deviceVersion: DEVICE_VERSION,\n firmware: FIRMWARE_VERSION,\n firmwareVersion: {\n mcu: \"mcu_version\",\n bootloader: \"bl_version\",\n os: \"se_version\",\n metadata: OS_VERSION,\n },\n firmwareUpdateContext: {\n currentFirmware: FIRMWARE_VERSION,\n availableUpdate: {\n osuFirmware: OSU_VERSION,\n finalFirmware: NEXT_FIRMWARE_VERSION,\n mcuUpdateRequired: false,\n },\n },\n customImage: {},\n },\n }),\n );\n expect(MANAGER_MOCK.getDeviceVersion).toHaveBeenCalledWith(OS_VERSION);\n expect(MANAGER_MOCK.getFirmwareVersion).toHaveBeenCalledWith(\n OS_VERSION,\n DEVICE_VERSION,\n );\n expect(MANAGER_MOCK.getLatestFirmwareVersion).toHaveBeenCalledWith(\n FIRMWARE_VERSION,\n DEVICE_VERSION,\n );\n expect(MANAGER_MOCK.getNextFirmwareVersion).toHaveBeenCalledWith(\n OSU_VERSION,\n );\n });\n\n it(\"success with a firmware update available and MCU update\", async () => {\n // GIVEN\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: OS_VERSION }))\n .mockResolvedValueOnce(\n CommandResultFactory({ error: new InvalidStatusWordError(\"error\") }),\n );\n const nextFirmware = {\n ...NEXT_FIRMWARE_VERSION,\n mcuVersions: [3],\n };\n MANAGER_MOCK.getNextFirmwareVersion.mockReturnValue(\n EitherAsync(async () => nextFirmware),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n data: {\n deviceVersion: DEVICE_VERSION,\n firmware: FIRMWARE_VERSION,\n firmwareVersion: {\n mcu: \"mcu_version\",\n bootloader: \"bl_version\",\n os: \"se_version\",\n metadata: OS_VERSION,\n },\n firmwareUpdateContext: {\n currentFirmware: FIRMWARE_VERSION,\n availableUpdate: {\n osuFirmware: OSU_VERSION,\n finalFirmware: nextFirmware,\n mcuUpdateRequired: true,\n },\n },\n customImage: {},\n },\n }),\n );\n });\n\n it(\"should fail when OS version cannot be retrieved\", async () => {\n // GIVEN\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ error: new InvalidStatusWordError(\"error\") }),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({ error: new InvalidStatusWordError(\"error\") }),\n );\n });\n\n it(\"should fail if device version cannot be fetched with InvalidGetFirmwareMetadataResponseError\", async () => {\n // GIVEN\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OS_VERSION }),\n );\n MANAGER_MOCK.getDeviceVersion.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new InvalidGetFirmwareMetadataResponseError(),\n }),\n );\n });\n\n it(\"should fail if firmware version cannot be fetched with InvalidGetFirmwareMetadataResponseError\", async () => {\n // GIVEN\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OS_VERSION }),\n );\n MANAGER_MOCK.getFirmwareVersion.mockReturnValueOnce(\n EitherAsync(async ({ throwE }) => {\n throwE(new Error(\"error\"));\n }),\n );\n\n // WHEN\n const result = await new GetFirmwareMetadataTask(apiMock).run();\n\n // THEN\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new InvalidGetFirmwareMetadataResponseError(),\n }),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA4B,qBAE5BC,EAAuC,+BACvCC,EAAqC,4CAErCC,EAAgD,6DAChDF,EAAwD,0CACxDG,EAAiC,gCAQjCC,EAAwC,qCAExC,SAAS,0BAA2B,IAAM,CACxC,MAAMC,KAAU,mCAAgC,EAC1CC,EAAa,CACjB,eAAgB,cAChB,qBAAsB,aACtB,UAAW,YACb,EAEMC,EAAoB,GAEpBC,EAAiB,CACrB,GAAI,CACN,EAEMC,EAAmB,CACvB,GAAI,IACJ,QAAS,QACT,MAAO,UACT,EAEMC,EAAc,CAClB,GAAI,IACJ,MAAO,UACT,EAEMC,EAAwB,CAC5B,GAAI,IACJ,QAAS,QACT,MAAO,WACP,YAAa,CAAC,CAAC,CACjB,EAEMC,EAAO,CACX,CACE,GAAI,EACJ,KAAM,eACR,EACA,CACE,GAAI,EACJ,KAAM,aACR,CACF,EAEMC,EAAe,CACnB,iBAAkB,GAAG,GAAG,EACxB,mBAAoB,GAAG,GAAG,EAC1B,yBAA0B,GAAG,GAAG,EAChC,uBAAwB,GAAG,GAAG,EAC9B,WAAY,GAAG,GAAG,CACpB,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EAEjBR,EAAQ,qBAAqB,gBAC3BQ,CACF,EACAA,EAAa,iBAAiB,mBAC5B,eAAY,SAAYL,CAAc,CACxC,EACAK,EAAa,mBAAmB,mBAC9B,eAAY,SAAYJ,CAAgB,CAC1C,EACAI,EAAa,yBAAyB,mBACpC,eAAY,SAAYH,CAAW,CACrC,EACAG,EAAa,uBAAuB,mBAClC,eAAY,SAAYF,CAAqB,CAC/C,EACAE,EAAa,WAAW,mBAAgB,eAAY,SAAYD,CAAI,CAAC,CACvE,CAAC,EAED,GAAG,4CAA6C,SAAY,CAE1DP,EAAQ,YACL,yBAAsB,wBAAqB,CAAE,KAAMC,CAAW,CAAC,CAAC,EAChE,yBAAsB,wBAAqB,CAAE,KAAMC,CAAkB,CAAC,CAAC,EAC1EM,EAAa,yBAAyB,uBACpC,eAAY,MAAO,CAAE,OAAAC,CAAO,IAAM,CAChCA,EAAO,IAAI,MAAM,OAAO,CAAC,CAC3B,CAAC,CACH,EAGA,MAAMC,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CACf,KAAM,CACJ,cAAeP,EACf,SAAUC,EACV,gBAAiB,CACf,IAAK,cACL,WAAY,aACZ,GAAI,aACJ,SAAUH,CACZ,EACA,sBAAuB,CACrB,gBAAiBG,EACjB,gBAAiB,MACnB,EACA,YAAa,CAAE,KAAMF,CAAkB,CACzC,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,2CAA4C,SAAY,CAEzDF,EAAQ,YACL,yBAAsB,wBAAqB,CAAE,KAAMC,CAAW,CAAC,CAAC,EAChE,yBACC,wBAAqB,CAAE,MAAO,IAAI,yBAAuB,OAAO,CAAE,CAAC,CACrE,EAGF,MAAMS,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CACf,KAAM,CACJ,cAAeP,EACf,SAAUC,EACV,gBAAiB,CACf,IAAK,cACL,WAAY,aACZ,GAAI,aACJ,SAAUH,CACZ,EACA,sBAAuB,CACrB,gBAAiBG,EACjB,gBAAiB,CACf,YAAaC,EACb,cAAeC,EACf,kBAAmB,EACrB,CACF,EACA,YAAa,CAAC,CAChB,CACF,CAAC,CACH,EACA,OAAOE,EAAa,gBAAgB,EAAE,qBAAqBP,CAAU,EACrE,OAAOO,EAAa,kBAAkB,EAAE,qBACtCP,EACAE,CACF,EACA,OAAOK,EAAa,wBAAwB,EAAE,qBAC5CJ,EACAD,CACF,EACA,OAAOK,EAAa,sBAAsB,EAAE,qBAC1CH,CACF,CACF,CAAC,EAED,GAAG,0DAA2D,SAAY,CAExEL,EAAQ,YACL,yBAAsB,wBAAqB,CAAE,KAAMC,CAAW,CAAC,CAAC,EAChE,yBACC,wBAAqB,CAAE,MAAO,IAAI,yBAAuB,OAAO,CAAE,CAAC,CACrE,EACF,MAAMU,EAAe,CACnB,GAAGL,EACH,YAAa,CAAC,CAAC,CACjB,EACAE,EAAa,uBAAuB,mBAClC,eAAY,SAAYG,CAAY,CACtC,EAGA,MAAMD,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CACf,KAAM,CACJ,cAAeP,EACf,SAAUC,EACV,gBAAiB,CACf,IAAK,cACL,WAAY,aACZ,GAAI,aACJ,SAAUH,CACZ,EACA,sBAAuB,CACrB,gBAAiBG,EACjB,gBAAiB,CACf,YAAaC,EACb,cAAeM,EACf,kBAAmB,EACrB,CACF,EACA,YAAa,CAAC,CAChB,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,kDAAmD,SAAY,CAEhEX,EAAQ,YAAY,yBAClB,wBAAqB,CAAE,MAAO,IAAI,yBAAuB,OAAO,CAAE,CAAC,CACrE,EAGA,MAAMU,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CAAE,MAAO,IAAI,yBAAuB,OAAO,CAAE,CAAC,CACjE,CACF,CAAC,EAED,GAAG,+FAAgG,SAAY,CAE7GV,EAAQ,YAAY,yBAClB,wBAAqB,CAAE,KAAMC,CAAW,CAAC,CAC3C,EACAO,EAAa,iBAAiB,uBAC5B,eAAY,MAAO,CAAE,OAAAC,CAAO,IAAM,CAChCA,EAAO,IAAI,MAAM,OAAO,CAAC,CAC3B,CAAC,CACH,EAGA,MAAMC,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CACf,MAAO,IAAI,yCACb,CAAC,CACH,CACF,CAAC,EAED,GAAG,iGAAkG,SAAY,CAE/GV,EAAQ,YAAY,yBAClB,wBAAqB,CAAE,KAAMC,CAAW,CAAC,CAC3C,EACAO,EAAa,mBAAmB,uBAC9B,eAAY,MAAO,CAAE,OAAAC,CAAO,IAAM,CAChCA,EAAO,IAAI,MAAM,OAAO,CAAC,CAC3B,CAAC,CACH,EAGA,MAAMC,EAAS,MAAM,IAAI,0BAAwBV,CAAO,EAAE,IAAI,EAG9D,OAAOU,CAAM,EAAE,iBACb,oBAAiB,CACf,MAAO,IAAI,yCACb,CAAC,CACH,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_Errors", "import_CommandResult", "import_makeInternalApi", "import_DmkResult", "import_GetFirmwareMetadataTask", "apiMock", "OS_VERSION", "CUSTOM_IMAGE_SIZE", "DEVICE_VERSION", "FIRMWARE_VERSION", "OSU_VERSION", "NEXT_FIRMWARE_VERSION", "MCUS", "MANAGER_MOCK", "throwE", "result", "nextFirmware"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var p=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var k=(n,e)=>{for(var s in e)p(n,s,{get:e[s],enumerable:!0})},y=(n,e,s,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of w(e))!h.call(n,a)&&a!==s&&p(n,a,{get:()=>e[a],enumerable:!(o=m(e,a))||o.enumerable});return n};var A=n=>y(p({},"__esModule",{value:!0}),n);var I={};k(I,{InstallLanguagePackageTask:()=>E});module.exports=A(I);var d=require("rxjs"),g=require("../../command/utils/CommandUtils"),t=require("../../device-action/os/Errors"),l=require("../../utils/HexaString");class E{constructor(e,s){this.api=e;this.args=s}run(){return new d.Observable(e=>{(async()=>{let o;try{const r=await fetch(this.args.apduInstallUrl);if(!r.ok)throw new Error(`HTTP ${r.status} ${r.statusText}`);o=await r.text()}catch(r){throw new t.NetworkDAError(`Failed to fetch APDUs: ${r instanceof Error?r.message:String(r)}`)}const a=o.split(/\r?\n/).filter(Boolean);if(typeof o!="string"||a.length===0)throw new t.UnknownDAError(`Language pack install script contains no APDUs: ${this.args.apduInstallUrl}`);for(let r=0;r<a.length;r++){const u=a[r],c=(0,l.hexaStringToBuffer)(u);if(c===null||c.length<5)throw new t.UnknownDAError(`Invalid APDU data: ${u}`);const f=(await this.api.sendApdu(c)).caseOf({Left:i=>new t.UnknownDAError(`Device communication error: ${String(i)}`),Right:i=>g.CommandUtils.isRefusedByUser(i)?new t.RefusedByUserDAError("Language install refused on device."):g.CommandUtils.isOutOfMemory(i)?new t.OutOfMemoryDAError("Not enough space for language pack."):g.CommandUtils.isSuccessResponse(i)?null:new t.UnknownDAError(`Unexpected device response: ${(0,l.bufferToHexaString)(i.statusCode)}`)});if(f)throw f;e.next({type:"progress",progress:(r+1)/a.length})}})().then(()=>e.complete(),o=>e.error(o))})}}0&&(module.exports={InstallLanguagePackageTask});
|
|
2
|
+
//# sourceMappingURL=InstallLanguagePackageTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/api/device-action/task/InstallLanguagePackageTask.ts"],
|
|
4
|
+
"sourcesContent": ["import { Observable } from \"rxjs\";\n\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport type { InternalApi } from \"@api/device-action/DeviceAction\";\nimport {\n NetworkDAError,\n OutOfMemoryDAError,\n RefusedByUserDAError,\n UnknownDAError,\n} from \"@api/device-action/os/Errors\";\nimport type { InstallLanguagePackageDAError } from \"@api/device-action/os/InstallLanguagePackage/types\";\nimport { bufferToHexaString, hexaStringToBuffer } from \"@api/utils/HexaString\";\n\nexport type InstallLanguagePackageTaskArgs = {\n apduInstallUrl: string;\n};\n\nexport type InstallLanguagePackageTaskError = Extract<\n InstallLanguagePackageDAError,\n RefusedByUserDAError | OutOfMemoryDAError | UnknownDAError\n>;\n\nexport type InstallLanguagePackageEvent = {\n type: \"progress\";\n progress: number;\n};\n\nexport class InstallLanguagePackageTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: InstallLanguagePackageTaskArgs,\n ) {}\n\n run(): Observable<InstallLanguagePackageEvent> {\n return new Observable((subscriber) => {\n const execute = async () => {\n let rawApdus: string;\n try {\n const response = await fetch(this.args.apduInstallUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n rawApdus = await response.text();\n } catch (error) {\n throw new NetworkDAError(\n `Failed to fetch APDUs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const apdus = rawApdus.split(/\\r?\\n/).filter(Boolean);\n if (typeof rawApdus !== \"string\" || apdus.length === 0) {\n throw new UnknownDAError(\n `Language pack install script contains no APDUs: ${this.args.apduInstallUrl}`,\n );\n }\n\n for (let i = 0; i < apdus.length; i++) {\n const apduHex = apdus[i]!;\n const apdu = hexaStringToBuffer(apduHex);\n if (apdu === null || apdu.length < 5) {\n throw new UnknownDAError(`Invalid APDU data: ${apduHex}`);\n }\n\n const response = await this.api.sendApdu(apdu);\n\n const error = response.caseOf({\n Left: (err) =>\n new UnknownDAError(`Device communication error: ${String(err)}`),\n Right: (apduResponse) => {\n if (CommandUtils.isRefusedByUser(apduResponse)) {\n return new RefusedByUserDAError(\n \"Language install refused on device.\",\n );\n }\n if (CommandUtils.isOutOfMemory(apduResponse)) {\n return new OutOfMemoryDAError(\n \"Not enough space for language pack.\",\n );\n }\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n return new UnknownDAError(\n `Unexpected device response: ${bufferToHexaString(\n apduResponse.statusCode,\n )}`,\n );\n }\n return null;\n },\n });\n\n if (error) {\n throw error;\n }\n\n subscriber.next({\n type: \"progress\",\n progress: (i + 1) / apdus.length,\n });\n }\n };\n\n execute().then(\n () => subscriber.complete(),\n (err) => subscriber.error(err),\n );\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA2B,gBAE3BC,EAA6B,2CAE7BC,EAKO,wCAEPC,EAAuD,iCAgBhD,MAAML,CAA2B,CACtC,YACmBM,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,KAA+C,CAC7C,OAAO,IAAI,aAAYC,GAAe,EACpB,SAAY,CAC1B,IAAIC,EACJ,GAAI,CACF,MAAMC,EAAW,MAAM,MAAM,KAAK,KAAK,cAAc,EACrD,GAAI,CAACA,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAElED,EAAW,MAAMC,EAAS,KAAK,CACjC,OAASC,EAAO,CACd,MAAM,IAAI,iBACR,0BAA0BA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAAC,EAClF,CACF,CAEA,MAAMC,EAAQH,EAAS,MAAM,OAAO,EAAE,OAAO,OAAO,EACpD,GAAI,OAAOA,GAAa,UAAYG,EAAM,SAAW,EACnD,MAAM,IAAI,iBACR,mDAAmD,KAAK,KAAK,cAAc,EAC7E,EAGF,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAK,CACrC,MAAMC,EAAUF,EAAMC,CAAC,EACjBE,KAAO,sBAAmBD,CAAO,EACvC,GAAIC,IAAS,MAAQA,EAAK,OAAS,EACjC,MAAM,IAAI,iBAAe,sBAAsBD,CAAO,EAAE,EAK1D,MAAMH,GAFW,MAAM,KAAK,IAAI,SAASI,CAAI,GAEtB,OAAO,CAC5B,KAAOC,GACL,IAAI,iBAAe,+BAA+B,OAAOA,CAAG,CAAC,EAAE,EACjE,MAAQC,GACF,eAAa,gBAAgBA,CAAY,EACpC,IAAI,uBACT,qCACF,EAEE,eAAa,cAAcA,CAAY,EAClC,IAAI,qBACT,qCACF,EAEG,eAAa,kBAAkBA,CAAY,EAOzC,KANE,IAAI,iBACT,kCAA+B,sBAC7BA,EAAa,UACf,CAAC,EACH,CAIN,CAAC,EAED,GAAIN,EACF,MAAMA,EAGRH,EAAW,KAAK,CACd,KAAM,WACN,UAAWK,EAAI,GAAKD,EAAM,MAC5B,CAAC,CACH,CACF,GAEQ,EAAE,KACR,IAAMJ,EAAW,SAAS,EACzBQ,GAAQR,EAAW,MAAMQ,CAAG,CAC/B,CACF,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["InstallLanguagePackageTask_exports", "__export", "InstallLanguagePackageTask", "__toCommonJS", "import_rxjs", "import_CommandUtils", "import_Errors", "import_HexaString", "api", "args", "subscriber", "rawApdus", "response", "error", "apdus", "i", "apduHex", "apdu", "err", "apduResponse"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";var n=require("purify-ts"),t=require("rxjs"),r=require("../../device-action/os/Errors"),u=require("../../device-session/ApduResponse"),l=require("./InstallLanguagePackageTask");describe("InstallLanguagePackageTask",()=>{let o;const s=vi.fn(),p=new Uint8Array([144,0]),i=new Uint8Array([85,1]),d=new Uint8Array([106,132]),m=new Uint8Array([103,0]);function a(e){return new u.ApduResponse({statusCode:e,data:new Uint8Array})}beforeEach(()=>{vi.clearAllMocks(),o={sendApdu:s}}),afterEach(()=>{vi.restoreAllMocks()}),describe("success",()=>{it("should send all APDUs and emit progress events",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response(`e0c4000000
|
|
2
|
+
e0c4010000
|
|
3
|
+
e0c4020000`)),s.mockResolvedValueOnce((0,n.Right)(a(p))).mockResolvedValueOnce((0,n.Right)(a(p))).mockResolvedValueOnce((0,n.Right)(a(p)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"}),c=await(0,t.lastValueFrom)(e.run().pipe((0,t.toArray)()));expect(globalThis.fetch).toHaveBeenCalledWith("https://example.com/install"),expect(s).toHaveBeenCalledTimes(3),expect(c).toEqual([{type:"progress",progress:1/3},{type:"progress",progress:2/3},{type:"progress",progress:1}])}),it("should handle a single APDU",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4000000")),s.mockResolvedValueOnce((0,n.Right)(a(p)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"}),c=await(0,t.lastValueFrom)(e.run().pipe((0,t.toArray)()));expect(s).toHaveBeenCalledTimes(1),expect(c).toEqual([{type:"progress",progress:1}])}),it("should skip empty lines in APDU data",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response(`e0c4000000
|
|
4
|
+
|
|
5
|
+
e0c4010000
|
|
6
|
+
`)),s.mockResolvedValueOnce((0,n.Right)(a(p))).mockResolvedValueOnce((0,n.Right)(a(p)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"}),c=await(0,t.lastValueFrom)(e.run().pipe((0,t.toArray)()));expect(s).toHaveBeenCalledTimes(2),expect(c).toEqual([{type:"progress",progress:.5},{type:"progress",progress:1}])}),it("should handle Windows-style line endings",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response(`e0c4000000\r
|
|
7
|
+
e0c4010000`)),s.mockResolvedValueOnce((0,n.Right)(a(p))).mockResolvedValueOnce((0,n.Right)(a(p)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"}),c=await(0,t.lastValueFrom)(e.run().pipe((0,t.toArray)()));expect(s).toHaveBeenCalledTimes(2),expect(c).toEqual([{type:"progress",progress:.5},{type:"progress",progress:1}])})}),describe("error",()=>{it("should throw NetworkDAError when fetching APDUs fails",async()=>{vi.spyOn(globalThis,"fetch").mockRejectedValueOnce(new Error("Network timeout"));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.NetworkDAError("Failed to fetch APDUs: Network timeout")),expect(s).not.toHaveBeenCalled()}),it("should throw UnknownDAError for invalid APDU hex data",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("ZZZZ"));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.UnknownDAError("Invalid APDU data: ZZZZ")),expect(s).not.toHaveBeenCalled()}),it("should throw UnknownDAError for too-short APDU data",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4"));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.UnknownDAError("Invalid APDU data: e0c4")),expect(s).not.toHaveBeenCalled()}),it("should throw UnknownDAError on device communication error (Left)",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4000000")),s.mockResolvedValueOnce((0,n.Left)(new Error("Transport error")));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.UnknownDAError("Device communication error: Error: Transport error"))}),it("should throw RefusedByUserDAError when device refuses",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4000000")),s.mockResolvedValueOnce((0,n.Right)(a(i)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.RefusedByUserDAError("Language install refused on device."))}),it("should throw OutOfMemoryDAError when device is out of memory",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4000000")),s.mockResolvedValueOnce((0,n.Right)(a(d)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.OutOfMemoryDAError("Not enough space for language pack."))}),it("should throw UnknownDAError for unexpected device response status",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response("e0c4000000")),s.mockResolvedValueOnce((0,n.Right)(a(m)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"});await expect((0,t.lastValueFrom)(e.run())).rejects.toEqual(new r.UnknownDAError("Unexpected device response: 0x6700"))}),it("should error on second APDU after first succeeds",async()=>{vi.spyOn(globalThis,"fetch").mockResolvedValueOnce(new Response(`e0c4000000
|
|
8
|
+
e0c4010000`)),s.mockResolvedValueOnce((0,n.Right)(a(p))).mockResolvedValueOnce((0,n.Right)(a(i)));const e=new l.InstallLanguagePackageTask(o,{apduInstallUrl:"https://example.com/install"}),c=[];await expect(new Promise((h,w)=>{e.run().subscribe({next:v=>c.push(v),error:w,complete:h})})).rejects.toEqual(new r.RefusedByUserDAError("Language install refused on device.")),expect(c).toEqual([{type:"progress",progress:.5}])})})});
|
|
9
|
+
//# sourceMappingURL=InstallLanguagePackageTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/api/device-action/task/InstallLanguagePackageTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { lastValueFrom, toArray } from \"rxjs\";\n\nimport type { InternalApi } from \"@api/device-action/DeviceAction\";\nimport {\n NetworkDAError,\n OutOfMemoryDAError,\n RefusedByUserDAError,\n UnknownDAError,\n} from \"@api/device-action/os/Errors\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\nimport { InstallLanguagePackageTask } from \"./InstallLanguagePackageTask\";\n\ndescribe(\"InstallLanguagePackageTask\", () => {\n let api: InternalApi;\n const sendApdu = vi.fn();\n\n const SUCCESS_STATUS = new Uint8Array([0x90, 0x00]);\n const REFUSED_STATUS = new Uint8Array([0x55, 0x01]);\n const OUT_OF_MEMORY_STATUS = new Uint8Array([0x6a, 0x84]);\n const UNKNOWN_ERROR_STATUS = new Uint8Array([0x67, 0x00]);\n\n function makeApduResponse(statusCode: Uint8Array) {\n return new ApduResponse({ statusCode, data: new Uint8Array() });\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n api = { sendApdu } as unknown as InternalApi;\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"success\", () => {\n it(\"should send all APDUs and emit progress events\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\\ne0c4010000\\ne0c4020000\"),\n );\n sendApdu\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)))\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)))\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n const events = await lastValueFrom(task.run().pipe(toArray()));\n\n expect(globalThis.fetch).toHaveBeenCalledWith(\n \"https://example.com/install\",\n );\n expect(sendApdu).toHaveBeenCalledTimes(3);\n expect(events).toEqual([\n { type: \"progress\", progress: 1 / 3 },\n { type: \"progress\", progress: 2 / 3 },\n { type: \"progress\", progress: 1 },\n ]);\n });\n\n it(\"should handle a single APDU\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\"),\n );\n sendApdu.mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n const events = await lastValueFrom(task.run().pipe(toArray()));\n\n expect(sendApdu).toHaveBeenCalledTimes(1);\n expect(events).toEqual([{ type: \"progress\", progress: 1 }]);\n });\n\n it(\"should skip empty lines in APDU data\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\\n\\ne0c4010000\\n\"),\n );\n sendApdu\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)))\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n const events = await lastValueFrom(task.run().pipe(toArray()));\n\n expect(sendApdu).toHaveBeenCalledTimes(2);\n expect(events).toEqual([\n { type: \"progress\", progress: 0.5 },\n { type: \"progress\", progress: 1 },\n ]);\n });\n\n it(\"should handle Windows-style line endings\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\\r\\ne0c4010000\"),\n );\n sendApdu\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)))\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n const events = await lastValueFrom(task.run().pipe(toArray()));\n\n expect(sendApdu).toHaveBeenCalledTimes(2);\n expect(events).toEqual([\n { type: \"progress\", progress: 0.5 },\n { type: \"progress\", progress: 1 },\n ]);\n });\n });\n\n describe(\"error\", () => {\n it(\"should throw NetworkDAError when fetching APDUs fails\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockRejectedValueOnce(\n new Error(\"Network timeout\"),\n );\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new NetworkDAError(\"Failed to fetch APDUs: Network timeout\"),\n );\n expect(sendApdu).not.toHaveBeenCalled();\n });\n\n it(\"should throw UnknownDAError for invalid APDU hex data\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(new Response(\"ZZZZ\"));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new UnknownDAError(\"Invalid APDU data: ZZZZ\"),\n );\n expect(sendApdu).not.toHaveBeenCalled();\n });\n\n it(\"should throw UnknownDAError for too-short APDU data\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(new Response(\"e0c4\"));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new UnknownDAError(\"Invalid APDU data: e0c4\"),\n );\n expect(sendApdu).not.toHaveBeenCalled();\n });\n\n it(\"should throw UnknownDAError on device communication error (Left)\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\"),\n );\n sendApdu.mockResolvedValueOnce(Left(new Error(\"Transport error\")));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new UnknownDAError(\n \"Device communication error: Error: Transport error\",\n ),\n );\n });\n\n it(\"should throw RefusedByUserDAError when device refuses\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\"),\n );\n sendApdu.mockResolvedValueOnce(Right(makeApduResponse(REFUSED_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new RefusedByUserDAError(\"Language install refused on device.\"),\n );\n });\n\n it(\"should throw OutOfMemoryDAError when device is out of memory\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\"),\n );\n sendApdu.mockResolvedValueOnce(\n Right(makeApduResponse(OUT_OF_MEMORY_STATUS)),\n );\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new OutOfMemoryDAError(\"Not enough space for language pack.\"),\n );\n });\n\n it(\"should throw UnknownDAError for unexpected device response status\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\"),\n );\n sendApdu.mockResolvedValueOnce(\n Right(makeApduResponse(UNKNOWN_ERROR_STATUS)),\n );\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n await expect(lastValueFrom(task.run())).rejects.toEqual(\n new UnknownDAError(\"Unexpected device response: 0x6700\"),\n );\n });\n\n it(\"should error on second APDU after first succeeds\", async () => {\n vi.spyOn(globalThis, \"fetch\").mockResolvedValueOnce(\n new Response(\"e0c4000000\\ne0c4010000\"),\n );\n sendApdu\n .mockResolvedValueOnce(Right(makeApduResponse(SUCCESS_STATUS)))\n .mockResolvedValueOnce(Right(makeApduResponse(REFUSED_STATUS)));\n\n const task = new InstallLanguagePackageTask(api, {\n apduInstallUrl: \"https://example.com/install\",\n });\n\n const events: Array<{ type: string; progress: number }> = [];\n await expect(\n new Promise<void>((resolve, reject) => {\n task.run().subscribe({\n next: (event) => events.push(event),\n error: reject,\n complete: resolve,\n });\n }),\n ).rejects.toEqual(\n new RefusedByUserDAError(\"Language install refused on device.\"),\n );\n expect(events).toEqual([{ type: \"progress\", progress: 0.5 }]);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA4B,qBAC5BC,EAAuC,gBAGvCC,EAKO,wCACPC,EAA6B,4CAE7BC,EAA2C,wCAE3C,SAAS,6BAA8B,IAAM,CAC3C,IAAIC,EACJ,MAAMC,EAAW,GAAG,GAAG,EAEjBC,EAAiB,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,EAC5CC,EAAiB,IAAI,WAAW,CAAC,GAAM,CAAI,CAAC,EAC5CC,EAAuB,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAClDC,EAAuB,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,EAExD,SAASC,EAAiBC,EAAwB,CAChD,OAAO,IAAI,eAAa,CAAE,WAAAA,EAAY,KAAM,IAAI,UAAa,CAAC,CAChE,CAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjBP,EAAM,CAAE,SAAAC,CAAS,CACnB,CAAC,EAED,UAAU,IAAM,CACd,GAAG,gBAAgB,CACrB,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iDAAkD,SAAY,CAC/D,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS;AAAA;AAAA,WAAoC,CACnD,EACAA,EACG,yBAAsB,SAAMK,EAAiBJ,CAAc,CAAC,CAAC,EAC7D,yBAAsB,SAAMI,EAAiBJ,CAAc,CAAC,CAAC,EAC7D,yBAAsB,SAAMI,EAAiBJ,CAAc,CAAC,CAAC,EAEhE,MAAMM,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAEKS,EAAS,QAAM,iBAAcD,EAAK,IAAI,EAAE,QAAK,WAAQ,CAAC,CAAC,EAE7D,OAAO,WAAW,KAAK,EAAE,qBACvB,6BACF,EACA,OAAOP,CAAQ,EAAE,sBAAsB,CAAC,EACxC,OAAOQ,CAAM,EAAE,QAAQ,CACrB,CAAE,KAAM,WAAY,SAAU,EAAI,CAAE,EACpC,CAAE,KAAM,WAAY,SAAU,EAAI,CAAE,EACpC,CAAE,KAAM,WAAY,SAAU,CAAE,CAClC,CAAC,CACH,CAAC,EAED,GAAG,8BAA+B,SAAY,CAC5C,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS,YAAY,CAC3B,EACAR,EAAS,yBAAsB,SAAMK,EAAiBJ,CAAc,CAAC,CAAC,EAEtE,MAAMM,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAEKS,EAAS,QAAM,iBAAcD,EAAK,IAAI,EAAE,QAAK,WAAQ,CAAC,CAAC,EAE7D,OAAOP,CAAQ,EAAE,sBAAsB,CAAC,EACxC,OAAOQ,CAAM,EAAE,QAAQ,CAAC,CAAE,KAAM,WAAY,SAAU,CAAE,CAAC,CAAC,CAC5D,CAAC,EAED,GAAG,uCAAwC,SAAY,CACrD,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS;AAAA;AAAA;AAAA,CAA4B,CAC3C,EACAR,EACG,yBAAsB,SAAMK,EAAiBJ,CAAc,CAAC,CAAC,EAC7D,yBAAsB,SAAMI,EAAiBJ,CAAc,CAAC,CAAC,EAEhE,MAAMM,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAEKS,EAAS,QAAM,iBAAcD,EAAK,IAAI,EAAE,QAAK,WAAQ,CAAC,CAAC,EAE7D,OAAOP,CAAQ,EAAE,sBAAsB,CAAC,EACxC,OAAOQ,CAAM,EAAE,QAAQ,CACrB,CAAE,KAAM,WAAY,SAAU,EAAI,EAClC,CAAE,KAAM,WAAY,SAAU,CAAE,CAClC,CAAC,CACH,CAAC,EAED,GAAG,2CAA4C,SAAY,CACzD,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS;AAAA,WAA0B,CACzC,EACAR,EACG,yBAAsB,SAAMK,EAAiBJ,CAAc,CAAC,CAAC,EAC7D,yBAAsB,SAAMI,EAAiBJ,CAAc,CAAC,CAAC,EAEhE,MAAMM,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAEKS,EAAS,QAAM,iBAAcD,EAAK,IAAI,EAAE,QAAK,WAAQ,CAAC,CAAC,EAE7D,OAAOP,CAAQ,EAAE,sBAAsB,CAAC,EACxC,OAAOQ,CAAM,EAAE,QAAQ,CACrB,CAAE,KAAM,WAAY,SAAU,EAAI,EAClC,CAAE,KAAM,WAAY,SAAU,CAAE,CAClC,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,wDAAyD,SAAY,CACtE,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,MAAM,iBAAiB,CAC7B,EAEA,MAAMD,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,iBAAe,wCAAwC,CAC7D,EACA,OAAOP,CAAQ,EAAE,IAAI,iBAAiB,CACxC,CAAC,EAED,GAAG,wDAAyD,SAAY,CACtE,GAAG,MAAM,WAAY,OAAO,EAAE,sBAAsB,IAAI,SAAS,MAAM,CAAC,EAExE,MAAMO,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,iBAAe,yBAAyB,CAC9C,EACA,OAAOP,CAAQ,EAAE,IAAI,iBAAiB,CACxC,CAAC,EAED,GAAG,sDAAuD,SAAY,CACpE,GAAG,MAAM,WAAY,OAAO,EAAE,sBAAsB,IAAI,SAAS,MAAM,CAAC,EAExE,MAAMO,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,iBAAe,yBAAyB,CAC9C,EACA,OAAOP,CAAQ,EAAE,IAAI,iBAAiB,CACxC,CAAC,EAED,GAAG,mEAAoE,SAAY,CACjF,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS,YAAY,CAC3B,EACAA,EAAS,yBAAsB,QAAK,IAAI,MAAM,iBAAiB,CAAC,CAAC,EAEjE,MAAMO,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,iBACF,oDACF,CACF,CACF,CAAC,EAED,GAAG,wDAAyD,SAAY,CACtE,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS,YAAY,CAC3B,EACAP,EAAS,yBAAsB,SAAMK,EAAiBH,CAAc,CAAC,CAAC,EAEtE,MAAMK,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,uBAAqB,qCAAqC,CAChE,CACF,CAAC,EAED,GAAG,+DAAgE,SAAY,CAC7E,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS,YAAY,CAC3B,EACAP,EAAS,yBACP,SAAMK,EAAiBF,CAAoB,CAAC,CAC9C,EAEA,MAAMI,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,qBAAmB,qCAAqC,CAC9D,CACF,CAAC,EAED,GAAG,oEAAqE,SAAY,CAClF,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS,YAAY,CAC3B,EACAP,EAAS,yBACP,SAAMK,EAAiBD,CAAoB,CAAC,CAC9C,EAEA,MAAMG,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAED,MAAM,UAAO,iBAAcQ,EAAK,IAAI,CAAC,CAAC,EAAE,QAAQ,QAC9C,IAAI,iBAAe,oCAAoC,CACzD,CACF,CAAC,EAED,GAAG,mDAAoD,SAAY,CACjE,GAAG,MAAM,WAAY,OAAO,EAAE,sBAC5B,IAAI,SAAS;AAAA,WAAwB,CACvC,EACAP,EACG,yBAAsB,SAAMK,EAAiBJ,CAAc,CAAC,CAAC,EAC7D,yBAAsB,SAAMI,EAAiBH,CAAc,CAAC,CAAC,EAEhE,MAAMK,EAAO,IAAI,6BAA2BR,EAAK,CAC/C,eAAgB,6BAClB,CAAC,EAEKS,EAAoD,CAAC,EAC3D,MAAM,OACJ,IAAI,QAAc,CAACC,EAASC,IAAW,CACrCH,EAAK,IAAI,EAAE,UAAU,CACnB,KAAOI,GAAUH,EAAO,KAAKG,CAAK,EAClC,MAAOD,EACP,SAAUD,CACZ,CAAC,CACH,CAAC,CACH,EAAE,QAAQ,QACR,IAAI,uBAAqB,qCAAqC,CAChE,EACA,OAAOD,CAAM,EAAE,QAAQ,CAAC,CAAE,KAAM,WAAY,SAAU,EAAI,CAAC,CAAC,CAC9D,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_rxjs", "import_Errors", "import_ApduResponse", "import_InstallLanguagePackageTask", "api", "sendApdu", "SUCCESS_STATUS", "REFUSED_STATUS", "OUT_OF_MEMORY_STATUS", "UNKNOWN_ERROR_STATUS", "makeApduResponse", "statusCode", "task", "events", "resolve", "reject", "event"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var D=(a,e)=>{for(var t in e)l(a,t,{get:e[t],enumerable:!0})},E=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of v(e))!A.call(a,n)&&n!==t&&l(a,n,{get:()=>e[n],enumerable:!(r=I(e,n))||r.enumerable});return a};var
|
|
1
|
+
"use strict";var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var D=(a,e)=>{for(var t in e)l(a,t,{get:e[t],enumerable:!0})},E=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of v(e))!A.call(a,n)&&n!==t&&l(a,n,{get:()=>e[n],enumerable:!(r=I(e,n))||r.enumerable});return a};var V=a=>E(l({},"__esModule",{value:!0}),a);var x={};D(x,{XStateDeviceAction:()=>f});module.exports=V(x);var c=require("rxjs"),d=require("xstate"),s=require("../../device-action/model/DeviceActionState"),m=require("../../logger-publisher/utils/noopLoggerFactory");class f{input;inspect=!1;logger;loggerFactory;constructor(e){this.input=e.input,this.inspect=!!e.inspect,this.logger=e.logger,this.loggerFactory=e.loggerFactory}getLoggerFactory(e){return this.loggerFactory??e.loggerFactory??m.noopLoggerFactory}_execute(e){const t=this.makeStateMachine(e);return!this.logger&&t.id&&(this.logger=this.getLoggerFactory(e)(t.id)),this._subscribeToStateMachine(t)}_subscribeToStateMachine(e){const t=(0,d.createActor)(e,{input:this.input}),r=new c.ReplaySubject;let n=!1;const g=i=>{const{context:o,status:p,output:y,error:b}=i;if(this.logger&&!n&&(n=!0,this.logger.debug("[XStateDeviceAction] Input",{data:{input:o.input}})),this.logger&&(p==="active"||p==="done")){const u=typeof i.value=="string"?i.value:JSON.stringify(i.value);this.logger.debug(`[XStateDeviceAction] State: ${u}`,{data:{internalState:o._internalState,intermediateValue:o.intermediateValue}})}switch(p){case"active":r.next({status:s.DeviceActionStatus.Pending,intermediateValue:o.intermediateValue});break;case"done":y.caseOf({Left:u=>{r.next({status:s.DeviceActionStatus.Error,error:u})},Right:u=>{r.next({status:s.DeviceActionStatus.Completed,output:u})}}),r.complete();break;case"error":r.error(b),r.complete();break;case"stopped":r.next({status:s.DeviceActionStatus.Stopped}),r.complete();break;default:this._exhaustiveMatchingGuard(p)}},S=new c.Observable(i=>{const o=r.subscribe(i);return()=>{h.unsubscribe(),o.unsubscribe(),t.stop()}}),h=t.subscribe(g);return t.start(),{observable:S.pipe((0,c.share)()),cancel:()=>{t.stop(),h.unsubscribe(),g(t.getSnapshot())}}}_exhaustiveMatchingGuard(e){throw console.log("_exhaustiveMatchingGuard status",e),new Error(`Unhandled status: ${e}`)}}0&&(module.exports={XStateDeviceAction});
|
|
2
2
|
//# sourceMappingURL=XStateDeviceAction.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/xstate-utils/XStateDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["// import { createBrowserInspector } from \"@statelyai/inspect\";\nimport { Observable, ReplaySubject, share } from \"rxjs\";\nimport {\n createActor,\n type SnapshotFrom,\n type StateMachine,\n type StateSchema,\n} from \"xstate\";\n\nimport {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type ExecuteDeviceActionReturnType,\n type InternalApi,\n} from \"@api/device-action/DeviceAction\";\nimport {\n type DeviceActionState,\n DeviceActionStatus,\n} from \"@api/device-action/model/DeviceActionState\";\nimport { type DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { noopLoggerFactory } from \"@api/logger-publisher/utils/noopLoggerFactory\";\n\nimport { type StateMachineTypes } from \"./StateMachineTypes\";\n\nexport type DeviceActionStateMachine<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n InternalState,\n> = StateMachine<\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"context\"], // context\n /**\n * The following usages `any` are OK because this is just a wrapper around the\n * state machine and we are not directly going to use these types.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n any, // event\n any, // children\n any, // actor\n any, // action\n any, // guard\n any, // delay\n any, // state value\n any, // tag\n /* eslint-enable @typescript-eslint/no-explicit-any */\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"input\"],\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"output\"],\n /* eslint-disable @typescript-eslint/no-explicit-any */\n any,\n any,\n /* eslint-enable @typescript-eslint/no-explicit-any */\n StateSchema\n>;\n\n/**\n * A DeviceAction that uses an XState state machine to execute.\n * It maps the state machine snapshots to the DeviceActionState.\n * This class is abstract and should be extended to implement the state machine.\n */\nexport abstract class XStateDeviceAction<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n InternalState,\n> implements DeviceAction<Output, Input, Error, IntermediateValue>\n{\n readonly input: Input;\n readonly inspect: boolean = false;\n protected logger?: LoggerPublisherService;\n protected loggerFactory?: (tag: string) => LoggerPublisherService;\n\n /**\n *\n * @param input The input for the DeviceAction\n * @param inspect If true, the state machine will be inspected in the browser\n * @param logger Optional logger for debugging. If provided, input and internal state will be logged on state transitions.\n * @param loggerFactory Optional logger factory for creating loggers with prefixed tags. Takes precedence over logger.\n */\n constructor(args: {\n input: Input;\n inspect?: boolean;\n logger?: LoggerPublisherService;\n loggerFactory?: (tag: string) => LoggerPublisherService;\n }) {\n this.input = args.input;\n this.inspect = Boolean(args.inspect);\n this.logger = args.logger;\n this.loggerFactory = args.loggerFactory;\n }\n\n /**\n * Returns the logger factory to use for creating loggers.\n * Prefers the instance loggerFactory, then internalApi.loggerFactory,\n * and falls back to a no-op logger factory if neither is available.\n */\n protected getLoggerFactory(\n internalApi: InternalApi,\n ): (tag: string) => LoggerPublisherService {\n return this.loggerFactory ?? internalApi.loggerFactory ?? noopLoggerFactory;\n }\n\n protected abstract makeStateMachine(\n internalAPI: InternalApi,\n ): DeviceActionStateMachine<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >;\n\n _execute(\n internalApi: InternalApi,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const stateMachine = this.makeStateMachine(internalApi);\n\n // Create logger from machine ID if not explicitly provided\n // Prefer loggerFactory (prefixed) over internalApi.loggerFactory (unprefixed)\n if (!this.logger && stateMachine.id) {\n this.logger = this.getLoggerFactory(internalApi)(stateMachine.id);\n }\n\n return this._subscribeToStateMachine(stateMachine);\n }\n\n protected _subscribeToStateMachine(\n stateMachine: DeviceActionStateMachine<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const actor = createActor(stateMachine, {\n input: this.input,\n // optional inspector for debugging\n // inspect: this.inspect ? createBrowserInspector().inspect : undefined,\n });\n\n /**\n * Using a ReplaySubject is important because the first snapshots might be\n * emitted before the observable is subscribed (if the machine goes through\n * those states fully synchronously).\n * This way, we ensure that the subscriber always receives the latest snapshot.\n * */\n const subject = new ReplaySubject<\n DeviceActionState<Output, Error, IntermediateValue>\n >();\n\n let hasLoggedInput = false;\n\n const handleActorSnapshot = (\n snapshot: SnapshotFrom<typeof stateMachine>,\n ) => {\n const { context, status, output, error } = snapshot;\n\n // Log input once at the beginning\n if (this.logger && !hasLoggedInput) {\n hasLoggedInput = true;\n this.logger.debug(\"[XStateDeviceAction] Input\", {\n data: { input: context.input },\n });\n }\n\n // Log internal state on each state transition\n if (this.logger && status === \"active\") {\n const stateValue =\n typeof snapshot.value === \"string\"\n ? snapshot.value\n : JSON.stringify(snapshot.value);\n this.logger.debug(`[XStateDeviceAction] State: ${stateValue}`, {\n data: {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAiD,gBACjDC,EAKO,kBAQPC,EAGO,sDAGPC,EAAkC,yDA0D3B,MAAeL,CAOtB,CACW,MACA,QAAmB,GAClB,OACA,cASV,YAAYM,EAKT,CACD,KAAK,MAAQA,EAAK,MAClB,KAAK,QAAU,EAAQA,EAAK,QAC5B,KAAK,OAASA,EAAK,OACnB,KAAK,cAAgBA,EAAK,aAC5B,CAOU,iBACRC,EACyC,CACzC,OAAO,KAAK,eAAiBA,EAAY,eAAiB,mBAC5D,CAYA,SACEA,EACiE,CACjE,MAAMC,EAAe,KAAK,iBAAiBD,CAAW,EAItD,MAAI,CAAC,KAAK,QAAUC,EAAa,KAC/B,KAAK,OAAS,KAAK,iBAAiBD,CAAW,EAAEC,EAAa,EAAE,GAG3D,KAAK,yBAAyBA,CAAY,CACnD,CAEU,yBACRA,EAOiE,CACjE,MAAMC,KAAQ,eAAYD,EAAc,CACtC,MAAO,KAAK,KAGd,CAAC,EAQKE,EAAU,IAAI,gBAIpB,IAAIC,EAAiB,GAErB,MAAMC,EACJC,GACG,CACH,KAAM,CAAE,QAAAC,EAAS,OAAAC,EAAQ,OAAAC,EAAQ,MAAAC,CAAM,EAAIJ,EAW3C,GARI,KAAK,QAAU,CAACF,IAClBA,EAAiB,GACjB,KAAK,OAAO,MAAM,6BAA8B,CAC9C,KAAM,CAAE,MAAOG,EAAQ,KAAM,CAC/B,CAAC,GAIC,KAAK,
|
|
4
|
+
"sourcesContent": ["// import { createBrowserInspector } from \"@statelyai/inspect\";\nimport { Observable, ReplaySubject, share } from \"rxjs\";\nimport {\n createActor,\n type SnapshotFrom,\n type StateMachine,\n type StateSchema,\n} from \"xstate\";\n\nimport {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type ExecuteDeviceActionReturnType,\n type InternalApi,\n} from \"@api/device-action/DeviceAction\";\nimport {\n type DeviceActionState,\n DeviceActionStatus,\n} from \"@api/device-action/model/DeviceActionState\";\nimport { type DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { noopLoggerFactory } from \"@api/logger-publisher/utils/noopLoggerFactory\";\n\nimport { type StateMachineTypes } from \"./StateMachineTypes\";\n\nexport type DeviceActionStateMachine<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n InternalState,\n> = StateMachine<\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"context\"], // context\n /**\n * The following usages `any` are OK because this is just a wrapper around the\n * state machine and we are not directly going to use these types.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n any, // event\n any, // children\n any, // actor\n any, // action\n any, // guard\n any, // delay\n any, // state value\n any, // tag\n /* eslint-enable @typescript-eslint/no-explicit-any */\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"input\"],\n StateMachineTypes<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >[\"output\"],\n /* eslint-disable @typescript-eslint/no-explicit-any */\n any,\n any,\n /* eslint-enable @typescript-eslint/no-explicit-any */\n StateSchema\n>;\n\n/**\n * A DeviceAction that uses an XState state machine to execute.\n * It maps the state machine snapshots to the DeviceActionState.\n * This class is abstract and should be extended to implement the state machine.\n */\nexport abstract class XStateDeviceAction<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n InternalState,\n> implements DeviceAction<Output, Input, Error, IntermediateValue>\n{\n readonly input: Input;\n readonly inspect: boolean = false;\n protected logger?: LoggerPublisherService;\n protected loggerFactory?: (tag: string) => LoggerPublisherService;\n\n /**\n *\n * @param input The input for the DeviceAction\n * @param inspect If true, the state machine will be inspected in the browser\n * @param logger Optional logger for debugging. If provided, input and internal state will be logged on state transitions.\n * @param loggerFactory Optional logger factory for creating loggers with prefixed tags. Takes precedence over logger.\n */\n constructor(args: {\n input: Input;\n inspect?: boolean;\n logger?: LoggerPublisherService;\n loggerFactory?: (tag: string) => LoggerPublisherService;\n }) {\n this.input = args.input;\n this.inspect = Boolean(args.inspect);\n this.logger = args.logger;\n this.loggerFactory = args.loggerFactory;\n }\n\n /**\n * Returns the logger factory to use for creating loggers.\n * Prefers the instance loggerFactory, then internalApi.loggerFactory,\n * and falls back to a no-op logger factory if neither is available.\n */\n protected getLoggerFactory(\n internalApi: InternalApi,\n ): (tag: string) => LoggerPublisherService {\n return this.loggerFactory ?? internalApi.loggerFactory ?? noopLoggerFactory;\n }\n\n protected abstract makeStateMachine(\n internalAPI: InternalApi,\n ): DeviceActionStateMachine<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >;\n\n _execute(\n internalApi: InternalApi,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const stateMachine = this.makeStateMachine(internalApi);\n\n // Create logger from machine ID if not explicitly provided\n // Prefer loggerFactory (prefixed) over internalApi.loggerFactory (unprefixed)\n if (!this.logger && stateMachine.id) {\n this.logger = this.getLoggerFactory(internalApi)(stateMachine.id);\n }\n\n return this._subscribeToStateMachine(stateMachine);\n }\n\n protected _subscribeToStateMachine(\n stateMachine: DeviceActionStateMachine<\n Output,\n Input,\n Error,\n IntermediateValue,\n InternalState\n >,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const actor = createActor(stateMachine, {\n input: this.input,\n // optional inspector for debugging\n // inspect: this.inspect ? createBrowserInspector().inspect : undefined,\n });\n\n /**\n * Using a ReplaySubject is important because the first snapshots might be\n * emitted before the observable is subscribed (if the machine goes through\n * those states fully synchronously).\n * This way, we ensure that the subscriber always receives the latest snapshot.\n * */\n const subject = new ReplaySubject<\n DeviceActionState<Output, Error, IntermediateValue>\n >();\n\n let hasLoggedInput = false;\n\n const handleActorSnapshot = (\n snapshot: SnapshotFrom<typeof stateMachine>,\n ) => {\n const { context, status, output, error } = snapshot;\n\n // Log input once at the beginning\n if (this.logger && !hasLoggedInput) {\n hasLoggedInput = true;\n this.logger.debug(\"[XStateDeviceAction] Input\", {\n data: { input: context.input },\n });\n }\n\n // Log internal state on each state transition\n if (this.logger && (status === \"active\" || status === \"done\")) {\n const stateValue =\n typeof snapshot.value === \"string\"\n ? snapshot.value\n : JSON.stringify(snapshot.value);\n this.logger.debug(`[XStateDeviceAction] State: ${stateValue}`, {\n data: {\n internalState: context._internalState,\n intermediateValue: context.intermediateValue,\n },\n });\n }\n\n switch (status) {\n case \"active\":\n subject.next({\n status: DeviceActionStatus.Pending,\n intermediateValue: context.intermediateValue,\n });\n break;\n case \"done\":\n output.caseOf({\n Left: (err) => {\n subject.next({\n status: DeviceActionStatus.Error,\n error: err,\n });\n },\n Right: (result) => {\n subject.next({\n status: DeviceActionStatus.Completed,\n output: result,\n });\n },\n });\n subject.complete();\n break;\n case \"error\":\n // this is an error in the execution of the state machine, it should not happen\n subject.error(error);\n subject.complete();\n break;\n case \"stopped\":\n subject.next({\n status: DeviceActionStatus.Stopped,\n });\n subject.complete();\n break;\n default:\n this._exhaustiveMatchingGuard(status);\n }\n };\n\n const observable = new Observable<\n DeviceActionState<Output, Error, IntermediateValue>\n >((subscriber) => {\n const subjectSubscription = subject.subscribe(subscriber);\n return () => {\n actorSubscription.unsubscribe();\n subjectSubscription.unsubscribe();\n actor.stop(); // stop the actor when the observable is unsubscribed\n };\n });\n\n const actorSubscription = actor.subscribe(handleActorSnapshot);\n actor.start();\n\n return {\n observable: observable.pipe(share()), // share to garantee that once there is no more observer, the actor is stopped\n cancel: () => {\n actor.stop();\n actorSubscription.unsubscribe();\n handleActorSnapshot(actor.getSnapshot());\n },\n };\n }\n\n private _exhaustiveMatchingGuard(status: never): never {\n console.log(\"_exhaustiveMatchingGuard status\", status);\n throw new Error(`Unhandled status: ${status}`);\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAiD,gBACjDC,EAKO,kBAQPC,EAGO,sDAGPC,EAAkC,yDA0D3B,MAAeL,CAOtB,CACW,MACA,QAAmB,GAClB,OACA,cASV,YAAYM,EAKT,CACD,KAAK,MAAQA,EAAK,MAClB,KAAK,QAAU,EAAQA,EAAK,QAC5B,KAAK,OAASA,EAAK,OACnB,KAAK,cAAgBA,EAAK,aAC5B,CAOU,iBACRC,EACyC,CACzC,OAAO,KAAK,eAAiBA,EAAY,eAAiB,mBAC5D,CAYA,SACEA,EACiE,CACjE,MAAMC,EAAe,KAAK,iBAAiBD,CAAW,EAItD,MAAI,CAAC,KAAK,QAAUC,EAAa,KAC/B,KAAK,OAAS,KAAK,iBAAiBD,CAAW,EAAEC,EAAa,EAAE,GAG3D,KAAK,yBAAyBA,CAAY,CACnD,CAEU,yBACRA,EAOiE,CACjE,MAAMC,KAAQ,eAAYD,EAAc,CACtC,MAAO,KAAK,KAGd,CAAC,EAQKE,EAAU,IAAI,gBAIpB,IAAIC,EAAiB,GAErB,MAAMC,EACJC,GACG,CACH,KAAM,CAAE,QAAAC,EAAS,OAAAC,EAAQ,OAAAC,EAAQ,MAAAC,CAAM,EAAIJ,EAW3C,GARI,KAAK,QAAU,CAACF,IAClBA,EAAiB,GACjB,KAAK,OAAO,MAAM,6BAA8B,CAC9C,KAAM,CAAE,MAAOG,EAAQ,KAAM,CAC/B,CAAC,GAIC,KAAK,SAAWC,IAAW,UAAYA,IAAW,QAAS,CAC7D,MAAMG,EACJ,OAAOL,EAAS,OAAU,SACtBA,EAAS,MACT,KAAK,UAAUA,EAAS,KAAK,EACnC,KAAK,OAAO,MAAM,+BAA+BK,CAAU,GAAI,CAC7D,KAAM,CACJ,cAAeJ,EAAQ,eACvB,kBAAmBA,EAAQ,iBAC7B,CACF,CAAC,CACH,CAEA,OAAQC,EAAQ,CACd,IAAK,SACHL,EAAQ,KAAK,CACX,OAAQ,qBAAmB,QAC3B,kBAAmBI,EAAQ,iBAC7B,CAAC,EACD,MACF,IAAK,OACHE,EAAO,OAAO,CACZ,KAAOG,GAAQ,CACbT,EAAQ,KAAK,CACX,OAAQ,qBAAmB,MAC3B,MAAOS,CACT,CAAC,CACH,EACA,MAAQC,GAAW,CACjBV,EAAQ,KAAK,CACX,OAAQ,qBAAmB,UAC3B,OAAQU,CACV,CAAC,CACH,CACF,CAAC,EACDV,EAAQ,SAAS,EACjB,MACF,IAAK,QAEHA,EAAQ,MAAMO,CAAK,EACnBP,EAAQ,SAAS,EACjB,MACF,IAAK,UACHA,EAAQ,KAAK,CACX,OAAQ,qBAAmB,OAC7B,CAAC,EACDA,EAAQ,SAAS,EACjB,MACF,QACE,KAAK,yBAAyBK,CAAM,CACxC,CACF,EAEMM,EAAa,IAAI,aAEpBC,GAAe,CAChB,MAAMC,EAAsBb,EAAQ,UAAUY,CAAU,EACxD,MAAO,IAAM,CACXE,EAAkB,YAAY,EAC9BD,EAAoB,YAAY,EAChCd,EAAM,KAAK,CACb,CACF,CAAC,EAEKe,EAAoBf,EAAM,UAAUG,CAAmB,EAC7D,OAAAH,EAAM,MAAM,EAEL,CACL,WAAYY,EAAW,QAAK,SAAM,CAAC,EACnC,OAAQ,IAAM,CACZZ,EAAM,KAAK,EACXe,EAAkB,YAAY,EAC9BZ,EAAoBH,EAAM,YAAY,CAAC,CACzC,CACF,CACF,CAEQ,yBAAyBM,EAAsB,CACrD,cAAQ,IAAI,kCAAmCA,CAAM,EAC/C,IAAI,MAAM,qBAAqBA,CAAM,EAAE,CAC/C,CACF",
|
|
6
6
|
"names": ["XStateDeviceAction_exports", "__export", "XStateDeviceAction", "__toCommonJS", "import_rxjs", "import_xstate", "import_DeviceActionState", "import_noopLoggerFactory", "args", "internalApi", "stateMachine", "actor", "subject", "hasLoggedInput", "handleActorSnapshot", "snapshot", "context", "status", "output", "error", "stateValue", "err", "result", "observable", "subscriber", "subjectSubscription", "actorSubscription"]
|
|
7
7
|
}
|