@ovok/native 0.4.1 → 0.4.3
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/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
- package/lib/commonjs/modules/bt-management/components/bt-provider.js.map +1 -1
- package/lib/commonjs/modules/bt-management/constants/custom-device-brand.js +12 -0
- package/lib/commonjs/modules/bt-management/constants/custom-device-brand.js.map +1 -0
- package/lib/commonjs/modules/bt-management/constants/measurement-field-catalog.js +111 -0
- package/lib/commonjs/modules/bt-management/constants/measurement-field-catalog.js.map +1 -0
- package/lib/commonjs/modules/bt-management/index.js +209 -0
- package/lib/commonjs/modules/bt-management/index.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-case.js +116 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-case.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-field.js +83 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-field.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-frame.js +64 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-frame.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-monitor.js +76 -0
- package/lib/commonjs/modules/bt-management/services/custom/compile-custom-monitor.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/custom-device-error.js +13 -0
- package/lib/commonjs/modules/bt-management/services/custom/custom-device-error.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js +120 -0
- package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/custom/normalize-ble-uuid.js +32 -0
- package/lib/commonjs/modules/bt-management/services/custom/normalize-ble-uuid.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/device-creator.js +52 -26
- package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js +22 -5
- package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js +103 -0
- package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/accepted-device.js +6 -0
- package/lib/commonjs/modules/bt-management/types/accepted-device.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/compiled-custom-field.js +6 -0
- package/lib/commonjs/modules/bt-management/types/compiled-custom-field.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-byte-order.js +2 -0
- package/lib/commonjs/modules/bt-management/types/custom-byte-order.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-case-kind.js +2 -0
- package/lib/commonjs/modules/bt-management/types/custom-case-kind.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-case-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-case-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-definition.js +4 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-definition.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-id.js +2 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-id.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-device-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-field-encoding.js +2 -0
- package/lib/commonjs/modules/bt-management/types/custom-field-encoding.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-field-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-field-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-frame-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-frame-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-measurement.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-measurement.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-monitor-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-monitor-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/custom-service-spec.js +6 -0
- package/lib/commonjs/modules/bt-management/types/custom-service-spec.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/device-key-of.js +6 -0
- package/lib/commonjs/modules/bt-management/types/device-key-of.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/device-key.js +6 -0
- package/lib/commonjs/modules/bt-management/types/device-key.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/commonjs/modules/bt-management/utils/create-custom-field-parser.js +54 -0
- package/lib/commonjs/modules/bt-management/utils/create-custom-field-parser.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/create-frame-validator.js +40 -0
- package/lib/commonjs/modules/bt-management/utils/create-frame-validator.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/decode-medical-float.js +38 -0
- package/lib/commonjs/modules/bt-management/utils/decode-medical-float.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/is-custom-device-definition.js +15 -0
- package/lib/commonjs/modules/bt-management/utils/is-custom-device-definition.js.map +1 -0
- package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
- package/lib/module/modules/bt-management/components/bt-provider.js.map +1 -1
- package/lib/module/modules/bt-management/constants/custom-device-brand.js +8 -0
- package/lib/module/modules/bt-management/constants/custom-device-brand.js.map +1 -0
- package/lib/module/modules/bt-management/constants/measurement-field-catalog.js +108 -0
- package/lib/module/modules/bt-management/constants/measurement-field-catalog.js.map +1 -0
- package/lib/module/modules/bt-management/index.js +19 -0
- package/lib/module/modules/bt-management/index.js.map +1 -1
- package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
- package/lib/module/modules/bt-management/services/custom/compile-custom-case.js +112 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-case.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-field.js +78 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-field.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-frame.js +59 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-frame.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-monitor.js +71 -0
- package/lib/module/modules/bt-management/services/custom/compile-custom-monitor.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/custom-device-error.js +8 -0
- package/lib/module/modules/bt-management/services/custom/custom-device-error.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/define-custom-device.js +115 -0
- package/lib/module/modules/bt-management/services/custom/define-custom-device.js.map +1 -0
- package/lib/module/modules/bt-management/services/custom/normalize-ble-uuid.js +27 -0
- package/lib/module/modules/bt-management/services/custom/normalize-ble-uuid.js.map +1 -0
- package/lib/module/modules/bt-management/services/device-creator.js +52 -26
- package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-data-processor.js +22 -5
- package/lib/module/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/custom/custom.device.js +98 -0
- package/lib/module/modules/bt-management/services/devices/custom/custom.device.js.map +1 -0
- package/lib/module/modules/bt-management/types/accepted-device.js +4 -0
- package/lib/module/modules/bt-management/types/accepted-device.js.map +1 -0
- package/lib/module/modules/bt-management/types/compiled-custom-field.js +4 -0
- package/lib/module/modules/bt-management/types/compiled-custom-field.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-byte-order.js +2 -0
- package/lib/module/modules/bt-management/types/custom-byte-order.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-case-kind.js +2 -0
- package/lib/module/modules/bt-management/types/custom-case-kind.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-case-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-case-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-device-definition.js +8 -0
- package/lib/module/modules/bt-management/types/custom-device-definition.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-device-id.js +2 -0
- package/lib/module/modules/bt-management/types/custom-device-id.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-device-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-device-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-field-encoding.js +2 -0
- package/lib/module/modules/bt-management/types/custom-field-encoding.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-field-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-field-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-frame-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-frame-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-measurement.js +4 -0
- package/lib/module/modules/bt-management/types/custom-measurement.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-monitor-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-monitor-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/custom-service-spec.js +4 -0
- package/lib/module/modules/bt-management/types/custom-service-spec.js.map +1 -0
- package/lib/module/modules/bt-management/types/device-key-of.js +4 -0
- package/lib/module/modules/bt-management/types/device-key-of.js.map +1 -0
- package/lib/module/modules/bt-management/types/device-key.js +4 -0
- package/lib/module/modules/bt-management/types/device-key.js.map +1 -0
- package/lib/module/modules/bt-management/types/device-measurement-map.js +5 -0
- package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/module/modules/bt-management/utils/create-custom-field-parser.js +49 -0
- package/lib/module/modules/bt-management/utils/create-custom-field-parser.js.map +1 -0
- package/lib/module/modules/bt-management/utils/create-frame-validator.js +35 -0
- package/lib/module/modules/bt-management/utils/create-frame-validator.js.map +1 -0
- package/lib/module/modules/bt-management/utils/decode-medical-float.js +33 -0
- package/lib/module/modules/bt-management/utils/decode-medical-float.js.map +1 -0
- package/lib/module/modules/bt-management/utils/is-custom-device-definition.js +10 -0
- package/lib/module/modules/bt-management/utils/is-custom-device-definition.js.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/constants/custom-device-brand.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/constants/custom-device-brand.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/constants/measurement-field-catalog.d.ts +26 -0
- package/lib/typescript/commonjs/src/modules/bt-management/constants/measurement-field-catalog.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +19 -0
- package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +5 -4
- package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-case.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-case.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-field.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-field.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-frame.d.ts +13 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-frame.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/custom-device-error.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/custom-device-error.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts +12 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts +12 -5
- package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts +12 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts +43 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/accepted-device.d.ts +5 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/accepted-device.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-children-props.d.ts +5 -4
- package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-children-props.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-props.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-props.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/compiled-custom-field.d.ts +16 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/compiled-custom-field.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-byte-order.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-byte-order.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-kind.d.ts +12 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-kind.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-spec.d.ts +18 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts +22 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-id.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-id.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts +12 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-encoding.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-encoding.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-spec.d.ts +33 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-frame-spec.d.ts +27 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-frame-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-measurement.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-measurement.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-monitor-spec.d.ts +14 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-monitor-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-service-spec.d.ts +15 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/custom-service-spec.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-data.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-data.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-key-of.d.ts +8 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-key-of.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-key.d.ts +5 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-key.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +10 -5
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/create-custom-field-parser.d.ts +12 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/create-custom-field-parser.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/create-frame-validator.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/create-frame-validator.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/decode-medical-float.d.ts +9 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/decode-medical-float.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/is-custom-device-definition.d.ts +9 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/is-custom-device-definition.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
- package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/components/bt-provider.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/components/bt-provider.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/constants/custom-device-brand.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/constants/custom-device-brand.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/constants/measurement-field-catalog.d.ts +26 -0
- package/lib/typescript/module/src/modules/bt-management/constants/measurement-field-catalog.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/index.d.ts +19 -0
- package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +5 -4
- package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-case.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-case.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-field.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-field.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-frame.d.ts +13 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-frame.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/custom-device-error.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/custom-device-error.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts +12 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts +7 -0
- package/lib/typescript/module/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts +12 -5
- package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts +12 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts +43 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/accepted-device.d.ts +5 -0
- package/lib/typescript/module/src/modules/bt-management/types/accepted-device.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/btprovider-children-props.d.ts +5 -4
- package/lib/typescript/module/src/modules/bt-management/types/btprovider-children-props.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/btprovider-props.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/types/btprovider-props.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/compiled-custom-field.d.ts +16 -0
- package/lib/typescript/module/src/modules/bt-management/types/compiled-custom-field.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/custom-byte-order.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-byte-order.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-case-kind.d.ts +12 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-case-kind.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-case-spec.d.ts +18 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-case-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts +22 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-id.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-id.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts +12 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-field-encoding.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-field-encoding.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-field-spec.d.ts +33 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-field-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-frame-spec.d.ts +27 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-frame-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-measurement.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-measurement.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-monitor-spec.d.ts +14 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-monitor-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-service-spec.d.ts +15 -0
- package/lib/typescript/module/src/modules/bt-management/types/custom-service-spec.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-data.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/types/device-data.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/device-key-of.d.ts +8 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-key-of.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-key.d.ts +5 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-key.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +10 -5
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/create-custom-field-parser.d.ts +12 -0
- package/lib/typescript/module/src/modules/bt-management/utils/create-custom-field-parser.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/create-frame-validator.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/utils/create-frame-validator.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/decode-medical-float.d.ts +9 -0
- package/lib/typescript/module/src/modules/bt-management/utils/decode-medical-float.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/is-custom-device-definition.d.ts +9 -0
- package/lib/typescript/module/src/modules/bt-management/utils/is-custom-device-definition.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.compileCustomField = void 0;
|
|
7
|
+
var _measurementFieldCatalog = require("../../constants/measurement-field-catalog.js");
|
|
8
|
+
var _customDeviceError = require("./custom-device-error.js");
|
|
9
|
+
const MAX_INTEGER_BYTES = 6;
|
|
10
|
+
const WIDTHS = {
|
|
11
|
+
sfloat: 2,
|
|
12
|
+
float: 4
|
|
13
|
+
};
|
|
14
|
+
const assertByteIndexes = (id, path, field, minLengthBytes) => {
|
|
15
|
+
const indexes = field.byteIndexes;
|
|
16
|
+
if (!Array.isArray(indexes) || indexes.length === 0 || indexes.some(i => !Number.isInteger(i) || i < 0)) {
|
|
17
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.byteIndexes`, "must be a non-empty list of byte offsets that are integers of at least 0");
|
|
18
|
+
}
|
|
19
|
+
if (new Set(indexes).size !== indexes.length) {
|
|
20
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.byteIndexes`, "reads the same byte twice");
|
|
21
|
+
}
|
|
22
|
+
const encoding = field.encoding ?? "uint";
|
|
23
|
+
const required = WIDTHS[encoding];
|
|
24
|
+
if (required !== undefined && indexes.length !== required) {
|
|
25
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.encoding`, `"${encoding}" needs exactly ${required} bytes, but ${indexes.length} byte index(es) are declared`);
|
|
26
|
+
}
|
|
27
|
+
if (required === undefined && indexes.length > MAX_INTEGER_BYTES) {
|
|
28
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.byteIndexes`, `reads ${indexes.length} bytes; an integer field may read at most ${MAX_INTEGER_BYTES} bytes so the value stays exact in a JavaScript number`);
|
|
29
|
+
}
|
|
30
|
+
const outOfFrame = indexes.filter(i => i >= minLengthBytes);
|
|
31
|
+
if (outOfFrame.length > 0) {
|
|
32
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.byteIndexes`, `reads byte ${outOfFrame[0]}, which frame.minLengthBytes (${minLengthBytes}) does not guarantee is present`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const assertArithmetic = (id, path, field) => {
|
|
36
|
+
const scale = field.scale ?? 1;
|
|
37
|
+
if (!Number.isFinite(scale) || scale === 0) {
|
|
38
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.scale`, "must be a finite, non-zero number");
|
|
39
|
+
}
|
|
40
|
+
if (!Number.isFinite(field.offset ?? 0)) {
|
|
41
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.offset`, "must be a finite number");
|
|
42
|
+
}
|
|
43
|
+
const decimals = field.decimals;
|
|
44
|
+
if (decimals !== undefined && (!Number.isInteger(decimals) || decimals < 0 || decimals > 6)) {
|
|
45
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.decimals`, "must be a whole number between 0 and 6");
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** Validates one declared field against the measurement catalog and resolves its defaults. */
|
|
50
|
+
const compileCustomField = (id, path, field, measurementTypeKey, minLengthBytes) => {
|
|
51
|
+
const catalog = _measurementFieldCatalog.measurementFieldCatalog[measurementTypeKey];
|
|
52
|
+
const known = catalog?.[field.name];
|
|
53
|
+
if (!catalog || !known) {
|
|
54
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.name`, `"${field.name}" is not a property of ${measurementTypeKey}; expected one of ${Object.keys(catalog ?? {}).join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
if (field.unit !== known.unit) {
|
|
57
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.unit`, `is "${field.unit}"; expected "${known.unit}", the canonical unit of ${field.name}. Convert with scale instead of changing the unit`);
|
|
58
|
+
}
|
|
59
|
+
assertByteIndexes(id, path, field, minLengthBytes);
|
|
60
|
+
assertArithmetic(id, path, field);
|
|
61
|
+
const min = field.min ?? known.min;
|
|
62
|
+
const max = field.max ?? known.max;
|
|
63
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
|
|
64
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}`, `declares min ${min} and max ${max}; min must be below max`);
|
|
65
|
+
}
|
|
66
|
+
if (min < known.min || max > known.max) {
|
|
67
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}`, `declares ${min}-${max} ${known.unit}, which is outside the accepted range for ${field.name} (${known.min}-${known.max} ${known.unit})`);
|
|
68
|
+
}
|
|
69
|
+
const indexes = [...field.byteIndexes];
|
|
70
|
+
return {
|
|
71
|
+
name: field.name,
|
|
72
|
+
byteIndexes: field.byteOrder === "little" ? indexes.reverse() : indexes,
|
|
73
|
+
encoding: field.encoding ?? "uint",
|
|
74
|
+
scale: field.scale ?? 1,
|
|
75
|
+
offset: field.offset ?? 0,
|
|
76
|
+
decimals: field.decimals,
|
|
77
|
+
unit: known.unit,
|
|
78
|
+
min,
|
|
79
|
+
max
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
exports.compileCustomField = compileCustomField;
|
|
83
|
+
//# sourceMappingURL=compile-custom-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_measurementFieldCatalog","require","_customDeviceError","MAX_INTEGER_BYTES","WIDTHS","sfloat","float","assertByteIndexes","id","path","field","minLengthBytes","indexes","byteIndexes","Array","isArray","length","some","i","Number","isInteger","customDeviceError","Set","size","encoding","required","undefined","outOfFrame","filter","assertArithmetic","scale","isFinite","offset","decimals","compileCustomField","measurementTypeKey","catalog","measurementFieldCatalog","known","name","Object","keys","join","unit","min","max","byteOrder","reverse","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-field.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.compileCustomFrame = void 0;
|
|
7
|
+
var _customDeviceError = require("./custom-device-error.js");
|
|
8
|
+
const HEX_BYTE = /^[0-9a-f]{2}$/;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Checks that a frame declaration can actually recognise a complete package, and returns a
|
|
12
|
+
* frozen, lower-cased copy of it.
|
|
13
|
+
*
|
|
14
|
+
* The copy matters twice. The received buffer is always lower-case hex, so a header declared
|
|
15
|
+
* as ["AA","55"] would never match and the device would silently produce nothing until the
|
|
16
|
+
* stuck-data timeout. And the runtime must not read an object the caller still holds a
|
|
17
|
+
* reference to: mutating the declaration after registration would otherwise move byte offsets
|
|
18
|
+
* that were bounds-checked at registration.
|
|
19
|
+
*/
|
|
20
|
+
const compileCustomFrame = (id, path, frame) => {
|
|
21
|
+
const minLengthBytes = frame?.minLengthBytes;
|
|
22
|
+
if (!Number.isInteger(minLengthBytes) || minLengthBytes < 1) {
|
|
23
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.minLengthBytes`, "must be a whole number of at least 1");
|
|
24
|
+
}
|
|
25
|
+
const declaredHeader = frame.header ?? [];
|
|
26
|
+
if (!Array.isArray(declaredHeader)) {
|
|
27
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.header`, "must be a list of hex bytes");
|
|
28
|
+
}
|
|
29
|
+
const header = declaredHeader.map(byte => String(byte).toLowerCase());
|
|
30
|
+
if (header.some(byte => !HEX_BYTE.test(byte))) {
|
|
31
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.header`, 'must be a list of single hex bytes, e.g. ["aa", "55"]');
|
|
32
|
+
}
|
|
33
|
+
if (header.length > minLengthBytes) {
|
|
34
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.header`, `is ${header.length} bytes, which does not fit inside minLengthBytes (${minLengthBytes})`);
|
|
35
|
+
}
|
|
36
|
+
const length = frame.length;
|
|
37
|
+
if (!length) {
|
|
38
|
+
return Object.freeze({
|
|
39
|
+
header: Object.freeze(header),
|
|
40
|
+
minLengthBytes
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (!Number.isInteger(length.index) || length.index < 0) {
|
|
44
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.length.index`, "must be a byte offset of at least 0");
|
|
45
|
+
}
|
|
46
|
+
if (length.widthBytes !== 1 && length.widthBytes !== 2) {
|
|
47
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.length.widthBytes`, "must be 1 or 2");
|
|
48
|
+
}
|
|
49
|
+
if (!Number.isInteger(length.overheadBytes) || length.overheadBytes < 0) {
|
|
50
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.length.overheadBytes`, "must be a whole number of at least 0");
|
|
51
|
+
}
|
|
52
|
+
if (length.index + length.widthBytes > minLengthBytes) {
|
|
53
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.length`, `reads bytes ${length.index}-${length.index + length.widthBytes - 1}, which frame.minLengthBytes (${minLengthBytes}) does not guarantee are present`);
|
|
54
|
+
}
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
header: Object.freeze(header),
|
|
57
|
+
minLengthBytes,
|
|
58
|
+
length: Object.freeze({
|
|
59
|
+
...length
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
exports.compileCustomFrame = compileCustomFrame;
|
|
64
|
+
//# sourceMappingURL=compile-custom-frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_customDeviceError","require","HEX_BYTE","compileCustomFrame","id","path","frame","minLengthBytes","Number","isInteger","customDeviceError","declaredHeader","header","Array","isArray","map","byte","String","toLowerCase","some","test","length","Object","freeze","index","widthBytes","overheadBytes","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-frame.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.compileCustomMonitor = void 0;
|
|
7
|
+
var _compileCustomCase = require("./compile-custom-case.js");
|
|
8
|
+
var _compileCustomFrame = require("./compile-custom-frame.js");
|
|
9
|
+
var _customDeviceError = require("./custom-device-error.js");
|
|
10
|
+
var _normalizeBleUuid = require("./normalize-ble-uuid.js");
|
|
11
|
+
const HEX = /^[0-9a-f]*$/;
|
|
12
|
+
const assertSelectorBytes = (id, path, monitor, frame) => {
|
|
13
|
+
const selectorBytes = monitor.caseSelectorBytes;
|
|
14
|
+
if (selectorBytes === undefined) {
|
|
15
|
+
if (monitor.cases.length !== 1 || monitor.cases[0]?.selector !== "") {
|
|
16
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.caseSelectorBytes`, "is required unless the characteristic has exactly one case with an empty selector");
|
|
17
|
+
}
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
if (!Array.isArray(selectorBytes) || selectorBytes.length === 0 || selectorBytes.some(i => !Number.isInteger(i) || i < 0)) {
|
|
21
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.caseSelectorBytes`, "must be a non-empty list of byte offsets that are integers of at least 0");
|
|
22
|
+
}
|
|
23
|
+
const outOfFrame = selectorBytes.filter(i => i >= frame.minLengthBytes);
|
|
24
|
+
if (outOfFrame.length > 0) {
|
|
25
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.caseSelectorBytes`, `reads byte ${outOfFrame[0]}, which frame.minLengthBytes (${frame.minLengthBytes}) does not guarantee is present`);
|
|
26
|
+
}
|
|
27
|
+
return selectorBytes;
|
|
28
|
+
};
|
|
29
|
+
const assertSelector = (id, path, selector, selectorBytes, seen) => {
|
|
30
|
+
const value = String(selector ?? "").toLowerCase();
|
|
31
|
+
const expected = selectorBytes.length * 2;
|
|
32
|
+
if (!HEX.test(value)) {
|
|
33
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.selector`, `is "${selector}", which is not hex`);
|
|
34
|
+
}
|
|
35
|
+
if (value.length !== expected) {
|
|
36
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.selector`, `is ${value.length} hex digits but caseSelectorBytes declares ${selectorBytes.length} byte(s), so it must be ${expected}`);
|
|
37
|
+
}
|
|
38
|
+
if (seen.has(value)) {
|
|
39
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.selector`, `has the same selector "${value}" as an earlier case, which would silently shadow it`);
|
|
40
|
+
}
|
|
41
|
+
seen.add(value);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** Validates one notify characteristic and turns it into a parsing model and a frame. */
|
|
45
|
+
const compileCustomMonitor = (id, path, monitor, fields) => {
|
|
46
|
+
if (typeof monitor !== "object" || monitor === null) {
|
|
47
|
+
throw (0, _customDeviceError.customDeviceError)(id, path, "must be a monitor characteristic object");
|
|
48
|
+
}
|
|
49
|
+
const uuid = (0, _normalizeBleUuid.normalizeBleUuid)(id, `${path}.uuid`, monitor.uuid);
|
|
50
|
+
const frame = (0, _compileCustomFrame.compileCustomFrame)(id, `${path}.frame`, monitor.frame);
|
|
51
|
+
if (!Array.isArray(monitor.cases) || monitor.cases.length === 0) {
|
|
52
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.cases`, "must declare at least one case");
|
|
53
|
+
}
|
|
54
|
+
const selectorBytes = assertSelectorBytes(id, path, monitor, frame);
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
const cases = monitor.cases.map((caseSpec, index) => {
|
|
57
|
+
const casePath = `${path}.cases[${index}]`;
|
|
58
|
+
if (typeof caseSpec !== "object" || caseSpec === null) {
|
|
59
|
+
throw (0, _customDeviceError.customDeviceError)(id, casePath, "must be a case object");
|
|
60
|
+
}
|
|
61
|
+
assertSelector(id, casePath, caseSpec.selector, selectorBytes, seen);
|
|
62
|
+
return (0, _compileCustomCase.compileCustomCase)(id, casePath, caseSpec, frame.minLengthBytes, fields);
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
characteristic: {
|
|
66
|
+
uuid,
|
|
67
|
+
parsingModel: {
|
|
68
|
+
caseValuePosition: selectorBytes.length > 0 ? selectorBytes : undefined,
|
|
69
|
+
cases
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
frame
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
exports.compileCustomMonitor = compileCustomMonitor;
|
|
76
|
+
//# sourceMappingURL=compile-custom-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_compileCustomCase","require","_compileCustomFrame","_customDeviceError","_normalizeBleUuid","HEX","assertSelectorBytes","id","path","monitor","frame","selectorBytes","caseSelectorBytes","undefined","cases","length","selector","customDeviceError","Array","isArray","some","i","Number","isInteger","outOfFrame","filter","minLengthBytes","assertSelector","seen","value","String","toLowerCase","expected","test","has","add","compileCustomMonitor","fields","uuid","normalizeBleUuid","compileCustomFrame","Set","map","caseSpec","index","casePath","compileCustomCase","characteristic","parsingModel","caseValuePosition","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-monitor.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.customDeviceError = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Every registration failure names the exact position in the declaration, because the
|
|
9
|
+
* author is looking at a datasheet and needs to know which line of it is wrong.
|
|
10
|
+
*/
|
|
11
|
+
const customDeviceError = (id, path, message) => new Error(`Custom device "${id}": ${path} ${message}`);
|
|
12
|
+
exports.customDeviceError = customDeviceError;
|
|
13
|
+
//# sourceMappingURL=custom-device-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["customDeviceError","id","path","message","Error","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/custom-device-error.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACO,MAAMA,iBAAiB,GAAGA,CAC/BC,EAAU,EACVC,IAAY,EACZC,OAAe,KACL,IAAIC,KAAK,CAAC,kBAAkBH,EAAE,MAAMC,IAAI,IAAIC,OAAO,EAAE,CAAC;AAACE,OAAA,CAAAL,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.defineCustomDevice = void 0;
|
|
7
|
+
var _customDeviceBrand = require("../../constants/custom-device-brand.js");
|
|
8
|
+
var _integratedDevices = require("../../types/integrated-devices.js");
|
|
9
|
+
var _compileCustomMonitor = require("./compile-custom-monitor.js");
|
|
10
|
+
var _customDeviceError = require("./custom-device-error.js");
|
|
11
|
+
var _normalizeBleUuid = require("./normalize-ble-uuid.js");
|
|
12
|
+
const MIN_STUCK_TIMEOUT_MS = 1_000;
|
|
13
|
+
|
|
14
|
+
// The SDK's own F4 scale waits this long, because it sleeps while still connected.
|
|
15
|
+
const MAX_STUCK_TIMEOUT_MS = 6_000_000;
|
|
16
|
+
const HEX_BYTES = /^([0-9a-f]{2})+$/;
|
|
17
|
+
const assertIdentity = spec => {
|
|
18
|
+
const id = typeof spec?.id === "string" ? spec.id.trim() : "";
|
|
19
|
+
if (!id) {
|
|
20
|
+
throw (0, _customDeviceError.customDeviceError)(String(spec?.id), "id", "must not be empty");
|
|
21
|
+
}
|
|
22
|
+
const builtIn = Object.values(_integratedDevices.IntegratedDevices).find(name => name.toLowerCase() === id.toLowerCase());
|
|
23
|
+
if (builtIn) {
|
|
24
|
+
throw (0, _customDeviceError.customDeviceError)(id, "id", `collides with the built-in device "${builtIn}"`);
|
|
25
|
+
}
|
|
26
|
+
return id;
|
|
27
|
+
};
|
|
28
|
+
const compileNameMatch = (id, spec) => {
|
|
29
|
+
const nameMatch = spec.nameMatch;
|
|
30
|
+
if (nameMatch instanceof RegExp) {
|
|
31
|
+
if (nameMatch.global || nameMatch.sticky) {
|
|
32
|
+
throw (0, _customDeviceError.customDeviceError)(id, "nameMatch", `must not use the ${nameMatch.global ? "global" : "sticky"} flag, because it makes RegExp.test advance lastIndex and alternate between true and false across scan results`);
|
|
33
|
+
}
|
|
34
|
+
return nameMatch;
|
|
35
|
+
}
|
|
36
|
+
const exact = typeof nameMatch === "string" ? nameMatch.trim() : "";
|
|
37
|
+
if (!exact) {
|
|
38
|
+
throw (0, _customDeviceError.customDeviceError)(id, "nameMatch", "must not be empty");
|
|
39
|
+
}
|
|
40
|
+
return new RegExp(`^${exact.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`);
|
|
41
|
+
};
|
|
42
|
+
const assertStuckTimeout = (id, spec) => {
|
|
43
|
+
const timeout = spec.stuckDataTimeoutMs;
|
|
44
|
+
if (!Number.isInteger(timeout) || timeout < MIN_STUCK_TIMEOUT_MS || timeout > MAX_STUCK_TIMEOUT_MS) {
|
|
45
|
+
throw (0, _customDeviceError.customDeviceError)(id, "stuckDataTimeoutMs", `must be a whole number of milliseconds between ${MIN_STUCK_TIMEOUT_MS} and ${MAX_STUCK_TIMEOUT_MS}`);
|
|
46
|
+
}
|
|
47
|
+
return timeout;
|
|
48
|
+
};
|
|
49
|
+
const compileWrite = (id, path, write) => {
|
|
50
|
+
if (!write) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const commandHex = String(write.commandHex ?? "").toLowerCase();
|
|
54
|
+
if (!HEX_BYTES.test(commandHex)) {
|
|
55
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.write.commandHex`, `is "${write.commandHex}"; it must be an even number of hex digits`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
uuid: (0, _normalizeBleUuid.normalizeBleUuid)(id, `${path}.write.uuid`, write.uuid),
|
|
59
|
+
mainCommandUuid: commandHex
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Validates a declaration and compiles it into a runnable device.
|
|
65
|
+
*
|
|
66
|
+
* Every rule the declarative decoder relies on is checked here, at registration, because the
|
|
67
|
+
* alternative is a plausible wrong number at read time. Registration fails loudly - it
|
|
68
|
+
* throws, naming the exact position in the declaration - and a device that fails to compile
|
|
69
|
+
* is never scanned for.
|
|
70
|
+
*/
|
|
71
|
+
const defineCustomDevice = spec => {
|
|
72
|
+
const id = assertIdentity(spec);
|
|
73
|
+
const nameMatch = compileNameMatch(id, spec);
|
|
74
|
+
const stuckDataTimeout = assertStuckTimeout(id, spec);
|
|
75
|
+
if (!Array.isArray(spec.services) || spec.services.length === 0) {
|
|
76
|
+
throw (0, _customDeviceError.customDeviceError)(id, "services", "must declare at least one service");
|
|
77
|
+
}
|
|
78
|
+
const fields = new Map();
|
|
79
|
+
const frames = new Map();
|
|
80
|
+
const seenCharacteristics = new Set();
|
|
81
|
+
const mainServices = spec.services.map((service, serviceIndex) => {
|
|
82
|
+
const path = `services[${serviceIndex}]`;
|
|
83
|
+
if (typeof service !== "object" || service === null) {
|
|
84
|
+
throw (0, _customDeviceError.customDeviceError)(id, path, "must be a service object");
|
|
85
|
+
}
|
|
86
|
+
if (!Array.isArray(service.monitor) || service.monitor.length === 0) {
|
|
87
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${path}.monitor`, "must declare at least one monitor characteristic");
|
|
88
|
+
}
|
|
89
|
+
const monitorUuids = service.monitor.map((monitor, monitorIndex) => {
|
|
90
|
+
const monitorPath = `${path}.monitor[${monitorIndex}]`;
|
|
91
|
+
const {
|
|
92
|
+
characteristic,
|
|
93
|
+
frame
|
|
94
|
+
} = (0, _compileCustomMonitor.compileCustomMonitor)(id, monitorPath, monitor, fields);
|
|
95
|
+
if (seenCharacteristics.has(characteristic.uuid)) {
|
|
96
|
+
throw (0, _customDeviceError.customDeviceError)(id, `${monitorPath}.uuid`, `is declared twice; a characteristic may appear only once`);
|
|
97
|
+
}
|
|
98
|
+
seenCharacteristics.add(characteristic.uuid);
|
|
99
|
+
frames.set(characteristic.uuid, frame);
|
|
100
|
+
return characteristic;
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
uuid: (0, _normalizeBleUuid.normalizeBleUuid)(id, `${path}.uuid`, service.uuid),
|
|
104
|
+
monitorUuids,
|
|
105
|
+
writeUuid: compileWrite(id, path, service.write)
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
[_customDeviceBrand.CUSTOM_DEVICE_BRAND]: true,
|
|
110
|
+
id: id,
|
|
111
|
+
spec,
|
|
112
|
+
nameMatch,
|
|
113
|
+
mainServices,
|
|
114
|
+
stuckDataTimeout,
|
|
115
|
+
fields,
|
|
116
|
+
frames
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
exports.defineCustomDevice = defineCustomDevice;
|
|
120
|
+
//# sourceMappingURL=define-custom-device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_customDeviceBrand","require","_integratedDevices","_compileCustomMonitor","_customDeviceError","_normalizeBleUuid","MIN_STUCK_TIMEOUT_MS","MAX_STUCK_TIMEOUT_MS","HEX_BYTES","assertIdentity","spec","id","trim","customDeviceError","String","builtIn","Object","values","IntegratedDevices","find","name","toLowerCase","compileNameMatch","nameMatch","RegExp","global","sticky","exact","replace","assertStuckTimeout","timeout","stuckDataTimeoutMs","Number","isInteger","compileWrite","path","write","undefined","commandHex","test","uuid","normalizeBleUuid","mainCommandUuid","defineCustomDevice","stuckDataTimeout","Array","isArray","services","length","fields","Map","frames","seenCharacteristics","Set","mainServices","map","service","serviceIndex","monitor","monitorUuids","monitorIndex","monitorPath","characteristic","frame","compileCustomMonitor","has","add","set","writeUuid","CUSTOM_DEVICE_BRAND","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/define-custom-device.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.normalizeBleUuid = void 0;
|
|
7
|
+
var _customDeviceError = require("./custom-device-error.js");
|
|
8
|
+
const BASE_UUID_SUFFIX = "-0000-1000-8000-00805f9b34fb";
|
|
9
|
+
const SHORT = /^[0-9a-f]{4}$/;
|
|
10
|
+
const MEDIUM = /^[0-9a-f]{8}$/;
|
|
11
|
+
const FULL = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Accepts a 16-bit, 32-bit or 128-bit UUID and returns the 128-bit form, because that is
|
|
15
|
+
* what react-native-ble-plx reports back on a notification and what the parsing model is
|
|
16
|
+
* matched against.
|
|
17
|
+
*/
|
|
18
|
+
const normalizeBleUuid = (id, path, value) => {
|
|
19
|
+
const raw = typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
20
|
+
if (SHORT.test(raw)) {
|
|
21
|
+
return `0000${raw}${BASE_UUID_SUFFIX}`;
|
|
22
|
+
}
|
|
23
|
+
if (MEDIUM.test(raw)) {
|
|
24
|
+
return `${raw}${BASE_UUID_SUFFIX}`;
|
|
25
|
+
}
|
|
26
|
+
if (FULL.test(raw)) {
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
throw (0, _customDeviceError.customDeviceError)(id, path, `is "${String(value)}", which is not a 16-bit, 32-bit or 128-bit Bluetooth UUID`);
|
|
30
|
+
};
|
|
31
|
+
exports.normalizeBleUuid = normalizeBleUuid;
|
|
32
|
+
//# sourceMappingURL=normalize-ble-uuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_customDeviceError","require","BASE_UUID_SUFFIX","SHORT","MEDIUM","FULL","normalizeBleUuid","id","path","value","raw","trim","toLowerCase","test","customDeviceError","String","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/normalize-ble-uuid.ts"],"mappings":";;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AAEA,MAAMC,gBAAgB,GAAG,8BAA8B;AACvD,MAAMC,KAAK,GAAG,eAAe;AAC7B,MAAMC,MAAM,GAAG,eAAe;AAE9B,MAAMC,IAAI,GACR,gEAAgE;;AAElE;AACA;AACA;AACA;AACA;AACO,MAAMC,gBAAgB,GAAGA,CAC9BC,EAAU,EACVC,IAAY,EACZC,KAAc,KACH;EACX,MAAMC,GAAG,GAAG,OAAOD,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAG,EAAE;EAEvE,IAAIT,KAAK,CAACU,IAAI,CAACH,GAAG,CAAC,EAAE;IACnB,OAAO,OAAOA,GAAG,GAAGR,gBAAgB,EAAE;EACxC;EAEA,IAAIE,MAAM,CAACS,IAAI,CAACH,GAAG,CAAC,EAAE;IACpB,OAAO,GAAGA,GAAG,GAAGR,gBAAgB,EAAE;EACpC;EAEA,IAAIG,IAAI,CAACQ,IAAI,CAACH,GAAG,CAAC,EAAE;IAClB,OAAOA,GAAG;EACZ;EAEA,MAAM,IAAAI,oCAAiB,EACrBP,EAAE,EACFC,IAAI,EACJ,OAAOO,MAAM,CAACN,KAAK,CAAC,4DACtB,CAAC;AACH,CAAC;AAACO,OAAA,CAAAV,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -6,28 +6,55 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.DeviceCreator = void 0;
|
|
7
7
|
var _integratedDevicesMap = require("../constants/integrated-devices-map.js");
|
|
8
8
|
var _integratedDevices = require("../types/integrated-devices.js");
|
|
9
|
+
var _isCustomDeviceDefinition = require("../utils/is-custom-device-definition.js");
|
|
9
10
|
var _bc01Device = require("./devices/bc01/bc01.device.js");
|
|
10
11
|
var _bp2Device = require("./devices/bp2/bp2.device.js");
|
|
12
|
+
var _customDevice = require("./devices/custom/custom.device.js");
|
|
11
13
|
var _f4Device = require("./devices/f4/f4.device.js");
|
|
12
14
|
var _spo2Device = require("./devices/spo/spo2.device.js");
|
|
15
|
+
const collectCustomDevices = acceptedDevices => {
|
|
16
|
+
const customDevices = new Map();
|
|
17
|
+
const matchers = new Set();
|
|
18
|
+
acceptedDevices.forEach((entry, index) => {
|
|
19
|
+
if (typeof entry === "string") {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!(0, _isCustomDeviceDefinition.isCustomDeviceDefinition)(entry)) {
|
|
23
|
+
throw new Error(`acceptedDevices[${index}] is not a device registered with defineCustomDevice`);
|
|
24
|
+
}
|
|
25
|
+
if (customDevices.has(entry.id)) {
|
|
26
|
+
throw new Error(`acceptedDevices[${index}] registers the custom device "${entry.id}" twice`);
|
|
27
|
+
}
|
|
28
|
+
if (matchers.has(entry.nameMatch.source)) {
|
|
29
|
+
throw new Error(`acceptedDevices[${index}] ("${entry.id}") matches the same advertised name as an earlier custom device, so one would silently shadow the other`);
|
|
30
|
+
}
|
|
31
|
+
customDevices.set(entry.id, entry);
|
|
32
|
+
matchers.add(entry.nameMatch.source);
|
|
33
|
+
});
|
|
34
|
+
return customDevices;
|
|
35
|
+
};
|
|
13
36
|
class DeviceCreator {
|
|
14
37
|
deviceNameCache = new Map();
|
|
15
38
|
CACHE_MAX_SIZE = 100;
|
|
16
39
|
constructor(acceptedDeviceNames) {
|
|
17
40
|
this.acceptedDeviceNames = acceptedDeviceNames;
|
|
41
|
+
this.customDevices = collectCustomDevices(acceptedDeviceNames);
|
|
18
42
|
}
|
|
19
43
|
getDeviceName = foundName => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return;
|
|
44
|
+
if (!foundName) {
|
|
45
|
+
return undefined;
|
|
23
46
|
}
|
|
24
|
-
if (
|
|
25
|
-
return;
|
|
47
|
+
if (this.deviceNameCache.has(foundName)) {
|
|
48
|
+
return this.deviceNameCache.get(foundName) ?? undefined;
|
|
26
49
|
}
|
|
27
|
-
|
|
50
|
+
const matched = this.matchDeviceName(foundName);
|
|
51
|
+
|
|
52
|
+
// Cache the result (store null for non-matches to avoid repeated tests)
|
|
53
|
+
this.cacheDeviceName(foundName, matched ?? null);
|
|
54
|
+
return matched;
|
|
28
55
|
};
|
|
29
56
|
createDevice(params) {
|
|
30
|
-
if (!params.deviceName.trim()) {
|
|
57
|
+
if (!String(params.deviceName ?? "").trim()) {
|
|
31
58
|
throw new Error("Device name is required");
|
|
32
59
|
}
|
|
33
60
|
if (!params.device) {
|
|
@@ -39,6 +66,11 @@ class DeviceCreator {
|
|
|
39
66
|
if (!params.device.id) {
|
|
40
67
|
throw new Error("Device ID is required");
|
|
41
68
|
}
|
|
69
|
+
const custom = this.customDevices.get(params.deviceName);
|
|
70
|
+
if (custom) {
|
|
71
|
+
// @ts-expect-error - the caller asked for this custom device by its own id
|
|
72
|
+
return new _customDevice.CustomDevice(params.device, params, custom);
|
|
73
|
+
}
|
|
42
74
|
const deviceMap = {
|
|
43
75
|
[_integratedDevices.IntegratedDevices.BP2]: _bp2Device.BP2Device,
|
|
44
76
|
[_integratedDevices.IntegratedDevices.F4]: _f4Device.F4Device,
|
|
@@ -56,29 +88,23 @@ class DeviceCreator {
|
|
|
56
88
|
destroy = () => {
|
|
57
89
|
this.deviceNameCache.clear();
|
|
58
90
|
};
|
|
59
|
-
getIntegratedDeviceName = deviceName => {
|
|
60
|
-
if (!deviceName) {
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Check cache first
|
|
65
|
-
if (this.deviceNameCache.has(deviceName)) {
|
|
66
|
-
const cached = this.deviceNameCache.get(deviceName);
|
|
67
|
-
return cached ?? undefined;
|
|
68
|
-
}
|
|
69
91
|
|
|
70
|
-
|
|
71
|
-
|
|
92
|
+
/**
|
|
93
|
+
* A built-in device always wins over a declaration: its decoder is compiled and tested,
|
|
94
|
+
* and a declaration that happens to match the same advertised name must not displace it.
|
|
95
|
+
*/
|
|
96
|
+
matchDeviceName = deviceName => {
|
|
72
97
|
for (const [regex, deviceType] of _integratedDevicesMap.integratedDevicesMap) {
|
|
73
|
-
if (regex.test(deviceName)) {
|
|
74
|
-
|
|
75
|
-
break; // Early return!
|
|
98
|
+
if (regex.test(deviceName) && this.acceptedDeviceNames.some(name => name === deviceType)) {
|
|
99
|
+
return deviceType;
|
|
76
100
|
}
|
|
77
101
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
102
|
+
for (const custom of this.customDevices.values()) {
|
|
103
|
+
if (custom.nameMatch.test(deviceName)) {
|
|
104
|
+
return custom.id;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
82
108
|
};
|
|
83
109
|
cacheDeviceName(deviceName, deviceType) {
|
|
84
110
|
// Implement simple LRU by clearing oldest entries when cache is full
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_bc01Device","_bp2Device","_f4Device","_spo2Device","
|
|
1
|
+
{"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_isCustomDeviceDefinition","_bc01Device","_bp2Device","_customDevice","_f4Device","_spo2Device","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","isCustomDeviceDefinition","Error","has","id","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","undefined","get","matched","matchDeviceName","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","custom","CustomDevice","deviceMap","IntegratedDevices","BP2","BP2Device","F4","F4Device","PC60WF","SPO2Device","BC01","BC01Device","deviceClass","destroy","clear","regex","deviceType","integratedDevicesMap","test","some","values","size","firstKey","keys","next","value","delete","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
|