@onekeyfe/hd-shared 1.1.4-alpha.3 → 1.1.6

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.
@@ -56,6 +56,7 @@ export declare const HardwareErrorCode: {
56
56
  readonly DeviceNotSupportMethod: 415;
57
57
  readonly ForbiddenKeyPath: 416;
58
58
  readonly RepeatUnlocking: 417;
59
+ readonly DefectiveFirmware: 418;
59
60
  readonly NetworkError: 500;
60
61
  readonly TransportNotConfigured: 600;
61
62
  readonly TransportCallInProgress: 601;
@@ -112,9 +113,13 @@ export declare const HardwareErrorCodeMessage: HardwareErrorCodeMessageMapping;
112
113
  export declare const TypedError: (hardwareError: ErrorCodeUnion | string, message?: string, params?: any) => HardwareError;
113
114
  export declare const serializeError: (payload: any) => any;
114
115
  export declare const CreateErrorByMessage: (message: string) => HardwareError;
115
- declare const createNewFirmwareUnReleaseHardwareError: (currentVersion: string, requireVersion: string) => HardwareError;
116
- declare const createNeedUpgradeFirmwareHardwareError: (currentVersion: string, requireVersion: string) => HardwareError;
117
- declare const createNewFirmwareForceUpdateHardwareError: (connectId: string | undefined, deviceId: string | undefined) => HardwareError;
118
- declare const createDeprecatedHardwareError: (currentVersion: string, deprecatedVersion: string) => HardwareError;
119
- export { createNewFirmwareUnReleaseHardwareError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createDeprecatedHardwareError, };
116
+ declare const createNewFirmwareUnReleaseHardwareError: (currentVersion: string, requireVersion: string, methodName?: string) => HardwareError;
117
+ declare const createNeedUpgradeFirmwareHardwareError: (currentVersion: string, requireVersion: string, methodName?: string) => HardwareError;
118
+ declare const createNewFirmwareForceUpdateHardwareError: (connectId: string | undefined, deviceId: string | undefined, versionTypes?: ('firmware' | 'ble')[], currentVersions?: {
119
+ firmware?: string;
120
+ ble?: string;
121
+ }) => HardwareError;
122
+ declare const createDeprecatedHardwareError: (currentVersion: string, deprecatedVersion: string, methodName?: string) => HardwareError;
123
+ declare const createDefectiveFirmwareError: (serialNo: string, seVersion: string, deviceType: string, connectId?: string, deviceId?: string) => HardwareError;
124
+ export { createNewFirmwareUnReleaseHardwareError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createDeprecatedHardwareError, createDefectiveFirmwareError, };
120
125
  //# sourceMappingURL=HardwareError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAOxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyXpB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,+BAqI7B,CAAC;AAEX,eAAO,MAAM,UAAU,kBACN,cAAc,GAAG,MAAM,YAC5B,MAAM,WACP,GAAG,kBAMb,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,GAAG,QAe1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,aAOtD,CAAC;AAEF,QAAA,MAAM,uCAAuC,mBAAoB,MAAM,kBAAkB,MAAM,kBAK5F,CAAC;AAEJ,QAAA,MAAM,sCAAsC,mBAAoB,MAAM,kBAAkB,MAAM,kBAK3F,CAAC;AAEJ,QAAA,MAAM,yCAAyC,cAClC,MAAM,GAAG,SAAS,YACnB,MAAM,GAAG,SAAS,kBAM3B,CAAC;AAEJ,QAAA,MAAM,6BAA6B,mBAAoB,MAAM,qBAAqB,MAAM,kBAKrF,CAAC;AAEJ,OAAO,EACL,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,6BAA6B,GAC9B,CAAC"}
1
+ {"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsCxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8XpB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,+BAsI7B,CAAC;AAEX,eAAO,MAAM,UAAU,kBACN,cAAc,GAAG,MAAM,YAC5B,MAAM,WACP,GAAG,kBAMb,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,GAAG,QAe1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,aAOtD,CAAC;AAEF,QAAA,MAAM,uCAAuC,mBAC3B,MAAM,kBACN,MAAM,eACT,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,sCAAsC,mBAC1B,MAAM,kBACN,MAAM,eACT,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,yCAAyC,cAClC,MAAM,GAAG,SAAS,YACnB,MAAM,GAAG,SAAS,iBACb,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,oBACnB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,kBAsBF,CAAC;AAEF,QAAA,MAAM,6BAA6B,mBACjB,MAAM,qBACH,MAAM,eACZ,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,4BAA4B,aACtB,MAAM,aACL,MAAM,cACL,MAAM,cACN,MAAM,aACP,MAAM,kBAWlB,CAAC;AAEF,OAAO,EACL,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,6BAA6B,EAC7B,4BAA4B,GAC7B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -98,6 +98,7 @@ declare const HardwareErrorCode: {
98
98
  readonly DeviceNotSupportMethod: 415;
99
99
  readonly ForbiddenKeyPath: 416;
100
100
  readonly RepeatUnlocking: 417;
101
+ readonly DefectiveFirmware: 418;
101
102
  readonly NetworkError: 500;
102
103
  readonly TransportNotConfigured: 600;
103
104
  readonly TransportCallInProgress: 601;
@@ -154,15 +155,20 @@ declare const HardwareErrorCodeMessage: HardwareErrorCodeMessageMapping;
154
155
  declare const TypedError: (hardwareError: ErrorCodeUnion | string, message?: string, params?: any) => HardwareError;
155
156
  declare const serializeError: (payload: any) => any;
156
157
  declare const CreateErrorByMessage: (message: string) => HardwareError;
157
- declare const createNewFirmwareUnReleaseHardwareError: (currentVersion: string, requireVersion: string) => HardwareError;
158
- declare const createNeedUpgradeFirmwareHardwareError: (currentVersion: string, requireVersion: string) => HardwareError;
159
- declare const createNewFirmwareForceUpdateHardwareError: (connectId: string | undefined, deviceId: string | undefined) => HardwareError;
160
- declare const createDeprecatedHardwareError: (currentVersion: string, deprecatedVersion: string) => HardwareError;
158
+ declare const createNewFirmwareUnReleaseHardwareError: (currentVersion: string, requireVersion: string, methodName?: string) => HardwareError;
159
+ declare const createNeedUpgradeFirmwareHardwareError: (currentVersion: string, requireVersion: string, methodName?: string) => HardwareError;
160
+ declare const createNewFirmwareForceUpdateHardwareError: (connectId: string | undefined, deviceId: string | undefined, versionTypes?: ('firmware' | 'ble')[], currentVersions?: {
161
+ firmware?: string;
162
+ ble?: string;
163
+ }) => HardwareError;
164
+ declare const createDeprecatedHardwareError: (currentVersion: string, deprecatedVersion: string, methodName?: string) => HardwareError;
165
+ declare const createDefectiveFirmwareError: (serialNo: string, seVersion: string, deviceType: string, connectId?: string, deviceId?: string) => HardwareError;
161
166
 
162
167
  declare const HardwareError$1_createNewFirmwareUnReleaseHardwareError: typeof createNewFirmwareUnReleaseHardwareError;
163
168
  declare const HardwareError$1_createNeedUpgradeFirmwareHardwareError: typeof createNeedUpgradeFirmwareHardwareError;
164
169
  declare const HardwareError$1_createNewFirmwareForceUpdateHardwareError: typeof createNewFirmwareForceUpdateHardwareError;
165
170
  declare const HardwareError$1_createDeprecatedHardwareError: typeof createDeprecatedHardwareError;
171
+ declare const HardwareError$1_createDefectiveFirmwareError: typeof createDefectiveFirmwareError;
166
172
  type HardwareError$1_IHardwareError = IHardwareError;
167
173
  type HardwareError$1_HardwareError = HardwareError;
168
174
  declare const HardwareError$1_HardwareError: typeof HardwareError;
@@ -177,6 +183,7 @@ declare namespace HardwareError$1 {
177
183
  HardwareError$1_createNeedUpgradeFirmwareHardwareError as createNeedUpgradeFirmwareHardwareError,
178
184
  HardwareError$1_createNewFirmwareForceUpdateHardwareError as createNewFirmwareForceUpdateHardwareError,
179
185
  HardwareError$1_createDeprecatedHardwareError as createDeprecatedHardwareError,
186
+ HardwareError$1_createDefectiveFirmwareError as createDefectiveFirmwareError,
180
187
  HardwareError$1_IHardwareError as IHardwareError,
181
188
  HardwareError$1_HardwareError as HardwareError,
182
189
  HardwareError$1_HardwareErrorCode as HardwareErrorCode,
@@ -204,4 +211,4 @@ declare enum EFirmwareType {
204
211
  BitcoinOnly = "bitcoinonly"
205
212
  }
206
213
 
207
- export { CreateErrorByMessage, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDeferred, createDeprecatedHardwareError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isOnekeyDevice, serializeError, wait };
214
+ export { CreateErrorByMessage, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDefectiveFirmwareError, createDeferred, createDeprecatedHardwareError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isOnekeyDevice, serializeError, wait };
package/dist/index.js CHANGED
@@ -120,7 +120,34 @@ function createDeferred(arg, data) {
120
120
  function fillStringWithArguments(value, object) {
121
121
  if (typeof value !== 'string')
122
122
  return value;
123
- return value.replace(/\{([^}]+)\}/g, (_, arg) => object[arg] || '?');
123
+ if (value.indexOf('{') === -1)
124
+ return value;
125
+ let result = '';
126
+ let i = 0;
127
+ const dict = object;
128
+ while (i < value.length) {
129
+ const open = value.indexOf('{', i);
130
+ if (open === -1) {
131
+ result += value.slice(i);
132
+ break;
133
+ }
134
+ const close = value.indexOf('}', open + 1);
135
+ if (close === -1) {
136
+ result += value.slice(i);
137
+ break;
138
+ }
139
+ result += value.slice(i, open);
140
+ const key = value.slice(open + 1, close);
141
+ if (key.length === 0) {
142
+ result += '{}';
143
+ }
144
+ else {
145
+ const replacement = dict[key];
146
+ result += replacement ? String(replacement) : '?';
147
+ }
148
+ i = close + 1;
149
+ }
150
+ return result;
124
151
  }
125
152
  class HardwareError extends Error {
126
153
  constructor(hardwareError) {
@@ -188,6 +215,7 @@ const HardwareErrorCode = {
188
215
  DeviceNotSupportMethod: 415,
189
216
  ForbiddenKeyPath: 416,
190
217
  RepeatUnlocking: 417,
218
+ DefectiveFirmware: 418,
191
219
  NetworkError: 500,
192
220
  TransportNotConfigured: 600,
193
221
  TransportCallInProgress: 601,
@@ -282,6 +310,7 @@ const HardwareErrorCodeMessage = {
282
310
  [HardwareErrorCode.DeviceNotSupportMethod]: 'Device not support this method',
283
311
  [HardwareErrorCode.ForbiddenKeyPath]: 'Forbidden key path',
284
312
  [HardwareErrorCode.RepeatUnlocking]: 'Repeat unlocking',
313
+ [HardwareErrorCode.DefectiveFirmware]: 'Device firmware is defective, please update immediately',
285
314
  [HardwareErrorCode.NetworkError]: 'Network request error',
286
315
  [HardwareErrorCode.TransportNotConfigured]: 'Transport not configured',
287
316
  [HardwareErrorCode.TransportCallInProgress]: 'Transport call in progress',
@@ -364,10 +393,49 @@ const CreateErrorByMessage = (message) => {
364
393
  }
365
394
  return new HardwareError(message);
366
395
  };
367
- const createNewFirmwareUnReleaseHardwareError = (currentVersion, requireVersion) => TypedError(HardwareErrorCode.NewFirmwareUnRelease, 'Device firmware version is too low, please update to the latest version', { current: currentVersion, require: requireVersion });
368
- const createNeedUpgradeFirmwareHardwareError = (currentVersion, requireVersion) => TypedError(HardwareErrorCode.CallMethodNeedUpgradeFirmware, `Device firmware version is too low, please update to ${requireVersion}`, { current: currentVersion, require: requireVersion });
369
- const createNewFirmwareForceUpdateHardwareError = (connectId, deviceId) => TypedError(HardwareErrorCode.NewFirmwareForceUpdate, 'Device firmware version is too low, please update to the latest version', { connectId, deviceId });
370
- const createDeprecatedHardwareError = (currentVersion, deprecatedVersion) => TypedError(HardwareErrorCode.CallMethodDeprecated, `Device firmware version is too high, this method has been deprecated in ${deprecatedVersion}`, { current: currentVersion, deprecated: deprecatedVersion });
396
+ const createNewFirmwareUnReleaseHardwareError = (currentVersion, requireVersion, methodName) => {
397
+ const methodInfo = methodName ? ` for method '${methodName}'` : '';
398
+ return TypedError(HardwareErrorCode.NewFirmwareUnRelease, `Device firmware version is too low${methodInfo}, please update to the latest version`, { current: currentVersion, require: requireVersion, method: methodName });
399
+ };
400
+ const createNeedUpgradeFirmwareHardwareError = (currentVersion, requireVersion, methodName) => {
401
+ const methodInfo = methodName ? ` for method '${methodName}'` : '';
402
+ return TypedError(HardwareErrorCode.CallMethodNeedUpgradeFirmware, `Device firmware version is too low${methodInfo}, please update to ${requireVersion}`, { current: currentVersion, require: requireVersion, method: methodName });
403
+ };
404
+ const createNewFirmwareForceUpdateHardwareError = (connectId, deviceId, versionTypes, currentVersions) => {
405
+ const types = versionTypes || [];
406
+ const typeMap = { firmware: 'firmware', ble: 'BLE firmware' };
407
+ const requiredTypes = types.filter(type => type in typeMap);
408
+ const getVersionInfo = () => {
409
+ const versions = [];
410
+ if (currentVersions === null || currentVersions === void 0 ? void 0 : currentVersions.firmware)
411
+ versions.push(`firmware version: ${currentVersions.firmware}`);
412
+ if (currentVersions === null || currentVersions === void 0 ? void 0 : currentVersions.ble)
413
+ versions.push(`BLE version: ${currentVersions.ble}`);
414
+ return versions.length > 0 ? ` (${versions.join(', ')})` : '';
415
+ };
416
+ const getTypeDescription = () => requiredTypes.map(type => typeMap[type]).join(' and ');
417
+ const message = `Device ${getTypeDescription()} version is too low. ${getVersionInfo()}`;
418
+ return TypedError(HardwareErrorCode.NewFirmwareForceUpdate, message, {
419
+ connectId,
420
+ deviceId,
421
+ versionTypes,
422
+ currentVersions,
423
+ });
424
+ };
425
+ const createDeprecatedHardwareError = (currentVersion, deprecatedVersion, methodName) => {
426
+ const methodInfo = methodName ? ` Method '${methodName}'` : 'This method';
427
+ return TypedError(HardwareErrorCode.CallMethodDeprecated, `Device firmware version is too high. ${methodInfo} has been deprecated in ${deprecatedVersion}`, { current: currentVersion, deprecated: deprecatedVersion, method: methodName });
428
+ };
429
+ const createDefectiveFirmwareError = (serialNo, seVersion, deviceType, connectId, deviceId) => {
430
+ const message = `Defective firmware detected (Serial: ${serialNo}, SE: ${seVersion}). Please update immediately.`;
431
+ return TypedError(HardwareErrorCode.DefectiveFirmware, message, {
432
+ serialNo,
433
+ seVersion,
434
+ deviceType,
435
+ connectId,
436
+ deviceId,
437
+ });
438
+ };
371
439
 
372
440
  var HardwareError$1 = /*#__PURE__*/Object.freeze({
373
441
  __proto__: null,
@@ -380,7 +448,8 @@ var HardwareError$1 = /*#__PURE__*/Object.freeze({
380
448
  createNewFirmwareUnReleaseHardwareError: createNewFirmwareUnReleaseHardwareError,
381
449
  createNeedUpgradeFirmwareHardwareError: createNeedUpgradeFirmwareHardwareError,
382
450
  createNewFirmwareForceUpdateHardwareError: createNewFirmwareForceUpdateHardwareError,
383
- createDeprecatedHardwareError: createDeprecatedHardwareError
451
+ createDeprecatedHardwareError: createDeprecatedHardwareError,
452
+ createDefectiveFirmwareError: createDefectiveFirmwareError
384
453
  });
385
454
 
386
455
  const wait = (ms) => new Promise(resolve => {
@@ -414,6 +483,7 @@ exports.ONEKEY_SERVICE_UUID = ONEKEY_SERVICE_UUID;
414
483
  exports.ONEKEY_WEBUSB_FILTER = ONEKEY_WEBUSB_FILTER;
415
484
  exports.ONEKEY_WRITE_CHARACTERISTIC_UUID = ONEKEY_WRITE_CHARACTERISTIC_UUID;
416
485
  exports.TypedError = TypedError;
486
+ exports.createDefectiveFirmwareError = createDefectiveFirmwareError;
417
487
  exports.createDeferred = createDeferred;
418
488
  exports.createDeprecatedHardwareError = createDeprecatedHardwareError;
419
489
  exports.createNeedUpgradeFirmwareHardwareError = createNeedUpgradeFirmwareHardwareError;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-shared",
3
- "version": "1.1.4-alpha.3",
3
+ "version": "1.1.6",
4
4
  "description": "Hardware SDK's shared tool library",
5
5
  "keywords": [
6
6
  "Hardware-SDK",
@@ -25,5 +25,5 @@
25
25
  "lint": "eslint .",
26
26
  "lint:fix": "eslint . --fix"
27
27
  },
28
- "gitHead": "10e079a2aa02e79fe378be8af1c87e824c2e5872"
28
+ "gitHead": "e187d8cf8d616f5843dbc845543a96cc1d2ad93d"
29
29
  }
@@ -12,7 +12,38 @@ type ErrorCodeUnion = ValueOf<typeof HardwareErrorCode>;
12
12
 
13
13
  function fillStringWithArguments(value: string, object: object) {
14
14
  if (typeof value !== 'string') return value;
15
- return value.replace(/\{([^}]+)\}/g, (_, arg: string) => (object as unknown as any)[arg] || '?');
15
+ // Avoid regex with potential catastrophic backtracking by parsing manually in linear time
16
+ if (value.indexOf('{') === -1) return value;
17
+ let result = '';
18
+ let i = 0;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ const dict = object as any;
21
+ while (i < value.length) {
22
+ const open = value.indexOf('{', i);
23
+ if (open === -1) {
24
+ result += value.slice(i);
25
+ break;
26
+ }
27
+ const close = value.indexOf('}', open + 1);
28
+ if (close === -1) {
29
+ // No matching closing brace; append the rest as-is
30
+ result += value.slice(i);
31
+ break;
32
+ }
33
+ // Append text before the placeholder
34
+ result += value.slice(i, open);
35
+ const key = value.slice(open + 1, close);
36
+ if (key.length === 0) {
37
+ // Keep '{}' unchanged to match original regex behavior
38
+ result += '{}';
39
+ } else {
40
+ const replacement = dict[key];
41
+ // Preserve original semantics: falsy values fallback to '?'
42
+ result += replacement ? String(replacement) : '?';
43
+ }
44
+ i = close + 1;
45
+ }
46
+ return result;
16
47
  }
17
48
 
18
49
  export class HardwareError extends Error {
@@ -256,6 +287,11 @@ export const HardwareErrorCode = {
256
287
  */
257
288
  RepeatUnlocking: 417,
258
289
 
290
+ /**
291
+ * Defective firmware detected
292
+ */
293
+ DefectiveFirmware: 418,
294
+
259
295
  /**
260
296
  * Netword request error
261
297
  */
@@ -481,6 +517,7 @@ export const HardwareErrorCodeMessage: HardwareErrorCodeMessageMapping = {
481
517
  [HardwareErrorCode.DeviceNotSupportMethod]: 'Device not support this method',
482
518
  [HardwareErrorCode.ForbiddenKeyPath]: 'Forbidden key path',
483
519
  [HardwareErrorCode.RepeatUnlocking]: 'Repeat unlocking',
520
+ [HardwareErrorCode.DefectiveFirmware]: 'Device firmware is defective, please update immediately',
484
521
 
485
522
  /**
486
523
  * Network Errors
@@ -594,40 +631,98 @@ export const CreateErrorByMessage = (message: string): HardwareError => {
594
631
  return new HardwareError(message);
595
632
  };
596
633
 
597
- const createNewFirmwareUnReleaseHardwareError = (currentVersion: string, requireVersion: string) =>
598
- TypedError(
634
+ const createNewFirmwareUnReleaseHardwareError = (
635
+ currentVersion: string,
636
+ requireVersion: string,
637
+ methodName?: string
638
+ ) => {
639
+ const methodInfo = methodName ? ` for method '${methodName}'` : '';
640
+ return TypedError(
599
641
  HardwareErrorCode.NewFirmwareUnRelease,
600
- 'Device firmware version is too low, please update to the latest version',
601
- { current: currentVersion, require: requireVersion }
642
+ `Device firmware version is too low${methodInfo}, please update to the latest version`,
643
+ { current: currentVersion, require: requireVersion, method: methodName }
602
644
  );
645
+ };
603
646
 
604
- const createNeedUpgradeFirmwareHardwareError = (currentVersion: string, requireVersion: string) =>
605
- TypedError(
647
+ const createNeedUpgradeFirmwareHardwareError = (
648
+ currentVersion: string,
649
+ requireVersion: string,
650
+ methodName?: string
651
+ ) => {
652
+ const methodInfo = methodName ? ` for method '${methodName}'` : '';
653
+ return TypedError(
606
654
  HardwareErrorCode.CallMethodNeedUpgradeFirmware,
607
- `Device firmware version is too low, please update to ${requireVersion}`,
608
- { current: currentVersion, require: requireVersion }
655
+ `Device firmware version is too low${methodInfo}, please update to ${requireVersion}`,
656
+ { current: currentVersion, require: requireVersion, method: methodName }
609
657
  );
658
+ };
610
659
 
611
660
  const createNewFirmwareForceUpdateHardwareError = (
612
661
  connectId: string | undefined,
613
- deviceId: string | undefined
614
- ) =>
615
- TypedError(
616
- HardwareErrorCode.NewFirmwareForceUpdate,
617
- 'Device firmware version is too low, please update to the latest version',
618
- { connectId, deviceId }
619
- );
662
+ deviceId: string | undefined,
663
+ versionTypes?: ('firmware' | 'ble')[],
664
+ currentVersions?: {
665
+ firmware?: string;
666
+ ble?: string;
667
+ }
668
+ ) => {
669
+ const types = versionTypes || [];
670
+ const typeMap = { firmware: 'firmware', ble: 'BLE firmware' };
671
+ const requiredTypes = types.filter(type => type in typeMap);
672
+
673
+ const getVersionInfo = () => {
674
+ const versions = [];
675
+ if (currentVersions?.firmware) versions.push(`firmware version: ${currentVersions.firmware}`);
676
+ if (currentVersions?.ble) versions.push(`BLE version: ${currentVersions.ble}`);
677
+ return versions.length > 0 ? ` (${versions.join(', ')})` : '';
678
+ };
679
+
680
+ const getTypeDescription = () => requiredTypes.map(type => typeMap[type]).join(' and ');
681
+ const message = `Device ${getTypeDescription()} version is too low. ${getVersionInfo()}`;
682
+
683
+ return TypedError(HardwareErrorCode.NewFirmwareForceUpdate, message, {
684
+ connectId,
685
+ deviceId,
686
+ versionTypes,
687
+ currentVersions,
688
+ });
689
+ };
620
690
 
621
- const createDeprecatedHardwareError = (currentVersion: string, deprecatedVersion: string) =>
622
- TypedError(
691
+ const createDeprecatedHardwareError = (
692
+ currentVersion: string,
693
+ deprecatedVersion: string,
694
+ methodName?: string
695
+ ) => {
696
+ const methodInfo = methodName ? ` Method '${methodName}'` : 'This method';
697
+ return TypedError(
623
698
  HardwareErrorCode.CallMethodDeprecated,
624
- `Device firmware version is too high, this method has been deprecated in ${deprecatedVersion}`,
625
- { current: currentVersion, deprecated: deprecatedVersion }
699
+ `Device firmware version is too high. ${methodInfo} has been deprecated in ${deprecatedVersion}`,
700
+ { current: currentVersion, deprecated: deprecatedVersion, method: methodName }
626
701
  );
702
+ };
703
+
704
+ const createDefectiveFirmwareError = (
705
+ serialNo: string,
706
+ seVersion: string,
707
+ deviceType: string,
708
+ connectId?: string,
709
+ deviceId?: string
710
+ ) => {
711
+ const message = `Defective firmware detected (Serial: ${serialNo}, SE: ${seVersion}). Please update immediately.`;
712
+
713
+ return TypedError(HardwareErrorCode.DefectiveFirmware, message, {
714
+ serialNo,
715
+ seVersion,
716
+ deviceType,
717
+ connectId,
718
+ deviceId,
719
+ });
720
+ };
627
721
 
628
722
  export {
629
723
  createNewFirmwareUnReleaseHardwareError,
630
724
  createNeedUpgradeFirmwareHardwareError,
631
725
  createNewFirmwareForceUpdateHardwareError,
632
726
  createDeprecatedHardwareError,
727
+ createDefectiveFirmwareError,
633
728
  };