@ledgerhq/device-management-kit 1.1.0 → 1.3.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/apdu/utils/ApduBuilder.js +1 -1
- package/lib/cjs/src/api/apdu/utils/ApduBuilder.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/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/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/__test-utils__/setupTestMachine.js +1 -1
- package/lib/cjs/src/api/device-action/__test-utils__/setupTestMachine.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 +1 -1
- package/lib/cjs/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.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 +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/GetDeviceStatus/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/GoToDashboard/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/GoToDashboard/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.js.map +2 -2
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.test.js.map +2 -2
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/InstallOrUpdateApps/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListApps/ListAppsDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListApps/ListAppsDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListApps/ListAppsDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListApps/ListAppsDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListApps/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListApps/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/types.js +1 -1
- package/lib/cjs/src/api/device-action/os/OpenAppWithDependencies/types.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.js +1 -1
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.test.js +1 -1
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.test.js.map +3 -3
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.js +1 -1
- package/lib/cjs/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.js.map +3 -3
- 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/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/api/utils/ApplicationChecker.js +2 -0
- package/lib/cjs/src/api/utils/ApplicationChecker.js.map +7 -0
- package/lib/cjs/src/api/utils/ApplicationChecker.test.js +2 -0
- package/lib/cjs/src/api/utils/ApplicationChecker.test.js.map +7 -0
- package/lib/cjs/src/api/utils/ApplicationResolver.js +2 -0
- package/lib/cjs/src/api/utils/ApplicationResolver.js.map +7 -0
- package/lib/cjs/src/api/utils/Base64String.js +1 -1
- package/lib/cjs/src/api/utils/Base64String.js.map +3 -3
- package/lib/cjs/src/api/utils/Base64String.test.js +1 -1
- package/lib/cjs/src/api/utils/Base64String.test.js.map +3 -3
- 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/apdu/utils/ApduBuilder.js +1 -1
- package/lib/esm/src/api/apdu/utils/ApduBuilder.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/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/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/__test-utils__/setupTestMachine.js +1 -1
- package/lib/esm/src/api/device-action/__test-utils__/setupTestMachine.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 +1 -0
- package/lib/esm/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.js.map +4 -4
- 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 +1 -0
- package/lib/esm/src/api/device-action/os/GetDeviceMetadata/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/types.js +1 -0
- package/lib/esm/src/api/device-action/os/GetDeviceStatus/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/GoToDashboard/types.js +1 -0
- package/lib/esm/src/api/device-action/os/GoToDashboard/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/types.js +1 -0
- package/lib/esm/src/api/device-action/os/InstallOrUpdateApps/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/ListApps/ListAppsDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/ListApps/ListAppsDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/ListApps/ListAppsDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/ListApps/ListAppsDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/ListApps/types.js +1 -0
- package/lib/esm/src/api/device-action/os/ListApps/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/types.js +1 -0
- package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/types.js +1 -0
- package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/types.js +1 -0
- package/lib/esm/src/api/device-action/os/OpenAppWithDependencies/types.js.map +4 -4
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.js +1 -1
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.js.map +3 -3
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.test.js +1 -1
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.test.js.map +3 -3
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.js +1 -0
- package/lib/esm/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.js.map +4 -4
- 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/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/api/utils/ApplicationChecker.js +2 -0
- package/lib/esm/src/api/utils/ApplicationChecker.js.map +7 -0
- package/lib/esm/src/api/utils/ApplicationChecker.test.js +2 -0
- package/lib/esm/src/api/utils/ApplicationChecker.test.js.map +7 -0
- package/lib/esm/src/api/utils/ApplicationResolver.js +1 -0
- package/lib/esm/src/api/utils/ApplicationResolver.js.map +7 -0
- package/lib/esm/src/api/utils/Base64String.js +1 -1
- package/lib/esm/src/api/utils/Base64String.js.map +3 -3
- package/lib/esm/src/api/utils/Base64String.test.js +1 -1
- package/lib/esm/src/api/utils/Base64String.test.js.map +3 -3
- 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/apdu/utils/ApduBuilder.d.ts +7 -0
- package/lib/types/src/api/apdu/utils/ApduBuilder.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/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/device-action/__test-utils__/setupTestMachine.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 +16 -7
- package/lib/types/src/api/device-action/os/CallTaskInAppDeviceAction/CallTaskInAppDeviceActionTypes.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 +16 -4
- package/lib/types/src/api/device-action/os/GetDeviceMetadata/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GetDeviceStatus/types.d.ts +6 -0
- package/lib/types/src/api/device-action/os/GetDeviceStatus/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.d.ts +1 -1
- package/lib/types/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/GoToDashboard/types.d.ts +9 -1
- package/lib/types/src/api/device-action/os/GoToDashboard/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/InstallOrUpdateApps/InstallOrUpdateAppsDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/InstallOrUpdateApps/types.d.ts +9 -1
- package/lib/types/src/api/device-action/os/InstallOrUpdateApps/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/ListApps/ListAppsDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/ListApps/types.d.ts +6 -0
- package/lib/types/src/api/device-action/os/ListApps/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/ListAppsWithMetadata/types.d.ts +8 -1
- package/lib/types/src/api/device-action/os/ListAppsWithMetadata/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/OpenAppDeviceAction/types.d.ts +12 -2
- package/lib/types/src/api/device-action/os/OpenAppDeviceAction/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/OpenAppWithDependencies/OpenAppWithDependenciesDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/OpenAppWithDependencies/types.d.ts +8 -0
- package/lib/types/src/api/device-action/os/OpenAppWithDependencies/types.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.d.ts +9 -1
- package/lib/types/src/api/device-action/os/SendCommandInAppDeviceAction/SendCommandInAppDeviceActionTypes.d.ts.map +1 -1
- 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/xstate-utils/XStateDeviceAction.d.ts.map +1 -1
- package/lib/types/src/api/index.d.ts +13 -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 +73 -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/api/utils/ApplicationChecker.d.ts +14 -0
- package/lib/types/src/api/utils/ApplicationChecker.d.ts.map +1 -0
- package/lib/types/src/api/utils/ApplicationChecker.test.d.ts +2 -0
- package/lib/types/src/api/utils/ApplicationChecker.test.d.ts.map +1 -0
- package/lib/types/src/api/utils/ApplicationResolver.d.ts +12 -0
- package/lib/types/src/api/utils/ApplicationResolver.d.ts.map +1 -0
- package/lib/types/src/api/utils/Base64String.d.ts +1 -0
- package/lib/types/src/api/utils/Base64String.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,2 @@
|
|
|
1
|
+
var s=(t=>(t.Error="ERROR",t.Success="SUCCESS",t))(s||{});function e(r){return"error"in r&&r.error!==void 0}function u(r){return e(r)?{status:"ERROR",error:r.error}:{status:"SUCCESS",data:r.data}}function a(r){return r.status==="SUCCESS"}export{u as DmkResultFactory,s as DmkResultStatus,a as isSuccessDmkResult};
|
|
2
|
+
//# sourceMappingURL=DmkResult.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/model/DmkResult.ts"],
|
|
4
|
+
"sourcesContent": ["export enum DmkResultStatus {\n Error = \"ERROR\",\n Success = \"SUCCESS\",\n}\n\nexport type DmkSuccessResult<Data> = {\n status: DmkResultStatus.Success;\n data: Data;\n};\n\nexport type DmkErrorResult<Error> = {\n status: DmkResultStatus.Error;\n error: Error;\n};\n\nexport type DmkResult<Data, Error> =\n | DmkSuccessResult<Data>\n | DmkErrorResult<Error>;\n\ntype DmkSuccessInput<Data> = {\n data: Data;\n};\n\ntype DmkErrorInput<Error> = {\n error: Error;\n};\n\ntype DmkResultInput<Data, Error> = DmkSuccessInput<Data> | DmkErrorInput<Error>;\n\nfunction isDmkErrorInput<Data, Error>(\n input: DmkResultInput<Data, Error>,\n): input is DmkErrorInput<Error> {\n return \"error\" in input && input.error !== undefined;\n}\n\nexport function DmkResultFactory<Data, Error>(\n input: DmkResultInput<Data, Error>,\n): DmkResult<Data, Error> {\n if (isDmkErrorInput(input)) {\n return {\n status: DmkResultStatus.Error,\n error: input.error,\n };\n }\n\n return {\n status: DmkResultStatus.Success,\n data: input.data,\n };\n}\n\nexport function isSuccessDmkResult<Data, Error>(\n result: DmkResult<Data, Error>,\n): result is DmkSuccessResult<Data> {\n return result.status === DmkResultStatus.Success;\n}\n"],
|
|
5
|
+
"mappings": "AAAO,IAAKA,OACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UAFAA,OAAA,IA6BZ,SAASC,EACPC,EAC+B,CAC/B,MAAO,UAAWA,GAASA,EAAM,QAAU,MAC7C,CAEO,SAASC,EACdD,EACwB,CACxB,OAAID,EAAgBC,CAAK,EAChB,CACL,OAAQ,QACR,MAAOA,EAAM,KACf,EAGK,CACL,OAAQ,UACR,KAAMA,EAAM,IACd,CACF,CAEO,SAASE,EACdC,EACkC,CAClC,OAAOA,EAAO,SAAW,SAC3B",
|
|
6
|
+
"names": ["DmkResultStatus", "isDmkErrorInput", "input", "DmkResultFactory", "isSuccessDmkResult", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DmkResultFactory as s,DmkResultStatus as r,isSuccessDmkResult as u}from"./DmkResult";describe("DmkResult",()=>{describe("DmkResultFactory",()=>{it("should create a success result with given data",()=>{const t={lorem:"ipsum"},e=s({data:t});expect(e).toStrictEqual({status:r.Success,data:t})}),it("should create a success result when error is undefined",()=>{const t={lorem:"ipsum"},e=s({data:t,error:void 0});expect(e).toStrictEqual({status:r.Success,data:t})}),it("should create an error result with given error",()=>{const t=new Error("test"),e=s({error:t});expect(e).toStrictEqual({status:r.Error,error:t})})}),describe("isSuccessDmkResult",()=>{it("should return true if dmk result succeeds",()=>{const t=s({data:{test:"ttest"}});expect(u(t)).toBeTruthy()}),it("should return false if dmk result fails",()=>{const t=s({error:new Error("test")});expect(u(t)).toBeFalsy()})})});
|
|
2
|
+
//# sourceMappingURL=DmkResult.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/model/DmkResult.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n DmkResultFactory,\n DmkResultStatus,\n isSuccessDmkResult,\n} from \"./DmkResult\";\n\ndescribe(\"DmkResult\", () => {\n describe(\"DmkResultFactory\", () => {\n it(\"should create a success result with given data\", () => {\n const data = { lorem: \"ipsum\" };\n\n const result = DmkResultFactory({ data });\n\n expect(result).toStrictEqual({\n status: DmkResultStatus.Success,\n data,\n });\n });\n\n it(\"should create a success result when error is undefined\", () => {\n const data = { lorem: \"ipsum\" };\n\n const result = DmkResultFactory({\n data,\n error: undefined,\n });\n\n expect(result).toStrictEqual({\n status: DmkResultStatus.Success,\n data,\n });\n });\n\n it(\"should create an error result with given error\", () => {\n const error = new Error(\"test\");\n\n const result = DmkResultFactory({ error });\n\n expect(result).toStrictEqual({\n status: DmkResultStatus.Error,\n error,\n });\n });\n });\n\n describe(\"isSuccessDmkResult\", () => {\n it(\"should return true if dmk result succeeds\", () => {\n const result = DmkResultFactory({ data: { test: \"ttest\" } });\n\n expect(isSuccessDmkResult(result)).toBeTruthy();\n });\n\n it(\"should return false if dmk result fails\", () => {\n const result = DmkResultFactory({ error: new Error(\"test\") });\n\n expect(isSuccessDmkResult(result)).toBeFalsy();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,oBAAAA,EACA,mBAAAC,EACA,sBAAAC,MACK,cAEP,SAAS,YAAa,IAAM,CAC1B,SAAS,mBAAoB,IAAM,CACjC,GAAG,iDAAkD,IAAM,CACzD,MAAMC,EAAO,CAAE,MAAO,OAAQ,EAExBC,EAASJ,EAAiB,CAAE,KAAAG,CAAK,CAAC,EAExC,OAAOC,CAAM,EAAE,cAAc,CAC3B,OAAQH,EAAgB,QACxB,KAAAE,CACF,CAAC,CACH,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,MAAMA,EAAO,CAAE,MAAO,OAAQ,EAExBC,EAASJ,EAAiB,CAC9B,KAAAG,EACA,MAAO,MACT,CAAC,EAED,OAAOC,CAAM,EAAE,cAAc,CAC3B,OAAQH,EAAgB,QACxB,KAAAE,CACF,CAAC,CACH,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,MAAME,EAAQ,IAAI,MAAM,MAAM,EAExBD,EAASJ,EAAiB,CAAE,MAAAK,CAAM,CAAC,EAEzC,OAAOD,CAAM,EAAE,cAAc,CAC3B,OAAQH,EAAgB,MACxB,MAAAI,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,4CAA6C,IAAM,CACpD,MAAMD,EAASJ,EAAiB,CAAE,KAAM,CAAE,KAAM,OAAQ,CAAE,CAAC,EAE3D,OAAOE,EAAmBE,CAAM,CAAC,EAAE,WAAW,CAChD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,MAAMA,EAASJ,EAAiB,CAAE,MAAO,IAAI,MAAM,MAAM,CAAE,CAAC,EAE5D,OAAOE,EAAmBE,CAAM,CAAC,EAAE,UAAU,CAC/C,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["DmkResultFactory", "DmkResultStatus", "isSuccessDmkResult", "data", "result", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DmkNetworkClientError as p}from"./DmkNetworkClientError";import{buildBodyAndHeaders as m,buildSignal as d,buildUrl as h,parseBody as l,safeReadText as k,wrapFetchError as y}from"./DmkNetworkClientHelpers";class D{baseUrl;defaultHeaders;fetchImpl;constructor(e={}){this.baseUrl=e.baseUrl,this.defaultHeaders=e.headers??{},this.fetchImpl=e.fetch}getFetch(){return this.fetchImpl??globalThis.fetch.bind(globalThis)}get(e,t){return this.request({...t,method:"GET",url:e}).then(r=>r.data)}post(e,t,r){return this.request({...r,method:"POST",url:e,body:t}).then(n=>n.data)}put(e,t,r){return this.request({...r,method:"PUT",url:e,body:t}).then(n=>n.data)}patch(e,t,r){return this.request({...r,method:"PATCH",url:e,body:t}).then(n=>n.data)}delete(e,t){return this.request({...t,method:"DELETE",url:e}).then(r=>r.data)}head(e,t){return this.request({...t,method:"HEAD",url:e,responseType:"void"}).then(()=>{})}async request(e){const t=h({url:e.url,params:e.params,baseUrl:this.baseUrl}),{body:r,headers:n}=m({method:e.method,body:e.body,defaultHeaders:this.defaultHeaders,perRequestHeaders:e.headers}),a=d({timeoutMs:e.timeoutMs,externalSignal:e.signal}),u=e.throwOnHttpError??!0,i=e.responseType??"json";let s;try{s=await this.getFetch()(t,{method:e.method,headers:n,body:r,signal:a})}catch(o){throw y({cause:o,externalSignal:e.signal,timeoutMs:e.timeoutMs})}if(!s.ok&&u){const o=await k(s);throw new p({message:`HTTP error ${s.status} ${s.statusText}`.trim(),status:s.status,statusText:s.statusText,responseBody:o})}return{data:await l(s,i),status:s.status,statusText:s.statusText,headers:s.headers,ok:s.ok}}}export{D as DmkNetworkClient};
|
|
2
|
+
//# sourceMappingURL=DmkNetworkClient.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/network/DmkNetworkClient.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n type DmkQueryParams,\n type DmkResponseType,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\nexport type { DmkQueryParamValue } from \"./DmkNetworkClientHelpers\";\nexport type { DmkQueryParams, DmkResponseType };\n\n/**\n * Per-request configuration. Everything is optional \u2014 sensible defaults are\n * applied by the client.\n */\nexport type DmkRequestConfig = {\n /** Query params merged into the URL. `null`/`undefined` entries are skipped. */\n params?: DmkQueryParams;\n /** Per-request headers merged on top of the client's default headers. */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in milliseconds. When unset (or `0`), the request\n * has no timeout.\n */\n timeoutMs?: number;\n /**\n * External abort signal. Composed with the internal timeout signal, so\n * either one firing will abort the request.\n */\n signal?: AbortSignal;\n /**\n * How to parse the response body. Defaults to `\"json\"`, except for `head`\n * which always resolves to `void`.\n */\n responseType?: DmkResponseType;\n /**\n * When `true` (default), non-2xx responses throw {@link DmkNetworkClientError}.\n * Set to `false` to resolve normally and inspect {@link DmkNetworkResponse}\n * via {@link DmkNetworkClient.request}.\n */\n throwOnHttpError?: boolean;\n};\n\n/**\n * Full response envelope returned by {@link DmkNetworkClient.request}.\n * The simple method helpers (`get`, `post`, \u2026) unwrap to `data` directly.\n *\n * `data` is intentionally typed as `unknown`: network payloads are untrusted\n * input, so callers must narrow it with a type guard or runtime validator\n * (e.g. the existing DTO mappers) before use.\n */\nexport type DmkNetworkResponse = {\n data: unknown;\n status: number;\n statusText: string;\n headers: Headers;\n ok: boolean;\n};\n\nexport type DmkNetworkClientOptions = {\n /** Base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default headers merged into every request. */\n headers?: Record<string, string>;\n /** Injection point for tests. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n};\n\ntype InternalRequestConfig = DmkRequestConfig & {\n method: string;\n url: string;\n body?: unknown;\n};\n\n/**\n * Minimal axios-like wrapper over `fetch`. Handles:\n *\n * - URL composition (base URL + relative path + query params from an object)\n * - Automatic JSON body encoding and `Content-Type` header\n * - Default and per-request headers merging\n * - Request timeout via `AbortSignal.timeout`, composable with a caller signal\n * - Automatic `response.ok` check with a typed {@link DmkNetworkClientError}\n * - Typed JSON / text / blob / arrayBuffer response parsing\n *\n * Use the high-level helpers ({@link DmkNetworkClient.get}, {@link DmkNetworkClient.post},\n * \u2026) for 95% of calls and {@link DmkNetworkClient.request} when you need the\n * full response envelope (status, headers).\n */\nexport class DmkNetworkClient {\n private readonly baseUrl?: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetchImpl?: typeof fetch;\n\n constructor(options: DmkNetworkClientOptions = {}) {\n this.baseUrl = options.baseUrl;\n this.defaultHeaders = options.headers ?? {};\n this.fetchImpl = options.fetch;\n }\n\n private getFetch(): typeof fetch {\n // Resolve `fetch` at call time so that spies installed on `globalThis.fetch`\n // after the client was constructed are still honored.\n return this.fetchImpl ?? globalThis.fetch.bind(globalThis);\n }\n\n public get(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"GET\", url }).then(\n (res) => res.data,\n );\n }\n\n public post(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"POST\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public put(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PUT\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public patch(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PATCH\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public delete(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"DELETE\", url }).then(\n (res) => res.data,\n );\n }\n\n public head(url: string, config?: DmkRequestConfig): Promise<void> {\n return this.request({\n ...config,\n method: \"HEAD\",\n url,\n responseType: \"void\",\n }).then(() => undefined);\n }\n\n /**\n * Escape hatch returning the full response envelope (status, headers, data).\n * Most callers should prefer {@link get}, {@link post}, etc.\n *\n * `data` is `unknown` by design; validate it with a type guard before use.\n */\n public async request(\n config: InternalRequestConfig,\n ): Promise<DmkNetworkResponse> {\n const url = buildUrl({\n url: config.url,\n params: config.params,\n baseUrl: this.baseUrl,\n });\n const { body, headers } = buildBodyAndHeaders({\n method: config.method,\n body: config.body,\n defaultHeaders: this.defaultHeaders,\n perRequestHeaders: config.headers,\n });\n const signal = buildSignal({\n timeoutMs: config.timeoutMs,\n externalSignal: config.signal,\n });\n const throwOnHttpError = config.throwOnHttpError ?? true;\n const responseType: DmkResponseType = config.responseType ?? \"json\";\n\n let response: Response;\n try {\n response = await this.getFetch()(url, {\n method: config.method,\n headers,\n body,\n signal,\n });\n } catch (cause) {\n throw wrapFetchError({\n cause,\n externalSignal: config.signal,\n timeoutMs: config.timeoutMs,\n });\n }\n\n if (!response.ok && throwOnHttpError) {\n const responseBody = await safeReadText(response);\n throw new DmkNetworkClientError({\n message: `HTTP error ${response.status} ${response.statusText}`.trim(),\n status: response.status,\n statusText: response.statusText,\n responseBody,\n });\n }\n\n const data = await parseBody(response, responseType);\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n ok: response.ok,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,yBAAAA,MAA6B,0BACtC,OACE,uBAAAC,EACA,eAAAC,EACA,YAAAC,EAGA,aAAAC,EACA,gBAAAC,EACA,kBAAAC,MACK,4BAkFA,MAAMC,CAAiB,CACX,QACA,eACA,UAEjB,YAAYC,EAAmC,CAAC,EAAG,CACjD,KAAK,QAAUA,EAAQ,QACvB,KAAK,eAAiBA,EAAQ,SAAW,CAAC,EAC1C,KAAK,UAAYA,EAAQ,KAC3B,CAEQ,UAAyB,CAG/B,OAAO,KAAK,WAAa,WAAW,MAAM,KAAK,UAAU,CAC3D,CAEO,IAAIC,EAAaC,EAA6C,CACnE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,CAAI,CAAC,EAAE,KACpDE,GAAQA,EAAI,IACf,CACF,CAEO,KACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,OAAQ,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC3DD,GAAQA,EAAI,IACf,CACF,CAEO,IACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC1DD,GAAQA,EAAI,IACf,CACF,CAEO,MACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,QAAS,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC5DD,GAAQA,EAAI,IACf,CACF,CAEO,OAAOF,EAAaC,EAA6C,CACtE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,SAAU,IAAAD,CAAI,CAAC,EAAE,KACvDE,GAAQA,EAAI,IACf,CACF,CAEO,KAAKF,EAAaC,EAA0C,CACjE,OAAO,KAAK,QAAQ,CAClB,GAAGA,EACH,OAAQ,OACR,IAAAD,EACA,aAAc,MAChB,CAAC,EAAE,KAAK,IAAG,EAAY,CACzB,CAQA,MAAa,QACXC,EAC6B,CAC7B,MAAMD,EAAMN,EAAS,CACnB,IAAKO,EAAO,IACZ,OAAQA,EAAO,OACf,QAAS,KAAK,OAChB,CAAC,EACK,CAAE,KAAAE,EAAM,QAAAC,CAAQ,EAAIZ,EAAoB,CAC5C,OAAQS,EAAO,OACf,KAAMA,EAAO,KACb,eAAgB,KAAK,eACrB,kBAAmBA,EAAO,OAC5B,CAAC,EACKI,EAASZ,EAAY,CACzB,UAAWQ,EAAO,UAClB,eAAgBA,EAAO,MACzB,CAAC,EACKK,EAAmBL,EAAO,kBAAoB,GAC9CM,EAAgCN,EAAO,cAAgB,OAE7D,IAAIO,EACJ,GAAI,CACFA,EAAW,MAAM,KAAK,SAAS,EAAER,EAAK,CACpC,OAAQC,EAAO,OACf,QAAAG,EACA,KAAAD,EACA,OAAAE,CACF,CAAC,CACH,OAASI,EAAO,CACd,MAAMZ,EAAe,CACnB,MAAAY,EACA,eAAgBR,EAAO,OACvB,UAAWA,EAAO,SACpB,CAAC,CACH,CAEA,GAAI,CAACO,EAAS,IAAMF,EAAkB,CACpC,MAAMI,EAAe,MAAMd,EAAaY,CAAQ,EAChD,MAAM,IAAIjB,EAAsB,CAC9B,QAAS,cAAciB,EAAS,MAAM,IAAIA,EAAS,UAAU,GAAG,KAAK,EACrE,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,aAAAE,CACF,CAAC,CACH,CAIA,MAAO,CACL,KAHW,MAAMf,EAAUa,EAAUD,CAAY,EAIjD,OAAQC,EAAS,OACjB,WAAYA,EAAS,WACrB,QAASA,EAAS,QAClB,GAAIA,EAAS,EACf,CACF,CACF",
|
|
6
|
+
"names": ["DmkNetworkClientError", "buildBodyAndHeaders", "buildSignal", "buildUrl", "parseBody", "safeReadText", "wrapFetchError", "DmkNetworkClient", "options", "url", "config", "res", "body", "headers", "signal", "throwOnHttpError", "responseType", "response", "cause", "responseBody"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DmkNetworkClient as s}from"./DmkNetworkClient";import{DmkNetworkClientError as i}from"./DmkNetworkClientError";describe("DmkNetworkClient",()=>{const c=(e,o={})=>new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"},...o});describe("URL composition",()=>{it("should send requests to an absolute URL as-is",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).get("https://api.example.com/items");const[t]=e.mock.calls[0];expect(t).toBeInstanceOf(URL),expect(t.toString()).toBe("https://api.example.com/items")}),it("should prepend baseUrl to relative paths with slash normalization",async()=>{const e=vi.fn().mockImplementation(()=>Promise.resolve(c({ok:!0}))),o=new s({baseUrl:"https://api.example.com/",fetch:e});await o.get("/items"),await o.get("items"),expect(e.mock.calls[0][0].toString()).toBe("https://api.example.com/items"),expect(e.mock.calls[1][0].toString()).toBe("https://api.example.com/items")}),it("should set URL search params from the config",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).get("https://api.example.com/items",{params:{chain:1,contract:"0xabc",active:!0,skip:null,alsoSkip:void 0}});const t=e.mock.calls[0][0];expect(t.searchParams.get("chain")).toBe("1"),expect(t.searchParams.get("contract")).toBe("0xabc"),expect(t.searchParams.get("active")).toBe("true"),expect(t.searchParams.has("skip")).toBe(!1),expect(t.searchParams.has("alsoSkip")).toBe(!1)})}),describe("headers",()=>{it("should merge default and per-request headers",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e,headers:{"X-Default":"default","X-Shared":"from-default"}}).get("https://api.example.com/items",{headers:{"X-Shared":"overridden","X-Per-Request":"per"}});const t=e.mock.calls[0][1];expect(t.headers).toMatchObject({"X-Default":"default","X-Shared":"overridden","X-Per-Request":"per"})})}),describe("body handling",()=>{it("should JSON-stringify plain-object bodies and set Content-Type",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).post("https://api.example.com/items",{foo:"bar"});const t=e.mock.calls[0][1];expect(t.method).toBe("POST"),expect(t.body).toBe(JSON.stringify({foo:"bar"})),expect(t.headers).toMatchObject({"Content-Type":"application/json"})}),it("should not override an explicit Content-Type header",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).post("https://api.example.com/items",{foo:"bar"},{headers:{"content-type":"application/vnd.custom+json"}});const t=e.mock.calls[0][1];expect(t.headers).toMatchObject({"content-type":"application/vnd.custom+json"})}),it("should pass raw BodyInit values through unchanged",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0})),o=new s({fetch:e}),t=new FormData;t.set("field","value"),await o.post("https://api.example.com/items",t);const n=e.mock.calls[0][1];expect(n.body).toBe(t),expect(n.headers).not.toMatchObject({"Content-Type":"application/json"})}),it("should not send a body on GET or HEAD",async()=>{const e=vi.fn().mockImplementation(()=>Promise.resolve(c({ok:!0}))),o=new s({fetch:e});await o.get("https://api.example.com/items"),await o.head("https://api.example.com/items"),expect(e.mock.calls[0][1]).toMatchObject({body:void 0}),expect(e.mock.calls[1][1]).toMatchObject({body:void 0})})}),describe("response parsing",()=>{it("should return the parsed JSON body by default",async()=>{const e=vi.fn().mockResolvedValue(c({hello:"world"})),t=await new s({fetch:e}).get("https://api.example.com/items");expect(t).toEqual({hello:"world"})}),it("should return text when responseType is 'text'",async()=>{const e=vi.fn().mockResolvedValue(new Response("plain-body",{status:200})),t=await new s({fetch:e}).get("https://api.example.com/items",{responseType:"text"});expect(t).toBe("plain-body")}),it("should resolve HEAD to void without reading the body",async()=>{const e=vi.fn().mockResolvedValue(new Response(null,{status:200})),t=await new s({fetch:e}).head("https://api.example.com/items");expect(t).toBeUndefined()}),it("should resolve empty JSON body to undefined",async()=>{const e=vi.fn().mockResolvedValue(new Response(null,{status:204})),t=await new s({fetch:e}).get("https://api.example.com/items");expect(t).toBeUndefined()}),it("should throw a DmkNetworkClientError on malformed JSON",async()=>{const e=vi.fn().mockResolvedValue(new Response("not-json",{status:200})),o=new s({fetch:e});await expect(o.get("https://api.example.com/items")).rejects.toBeInstanceOf(i)})}),describe("error handling",()=>{it("should throw DmkNetworkClientError with status on non-2xx responses",async()=>{const e=vi.fn().mockResolvedValue(new Response("boom",{status:500,statusText:"Server Error"})),t=await new s({fetch:e}).get("https://api.example.com/items").catch(a=>a);expect(t).toBeInstanceOf(i);const n=t;expect(n.status).toBe(500),expect(n.statusText).toBe("Server Error"),expect(n.responseBody).toBe("boom"),expect(n.isTimeout).toBe(!1),expect(n.isAbort).toBe(!1)}),it("should not throw when throwOnHttpError is disabled",async()=>{const e=vi.fn().mockResolvedValue(new Response("boom",{status:500})),t=await new s({fetch:e}).request({method:"GET",url:"https://api.example.com/items",responseType:"text",throwOnHttpError:!1});expect(t.status).toBe(500),expect(t.ok).toBe(!1),expect(t.data).toBe("boom")}),it("should wrap generic fetch failures into DmkNetworkClientError",async()=>{const e=new TypeError("network down"),o=vi.fn().mockRejectedValue(e),n=await new s({fetch:o}).get("https://api.example.com/items").catch(a=>a);expect(n).toBeInstanceOf(i),expect(n.cause).toBe(e)})}),describe("timeout",()=>{it("should pass an AbortSignal when timeoutMs is configured",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).get("https://api.example.com/items",{timeoutMs:1e3});const t=e.mock.calls[0][1];expect(t.signal).toBeInstanceOf(AbortSignal)}),it("should not pass a signal when no timeout and no external signal are set",async()=>{const e=vi.fn().mockResolvedValue(c({ok:!0}));await new s({fetch:e}).get("https://api.example.com/items");const t=e.mock.calls[0][1];expect(t.signal).toBeUndefined()}),it("should mark the error as a timeout when fetch rejects with TimeoutError",async()=>{const e=new Error("The operation was aborted");e.name="TimeoutError";const o=vi.fn().mockRejectedValue(e),n=await new s({fetch:o}).get("https://api.example.com/items",{timeoutMs:10}).catch(a=>a);expect(n).toBeInstanceOf(i),expect(n.isTimeout).toBe(!0),expect(n.isAbort).toBe(!1)}),it("should mark the error as an abort when the caller signal is aborted",async()=>{const e=new AbortController;e.abort();const o=new Error("aborted");o.name="AbortError";const t=vi.fn().mockRejectedValue(o),a=await new s({fetch:t}).get("https://api.example.com/items",{signal:e.signal}).catch(r=>r);expect(a).toBeInstanceOf(i),expect(a.isAbort).toBe(!0),expect(a.isTimeout).toBe(!1)})}),describe("request envelope",()=>{it("should expose full response metadata via request()",async()=>{const e=vi.fn().mockResolvedValue(new Response(JSON.stringify({hello:"world"}),{status:201,statusText:"Created",headers:{"X-Custom":"1","Content-Type":"application/json"}})),t=await new s({fetch:e}).request({method:"GET",url:"https://api.example.com/items"});expect(t.status).toBe(201),expect(t.statusText).toBe("Created"),expect(t.ok).toBe(!0),expect(t.data).toEqual({hello:"world"}),expect(t.headers.get("X-Custom")).toBe("1")})})});
|
|
2
|
+
//# sourceMappingURL=DmkNetworkClient.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/network/DmkNetworkClient.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"./DmkNetworkClient\";\nimport { DmkNetworkClientError } from \"./DmkNetworkClientError\";\n\ndescribe(\"DmkNetworkClient\", () => {\n const jsonResponse = (body: unknown, init: ResponseInit = {}) =>\n new Response(JSON.stringify(body), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n ...init,\n });\n\n describe(\"URL composition\", () => {\n it(\"should send requests to an absolute URL as-is\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.get(\"https://api.example.com/items\");\n\n const [calledUrl] = fetchMock.mock.calls[0]!;\n expect(calledUrl).toBeInstanceOf(URL);\n expect((calledUrl as URL).toString()).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should prepend baseUrl to relative paths with slash normalization\", async () => {\n const fetchMock = vi\n .fn()\n .mockImplementation(() => Promise.resolve(jsonResponse({ ok: true })));\n const client = new DmkNetworkClient({\n baseUrl: \"https://api.example.com/\",\n fetch: fetchMock,\n });\n\n await client.get(\"/items\");\n await client.get(\"items\");\n\n expect((fetchMock.mock.calls[0]![0] as URL).toString()).toBe(\n \"https://api.example.com/items\",\n );\n expect((fetchMock.mock.calls[1]![0] as URL).toString()).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should set URL search params from the config\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.get(\"https://api.example.com/items\", {\n params: {\n chain: 1,\n contract: \"0xabc\",\n active: true,\n skip: null,\n alsoSkip: undefined,\n },\n });\n\n const url = fetchMock.mock.calls[0]![0] as URL;\n expect(url.searchParams.get(\"chain\")).toBe(\"1\");\n expect(url.searchParams.get(\"contract\")).toBe(\"0xabc\");\n expect(url.searchParams.get(\"active\")).toBe(\"true\");\n expect(url.searchParams.has(\"skip\")).toBe(false);\n expect(url.searchParams.has(\"alsoSkip\")).toBe(false);\n });\n });\n\n describe(\"headers\", () => {\n it(\"should merge default and per-request headers\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({\n fetch: fetchMock,\n headers: { \"X-Default\": \"default\", \"X-Shared\": \"from-default\" },\n });\n\n await client.get(\"https://api.example.com/items\", {\n headers: { \"X-Shared\": \"overridden\", \"X-Per-Request\": \"per\" },\n });\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.headers).toMatchObject({\n \"X-Default\": \"default\",\n \"X-Shared\": \"overridden\",\n \"X-Per-Request\": \"per\",\n });\n });\n });\n\n describe(\"body handling\", () => {\n it(\"should JSON-stringify plain-object bodies and set Content-Type\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.post(\"https://api.example.com/items\", { foo: \"bar\" });\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.method).toBe(\"POST\");\n expect(init.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(init.headers).toMatchObject({\n \"Content-Type\": \"application/json\",\n });\n });\n\n it(\"should not override an explicit Content-Type header\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.post(\n \"https://api.example.com/items\",\n { foo: \"bar\" },\n { headers: { \"content-type\": \"application/vnd.custom+json\" } },\n );\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.headers).toMatchObject({\n \"content-type\": \"application/vnd.custom+json\",\n });\n });\n\n it(\"should pass raw BodyInit values through unchanged\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n const formData = new FormData();\n formData.set(\"field\", \"value\");\n\n await client.post(\"https://api.example.com/items\", formData);\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.body).toBe(formData);\n expect(init.headers).not.toMatchObject({\n \"Content-Type\": \"application/json\",\n });\n });\n\n it(\"should not send a body on GET or HEAD\", async () => {\n const fetchMock = vi\n .fn()\n .mockImplementation(() => Promise.resolve(jsonResponse({ ok: true })));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.get(\"https://api.example.com/items\");\n await client.head(\"https://api.example.com/items\");\n\n expect(fetchMock.mock.calls[0]![1]).toMatchObject({ body: undefined });\n expect(fetchMock.mock.calls[1]![1]).toMatchObject({ body: undefined });\n });\n });\n\n describe(\"response parsing\", () => {\n it(\"should return the parsed JSON body by default\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(jsonResponse({ hello: \"world\" }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const result = await client.get(\"https://api.example.com/items\");\n\n expect(result).toEqual({ hello: \"world\" });\n });\n\n it(\"should return text when responseType is 'text'\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(new Response(\"plain-body\", { status: 200 }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const result = await client.get(\"https://api.example.com/items\", {\n responseType: \"text\",\n });\n\n expect(result).toBe(\"plain-body\");\n });\n\n it(\"should resolve HEAD to void without reading the body\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(new Response(null, { status: 200 }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const result = await client.head(\"https://api.example.com/items\");\n\n expect(result).toBeUndefined();\n });\n\n it(\"should resolve empty JSON body to undefined\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(new Response(null, { status: 204 }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const result = await client.get(\"https://api.example.com/items\");\n\n expect(result).toBeUndefined();\n });\n\n it(\"should throw a DmkNetworkClientError on malformed JSON\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(new Response(\"not-json\", { status: 200 }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await expect(\n client.get(\"https://api.example.com/items\"),\n ).rejects.toBeInstanceOf(DmkNetworkClientError);\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw DmkNetworkClientError with status on non-2xx responses\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(\n new Response(\"boom\", {\n status: 500,\n statusText: \"Server Error\",\n }),\n );\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const error = await client\n .get(\"https://api.example.com/items\")\n .catch((e: unknown) => e);\n\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n const dmkError = error as DmkNetworkClientError;\n expect(dmkError.status).toBe(500);\n expect(dmkError.statusText).toBe(\"Server Error\");\n expect(dmkError.responseBody).toBe(\"boom\");\n expect(dmkError.isTimeout).toBe(false);\n expect(dmkError.isAbort).toBe(false);\n });\n\n it(\"should not throw when throwOnHttpError is disabled\", async () => {\n const fetchMock = vi\n .fn()\n .mockResolvedValue(new Response(\"boom\", { status: 500 }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const response = await client.request({\n method: \"GET\",\n url: \"https://api.example.com/items\",\n responseType: \"text\",\n throwOnHttpError: false,\n });\n\n expect(response.status).toBe(500);\n expect(response.ok).toBe(false);\n expect(response.data).toBe(\"boom\");\n });\n\n it(\"should wrap generic fetch failures into DmkNetworkClientError\", async () => {\n const cause = new TypeError(\"network down\");\n const fetchMock = vi.fn().mockRejectedValue(cause);\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const error = await client\n .get(\"https://api.example.com/items\")\n .catch((e: unknown) => e);\n\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect((error as DmkNetworkClientError).cause).toBe(cause);\n });\n });\n\n describe(\"timeout\", () => {\n it(\"should pass an AbortSignal when timeoutMs is configured\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.get(\"https://api.example.com/items\", { timeoutMs: 1000 });\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.signal).toBeInstanceOf(AbortSignal);\n });\n\n it(\"should not pass a signal when no timeout and no external signal are set\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ ok: true }));\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n await client.get(\"https://api.example.com/items\");\n\n const init = fetchMock.mock.calls[0]![1] as RequestInit;\n expect(init.signal).toBeUndefined();\n });\n\n it(\"should mark the error as a timeout when fetch rejects with TimeoutError\", async () => {\n const timeoutError = new Error(\"The operation was aborted\");\n timeoutError.name = \"TimeoutError\";\n const fetchMock = vi.fn().mockRejectedValue(timeoutError);\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const error = await client\n .get(\"https://api.example.com/items\", { timeoutMs: 10 })\n .catch((e: unknown) => e);\n\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect((error as DmkNetworkClientError).isTimeout).toBe(true);\n expect((error as DmkNetworkClientError).isAbort).toBe(false);\n });\n\n it(\"should mark the error as an abort when the caller signal is aborted\", async () => {\n const abortController = new AbortController();\n abortController.abort();\n const abortError = new Error(\"aborted\");\n abortError.name = \"AbortError\";\n const fetchMock = vi.fn().mockRejectedValue(abortError);\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const error = await client\n .get(\"https://api.example.com/items\", {\n signal: abortController.signal,\n })\n .catch((e: unknown) => e);\n\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect((error as DmkNetworkClientError).isAbort).toBe(true);\n expect((error as DmkNetworkClientError).isTimeout).toBe(false);\n });\n });\n\n describe(\"request envelope\", () => {\n it(\"should expose full response metadata via request()\", async () => {\n const fetchMock = vi.fn().mockResolvedValue(\n new Response(JSON.stringify({ hello: \"world\" }), {\n status: 201,\n statusText: \"Created\",\n headers: { \"X-Custom\": \"1\", \"Content-Type\": \"application/json\" },\n }),\n );\n const client = new DmkNetworkClient({ fetch: fetchMock });\n\n const response = await client.request({\n method: \"GET\",\n url: \"https://api.example.com/items\",\n });\n\n expect(response.status).toBe(201);\n expect(response.statusText).toBe(\"Created\");\n expect(response.ok).toBe(true);\n expect(response.data).toEqual({ hello: \"world\" });\n expect(response.headers.get(\"X-Custom\")).toBe(\"1\");\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DmkNetworkClient", "DmkNetworkClientError", "jsonResponse", "body", "init", "fetchMock", "calledUrl", "client", "url", "formData", "result", "error", "e", "dmkError", "response", "cause", "timeoutError", "abortController", "abortError"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class t extends Error{status;statusText;responseBody;isTimeout;isAbort;cause;constructor(e){super(e.message),this.name="DmkNetworkClientError",this.status=e.status,this.statusText=e.statusText,this.responseBody=e.responseBody,this.isTimeout=e.isTimeout??!1,this.isAbort=e.isAbort??!1,this.cause=e.cause}}export{t as DmkNetworkClientError};
|
|
2
|
+
//# sourceMappingURL=DmkNetworkClientError.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/network/DmkNetworkClientError.ts"],
|
|
4
|
+
"sourcesContent": ["export type DmkNetworkClientErrorParams = {\n message: string;\n status?: number;\n statusText?: string;\n responseBody?: string;\n isTimeout?: boolean;\n isAbort?: boolean;\n cause?: unknown;\n};\n\n/**\n * Error thrown by {@link DmkNetworkClient} for HTTP, timeout, abort or\n * transport-level failures.\n *\n * - When the remote returned a non-2xx response, {@link status} and\n * {@link statusText} are populated and {@link responseBody} contains the\n * raw text body (best effort).\n * - When the request timed out via the client's `timeoutMs`,\n * {@link isTimeout} is `true`.\n * - When the request was aborted through the caller's `signal`,\n * {@link isAbort} is `true`.\n * - For other fetch/network failures, {@link cause} carries the original\n * error.\n */\nexport class DmkNetworkClientError extends Error {\n public readonly status?: number;\n public readonly statusText?: string;\n public readonly responseBody?: string;\n public readonly isTimeout: boolean;\n public readonly isAbort: boolean;\n public override readonly cause?: unknown;\n\n constructor(params: DmkNetworkClientErrorParams) {\n super(params.message);\n this.name = \"DmkNetworkClientError\";\n this.status = params.status;\n this.statusText = params.statusText;\n this.responseBody = params.responseBody;\n this.isTimeout = params.isTimeout ?? false;\n this.isAbort = params.isAbort ?? false;\n this.cause = params.cause;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAwBO,MAAMA,UAA8B,KAAM,CAC/B,OACA,WACA,aACA,UACA,QACS,MAEzB,YAAYC,EAAqC,CAC/C,MAAMA,EAAO,OAAO,EACpB,KAAK,KAAO,wBACZ,KAAK,OAASA,EAAO,OACrB,KAAK,WAAaA,EAAO,WACzB,KAAK,aAAeA,EAAO,aAC3B,KAAK,UAAYA,EAAO,WAAa,GACrC,KAAK,QAAUA,EAAO,SAAW,GACjC,KAAK,MAAQA,EAAO,KACtB,CACF",
|
|
6
|
+
"names": ["DmkNetworkClientError", "params"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DmkNetworkClientError as u}from"./DmkNetworkClientError";const d="application/json";function c(e,t){if(!t)return e;const r=e.endsWith("/")?e.slice(0,-1):e,n=t.startsWith("/")?t:`/${t}`;return`${r}${n}`}function g(e){const{url:t,params:r,baseUrl:n}=e,o=/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?new URL(t):n?new URL(c(n,t)):new URL(t);if(r)for(const[a,s]of Object.entries(r))s!=null&&o.searchParams.set(a,String(s));return o}function f(e,t){const r=t.toLowerCase();return Object.keys(e).some(n=>n.toLowerCase()===r)}function l(e){return typeof e=="string"||e instanceof ArrayBuffer||e instanceof Blob||e instanceof FormData||e instanceof URLSearchParams||e instanceof ReadableStream||ArrayBuffer.isView(e)}function y(e){const{method:t,body:r,defaultHeaders:n,perRequestHeaders:i}=e,o={...n,...i};return r===void 0||t==="GET"||t==="HEAD"?{body:void 0,headers:o}:l(r)?{body:r,headers:o}:(f(o,"content-type")||(o["Content-Type"]=d),{body:JSON.stringify(r),headers:o})}function b(e){const{timeoutMs:t,externalSignal:r}=e,n=t&&t>0?AbortSignal.timeout(t):void 0;return n&&r?AbortSignal.any([r,n]):n??r}async function p(e,t){switch(t){case"void":return;case"text":return await e.text();case"blob":return await e.blob();case"arrayBuffer":return await e.arrayBuffer();case"json":default:{const r=await e.text();if(r.length===0)return;try{return JSON.parse(r)}catch(n){throw new u({message:"Failed to parse JSON response body",status:e.status,statusText:e.statusText,responseBody:r,cause:n})}}}}async function x(e){try{return await e.text()}catch{return}}function w(e){const{cause:t,externalSignal:r,timeoutMs:n}=e,i=!!(n&&n>0);if(t instanceof Error&&(t.name==="AbortError"||t.name==="TimeoutError")){const a=r?.aborted??!1,s=!a&&(t.name==="TimeoutError"||i);return new u({message:s?"Request timed out":"Request aborted",isTimeout:s,isAbort:a,cause:t})}return new u({message:t instanceof Error?t.message:"Network request failed",cause:t})}export{d as JSON_CONTENT_TYPE,y as buildBodyAndHeaders,b as buildSignal,g as buildUrl,f as hasHeader,l as isRawBody,c as joinPath,p as parseBody,x as safeReadText,w as wrapFetchError};
|
|
2
|
+
//# sourceMappingURL=DmkNetworkClientHelpers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/network/DmkNetworkClientHelpers.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\n\nexport type DmkQueryParamValue = string | number | boolean | null | undefined;\n\nexport type DmkQueryParams = Record<string, DmkQueryParamValue>;\n\nexport type DmkResponseType = \"json\" | \"text\" | \"blob\" | \"arrayBuffer\" | \"void\";\n\nexport const JSON_CONTENT_TYPE = \"application/json\";\n\n/**\n * Joins a base URL with a relative path, normalizing surrounding slashes so\n * that exactly one `/` appears between them.\n */\nexport function joinPath(base: string, path: string): string {\n if (!path) return base;\n const trimmedBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const trimmedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${trimmedBase}${trimmedPath}`;\n}\n\n/**\n * Builds the final request URL from an input URL (absolute or relative), an\n * optional base URL, and optional query params. `null`/`undefined` param\n * values are skipped.\n */\nexport function buildUrl(args: {\n url: string;\n params?: DmkQueryParams;\n baseUrl?: string;\n}): URL {\n const { url, params, baseUrl } = args;\n const isAbsolute = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(url);\n const fullUrl = isAbsolute\n ? new URL(url)\n : baseUrl\n ? new URL(joinPath(baseUrl, url))\n : new URL(url);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== null && value !== undefined) {\n fullUrl.searchParams.set(key, String(value));\n }\n }\n }\n\n return fullUrl;\n}\n\n/**\n * Case-insensitive lookup for a header name in a plain record.\n */\nexport function hasHeader(\n headers: Record<string, string>,\n name: string,\n): boolean {\n const lower = name.toLowerCase();\n return Object.keys(headers).some((k) => k.toLowerCase() === lower);\n}\n\n/**\n * Returns `true` when the value is already a `BodyInit` accepted by `fetch`\n * and should be passed through without JSON serialization.\n */\nexport function isRawBody(body: unknown): body is BodyInit {\n return (\n typeof body === \"string\" ||\n body instanceof ArrayBuffer ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams ||\n body instanceof ReadableStream ||\n ArrayBuffer.isView(body)\n );\n}\n\n/**\n * Computes the final request body and merged headers. Plain-object bodies are\n * JSON-serialized and the `Content-Type` header is set (unless the caller\n * already provided one). Raw `BodyInit` values pass through unchanged.\n */\nexport function buildBodyAndHeaders(args: {\n method: string;\n body: unknown;\n defaultHeaders: Record<string, string>;\n perRequestHeaders?: Record<string, string>;\n}): { body?: BodyInit; headers: Record<string, string> } {\n const { method, body, defaultHeaders, perRequestHeaders } = args;\n const headers: Record<string, string> = {\n ...defaultHeaders,\n ...perRequestHeaders,\n };\n\n if (body === undefined || method === \"GET\" || method === \"HEAD\") {\n return { body: undefined, headers };\n }\n\n if (isRawBody(body)) {\n return { body, headers };\n }\n\n if (!hasHeader(headers, \"content-type\")) {\n headers[\"Content-Type\"] = JSON_CONTENT_TYPE;\n }\n return { body: JSON.stringify(body), headers };\n}\n\n/**\n * Composes the effective abort signal for a request. If both a timeout and an\n * external signal are present, they are merged via `AbortSignal.any` so that\n * either one firing aborts the request.\n */\nexport function buildSignal(args: {\n timeoutMs: number | undefined;\n externalSignal: AbortSignal | undefined;\n}): AbortSignal | undefined {\n const { timeoutMs, externalSignal } = args;\n const timeoutSignal =\n timeoutMs && timeoutMs > 0 ? AbortSignal.timeout(timeoutMs) : undefined;\n\n if (timeoutSignal && externalSignal) {\n return AbortSignal.any([externalSignal, timeoutSignal]);\n }\n return timeoutSignal ?? externalSignal;\n}\n\n/**\n * Parses the response body according to the requested {@link DmkResponseType}.\n * Empty JSON bodies resolve to `undefined`; malformed JSON throws a\n * {@link DmkNetworkClientError}.\n */\nexport async function parseBody(\n response: Response,\n responseType: DmkResponseType,\n): Promise<unknown> {\n switch (responseType) {\n case \"void\":\n return undefined;\n case \"text\":\n return await response.text();\n case \"blob\":\n return await response.blob();\n case \"arrayBuffer\":\n return await response.arrayBuffer();\n case \"json\":\n default: {\n const text = await response.text();\n if (text.length === 0) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch (cause) {\n throw new DmkNetworkClientError({\n message: \"Failed to parse JSON response body\",\n status: response.status,\n statusText: response.statusText,\n responseBody: text,\n cause,\n });\n }\n }\n }\n}\n\n/**\n * Reads the response body as text, swallowing any error so callers can use it\n * for best-effort diagnostics (e.g. building an error payload).\n */\nexport async function safeReadText(\n response: Response,\n): Promise<string | undefined> {\n try {\n return await response.text();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Wraps a `fetch` rejection into a typed {@link DmkNetworkClientError},\n * discriminating between external aborts, timeouts and generic failures.\n */\nexport function wrapFetchError(args: {\n cause: unknown;\n externalSignal: AbortSignal | undefined;\n timeoutMs: number | undefined;\n}): DmkNetworkClientError {\n const { cause, externalSignal, timeoutMs } = args;\n const hasTimeout = Boolean(timeoutMs && timeoutMs > 0);\n const isAbortError =\n cause instanceof Error &&\n (cause.name === \"AbortError\" || cause.name === \"TimeoutError\");\n\n if (isAbortError) {\n const externallyAborted = externalSignal?.aborted ?? false;\n const timedOut =\n !externallyAborted && (cause.name === \"TimeoutError\" || hasTimeout);\n return new DmkNetworkClientError({\n message: timedOut ? `Request timed out` : \"Request aborted\",\n isTimeout: timedOut,\n isAbort: externallyAborted,\n cause,\n });\n }\n\n return new DmkNetworkClientError({\n message: cause instanceof Error ? cause.message : \"Network request failed\",\n cause,\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DmkNetworkClientError", "JSON_CONTENT_TYPE", "joinPath", "base", "path", "trimmedBase", "trimmedPath", "buildUrl", "args", "url", "params", "baseUrl", "fullUrl", "key", "value", "hasHeader", "headers", "name", "lower", "k", "isRawBody", "body", "buildBodyAndHeaders", "method", "defaultHeaders", "perRequestHeaders", "buildSignal", "timeoutMs", "externalSignal", "timeoutSignal", "parseBody", "response", "responseType", "text", "cause", "safeReadText", "wrapFetchError", "hasTimeout", "externallyAborted", "timedOut"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DmkNetworkClientError as p}from"./DmkNetworkClientError";import{buildBodyAndHeaders as r,buildSignal as a,buildUrl as l,hasHeader as c,isRawBody as o,joinPath as d,JSON_CONTENT_TYPE as m,parseBody as s,safeReadText as u,wrapFetchError as i}from"./DmkNetworkClientHelpers";describe("DmkNetworkClientHelpers",()=>{describe("joinPath",()=>{it("should return the base when the path is empty",()=>{expect(d("https://api.example.com","")).toBe("https://api.example.com")}),it("should insert a single slash when neither side has one",()=>{expect(d("https://api.example.com","items")).toBe("https://api.example.com/items")}),it("should collapse a trailing base slash with a leading path slash",()=>{expect(d("https://api.example.com/","/items")).toBe("https://api.example.com/items")}),it("should keep a single slash when only one side has one",()=>{expect(d("https://api.example.com/","items")).toBe("https://api.example.com/items"),expect(d("https://api.example.com","/items")).toBe("https://api.example.com/items")})}),describe("buildUrl",()=>{it("should keep an absolute URL as-is",()=>{const e=l({url:"https://api.example.com/items"});expect(e.toString()).toBe("https://api.example.com/items")}),it("should prepend the base URL to a relative path",()=>{const e=l({url:"/items",baseUrl:"https://api.example.com/"});expect(e.toString()).toBe("https://api.example.com/items")}),it("should ignore the base URL when the input URL is absolute",()=>{const e=l({url:"https://other.example.com/items",baseUrl:"https://api.example.com"});expect(e.toString()).toBe("https://other.example.com/items")}),it("should append query params and skip null/undefined entries",()=>{const e=l({url:"https://api.example.com/items",params:{chain:1,contract:"0xabc",active:!0,skip:null,alsoSkip:void 0}});expect(e.searchParams.get("chain")).toBe("1"),expect(e.searchParams.get("contract")).toBe("0xabc"),expect(e.searchParams.get("active")).toBe("true"),expect(e.searchParams.has("skip")).toBe(!1),expect(e.searchParams.has("alsoSkip")).toBe(!1)})}),describe("hasHeader",()=>{it("should find a header regardless of case",()=>{expect(c({"Content-Type":"json"},"content-type")).toBe(!0),expect(c({"content-type":"json"},"Content-Type")).toBe(!0)}),it("should return false when no matching header exists",()=>{expect(c({Accept:"json"},"content-type")).toBe(!1),expect(c({},"content-type")).toBe(!1)})}),describe("isRawBody",()=>{it("should accept native BodyInit values",()=>{expect(o("raw-string")).toBe(!0),expect(o(new ArrayBuffer(4))).toBe(!0),expect(o(new Uint8Array([1,2,3]))).toBe(!0),expect(o(new Blob(["a"]))).toBe(!0),expect(o(new FormData)).toBe(!0),expect(o(new URLSearchParams({a:"1"}))).toBe(!0),expect(o(new ReadableStream)).toBe(!0)}),it("should reject plain objects and primitives",()=>{expect(o({foo:"bar"})).toBe(!1),expect(o([1,2,3])).toBe(!1),expect(o(42)).toBe(!1),expect(o(null)).toBe(!1),expect(o(void 0)).toBe(!1)})}),describe("buildBodyAndHeaders",()=>{it("should merge default and per-request headers with per-request winning",()=>{const{headers:e}=r({method:"GET",body:void 0,defaultHeaders:{"X-Default":"default","X-Shared":"from-default"},perRequestHeaders:{"X-Shared":"overridden","X-Per":"per"}});expect(e).toEqual({"X-Default":"default","X-Shared":"overridden","X-Per":"per"})}),it("should not emit a body on GET/HEAD even when a body is provided",()=>{const e=r({method:"GET",body:{foo:"bar"},defaultHeaders:{}});expect(e.body).toBeUndefined(),expect(e.headers["Content-Type"]).toBeUndefined()}),it("should JSON-stringify plain objects and set the Content-Type",()=>{const e=r({method:"POST",body:{foo:"bar"},defaultHeaders:{}});expect(e.body).toBe(JSON.stringify({foo:"bar"})),expect(e.headers["Content-Type"]).toBe(m)}),it("should not override an explicit Content-Type header",()=>{const e=r({method:"POST",body:{foo:"bar"},defaultHeaders:{},perRequestHeaders:{"content-type":"application/vnd.custom+json"}});expect(e.body).toBe(JSON.stringify({foo:"bar"})),expect(e.headers["content-type"]).toBe("application/vnd.custom+json"),expect(e.headers["Content-Type"]).toBeUndefined()}),it("should pass raw BodyInit values through unchanged without JSON headers",()=>{const e=new FormData;e.set("field","value");const t=r({method:"POST",body:e,defaultHeaders:{}});expect(t.body).toBe(e),expect(t.headers["Content-Type"]).toBeUndefined()}),it("should return an undefined body when the body itself is undefined",()=>{const e=r({method:"POST",body:void 0,defaultHeaders:{"X-Default":"d"}});expect(e.body).toBeUndefined(),expect(e.headers).toEqual({"X-Default":"d"})})}),describe("buildSignal",()=>{it("should return undefined when no timeout and no external signal",()=>{expect(a({timeoutMs:void 0,externalSignal:void 0})).toBeUndefined()}),it("should return undefined when timeout is zero and no external signal",()=>{expect(a({timeoutMs:0,externalSignal:void 0})).toBeUndefined()}),it("should return the external signal alone when no timeout is configured",()=>{const e=new AbortController,t=a({timeoutMs:void 0,externalSignal:e.signal});expect(t).toBe(e.signal)}),it("should return a timeout signal when only a timeout is configured",()=>{const e=a({timeoutMs:1e3,externalSignal:void 0});expect(e).toBeInstanceOf(AbortSignal)}),it("should use the provided timeout value for AbortSignal.timeout",()=>{const e=vi.spyOn(AbortSignal,"timeout");a({timeoutMs:50,externalSignal:void 0}),expect(e).toHaveBeenCalledWith(50),e.mockRestore()}),it("should compose both signals with AbortSignal.any when both are set",()=>{const e=vi.spyOn(AbortSignal,"any"),t=new AbortController,n=a({timeoutMs:100,externalSignal:t.signal});expect(n).toBeInstanceOf(AbortSignal),expect(e).toHaveBeenCalledTimes(1),e.mockRestore()})}),describe("parseBody",()=>{it("should return undefined for 'void' response type without consuming the body",async()=>{const e=new Response("ignored"),t=await s(e,"void");expect(t).toBeUndefined(),expect(e.bodyUsed).toBe(!1)}),it("should return text for 'text' response type",async()=>{const e=new Response("plain-body");await expect(s(e,"text")).resolves.toBe("plain-body")}),it("should return a Blob for 'blob' response type",async()=>{const e=new Response("blob-body"),t=await s(e,"blob");expect(t).toBeInstanceOf(Blob)}),it("should return an ArrayBuffer for 'arrayBuffer' response type",async()=>{const e=new Response(new Uint8Array([1,2,3])),t=await s(e,"arrayBuffer");expect(t).toBeInstanceOf(ArrayBuffer),expect(new Uint8Array(t)).toEqual(new Uint8Array([1,2,3]))}),it("should parse JSON for 'json' response type",async()=>{const e=new Response(JSON.stringify({hello:"world"}));await expect(s(e,"json")).resolves.toEqual({hello:"world"})}),it("should resolve to undefined for an empty JSON body",async()=>{const e=new Response("");await expect(s(e,"json")).resolves.toBeUndefined()}),it("should throw a DmkNetworkClientError for malformed JSON",async()=>{const e=new Response("not-json",{status:200,statusText:"OK"}),t=await s(e,"json").catch(h=>h);expect(t).toBeInstanceOf(p);const n=t;expect(n.status).toBe(200),expect(n.statusText).toBe("OK"),expect(n.responseBody).toBe("not-json"),expect(n.cause).toBeInstanceOf(SyntaxError)})}),describe("safeReadText",()=>{it("should return the text body",async()=>{await expect(u(new Response("hello"))).resolves.toBe("hello")}),it("should return undefined when reading the body throws",async()=>{const e={text:()=>Promise.reject(new Error("read failed"))};await expect(u(e)).resolves.toBeUndefined()})}),describe("wrapFetchError",()=>{it("should wrap a generic Error with its message",()=>{const e=new TypeError("network down"),t=i({cause:e,externalSignal:void 0,timeoutMs:void 0});expect(t).toBeInstanceOf(p),expect(t.message).toBe("network down"),expect(t.cause).toBe(e),expect(t.isTimeout).toBe(!1),expect(t.isAbort).toBe(!1)}),it("should fall back to a generic message for non-Error causes",()=>{const e=i({cause:"something",externalSignal:void 0,timeoutMs:void 0});expect(e.message).toBe("Network request failed"),expect(e.cause).toBe("something")}),it("should flag TimeoutError as a timeout",()=>{const e=new Error("timed out");e.name="TimeoutError";const t=i({cause:e,externalSignal:void 0,timeoutMs:10});expect(t.isTimeout).toBe(!0),expect(t.isAbort).toBe(!1),expect(t.message).toBe("Request timed out")}),it("should flag AbortError as a timeout when a timeout is configured and no external abort",()=>{const e=new Error("aborted");e.name="AbortError";const t=i({cause:e,externalSignal:void 0,timeoutMs:1e3});expect(t.isTimeout).toBe(!0),expect(t.isAbort).toBe(!1)}),it("should flag AbortError as an external abort when the caller signal is aborted",()=>{const e=new AbortController;e.abort();const t=new Error("aborted");t.name="AbortError";const n=i({cause:t,externalSignal:e.signal,timeoutMs:void 0});expect(n.isAbort).toBe(!0),expect(n.isTimeout).toBe(!1),expect(n.message).toBe("Request aborted")}),it("should treat AbortError with no timeout and no external abort as a plain abort",()=>{const e=new Error("aborted");e.name="AbortError";const t=i({cause:e,externalSignal:void 0,timeoutMs:void 0});expect(t.isTimeout).toBe(!1),expect(t.isAbort).toBe(!1),expect(t.message).toBe("Request aborted")})})});
|
|
2
|
+
//# sourceMappingURL=DmkNetworkClientHelpers.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/network/DmkNetworkClientHelpers.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n hasHeader,\n isRawBody,\n joinPath,\n JSON_CONTENT_TYPE,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\ndescribe(\"DmkNetworkClientHelpers\", () => {\n describe(\"joinPath\", () => {\n it(\"should return the base when the path is empty\", () => {\n expect(joinPath(\"https://api.example.com\", \"\")).toBe(\n \"https://api.example.com\",\n );\n });\n\n it(\"should insert a single slash when neither side has one\", () => {\n expect(joinPath(\"https://api.example.com\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should collapse a trailing base slash with a leading path slash\", () => {\n expect(joinPath(\"https://api.example.com/\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should keep a single slash when only one side has one\", () => {\n expect(joinPath(\"https://api.example.com/\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n expect(joinPath(\"https://api.example.com\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n });\n\n describe(\"buildUrl\", () => {\n it(\"should keep an absolute URL as-is\", () => {\n const url = buildUrl({ url: \"https://api.example.com/items\" });\n expect(url.toString()).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should prepend the base URL to a relative path\", () => {\n const url = buildUrl({\n url: \"/items\",\n baseUrl: \"https://api.example.com/\",\n });\n expect(url.toString()).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should ignore the base URL when the input URL is absolute\", () => {\n const url = buildUrl({\n url: \"https://other.example.com/items\",\n baseUrl: \"https://api.example.com\",\n });\n expect(url.toString()).toBe(\"https://other.example.com/items\");\n });\n\n it(\"should append query params and skip null/undefined entries\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: {\n chain: 1,\n contract: \"0xabc\",\n active: true,\n skip: null,\n alsoSkip: undefined,\n },\n });\n expect(url.searchParams.get(\"chain\")).toBe(\"1\");\n expect(url.searchParams.get(\"contract\")).toBe(\"0xabc\");\n expect(url.searchParams.get(\"active\")).toBe(\"true\");\n expect(url.searchParams.has(\"skip\")).toBe(false);\n expect(url.searchParams.has(\"alsoSkip\")).toBe(false);\n });\n });\n\n describe(\"hasHeader\", () => {\n it(\"should find a header regardless of case\", () => {\n expect(hasHeader({ \"Content-Type\": \"json\" }, \"content-type\")).toBe(true);\n expect(hasHeader({ \"content-type\": \"json\" }, \"Content-Type\")).toBe(true);\n });\n\n it(\"should return false when no matching header exists\", () => {\n expect(hasHeader({ Accept: \"json\" }, \"content-type\")).toBe(false);\n expect(hasHeader({}, \"content-type\")).toBe(false);\n });\n });\n\n describe(\"isRawBody\", () => {\n it(\"should accept native BodyInit values\", () => {\n expect(isRawBody(\"raw-string\")).toBe(true);\n expect(isRawBody(new ArrayBuffer(4))).toBe(true);\n expect(isRawBody(new Uint8Array([1, 2, 3]))).toBe(true);\n expect(isRawBody(new Blob([\"a\"]))).toBe(true);\n expect(isRawBody(new FormData())).toBe(true);\n expect(isRawBody(new URLSearchParams({ a: \"1\" }))).toBe(true);\n expect(isRawBody(new ReadableStream())).toBe(true);\n });\n\n it(\"should reject plain objects and primitives\", () => {\n expect(isRawBody({ foo: \"bar\" })).toBe(false);\n expect(isRawBody([1, 2, 3])).toBe(false);\n expect(isRawBody(42)).toBe(false);\n expect(isRawBody(null)).toBe(false);\n expect(isRawBody(undefined)).toBe(false);\n });\n });\n\n describe(\"buildBodyAndHeaders\", () => {\n it(\"should merge default and per-request headers with per-request winning\", () => {\n const { headers } = buildBodyAndHeaders({\n method: \"GET\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"default\", \"X-Shared\": \"from-default\" },\n perRequestHeaders: { \"X-Shared\": \"overridden\", \"X-Per\": \"per\" },\n });\n expect(headers).toEqual({\n \"X-Default\": \"default\",\n \"X-Shared\": \"overridden\",\n \"X-Per\": \"per\",\n });\n });\n\n it(\"should not emit a body on GET/HEAD even when a body is provided\", () => {\n const result = buildBodyAndHeaders({\n method: \"GET\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBeUndefined();\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should JSON-stringify plain objects and set the Content-Type\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"Content-Type\"]).toBe(JSON_CONTENT_TYPE);\n });\n\n it(\"should not override an explicit Content-Type header\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n perRequestHeaders: { \"content-type\": \"application/vnd.custom+json\" },\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"content-type\"]).toBe(\n \"application/vnd.custom+json\",\n );\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should pass raw BodyInit values through unchanged without JSON headers\", () => {\n const formData = new FormData();\n formData.set(\"field\", \"value\");\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: formData,\n defaultHeaders: {},\n });\n expect(result.body).toBe(formData);\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should return an undefined body when the body itself is undefined\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"d\" },\n });\n expect(result.body).toBeUndefined();\n expect(result.headers).toEqual({ \"X-Default\": \"d\" });\n });\n });\n\n describe(\"buildSignal\", () => {\n it(\"should return undefined when no timeout and no external signal\", () => {\n expect(\n buildSignal({\n timeoutMs: undefined,\n externalSignal: undefined,\n }),\n ).toBeUndefined();\n });\n\n it(\"should return undefined when timeout is zero and no external signal\", () => {\n expect(\n buildSignal({\n timeoutMs: 0,\n externalSignal: undefined,\n }),\n ).toBeUndefined();\n });\n\n it(\"should return the external signal alone when no timeout is configured\", () => {\n const controller = new AbortController();\n const signal = buildSignal({\n timeoutMs: undefined,\n externalSignal: controller.signal,\n });\n expect(signal).toBe(controller.signal);\n });\n\n it(\"should return a timeout signal when only a timeout is configured\", () => {\n const signal = buildSignal({\n timeoutMs: 1000,\n externalSignal: undefined,\n });\n expect(signal).toBeInstanceOf(AbortSignal);\n });\n\n it(\"should use the provided timeout value for AbortSignal.timeout\", () => {\n const timeoutSpy = vi.spyOn(AbortSignal, \"timeout\");\n buildSignal({\n timeoutMs: 50,\n externalSignal: undefined,\n });\n expect(timeoutSpy).toHaveBeenCalledWith(50);\n timeoutSpy.mockRestore();\n });\n\n it(\"should compose both signals with AbortSignal.any when both are set\", () => {\n const anySpy = vi.spyOn(AbortSignal, \"any\");\n const controller = new AbortController();\n const signal = buildSignal({\n timeoutMs: 100,\n externalSignal: controller.signal,\n });\n expect(signal).toBeInstanceOf(AbortSignal);\n expect(anySpy).toHaveBeenCalledTimes(1);\n anySpy.mockRestore();\n });\n });\n\n describe(\"parseBody\", () => {\n it(\"should return undefined for 'void' response type without consuming the body\", async () => {\n const response = new Response(\"ignored\");\n const result = await parseBody(response, \"void\");\n expect(result).toBeUndefined();\n expect(response.bodyUsed).toBe(false);\n });\n\n it(\"should return text for 'text' response type\", async () => {\n const response = new Response(\"plain-body\");\n await expect(parseBody(response, \"text\")).resolves.toBe(\"plain-body\");\n });\n\n it(\"should return a Blob for 'blob' response type\", async () => {\n const response = new Response(\"blob-body\");\n const result = await parseBody(response, \"blob\");\n expect(result).toBeInstanceOf(Blob);\n });\n\n it(\"should return an ArrayBuffer for 'arrayBuffer' response type\", async () => {\n const response = new Response(new Uint8Array([1, 2, 3]));\n const result = await parseBody(response, \"arrayBuffer\");\n expect(result).toBeInstanceOf(ArrayBuffer);\n expect(new Uint8Array(result as ArrayBuffer)).toEqual(\n new Uint8Array([1, 2, 3]),\n );\n });\n\n it(\"should parse JSON for 'json' response type\", async () => {\n const response = new Response(JSON.stringify({ hello: \"world\" }));\n await expect(parseBody(response, \"json\")).resolves.toEqual({\n hello: \"world\",\n });\n });\n\n it(\"should resolve to undefined for an empty JSON body\", async () => {\n const response = new Response(\"\");\n await expect(parseBody(response, \"json\")).resolves.toBeUndefined();\n });\n\n it(\"should throw a DmkNetworkClientError for malformed JSON\", async () => {\n const response = new Response(\"not-json\", {\n status: 200,\n statusText: \"OK\",\n });\n const error = await parseBody(response, \"json\").catch((e: unknown) => e);\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n const dmkError = error as DmkNetworkClientError;\n expect(dmkError.status).toBe(200);\n expect(dmkError.statusText).toBe(\"OK\");\n expect(dmkError.responseBody).toBe(\"not-json\");\n expect(dmkError.cause).toBeInstanceOf(SyntaxError);\n });\n });\n\n describe(\"safeReadText\", () => {\n it(\"should return the text body\", async () => {\n await expect(safeReadText(new Response(\"hello\"))).resolves.toBe(\"hello\");\n });\n\n it(\"should return undefined when reading the body throws\", async () => {\n const response = {\n text: () => Promise.reject(new Error(\"read failed\")),\n } as unknown as Response;\n await expect(safeReadText(response)).resolves.toBeUndefined();\n });\n });\n\n describe(\"wrapFetchError\", () => {\n it(\"should wrap a generic Error with its message\", () => {\n const cause = new TypeError(\"network down\");\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect(error.message).toBe(\"network down\");\n expect(error.cause).toBe(cause);\n expect(error.isTimeout).toBe(false);\n expect(error.isAbort).toBe(false);\n });\n\n it(\"should fall back to a generic message for non-Error causes\", () => {\n const error = wrapFetchError({\n cause: \"something\",\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error.message).toBe(\"Network request failed\");\n expect(error.cause).toBe(\"something\");\n });\n\n it(\"should flag TimeoutError as a timeout\", () => {\n const cause = new Error(\"timed out\");\n cause.name = \"TimeoutError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: 10,\n });\n expect(error.isTimeout).toBe(true);\n expect(error.isAbort).toBe(false);\n expect(error.message).toBe(\"Request timed out\");\n });\n\n it(\"should flag AbortError as a timeout when a timeout is configured and no external abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: 1000,\n });\n expect(error.isTimeout).toBe(true);\n expect(error.isAbort).toBe(false);\n });\n\n it(\"should flag AbortError as an external abort when the caller signal is aborted\", () => {\n const controller = new AbortController();\n controller.abort();\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: controller.signal,\n timeoutMs: undefined,\n });\n expect(error.isAbort).toBe(true);\n expect(error.isTimeout).toBe(false);\n expect(error.message).toBe(\"Request aborted\");\n });\n\n it(\"should treat AbortError with no timeout and no external abort as a plain abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error.isTimeout).toBe(false);\n expect(error.isAbort).toBe(false);\n expect(error.message).toBe(\"Request aborted\");\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DmkNetworkClientError", "buildBodyAndHeaders", "buildSignal", "buildUrl", "hasHeader", "isRawBody", "joinPath", "JSON_CONTENT_TYPE", "parseBody", "safeReadText", "wrapFetchError", "url", "headers", "result", "formData", "controller", "signal", "timeoutSpy", "anySpy", "response", "error", "e", "dmkError", "cause"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/storage/KeyValueStorage.ts"],
|
|
4
|
+
"sourcesContent": ["export const DMK_STORAGE_PREFIX_KEY = \"dmk\";\n\nexport interface KeyValueStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAyB",
|
|
6
|
+
"names": ["DMK_STORAGE_PREFIX_KEY"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{gt as s,gte as r}from"semver";class n{isCompatible;version;modelId;constructor(e,t,o){this.modelId=e.deviceModelId;const i=o.resolve(e,t);this.isCompatible=i.isCompatible,this.version=i.version}withMinVersionInclusive(e){return r(this.version,e)||(this.isCompatible=!1),this}withMinVersionExclusive(e){return s(this.version,e)||(this.isCompatible=!1),this}excludeDeviceModel(e){return this.modelId===e&&(this.isCompatible=!1),this}check(){return this.isCompatible}}export{n as ApplicationChecker};
|
|
2
|
+
//# sourceMappingURL=ApplicationChecker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/utils/ApplicationChecker.ts"],
|
|
4
|
+
"sourcesContent": ["import { gt, gte } from \"semver\";\n\nimport { type DeviceModelId } from \"@api/device/DeviceModel\";\nimport { type DeviceSessionState } from \"@api/device-session/DeviceSessionState\";\n\nimport {\n type AppConfig,\n type ApplicationResolver,\n} from \"./ApplicationResolver\";\n\nexport class ApplicationChecker {\n private isCompatible: boolean;\n private version: string;\n private modelId: DeviceModelId;\n\n constructor(\n deviceState: DeviceSessionState,\n appConfig: AppConfig,\n resolver: ApplicationResolver,\n ) {\n this.modelId = deviceState.deviceModelId;\n const resolved = resolver.resolve(deviceState, appConfig);\n this.isCompatible = resolved.isCompatible;\n this.version = resolved.version;\n }\n\n withMinVersionInclusive(version: string): ApplicationChecker {\n if (!gte(this.version, version)) this.isCompatible = false;\n return this;\n }\n\n withMinVersionExclusive(version: string): ApplicationChecker {\n if (!gt(this.version, version)) this.isCompatible = false;\n return this;\n }\n\n excludeDeviceModel(modelId: DeviceModelId): ApplicationChecker {\n if (this.modelId === modelId) this.isCompatible = false;\n return this;\n }\n\n check(): boolean {\n return this.isCompatible;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,MAAAA,EAAI,OAAAC,MAAW,SAUjB,MAAMC,CAAmB,CACtB,aACA,QACA,QAER,YACEC,EACAC,EACAC,EACA,CACA,KAAK,QAAUF,EAAY,cAC3B,MAAMG,EAAWD,EAAS,QAAQF,EAAaC,CAAS,EACxD,KAAK,aAAeE,EAAS,aAC7B,KAAK,QAAUA,EAAS,OAC1B,CAEA,wBAAwBC,EAAqC,CAC3D,OAAKN,EAAI,KAAK,QAASM,CAAO,IAAG,KAAK,aAAe,IAC9C,IACT,CAEA,wBAAwBA,EAAqC,CAC3D,OAAKP,EAAG,KAAK,QAASO,CAAO,IAAG,KAAK,aAAe,IAC7C,IACT,CAEA,mBAAmBC,EAA4C,CAC7D,OAAI,KAAK,UAAYA,IAAS,KAAK,aAAe,IAC3C,IACT,CAEA,OAAiB,CACf,OAAO,KAAK,YACd,CACF",
|
|
6
|
+
"names": ["gt", "gte", "ApplicationChecker", "deviceState", "appConfig", "resolver", "resolved", "version", "modelId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DeviceModelId as r}from"../device/DeviceModel";import{DeviceStatus as n}from"../device/DeviceStatus";import{DeviceSessionStateType as l}from"../device-session/DeviceSessionState";import{ApplicationChecker as c}from"./ApplicationChecker";describe("ApplicationChecker",()=>{function i(e=r.FLEX){return{sessionStateType:l.ReadyWithoutSecureChannel,deviceStatus:n.CONNECTED,installedApps:[],currentApp:{name:"TestApp",version:"1.0.0"},deviceModelId:e,isSecureConnectionAllowed:!1}}function s(e){return{resolve:()=>e}}const o={version:"1.0.0"};it("should pass check when resolved as compatible",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(),o,e).check();expect(t).toStrictEqual(!0)}),it("should reject check when resolved as incompatible",()=>{const e=s({isCompatible:!1,version:"0.0.1"}),t=new c(i(),o,e).check();expect(t).toStrictEqual(!1)}),it("should pass with min version inclusive when version matches",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(),o,e).withMinVersionInclusive("1.12.0").check();expect(t).toStrictEqual(!0)}),it("should reject with min version inclusive when version is too low",()=>{const e=s({isCompatible:!0,version:"1.11.0"}),t=new c(i(),o,e).withMinVersionInclusive("1.12.0").check();expect(t).toStrictEqual(!1)}),it("should pass with min version exclusive when version is greater",()=>{const e=s({isCompatible:!0,version:"1.13.0"}),t=new c(i(),o,e).withMinVersionExclusive("1.12.0").check();expect(t).toStrictEqual(!0)}),it("should reject with min version exclusive when version is equal",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(),o,e).withMinVersionExclusive("1.12.0").check();expect(t).toStrictEqual(!1)}),it("should pass when device model is not excluded",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(r.FLEX),o,e).excludeDeviceModel(r.NANO_S).check();expect(t).toStrictEqual(!0)}),it("should reject when device model is excluded",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(r.FLEX),o,e).excludeDeviceModel(r.FLEX).check();expect(t).toStrictEqual(!1)}),it("should pass with chained conditions when all are met",()=>{const e=s({isCompatible:!0,version:"1.12.0"}),t=new c(i(),o,e).withMinVersionInclusive("1.11.0").excludeDeviceModel(r.NANO_S).check();expect(t).toStrictEqual(!0)}),it("should reject with chained conditions when one fails",()=>{const e=s({isCompatible:!0,version:"1.10.0"}),t=new c(i(),o,e).withMinVersionInclusive("1.11.0").excludeDeviceModel(r.NANO_S).check();expect(t).toStrictEqual(!1)}),it("should not override incompatible resolution even if constraints pass",()=>{const e=s({isCompatible:!1,version:"1.15.0"}),t=new c(i(),o,e).withMinVersionInclusive("1.12.0").check();expect(t).toStrictEqual(!1)})});
|
|
2
|
+
//# sourceMappingURL=ApplicationChecker.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/api/utils/ApplicationChecker.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { DeviceSessionStateType } from \"@api/device-session/DeviceSessionState\";\n\nimport { ApplicationChecker } from \"./ApplicationChecker\";\nimport {\n type ApplicationResolver,\n type ResolvedApp,\n} from \"./ApplicationResolver\";\n\ndescribe(\"ApplicationChecker\", () => {\n function createReadyState(modelId: DeviceModelId = DeviceModelId.FLEX) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"TestApp\", version: \"1.0.0\" },\n deviceModelId: modelId,\n isSecureConnectionAllowed: false,\n };\n }\n\n function createMockResolver(resolved: ResolvedApp): ApplicationResolver {\n return {\n resolve: () => resolved,\n };\n }\n\n const appConfig = { version: \"1.0.0\" };\n\n it(\"should pass check when resolved as compatible\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n ).check();\n expect(result).toStrictEqual(true);\n });\n\n it(\"should reject check when resolved as incompatible\", () => {\n const resolver = createMockResolver({\n isCompatible: false,\n version: \"0.0.1\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n ).check();\n expect(result).toStrictEqual(false);\n });\n\n it(\"should pass with min version inclusive when version matches\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionInclusive(\"1.12.0\")\n .check();\n expect(result).toStrictEqual(true);\n });\n\n it(\"should reject with min version inclusive when version is too low\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.11.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionInclusive(\"1.12.0\")\n .check();\n expect(result).toStrictEqual(false);\n });\n\n it(\"should pass with min version exclusive when version is greater\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.13.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionExclusive(\"1.12.0\")\n .check();\n expect(result).toStrictEqual(true);\n });\n\n it(\"should reject with min version exclusive when version is equal\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionExclusive(\"1.12.0\")\n .check();\n expect(result).toStrictEqual(false);\n });\n\n it(\"should pass when device model is not excluded\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(DeviceModelId.FLEX),\n appConfig,\n resolver,\n )\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n expect(result).toStrictEqual(true);\n });\n\n it(\"should reject when device model is excluded\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(DeviceModelId.FLEX),\n appConfig,\n resolver,\n )\n .excludeDeviceModel(DeviceModelId.FLEX)\n .check();\n expect(result).toStrictEqual(false);\n });\n\n it(\"should pass with chained conditions when all are met\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.12.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionInclusive(\"1.11.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n expect(result).toStrictEqual(true);\n });\n\n it(\"should reject with chained conditions when one fails\", () => {\n const resolver = createMockResolver({\n isCompatible: true,\n version: \"1.10.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionInclusive(\"1.11.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n expect(result).toStrictEqual(false);\n });\n\n it(\"should not override incompatible resolution even if constraints pass\", () => {\n const resolver = createMockResolver({\n isCompatible: false,\n version: \"1.15.0\",\n });\n const result = new ApplicationChecker(\n createReadyState(),\n appConfig,\n resolver,\n )\n .withMinVersionInclusive(\"1.12.0\")\n .check();\n expect(result).toStrictEqual(false);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "DeviceStatus", "DeviceSessionStateType", "ApplicationChecker", "createReadyState", "modelId", "createMockResolver", "resolved", "appConfig", "resolver", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=ApplicationResolver.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function f(r){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(r)}function a(r){if(r.length===0)return new Uint8Array;if(!f(r))return null;try{const n=atob(r),e=new Uint8Array(n.length);for(let t=0;t<n.length;t++)e[t]=n.charCodeAt(t);return e}catch{return Uint8Array.from(Buffer.from(r,"base64"))}}function u(r){const n=globalThis;if(typeof n.btoa=="function"){let t="";for(let o=0;o<r.length;o++){const i=r[o];if(i===void 0)throw new Error("Unexpected undefined byte in array.");t+=String.fromCharCode(i)}return n.btoa(t)}const e=n.Buffer;if(typeof e<"u")return e.from(r).toString("base64");throw new Error("No Base64 encoder available in this environment.")}export{a as base64StringToBuffer,u as bufferToBase64String,f as isBase64String};
|
|
2
2
|
//# sourceMappingURL=Base64String.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/api/utils/Base64String.ts"],
|
|
4
|
-
"sourcesContent": ["export function isBase64String(value: string): boolean {\n // Valid base64 characters are [A-Za-z0-9+/]\n // They are always grouped by 4 characters.\n // Optional padding at the end with one or two '='.\n // see section 4 of: https://www.rfc-editor.org/rfc/rfc4648.txt\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n );\n}\n\nexport function base64StringToBuffer(value: string): Uint8Array | null {\n if (value.length === 0) {\n return new Uint8Array();\n }\n if (!isBase64String(value)) {\n return null;\n }\n try {\n // Use the browser implementation of atob\n const base64Decoded = atob(value);\n const buffer = new Uint8Array(base64Decoded.length);\n for (let i = 0; i < base64Decoded.length; i++) {\n buffer[i] = base64Decoded.charCodeAt(i);\n }\n return buffer;\n } catch (_error: unknown) {\n // Use the implementation of Buffer for environments such as node\n return Uint8Array.from(Buffer.from(value, \"base64\"));\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAO,SAASA,EAAeC,EAAwB,CAKrD,MAAO,mEAAmE,KACxEA,CACF,CACF,CAEO,SAASC,EAAqBD,EAAkC,CACrE,GAAIA,EAAM,SAAW,EACnB,OAAO,IAAI,WAEb,GAAI,CAACD,EAAeC,CAAK,EACvB,OAAO,KAET,GAAI,CAEF,MAAME,EAAgB,KAAKF,CAAK,EAC1BG,EAAS,IAAI,WAAWD,EAAc,MAAM,EAClD,QAASE,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IACxCD,EAAOC,CAAC,EAAIF,EAAc,WAAWE,CAAC,EAExC,OAAOD,CACT,MAA0B,CAExB,OAAO,WAAW,KAAK,OAAO,KAAKH,EAAO,QAAQ,CAAC,CACrD,CACF",
|
|
6
|
-
"names": ["isBase64String", "value", "base64StringToBuffer", "base64Decoded", "buffer", "i"]
|
|
4
|
+
"sourcesContent": ["export function isBase64String(value: string): boolean {\n // Valid base64 characters are [A-Za-z0-9+/]\n // They are always grouped by 4 characters.\n // Optional padding at the end with one or two '='.\n // see section 4 of: https://www.rfc-editor.org/rfc/rfc4648.txt\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n );\n}\n\nexport function base64StringToBuffer(value: string): Uint8Array | null {\n if (value.length === 0) {\n return new Uint8Array();\n }\n if (!isBase64String(value)) {\n return null;\n }\n try {\n // Use the browser implementation of atob\n const base64Decoded = atob(value);\n const buffer = new Uint8Array(base64Decoded.length);\n for (let i = 0; i < base64Decoded.length; i++) {\n buffer[i] = base64Decoded.charCodeAt(i);\n }\n return buffer;\n } catch (_error: unknown) {\n // Use the implementation of Buffer for environments such as node\n return Uint8Array.from(Buffer.from(value, \"base64\"));\n }\n}\n\nexport function bufferToBase64String(bytes: Uint8Array): string {\n const g = globalThis as typeof globalThis & {\n Buffer?: typeof Buffer;\n btoa?: (data: string) => string;\n };\n\n if (typeof g.btoa === \"function\") {\n // convert bytes to a binary string for btoa\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error(\"Unexpected undefined byte in array.\");\n }\n binary += String.fromCharCode(byte);\n }\n return g.btoa(binary);\n }\n\n const Buf = g.Buffer;\n if (typeof Buf !== \"undefined\") {\n return Buf.from(bytes).toString(\"base64\");\n }\n\n throw new Error(\"No Base64 encoder available in this environment.\");\n}\n"],
|
|
5
|
+
"mappings": "AAAO,SAASA,EAAeC,EAAwB,CAKrD,MAAO,mEAAmE,KACxEA,CACF,CACF,CAEO,SAASC,EAAqBD,EAAkC,CACrE,GAAIA,EAAM,SAAW,EACnB,OAAO,IAAI,WAEb,GAAI,CAACD,EAAeC,CAAK,EACvB,OAAO,KAET,GAAI,CAEF,MAAME,EAAgB,KAAKF,CAAK,EAC1BG,EAAS,IAAI,WAAWD,EAAc,MAAM,EAClD,QAASE,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IACxCD,EAAOC,CAAC,EAAIF,EAAc,WAAWE,CAAC,EAExC,OAAOD,CACT,MAA0B,CAExB,OAAO,WAAW,KAAK,OAAO,KAAKH,EAAO,QAAQ,CAAC,CACrD,CACF,CAEO,SAASK,EAAqBC,EAA2B,CAC9D,MAAMC,EAAI,WAKV,GAAI,OAAOA,EAAE,MAAS,WAAY,CAEhC,IAAIC,EAAS,GACb,QAASJ,EAAI,EAAGA,EAAIE,EAAM,OAAQF,IAAK,CACrC,MAAMK,EAAOH,EAAMF,CAAC,EACpB,GAAIK,IAAS,OACX,MAAM,IAAI,MAAM,qCAAqC,EAEvDD,GAAU,OAAO,aAAaC,CAAI,CACpC,CACA,OAAOF,EAAE,KAAKC,CAAM,CACtB,CAEA,MAAME,EAAMH,EAAE,OACd,GAAI,OAAOG,EAAQ,IACjB,OAAOA,EAAI,KAAKJ,CAAK,EAAE,SAAS,QAAQ,EAG1C,MAAM,IAAI,MAAM,kDAAkD,CACpE",
|
|
6
|
+
"names": ["isBase64String", "value", "base64StringToBuffer", "base64Decoded", "buffer", "i", "bufferToBase64String", "bytes", "g", "binary", "byte", "Buf"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{base64StringToBuffer as l,isBase64String as s}from"./Base64String";describe("Base64String",()=>{describe("isBase64String function",()=>{it("should return true if the value is a valid base64 string",()=>{const
|
|
1
|
+
import{base64StringToBuffer as i,bufferToBase64String as l,isBase64String as s}from"./Base64String";describe("Base64String",()=>{describe("isBase64String function",()=>{it("should return true if the value is a valid base64 string",()=>{const e=s("Zmlyc3QgdG/zdGluZyBz+HI9");expect(e).toBeTruthy()}),it("should return true if the value is a valid base64 string, one padding",()=>{const e=s("Zmlyc3QgdGVzdGluZyBzdHI=");expect(e).toBeTruthy()}),it("should return true if the value is a valid base64 string, two paddings",()=>{const e=s("Zmlyc3QgdGVzdGluZyBzdH==");expect(e).toBeTruthy()}),it("should return true for an empty string",()=>{const e=s("");expect(e).toBeTruthy()}),it("should return false for an invalid base64 string",()=>{const e=s("invalid base64 string");expect(e).toBeFalsy()}),it("should return false with 3 paddings",()=>{const e=s("Zmlyc3QgdGVzdGluZyBzd===");expect(e).toBeFalsy()}),it("should return false on incomplete string (not multiple of 4)",()=>{const e=s("Zmlyc3QgdGVzdGluZyBzdHI");expect(e).toBeFalsy()})}),describe("base64StringToBuffer function",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("should convert empty input to empty buffer",()=>{const e=i("");expect(e).toStrictEqual(new Uint8Array)}),it("invalid base64 string converted to null",()=>{const e=i("invalid string");expect(e).toStrictEqual(null)}),it("should convert a base64 string to a buffer using browser's atob",()=>{const e=i("Zmlyc3QgdGVzdCBzdHJpbmc=");expect(e).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103]))}),it("should convert a base64 string to a buffer using Buffer",()=>{vi.spyOn(global,"atob").mockImplementation(()=>{throw new Error("atob is not defined")});const e=i("Zmlyc3QgdGVzdCBzdHJpbmc=");expect(e).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103]))})})});describe("bufferToBase64String",()=>{const t=globalThis.btoa,e=globalThis.Buffer;beforeEach(()=>{vi.restoreAllMocks(),globalThis.btoa=t,globalThis.Buffer=e}),afterAll(()=>{globalThis.btoa=t,globalThis.Buffer=e}),it("should encode an empty buffer to an empty base64 string when btoa is available",()=>{globalThis.btoa=vi.fn(o=>(expect(o).toBe(""),""));const a=new Uint8Array,n=l(a);expect(n).toBe(""),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),it("should encode a buffer to base64 using btoa when available",()=>{const a="first testing str",n=Uint8Array.from(a.split("").map(r=>r.charCodeAt(0)));globalThis.btoa=vi.fn(r=>(expect(r).toBe(a),"Zmlyc3QgdGVzdGluZyBzdHI="));const o=l(n);expect(o).toBe("Zmlyc3QgdGVzdGluZyBzdHI="),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),it("should encode a buffer to base64 using Buffer when btoa is not available",()=>{globalThis.btoa=void 0;const a="testing str",n=Buffer.from(a,"binary").toString("base64"),o=Uint8Array.from(a.split("").map(c=>c.charCodeAt(0))),r=vi.spyOn(Buffer,"from"),u=l(o);expect(u).toBe(n),expect(r).toHaveBeenCalledTimes(1)}),it("should throw an error when no Base64 encoder is available",()=>{globalThis.btoa=void 0,globalThis.Buffer=void 0;const a=Uint8Array.from([1,2,3]);expect(()=>l(a)).toThrowError("No Base64 encoder available in this environment.")}),it("should throw if an undefined byte is encountered (defensive check)",()=>{const a={length:3,0:102,1:void 0,2:111};globalThis.btoa=vi.fn(),expect(()=>l(a)).toThrowError("Unexpected undefined byte in array.")})});
|
|
2
2
|
//# sourceMappingURL=Base64String.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/api/utils/Base64String.test.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["base64StringToBuffer", "isBase64String", "result"]
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n base64StringToBuffer,\n bufferToBase64String,\n isBase64String,\n} from \"./Base64String\";\n\ndescribe(\"Base64String\", () => {\n describe(\"isBase64String function\", () => {\n it(\"should return true if the value is a valid base64 string\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdG/zdGluZyBz+HI9\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, one padding\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, two paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdH==\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true for an empty string\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return false for an invalid base64 string\", () => {\n // GIVEN\n const value = \"invalid base64 string\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false with 3 paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzd===\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false on incomplete string (not multiple of 4)\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n });\n\n describe(\"base64StringToBuffer function\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should convert empty input to empty buffer\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(new Uint8Array());\n });\n\n it(\"invalid base64 string converted to null\", () => {\n // GIVEN\n const value = \"invalid string\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(null);\n });\n\n it(\"should convert a base64 string to a buffer using browser's atob\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n });\n\n it(\"should convert a base64 string to a buffer using Buffer\", () => {\n // GIVEN\n vi.spyOn(global, \"atob\").mockImplementation(() => {\n throw new Error(\"atob is not defined\");\n });\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n });\n });\n});\n\ndescribe(\"bufferToBase64String\", () => {\n const originalBtoa = (globalThis as any).btoa;\n const originalBuffer = (globalThis as any).Buffer;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n });\n\n afterAll(() => {\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n });\n\n it(\"should encode an empty buffer to an empty base64 string when btoa is available\", () => {\n // GIVEN\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(\"\");\n return \"\";\n });\n\n const bytes = new Uint8Array();\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n it(\"should encode a buffer to base64 using btoa when available\", () => {\n // GIVEN\n const text = \"first testing str\";\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(text);\n return \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n });\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"Zmlyc3QgdGVzdGluZyBzdHI=\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n it(\"should encode a buffer to base64 using Buffer when btoa is not available\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n\n const text = \"testing str\";\n const expectedBase64 = Buffer.from(text, \"binary\").toString(\"base64\");\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n const bufferFromSpy = vi.spyOn(Buffer, \"from\");\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(expectedBase64);\n expect(bufferFromSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"should throw an error when no Base64 encoder is available\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n (globalThis as any).Buffer = undefined;\n\n const bytes = Uint8Array.from([0x01, 0x02, 0x03]);\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"No Base64 encoder available in this environment.\",\n );\n });\n\n it(\"should throw if an undefined byte is encountered (defensive check)\", () => {\n // GIVEN\n const bytes = {\n length: 3,\n 0: 0x66,\n 1: undefined,\n 2: 0x6f,\n } as unknown as Uint8Array;\n\n (globalThis as any).btoa = vi.fn();\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"Unexpected undefined byte in array.\",\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["base64StringToBuffer", "bufferToBase64String", "isBase64String", "result", "originalBtoa", "originalBuffer", "input", "bytes", "text", "c", "expectedBase64", "bufferFromSpy"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Either as l,Left as u}from"purify-ts";import{Observable as b}from"rxjs";import{connectedDeviceStubBuilder as p}from"../../../api/transport/model/TransportConnectedDevice.stub";import{DEVICE_SESSION_REFRESHER_DEFAULT_OPTIONS as r}from"../../device-session/data/DeviceSessionRefresherConst";import{deviceSessionStubBuilder as a}from"../../device-session/model/DeviceSession.stub";import{DeviceSessionNotFound as m}from"../../device-session/model/Errors";import{DefaultLoggerPublisherService as x}from"../../logger-publisher/service/DefaultLoggerPublisherService";import{
|
|
1
|
+
import{Either as l,Left as u}from"purify-ts";import{Observable as b}from"rxjs";import{connectedDeviceStubBuilder as p}from"../../../api/transport/model/TransportConnectedDevice.stub";import{DEVICE_SESSION_REFRESHER_DEFAULT_OPTIONS as r}from"../../device-session/data/DeviceSessionRefresherConst";import{deviceSessionStubBuilder as a}from"../../device-session/model/DeviceSession.stub";import{DeviceSessionNotFound as m}from"../../device-session/model/Errors";import{DefaultLoggerPublisherService as x}from"../../logger-publisher/service/DefaultLoggerPublisherService";import{HttpManagerApiDataSource as E}from"../../manager-api/data/HttpManagerApiDataSource";import{DefaultManagerApiService as y}from"../../manager-api/service/DefaultManagerApiService";import{DefaultSecureChannelDataSource as I}from"../../secure-channel/data/DefaultSecureChannelDataSource";import{DefaultSecureChannelService as q}from"../../secure-channel/service/DefaultSecureChannelService";import{DefaultDeviceSessionService as A}from"./DefaultDeviceSessionService";vi.mock("@internal/logger-publisher/service/DefaultLoggerPublisherService");vi.mock("@internal/manager-api/data/HttpManagerApiDataSource");let e,s,i,v,d,g,t,f,c;describe("DefaultDeviceSessionService",()=>{s=new x([],"deviceSession"),g=new E({}),t=new y(g),f=new I({}),c=new q(f),beforeEach(()=>{vi.restoreAllMocks(),e=new A(()=>s),i=a({},()=>s,t,c,r)}),afterEach(()=>{i.close()}),it("should have an empty DeviceSession list",()=>{expect(e.getDeviceSessions()).toEqual([])}),describe("DeviceSessionService addDeviceSession",()=>{it("should add a DeviceSession if it does not already exist",()=>{e.addDeviceSession(i),expect(e.getDeviceSessions()).toEqual([i])}),it("should not add a DeviceSession if it already exists",()=>{e.addDeviceSession(i),e.addDeviceSession(i),expect(e.getDeviceSessions()).toEqual([i])})}),describe("DeviceSessionService removeDeviceSession",()=>{it("should remove the DeviceSession of given ID",()=>{e.addDeviceSession(i),e.removeDeviceSession(i.id),expect(e.getDeviceSessions()).toEqual([])}),it("should not remove the DeviceSession of given ID if it does not exist",()=>{e.addDeviceSession(i),e.removeDeviceSession("non-existent-id"),expect(e.getDeviceSessions()).toEqual([i])})}),describe("DeviceSessionService getDeviceSessionById",()=>{it("should get the DeviceSession of given ID if it exists",()=>{e.addDeviceSession(i),expect(e.getDeviceSessionById(i.id)).toEqual(l.of(i))}),it("should not get the DeviceSession if it does not exist",()=>{e.addDeviceSession(i),expect(e.getDeviceSessionById("non-existent-id")).toEqual(u(new m))})}),describe("DeviceSessionService getDeviceSessionsByDeviceId",()=>{it("should not get device sessions by deviceId if none exist",()=>{e.addDeviceSession(i),expect(e.getDeviceSessionsByDeviceId("non-existent-device-id")).toEqual(u(new m))}),it("should get a single device session by deviceId",()=>{e.addDeviceSession(i),expect(e.getDeviceSessionsByDeviceId(i.connectedDevice.id)).toEqual(l.of([i]))}),it("should get device sessions by deviceId",()=>{e.addDeviceSession(i),v=a({connectedDevice:p({id:"device-1"}),id:"session-1"},()=>s,t,c,r),d=a({connectedDevice:p({id:"device-1"}),id:"session-2"},()=>s,t,c,r),e.addDeviceSession(v),e.addDeviceSession(d),expect(e.getDeviceSessionsByDeviceId("device-1")).toEqual(l.of([v,d])),v.close(),d.close()})}),it("should get all sessions",()=>{e.addDeviceSession(i),expect(e.getDeviceSessions()).toEqual([i])}),it("should retrieve sessionObs",()=>{expect(e.sessionsObs).toBeInstanceOf(b)}),it("should emit new session",()=>new Promise((o,n)=>{const S=e.sessionsObs.subscribe({next(D){try{expect(D).toStrictEqual(i),S.unsubscribe(),o()}catch(h){n(h)}}});e.addDeviceSession(i)})),it("should emit previous added session",()=>{const o=a({id:"last-session"},()=>s,t,c,r),n=[];e.addDeviceSession(i),e.addDeviceSession(o);const S=e.sessionsObs.subscribe({next(D){n.push(D)}});o.close(),expect(n).toEqual([i,o]),S.unsubscribe()})});
|
|
2
2
|
//# sourceMappingURL=DefaultDeviceSessionService.test.js.map
|