1+ import semver from 'semver' ;
2+ import { ERRORS , HardwareError , HardwareErrorCode } from '@onekeyfe/hd-shared' ;
13import { supportInputPinOnSoftware , supportModifyHomescreen } from '../utils/deviceFeaturesUtils' ;
24import { createDeviceMessage } from '../events/device' ;
35import { UI_REQUEST } from '../constants/ui-request' ;
@@ -6,7 +8,8 @@ import DeviceConnector from '../device/DeviceConnector';
68import { DeviceFirmwareRange , KnownDevice } from '../types' ;
79import { CoreMessage , createFirmwareMessage , createUiMessage , DEVICE , FIRMWARE } from '../events' ;
810import { getBleFirmwareReleaseInfo , getFirmwareReleaseInfo } from './firmware/releaseHelper' ;
9- import { getLogger , LoggerNames } from '../utils' ;
11+ import { getDeviceFirmwareVersion , getLogger , getMethodVersionRange , LoggerNames } from '../utils' ;
12+ import { DataManager } from '../data-manager' ;
1013
1114const Log = getLogger ( LoggerNames . Method ) ;
1215
@@ -81,6 +84,12 @@ export abstract class BaseMethod<Params = undefined> {
8184 */
8285 skipForceUpdateCheck = false ;
8386
87+ /**
88+ * 是否需要预先检查版本限制
89+ * @default false
90+ */
91+ preCheckVersionLimit = false ;
92+
8493 // @ts -expect-error: strictPropertyInitialization
8594 postMessage : ( message : CoreMessage ) => void ;
8695
@@ -127,6 +136,46 @@ export abstract class BaseMethod<Params = undefined> {
127136 ) ;
128137 }
129138
139+ handleUnsupportedMethodError ( error : HardwareError ) {
140+ if ( ! error . message . includes ( 'Failure_UnexpectedMessage' ) ) {
141+ return undefined ;
142+ }
143+
144+ const versionRange = getMethodVersionRange (
145+ this . device . features ,
146+ type => this . getVersionRange ( ) [ type ]
147+ ) ;
148+
149+ if ( ! versionRange || ! this . device . features ) {
150+ return ERRORS . TypedError ( HardwareErrorCode . UnsupportedMethod ) ;
151+ }
152+ const newVersionStatus = DataManager . getFirmwareStatus ( this . device . features ) ;
153+ const currentVersion = getDeviceFirmwareVersion ( this . device . features ) . join ( '.' ) ;
154+ if ( semver . valid ( versionRange . min ) && semver . lt ( currentVersion , versionRange . min ) ) {
155+ if ( newVersionStatus === 'none' || newVersionStatus === 'valid' ) {
156+ throw ERRORS . TypedError ( HardwareErrorCode . NewFirmwareUnRelease ) ;
157+ }
158+
159+ return ERRORS . TypedError (
160+ HardwareErrorCode . CallMethodNeedUpgradeFirmware ,
161+ `Device firmware version is too low, please update to ${ versionRange . min } ` ,
162+ { current : currentVersion , require : versionRange . min }
163+ ) ;
164+ }
165+
166+ if (
167+ versionRange . max &&
168+ semver . valid ( versionRange . max ) &&
169+ semver . gte ( currentVersion , versionRange . max )
170+ ) {
171+ return ERRORS . TypedError (
172+ HardwareErrorCode . CallMethodDeprecated ,
173+ `Device firmware version is too high, this method has been deprecated in ${ versionRange . max } ` ,
174+ { current : currentVersion , deprecated : versionRange . max }
175+ ) ;
176+ }
177+ }
178+
130179 checkDeviceSupportFeature ( ) {
131180 if ( ! this . device || ! this . device . features ) return ;
132181 const inputPinOnSoftware = supportInputPinOnSoftware ( this . device . features ) ;
0 commit comments