@ovok/native 1.16.1-dev.2087 → 1.16.1-dev.2091

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.
Files changed (47) hide show
  1. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js +4 -3
  2. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -1
  3. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js +55 -7
  4. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -1
  5. package/lib/commonjs/modules/next/index.js +36 -0
  6. package/lib/commonjs/modules/next/index.js.map +1 -0
  7. package/lib/commonjs/modules/next/ovok.js +30 -0
  8. package/lib/commonjs/modules/next/ovok.js.map +1 -0
  9. package/lib/commonjs/modules/next/random-values.js +19 -0
  10. package/lib/commonjs/modules/next/random-values.js.map +1 -0
  11. package/lib/commonjs/modules/next/secure-store-storage.js +76 -0
  12. package/lib/commonjs/modules/next/secure-store-storage.js.map +1 -0
  13. package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js +5 -4
  14. package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -1
  15. package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js +55 -7
  16. package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -1
  17. package/lib/module/modules/next/index.js +6 -0
  18. package/lib/module/modules/next/index.js.map +1 -0
  19. package/lib/module/modules/next/ovok.js +27 -0
  20. package/lib/module/modules/next/ovok.js.map +1 -0
  21. package/lib/module/modules/next/random-values.js +15 -0
  22. package/lib/module/modules/next/random-values.js.map +1 -0
  23. package/lib/module/modules/next/secure-store-storage.js +72 -0
  24. package/lib/module/modules/next/secure-store-storage.js.map +1 -0
  25. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +7 -17
  27. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/src/modules/next/index.d.ts +7 -0
  29. package/lib/typescript/commonjs/src/modules/next/index.d.ts.map +1 -0
  30. package/lib/typescript/commonjs/src/modules/next/ovok.d.ts +20 -0
  31. package/lib/typescript/commonjs/src/modules/next/ovok.d.ts.map +1 -0
  32. package/lib/typescript/commonjs/src/modules/next/random-values.d.ts +11 -0
  33. package/lib/typescript/commonjs/src/modules/next/random-values.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/src/modules/next/secure-store-storage.d.ts +22 -0
  35. package/lib/typescript/commonjs/src/modules/next/secure-store-storage.d.ts.map +1 -0
  36. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -1
  37. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +7 -17
  38. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -1
  39. package/lib/typescript/module/src/modules/next/index.d.ts +7 -0
  40. package/lib/typescript/module/src/modules/next/index.d.ts.map +1 -0
  41. package/lib/typescript/module/src/modules/next/ovok.d.ts +20 -0
  42. package/lib/typescript/module/src/modules/next/ovok.d.ts.map +1 -0
  43. package/lib/typescript/module/src/modules/next/random-values.d.ts +11 -0
  44. package/lib/typescript/module/src/modules/next/random-values.d.ts.map +1 -0
  45. package/lib/typescript/module/src/modules/next/secure-store-storage.d.ts +22 -0
  46. package/lib/typescript/module/src/modules/next/secure-store-storage.d.ts.map +1 -0
  47. package/package.json +3 -3
@@ -28,7 +28,7 @@ class BC01Device extends _btManagedDevice.BTManagedDevice {
28
28
  this.reportedTimestamps.clear();
29
29
  };
30
30
  reportedTimestamps = new Set();
31
- mainServices = _bc01MainServices.bc01MainServices;
31
+ mainServices = [_bc01MainServices.bc01MainServices[0]];
32
32
  frameReader = new _bc01FrameReader.Bc01FrameReader();
33
33
 
34
34
  /**
@@ -40,6 +40,7 @@ class BC01Device extends _btManagedDevice.BTManagedDevice {
40
40
  stuckDataTimeout = 90_000;
41
41
  constructor(device, params) {
42
42
  super(device, params);
43
+ this.mainServices = [(0, _bc01MainServices.selectBc01MainService)(device.serviceUUIDs)];
43
44
 
44
45
  /**
45
46
  * The BC401 answers one command with one frame and picks the next command
@@ -52,8 +53,8 @@ class BC01Device extends _btManagedDevice.BTManagedDevice {
52
53
  this.reportedTimestamps.clear();
53
54
  return new _bc01CommandSequencer.Bc01CommandSequencer({
54
55
  write: {
55
- serviceUuid: _bc01MainServices.bc01MainServices[0].uuid,
56
- characteristicUuid: _bc01MainServices.bc01MainServices[0].writeUuid.uuid
56
+ serviceUuid: this.mainServices[0].uuid,
57
+ characteristicUuid: this.mainServices[0].writeUuid.uuid
57
58
  },
58
59
  onError: reason => this.onError?.(new Error(`BC401: ${reason}`)),
59
60
  clockSync: params.clockSync,
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_measurementFeedback","_caseType","_hexToByte","_btManagedDevice","_bc01CommandSequencer","_bc01FrameParser","_bc01FrameReader","_bc01MainServices","BC01Device","BTManagedDevice","onStreamStart","reportedTimestamps","clear","Set","mainServices","bc01MainServices","frameReader","Bc01FrameReader","stuckDataTimeout","constructor","device","params","createCommandSequencer","Bc01CommandSequencer","write","serviceUuid","uuid","characteristicUuid","writeUuid","onError","reason","Error","clockSync","clearDeviceHistory","now","validatePackage","pkg","length","opcode","hexToByte","minLength","bc01FrameLengths","toString","padStart","undefined","handleDependentResult","data","frame","reportUrsRecord","parsingCase","caseType","CaseType","OTHER","parsed","parseBc01Record","measuredValues","BC01_ANALYTE_ORDER","reduce","acc","analyte","value","values","Object","keys","MeasurementFeedbackKey","DISTURB_DETECTED","timestamp","getTime","has","add","reading","RESULT","measurementTypeKey","MeasurementTypeKey","uricAcid","urineValues","recordedAt","onResult","exports"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA,IAAAC,oBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAQA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AAEA,IAAAK,qBAAA,GAAAL,OAAA;AACA,IAAAM,gBAAA,GAAAN,OAAA;AACA,IAAAO,gBAAA,GAAAP,OAAA;AACA,IAAAQ,iBAAA,GAAAR,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMS,UAAU,SAASC,gCAAe,CAAyB;EAC5DC,aAAa,GAAeA,CAAA,KAAM;IAC1C,IAAI,CAACC,kBAAkB,CAACC,KAAK,CAAC,CAAC;EACjC,CAAC;EAEgBD,kBAAkB,GAAG,IAAIE,GAAG,CAAS,CAAC;EAE7CC,YAAY,GAAeC,kCAAgB;EAC3CC,WAAW,GAAoB,IAAIC,gCAAe,CAAC,CAAC;;EAE9D;AACF;AACA;AACA;AACA;AACA;EACYC,gBAAgB,GAAG,MAAM;EAEnCC,WAAWA,CAACC,MAAc,EAAEC,MAAkD,EAAE;IAC9E,KAAK,CAACD,MAAM,EAAEC,MAAM,CAAC;;IAErB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACC,sBAAsB,GAAG,MAAwB;MACpD,IAAI,CAACX,kBAAkB,CAACC,KAAK,CAAC,CAAC;MAE/B,OAAO,IAAIW,0CAAoB,CAC7B;QACEC,KAAK,EAAE;UACLC,WAAW,EAAEV,kCAAgB,CAAC,CAAC,CAAC,CAAEW,IAAI;UACtCC,kBAAkB,EAAEZ,kCAAgB,CAAC,CAAC,CAAC,CAAEa,SAAS,CAAEF;QACtD,CAAC;QACDG,OAAO,EAAGC,MAAM,IAAK,IAAI,CAACD,OAAO,GAAG,IAAIE,KAAK,CAAC,UAAUD,MAAM,EAAE,CAAC,CAAC;QAClEE,SAAS,EAAEX,MAAM,CAACW,SAAS;QAC3BC,kBAAkB,EAAEZ,MAAM,CAACY;MAC7B,CAAC,EACDZ,MAAM,CAACW,SAAS,EAAEE,GACpB,CAAC;IACH,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;EACYC,eAAe,GAAgCC,GAAG,IAAK;IAC/D,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IAEA,MAAMC,MAAM,GAAG,IAAAC,oBAAS,EAACH,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAMI,SAAS,GAAGC,iCAAgB,CAACH,MAAM,CAACI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAExE,IAAIH,SAAS,KAAKI,SAAS,EAAE;MAC3B,OAAO,KAAK;IACd;IAEA,OAAOR,GAAG,CAACC,MAAM,IAAIG,SAAS;EAChC,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACYK,qBAAqB,GAC7BC,IAEC,IAGE;IACH,IAAIA,IAAI,CAACC,KAAK,EAAE;MACd,IAAI,CAACC,eAAe,CAACF,IAAI,CAACC,KAAK,CAAC;IAClC;IAEA,OAAO;MACL,GAAGD,IAAI;MACPG,WAAW,EAAE;QAAE,GAAGH,IAAI,CAACG,WAAW;QAAEC,QAAQ,EAAEC,kBAAQ,CAACC;MAAM;IAC/D,CAAC;EACH,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;;EAEUJ,eAAeA,CAACD,KAAwB,EAAQ;IACtD,MAAMM,MAAM,GAAG,IAAAC,gCAAe,EAACP,KAAK,CAAC;IAErC,IAAI,CAACM,MAAM,EAAE;MACX;IACF;IAEA,MAAME,cAAc,GAAGC,mCAAkB,CAACC,MAAM,CAE9C,CAACC,GAAG,EAAEC,OAAO,KAAK;MAClB,MAAMC,KAAK,GAAGP,MAAM,CAACQ,MAAM,CAACF,OAAO,CAAC;MAEpC,IAAIC,KAAK,KAAKhB,SAAS,EAAE;QACvBc,GAAG,CAACC,OAAO,CAAC,GAAGC,KAAK;MACtB;MAEA,OAAOF,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,IAAII,MAAM,CAACC,IAAI,CAACR,cAAc,CAAC,CAAClB,MAAM,KAAK,CAAC,EAAE;MAC5C,IAAI,CAACR,OAAO,GAAGmC,2CAAsB,CAACC,gBAAgB,CAAC;MAEvD;IACF;IAEA,MAAMC,SAAS,GAAGb,MAAM,CAACa,SAAS,CAACC,OAAO,CAAC,CAAC;IAE5C,IAAI,IAAI,CAACxD,kBAAkB,CAACyD,GAAG,CAACF,SAAS,CAAC,EAAE;MAC1C;IACF;IAEA,IAAI,CAACvD,kBAAkB,CAAC0D,GAAG,CAACH,SAAS,CAAC;IAEtC,MAAMI,OAAO,GAAG;MACdpB,QAAQ,EAAEC,kBAAQ,CAACoB,MAAM;MACzBC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;MAC/CC,WAAW,EAAE,EAAE;MACfC,UAAU,EAAEvB,MAAM,CAACa,SAAS;MAC5B,GAAGX;IACL,CAEC;IAED,IAAI,CAACsB,QAAQ,GAAGP,OAAO,CAAC;EAC1B;AACF;AAACQ,OAAA,CAAAtE,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_measurementFeedback","_caseType","_hexToByte","_btManagedDevice","_bc01CommandSequencer","_bc01FrameParser","_bc01FrameReader","_bc01MainServices","BC01Device","BTManagedDevice","onStreamStart","reportedTimestamps","clear","Set","mainServices","bc01MainServices","frameReader","Bc01FrameReader","stuckDataTimeout","constructor","device","params","selectBc01MainService","serviceUUIDs","createCommandSequencer","Bc01CommandSequencer","write","serviceUuid","uuid","characteristicUuid","writeUuid","onError","reason","Error","clockSync","clearDeviceHistory","now","validatePackage","pkg","length","opcode","hexToByte","minLength","bc01FrameLengths","toString","padStart","undefined","handleDependentResult","data","frame","reportUrsRecord","parsingCase","caseType","CaseType","OTHER","parsed","parseBc01Record","measuredValues","BC01_ANALYTE_ORDER","reduce","acc","analyte","value","values","Object","keys","MeasurementFeedbackKey","DISTURB_DETECTED","timestamp","getTime","has","add","reading","RESULT","measurementTypeKey","MeasurementTypeKey","uricAcid","urineValues","recordedAt","onResult","exports"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA,IAAAC,oBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAQA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AAEA,IAAAK,qBAAA,GAAAL,OAAA;AACA,IAAAM,gBAAA,GAAAN,OAAA;AACA,IAAAO,gBAAA,GAAAP,OAAA;AACA,IAAAQ,iBAAA,GAAAR,OAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMS,UAAU,SAASC,gCAAe,CAAyB;EAC5DC,aAAa,GAAeA,CAAA,KAAM;IAC1C,IAAI,CAACC,kBAAkB,CAACC,KAAK,CAAC,CAAC;EACjC,CAAC;EAEgBD,kBAAkB,GAAG,IAAIE,GAAG,CAAS,CAAC;EAE7CC,YAAY,GAAe,CAACC,kCAAgB,CAAC,CAAC,CAAC,CAAE;EACjDC,WAAW,GAAoB,IAAIC,gCAAe,CAAC,CAAC;;EAE9D;AACF;AACA;AACA;AACA;AACA;EACYC,gBAAgB,GAAG,MAAM;EAEnCC,WAAWA,CAACC,MAAc,EAAEC,MAAkD,EAAE;IAC9E,KAAK,CAACD,MAAM,EAAEC,MAAM,CAAC;IACrB,IAAI,CAACP,YAAY,GAAG,CAAC,IAAAQ,uCAAqB,EAACF,MAAM,CAACG,YAAY,CAAC,CAAC;;IAEhE;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACC,sBAAsB,GAAG,MAAwB;MACpD,IAAI,CAACb,kBAAkB,CAACC,KAAK,CAAC,CAAC;MAE/B,OAAO,IAAIa,0CAAoB,CAC7B;QACEC,KAAK,EAAE;UACLC,WAAW,EAAE,IAAI,CAACb,YAAY,CAAC,CAAC,CAAC,CAAEc,IAAI;UACvCC,kBAAkB,EAAE,IAAI,CAACf,YAAY,CAAC,CAAC,CAAC,CAAEgB,SAAS,CAAEF;QACvD,CAAC;QACDG,OAAO,EAAGC,MAAM,IAAK,IAAI,CAACD,OAAO,GAAG,IAAIE,KAAK,CAAC,UAAUD,MAAM,EAAE,CAAC,CAAC;QAClEE,SAAS,EAAEb,MAAM,CAACa,SAAS;QAC3BC,kBAAkB,EAAEd,MAAM,CAACc;MAC7B,CAAC,EACDd,MAAM,CAACa,SAAS,EAAEE,GACpB,CAAC;IACH,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;EACYC,eAAe,GAAgCC,GAAG,IAAK;IAC/D,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IAEA,MAAMC,MAAM,GAAG,IAAAC,oBAAS,EAACH,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAMI,SAAS,GAAGC,iCAAgB,CAACH,MAAM,CAACI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAExE,IAAIH,SAAS,KAAKI,SAAS,EAAE;MAC3B,OAAO,KAAK;IACd;IAEA,OAAOR,GAAG,CAACC,MAAM,IAAIG,SAAS;EAChC,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACYK,qBAAqB,GAC7BC,IAEC,IAGE;IACH,IAAIA,IAAI,CAACC,KAAK,EAAE;MACd,IAAI,CAACC,eAAe,CAACF,IAAI,CAACC,KAAK,CAAC;IAClC;IAEA,OAAO;MACL,GAAGD,IAAI;MACPG,WAAW,EAAE;QAAE,GAAGH,IAAI,CAACG,WAAW;QAAEC,QAAQ,EAAEC,kBAAQ,CAACC;MAAM;IAC/D,CAAC;EACH,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;;EAEUJ,eAAeA,CAACD,KAAwB,EAAQ;IACtD,MAAMM,MAAM,GAAG,IAAAC,gCAAe,EAACP,KAAK,CAAC;IAErC,IAAI,CAACM,MAAM,EAAE;MACX;IACF;IAEA,MAAME,cAAc,GAAGC,mCAAkB,CAACC,MAAM,CAE9C,CAACC,GAAG,EAAEC,OAAO,KAAK;MAClB,MAAMC,KAAK,GAAGP,MAAM,CAACQ,MAAM,CAACF,OAAO,CAAC;MAEpC,IAAIC,KAAK,KAAKhB,SAAS,EAAE;QACvBc,GAAG,CAACC,OAAO,CAAC,GAAGC,KAAK;MACtB;MAEA,OAAOF,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,IAAII,MAAM,CAACC,IAAI,CAACR,cAAc,CAAC,CAAClB,MAAM,KAAK,CAAC,EAAE;MAC5C,IAAI,CAACR,OAAO,GAAGmC,2CAAsB,CAACC,gBAAgB,CAAC;MAEvD;IACF;IAEA,MAAMC,SAAS,GAAGb,MAAM,CAACa,SAAS,CAACC,OAAO,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC1D,kBAAkB,CAAC2D,GAAG,CAACF,SAAS,CAAC,EAAE;MAC1C;IACF;IAEA,IAAI,CAACzD,kBAAkB,CAAC4D,GAAG,CAACH,SAAS,CAAC;IAEtC,MAAMI,OAAO,GAAG;MACdpB,QAAQ,EAAEC,kBAAQ,CAACoB,MAAM;MACzBC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;MAC/CC,WAAW,EAAE,EAAE;MACfC,UAAU,EAAEvB,MAAM,CAACa,SAAS;MAC5B,GAAGX;IACL,CAEC;IAED,IAAI,CAACsB,QAAQ,GAAGP,OAAO,CAAC;EAC1B;AACF;AAACQ,OAAA,CAAAxE,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -3,20 +3,22 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.bc01MainServices = void 0;
6
+ exports.selectBc01MainService = exports.bc01MainServices = exports.BC01_UART_SERVICE_UUID = void 0;
7
7
  var _core = require("@ovok/core");
8
8
  var _caseType = require("../../../types/case-type.js");
9
9
  /**
10
- * Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
10
+ * Contec BC401 (a.k.a. BC01) urine analyzer — supported GATT profiles.
11
11
  *
12
- * The BC401 uses Contec's proprietary FF12 service, shared across their
13
- * consumer medical devices. Every stored urine-strip measurement is pushed as a
14
- * 16-byte record on 0xFF02 after the host has walked the handshake documented
15
- * in `bc01-command-sequencer.ts`.
12
+ * PHMS supports both the proprietary FF12 profile and the Microchip/ISSC
13
+ * transparent-UART profile. The peripheral advertises its active profile; the
14
+ * device selects one profile and subscribes only to its characteristics.
16
15
  *
17
16
  * Service 0xFF12
18
17
  * Notify (result) 0xFF02 — CCCD 0x2902 must be written 01 00 to enable
19
18
  * Write (command) 0xFF01 — RESET / SET_TIME / GET_COUNT / GET_RECORDS
19
+ * Service 49535343-fe7d-4ae5-8fa9-9fafd205e455
20
+ * Notify (result) 49535343-1e4d-4bd9-ba61-23c647249616
21
+ * Write (command) 49535343-8841-43f4-a8d4-ecbe34729bb3
20
22
  *
21
23
  * On the wire a stored URS record opens with 0xE1 (single) or 0xE2 (paginated).
22
24
  * The remaining fifteen bytes carry the flags nibble, timestamp, seven bytes of
@@ -24,8 +26,10 @@ var _caseType = require("../../../types/case-type.js");
24
26
  * them; this file just declares the GATT surface and hands every E1/E2 frame
25
27
  * to the driver's dependent-result path so the parser can run.
26
28
  */
29
+ const BC01_FF12_SERVICE_UUID = "0000ff12-0000-1000-8000-00805f9b34fb";
30
+ const BC01_UART_SERVICE_UUID = exports.BC01_UART_SERVICE_UUID = "49535343-fe7d-4ae5-8fa9-9fafd205e455";
27
31
  const bc01MainServices = exports.bc01MainServices = [{
28
- uuid: "0000ff12-0000-1000-8000-00805f9b34fb",
32
+ uuid: BC01_FF12_SERVICE_UUID,
29
33
  /**
30
34
  * PHMS 3.0.03 writes `[0x80, 0x00]` to 0xFF01 the moment its GATT
31
35
  * subscription is up — decompiled at L1/f.java:694 ("发送复位命令" — "send
@@ -63,5 +67,49 @@ const bc01MainServices = exports.bc01MainServices = [{
63
67
  }]
64
68
  }
65
69
  }]
70
+ }, {
71
+ uuid: BC01_UART_SERVICE_UUID,
72
+ writeUuid: {
73
+ uuid: "49535343-8841-43f4-a8d4-ecbe34729bb3",
74
+ mainCommandUuid: "8000"
75
+ },
76
+ monitorUuids: [{
77
+ uuid: "49535343-1e4d-4bd9-ba61-23c647249616",
78
+ parsingModel: {
79
+ caseValuePosition: [0],
80
+ cases: [{
81
+ measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
82
+ caseType: _caseType.CaseType.DEPENDENT,
83
+ caseValue: "e1",
84
+ parseDefinitions: []
85
+ }, {
86
+ measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
87
+ caseType: _caseType.CaseType.DEPENDENT,
88
+ caseValue: "e2",
89
+ parseDefinitions: []
90
+ }]
91
+ }
92
+ }]
66
93
  }];
94
+ const normalizeAdvertisedUuid = uuid => {
95
+ const normalized = uuid.trim().toLowerCase();
96
+ if (/^[0-9a-f]{4}$/.test(normalized)) {
97
+ return `0000${normalized}-0000-1000-8000-00805f9b34fb`;
98
+ }
99
+ if (/^[0-9a-f]{8}$/.test(normalized)) {
100
+ return `${normalized}-0000-1000-8000-00805f9b34fb`;
101
+ }
102
+ return normalized;
103
+ };
104
+
105
+ /**
106
+ * Select the advertised profile, preferring the existing FF12 protocol when
107
+ * a peripheral advertises both. Devices without an advertisement keep the
108
+ * established FF12 behavior.
109
+ */
110
+ const selectBc01MainService = advertisedServiceUuids => {
111
+ const advertised = new Set((advertisedServiceUuids ?? []).map(normalizeAdvertisedUuid));
112
+ return bc01MainServices.find(service => advertised.has(service.uuid)) ?? bc01MainServices[0];
113
+ };
114
+ exports.selectBc01MainService = selectBc01MainService;
67
115
  //# sourceMappingURL=bc01.main-services.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_caseType","bc01MainServices","exports","uuid","writeUuid","mainCommandUuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","MeasurementTypeKey","uricAcid","caseType","CaseType","DEPENDENT","caseValue","parseDefinitions"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAA4B,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAC1C;EACEE,IAAI,EAAE,sCAAsC;EAE5C;AACJ;AACA;AACA;AACA;AACA;AACA;EACIC,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAE5C;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEP,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_caseType","BC01_FF12_SERVICE_UUID","BC01_UART_SERVICE_UUID","exports","bc01MainServices","uuid","writeUuid","mainCommandUuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","MeasurementTypeKey","uricAcid","caseType","CaseType","DEPENDENT","caseValue","parseDefinitions","normalizeAdvertisedUuid","normalized","trim","toLowerCase","test","selectBc01MainService","advertisedServiceUuids","advertised","Set","map","find","service","has"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAME,sBAAsB,GAC1B,sCAAsC;AAExC,MAAMC,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAC1B,sCAAsC;AAExC,MAAME,gBAA4B,GAAAD,OAAA,CAAAC,gBAAA,GAAG,CACnC;EACEC,IAAI,EAAEJ,sBAAsB;EAE5B;AACJ;AACA;AACA;AACA;AACA;AACA;EACIK,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAE5C;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEP,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,EACD;EACEd,IAAI,EAAEH,sBAAsB;EAC5BI,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAC5CI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEP,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF;AAED,MAAMC,uBAAuB,GAAIf,IAAY,IAAa;EACxD,MAAMgB,UAAU,GAAGhB,IAAI,CAACiB,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAE5C,IAAI,eAAe,CAACC,IAAI,CAACH,UAAU,CAAC,EAAE;IACpC,OAAO,OAAOA,UAAU,8BAA8B;EACxD;EAEA,IAAI,eAAe,CAACG,IAAI,CAACH,UAAU,CAAC,EAAE;IACpC,OAAO,GAAGA,UAAU,8BAA8B;EACpD;EAEA,OAAOA,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAMI,qBAAqB,GACzBC,sBAA4D,IAC/C;EACb,MAAMC,UAAU,GAAG,IAAIC,GAAG,CACxB,CAACF,sBAAsB,IAAI,EAAE,EAAEG,GAAG,CAACT,uBAAuB,CAC5D,CAAC;EAED,OACEhB,gBAAgB,CAAC0B,IAAI,CAAEC,OAAO,IAAKJ,UAAU,CAACK,GAAG,CAACD,OAAO,CAAC1B,IAAI,CAAC,CAAC,IAChED,gBAAgB,CAAC,CAAC,CAAE;AAExB,CAAC;AAACD,OAAA,CAAAsB,qBAAA,GAAAA,qBAAA","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ Ovok: true,
8
+ SecureStoreStorage: true
9
+ };
10
+ Object.defineProperty(exports, "Ovok", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _ovok.Ovok;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "SecureStoreStorage", {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _secureStoreStorage.SecureStoreStorage;
20
+ }
21
+ });
22
+ var _next = require("@ovok/core/next");
23
+ Object.keys(_next).forEach(function (key) {
24
+ if (key === "default" || key === "__esModule") return;
25
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
26
+ if (key in exports && exports[key] === _next[key]) return;
27
+ Object.defineProperty(exports, key, {
28
+ enumerable: true,
29
+ get: function () {
30
+ return _next[key];
31
+ }
32
+ });
33
+ });
34
+ var _ovok = require("./ovok.js");
35
+ var _secureStoreStorage = require("./secure-store-storage.js");
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_next","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_ovok","_secureStoreStorage"],"sourceRoot":"../../../../src","sources":["modules/next/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,KAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,KAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,KAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,KAAA,GAAAb,OAAA;AAGA,IAAAc,mBAAA,GAAAd,OAAA","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Ovok = void 0;
7
+ var _next = require("@ovok/core/next");
8
+ var _randomValues = require("./random-values.js");
9
+ var _secureStoreStorage = require("./secure-store-storage.js");
10
+ /** No clientSecret: anything shipped inside an app can be extracted from it. */
11
+
12
+ /** The @ovok/core/next client with the session kept in the device's secure store. */
13
+ class Ovok extends _next.Ovok {
14
+ constructor(config) {
15
+ const {
16
+ secureStore,
17
+ secureStoreOptions,
18
+ getRandomValues,
19
+ ...shared
20
+ } = config;
21
+ (0, _randomValues.installRandomValues)(getRandomValues);
22
+ super({
23
+ ...shared,
24
+ clientSecret: undefined,
25
+ storage: new _secureStoreStorage.SecureStoreStorage(secureStore, secureStoreOptions)
26
+ });
27
+ }
28
+ }
29
+ exports.Ovok = Ovok;
30
+ //# sourceMappingURL=ovok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_next","require","_randomValues","_secureStoreStorage","Ovok","CoreOvok","constructor","config","secureStore","secureStoreOptions","getRandomValues","shared","installRandomValues","clientSecret","undefined","storage","SecureStoreStorage","exports"],"sourceRoot":"../../../../src","sources":["modules/next/ovok.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAMA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AAIA;;AAOA;AACA,MAAMG,IAAI,SAASC,UAAQ,CAAC;EAC1BC,WAAWA,CAACC,MAAwB,EAAE;IACpC,MAAM;MAAEC,WAAW;MAAEC,kBAAkB;MAAEC,eAAe;MAAE,GAAGC;IAAO,CAAC,GAAGJ,MAAM;IAE9E,IAAAK,iCAAmB,EAACF,eAAe,CAAC;IACpC,KAAK,CAAC;MACJ,GAAGC,MAAM;MACTE,YAAY,EAAEC,SAAS;MACvBC,OAAO,EAAE,IAAIC,sCAAkB,CAACR,WAAW,EAAEC,kBAAkB;IACjE,CAAC,CAAC;EACJ;AACF;AAACQ,OAAA,CAAAb,IAAA,GAAAA,IAAA","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.installRandomValues = void 0;
7
+ /** Hermes has no crypto.getRandomValues, and PKCE sign-in needs it; an existing one always wins. */
8
+ const installRandomValues = (source, runtime = globalThis) => {
9
+ const present = typeof runtime.crypto?.getRandomValues === "function";
10
+ if (present || source === undefined) {
11
+ return;
12
+ }
13
+ runtime.crypto = {
14
+ ...runtime.crypto,
15
+ getRandomValues: source
16
+ };
17
+ };
18
+ exports.installRandomValues = installRandomValues;
19
+ //# sourceMappingURL=random-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["installRandomValues","source","runtime","globalThis","present","crypto","getRandomValues","undefined","exports"],"sourceRoot":"../../../../src","sources":["modules/next/random-values.ts"],"mappings":";;;;;;AAIA;AACA,MAAMA,mBAAmB,GAAGA,CAC1BC,MAAsC,EACtCC,OAA4B,GAAGC,UAAiC,KACvD;EACT,MAAMC,OAAO,GAAG,OAAOF,OAAO,CAACG,MAAM,EAAEC,eAAe,KAAK,UAAU;EAErE,IAAIF,OAAO,IAAIH,MAAM,KAAKM,SAAS,EAAE;IACnC;EACF;EAEAL,OAAO,CAACG,MAAM,GAAG;IAAE,GAAGH,OAAO,CAACG,MAAM;IAAEC,eAAe,EAAEL;EAAO,CAAC;AACjE,CAAC;AAACO,OAAA,CAAAR,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SecureStoreStorage = void 0;
7
+ /** The part of expo-secure-store the storage needs; the host app passes the module in. */
8
+
9
+ /** Expo warns past 2048 bytes per value; 1024 UTF-16 units stays under it for any text. */
10
+ const CHUNK_LENGTH = 1024;
11
+ const KEY_UNSAFE_CHARACTERS = /[^\w.-]/g;
12
+
13
+ /** Splits each value across numbered entries and keeps the count under the key itself. */
14
+ class SecureStoreStorage {
15
+ constructor(store, options) {
16
+ this.store = store;
17
+ this.options = options;
18
+ }
19
+ async getItem(key) {
20
+ try {
21
+ return await this.read(safeKey(key));
22
+ } catch {
23
+ // A locked keychain rejects reads before first unlock; that is not a missing value to delete.
24
+ return null;
25
+ }
26
+ }
27
+ async setItem(key, value) {
28
+ const base = safeKey(key);
29
+ const previousCount = await this.chunkCount(base);
30
+ const chunks = splitIntoChunks(value);
31
+ await Promise.all(chunks.map((chunk, index) => this.store.setItemAsync(chunkKey(base, index), chunk, this.options)));
32
+ await this.store.setItemAsync(base, String(chunks.length), this.options);
33
+ await this.deleteChunks(base, chunks.length, previousCount);
34
+ }
35
+ async removeItem(key) {
36
+ const base = safeKey(key);
37
+ const count = await this.chunkCount(base);
38
+ await this.store.deleteItemAsync(base, this.options);
39
+ await this.deleteChunks(base, 0, count);
40
+ }
41
+ async read(base) {
42
+ const count = await this.chunkCount(base);
43
+ const chunks = await Promise.all(indexes(0, count).map(index => this.store.getItemAsync(chunkKey(base, index), this.options)));
44
+ const complete = count > 0 && chunks.every(chunk => chunk !== null);
45
+ return complete ? chunks.join("") : null;
46
+ }
47
+ async chunkCount(base) {
48
+ const raw = await this.store.getItemAsync(base, this.options);
49
+ const count = Number(raw);
50
+ return raw !== null && Number.isInteger(count) && count > 0 ? count : 0;
51
+ }
52
+ async deleteChunks(base, from, to) {
53
+ await Promise.all(indexes(from, to).map(index => this.store.deleteItemAsync(chunkKey(base, index), this.options)));
54
+ }
55
+ }
56
+ exports.SecureStoreStorage = SecureStoreStorage;
57
+ const safeKey = key => key.replace(KEY_UNSAFE_CHARACTERS, "_");
58
+ const chunkKey = (base, index) => `${base}.${index}`;
59
+ const indexes = (from, to) => Array.from({
60
+ length: Math.max(0, to - from)
61
+ }, (_, offset) => from + offset);
62
+
63
+ /** Never ends a chunk inside a surrogate pair, so each stored entry is valid text. */
64
+ const splitIntoChunks = value => {
65
+ const chunks = [];
66
+ for (let start = 0; start < value.length || chunks.length === 0;) {
67
+ const end = Math.min(start + CHUNK_LENGTH, value.length);
68
+ const splitsPair = end < value.length && isHighSurrogate(value.charCodeAt(end - 1));
69
+ const safeEnd = splitsPair ? end - 1 : end;
70
+ chunks.push(value.slice(start, safeEnd));
71
+ start = safeEnd;
72
+ }
73
+ return chunks;
74
+ };
75
+ const isHighSurrogate = code => code >= 0xd800 && code <= 0xdbff;
76
+ //# sourceMappingURL=secure-store-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CHUNK_LENGTH","KEY_UNSAFE_CHARACTERS","SecureStoreStorage","constructor","store","options","getItem","key","read","safeKey","setItem","value","base","previousCount","chunkCount","chunks","splitIntoChunks","Promise","all","map","chunk","index","setItemAsync","chunkKey","String","length","deleteChunks","removeItem","count","deleteItemAsync","indexes","getItemAsync","complete","every","join","raw","Number","isInteger","from","to","exports","replace","Array","Math","max","_","offset","start","end","min","splitsPair","isHighSurrogate","charCodeAt","safeEnd","push","slice","code"],"sourceRoot":"../../../../src","sources":["modules/next/secure-store-storage.ts"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ import { BTManagedDevice } from "../bt-managed-device.js";
8
8
  import { Bc01CommandSequencer } from "./bc01-command-sequencer.js";
9
9
  import { BC01_ANALYTE_ORDER, parseBc01Record } from "./bc01-frame-parser.js";
10
10
  import { Bc01FrameReader, bc01FrameLengths } from "./bc01.frame-reader.js";
11
- import { bc01MainServices } from "./bc01.main-services.js";
11
+ import { bc01MainServices, selectBc01MainService } from "./bc01.main-services.js";
12
12
 
13
13
  /**
14
14
  * Contec BC401 (BC01) urine analyzer driver.
@@ -25,7 +25,7 @@ export class BC01Device extends BTManagedDevice {
25
25
  this.reportedTimestamps.clear();
26
26
  };
27
27
  reportedTimestamps = new Set();
28
- mainServices = bc01MainServices;
28
+ mainServices = [bc01MainServices[0]];
29
29
  frameReader = new Bc01FrameReader();
30
30
 
31
31
  /**
@@ -37,6 +37,7 @@ export class BC01Device extends BTManagedDevice {
37
37
  stuckDataTimeout = 90_000;
38
38
  constructor(device, params) {
39
39
  super(device, params);
40
+ this.mainServices = [selectBc01MainService(device.serviceUUIDs)];
40
41
 
41
42
  /**
42
43
  * The BC401 answers one command with one frame and picks the next command
@@ -49,8 +50,8 @@ export class BC01Device extends BTManagedDevice {
49
50
  this.reportedTimestamps.clear();
50
51
  return new Bc01CommandSequencer({
51
52
  write: {
52
- serviceUuid: bc01MainServices[0].uuid,
53
- characteristicUuid: bc01MainServices[0].writeUuid.uuid
53
+ serviceUuid: this.mainServices[0].uuid,
54
+ characteristicUuid: this.mainServices[0].writeUuid.uuid
54
55
  },
55
56
  onError: reason => this.onError?.(new Error(`BC401: ${reason}`)),
56
57
  clockSync: params.clockSync,
@@ -1 +1 @@
1
- {"version":3,"names":["MeasurementTypeKey","MeasurementFeedbackKey","CaseType","hexToByte","BTManagedDevice","Bc01CommandSequencer","BC01_ANALYTE_ORDER","parseBc01Record","Bc01FrameReader","bc01FrameLengths","bc01MainServices","BC01Device","onStreamStart","reportedTimestamps","clear","Set","mainServices","frameReader","stuckDataTimeout","constructor","device","params","createCommandSequencer","write","serviceUuid","uuid","characteristicUuid","writeUuid","onError","reason","Error","clockSync","clearDeviceHistory","now","validatePackage","pkg","length","opcode","minLength","toString","padStart","undefined","handleDependentResult","data","frame","reportUrsRecord","parsingCase","caseType","OTHER","parsed","measuredValues","reduce","acc","analyte","value","values","Object","keys","DISTURB_DETECTED","timestamp","getTime","has","add","reading","RESULT","measurementTypeKey","uricAcid","urineValues","recordedAt","onResult"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["MeasurementTypeKey","MeasurementFeedbackKey","CaseType","hexToByte","BTManagedDevice","Bc01CommandSequencer","BC01_ANALYTE_ORDER","parseBc01Record","Bc01FrameReader","bc01FrameLengths","bc01MainServices","selectBc01MainService","BC01Device","onStreamStart","reportedTimestamps","clear","Set","mainServices","frameReader","stuckDataTimeout","constructor","device","params","serviceUUIDs","createCommandSequencer","write","serviceUuid","uuid","characteristicUuid","writeUuid","onError","reason","Error","clockSync","clearDeviceHistory","now","validatePackage","pkg","length","opcode","minLength","toString","padStart","undefined","handleDependentResult","data","frame","reportUrsRecord","parsingCase","caseType","OTHER","parsed","measuredValues","reduce","acc","analyte","value","values","Object","keys","DISTURB_DETECTED","timestamp","getTime","has","add","reading","RESULT","measurementTypeKey","uricAcid","urineValues","recordedAt","onResult"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":"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","ignoreList":[]}
@@ -3,16 +3,18 @@
3
3
  import { MeasurementTypeKey } from "@ovok/core";
4
4
  import { CaseType } from "../../../types/case-type.js";
5
5
  /**
6
- * Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
6
+ * Contec BC401 (a.k.a. BC01) urine analyzer — supported GATT profiles.
7
7
  *
8
- * The BC401 uses Contec's proprietary FF12 service, shared across their
9
- * consumer medical devices. Every stored urine-strip measurement is pushed as a
10
- * 16-byte record on 0xFF02 after the host has walked the handshake documented
11
- * in `bc01-command-sequencer.ts`.
8
+ * PHMS supports both the proprietary FF12 profile and the Microchip/ISSC
9
+ * transparent-UART profile. The peripheral advertises its active profile; the
10
+ * device selects one profile and subscribes only to its characteristics.
12
11
  *
13
12
  * Service 0xFF12
14
13
  * Notify (result) 0xFF02 — CCCD 0x2902 must be written 01 00 to enable
15
14
  * Write (command) 0xFF01 — RESET / SET_TIME / GET_COUNT / GET_RECORDS
15
+ * Service 49535343-fe7d-4ae5-8fa9-9fafd205e455
16
+ * Notify (result) 49535343-1e4d-4bd9-ba61-23c647249616
17
+ * Write (command) 49535343-8841-43f4-a8d4-ecbe34729bb3
16
18
  *
17
19
  * On the wire a stored URS record opens with 0xE1 (single) or 0xE2 (paginated).
18
20
  * The remaining fifteen bytes carry the flags nibble, timestamp, seven bytes of
@@ -20,8 +22,10 @@ import { CaseType } from "../../../types/case-type.js";
20
22
  * them; this file just declares the GATT surface and hands every E1/E2 frame
21
23
  * to the driver's dependent-result path so the parser can run.
22
24
  */
23
- export const bc01MainServices = [{
24
- uuid: "0000ff12-0000-1000-8000-00805f9b34fb",
25
+ const BC01_FF12_SERVICE_UUID = "0000ff12-0000-1000-8000-00805f9b34fb";
26
+ const BC01_UART_SERVICE_UUID = "49535343-fe7d-4ae5-8fa9-9fafd205e455";
27
+ const bc01MainServices = [{
28
+ uuid: BC01_FF12_SERVICE_UUID,
25
29
  /**
26
30
  * PHMS 3.0.03 writes `[0x80, 0x00]` to 0xFF01 the moment its GATT
27
31
  * subscription is up — decompiled at L1/f.java:694 ("发送复位命令" — "send
@@ -59,5 +63,49 @@ export const bc01MainServices = [{
59
63
  }]
60
64
  }
61
65
  }]
66
+ }, {
67
+ uuid: BC01_UART_SERVICE_UUID,
68
+ writeUuid: {
69
+ uuid: "49535343-8841-43f4-a8d4-ecbe34729bb3",
70
+ mainCommandUuid: "8000"
71
+ },
72
+ monitorUuids: [{
73
+ uuid: "49535343-1e4d-4bd9-ba61-23c647249616",
74
+ parsingModel: {
75
+ caseValuePosition: [0],
76
+ cases: [{
77
+ measurementTypeKey: MeasurementTypeKey.uricAcid,
78
+ caseType: CaseType.DEPENDENT,
79
+ caseValue: "e1",
80
+ parseDefinitions: []
81
+ }, {
82
+ measurementTypeKey: MeasurementTypeKey.uricAcid,
83
+ caseType: CaseType.DEPENDENT,
84
+ caseValue: "e2",
85
+ parseDefinitions: []
86
+ }]
87
+ }
88
+ }]
62
89
  }];
90
+ const normalizeAdvertisedUuid = uuid => {
91
+ const normalized = uuid.trim().toLowerCase();
92
+ if (/^[0-9a-f]{4}$/.test(normalized)) {
93
+ return `0000${normalized}-0000-1000-8000-00805f9b34fb`;
94
+ }
95
+ if (/^[0-9a-f]{8}$/.test(normalized)) {
96
+ return `${normalized}-0000-1000-8000-00805f9b34fb`;
97
+ }
98
+ return normalized;
99
+ };
100
+
101
+ /**
102
+ * Select the advertised profile, preferring the existing FF12 protocol when
103
+ * a peripheral advertises both. Devices without an advertisement keep the
104
+ * established FF12 behavior.
105
+ */
106
+ const selectBc01MainService = advertisedServiceUuids => {
107
+ const advertised = new Set((advertisedServiceUuids ?? []).map(normalizeAdvertisedUuid));
108
+ return bc01MainServices.find(service => advertised.has(service.uuid)) ?? bc01MainServices[0];
109
+ };
110
+ export { BC01_UART_SERVICE_UUID, bc01MainServices, selectBc01MainService };
63
111
  //# sourceMappingURL=bc01.main-services.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["MeasurementTypeKey","CaseType","bc01MainServices","uuid","writeUuid","mainCommandUuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","uricAcid","caseType","DEPENDENT","caseValue","parseDefinitions"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,YAAY;AAE/C,SAASC,QAAQ,QAAQ,6BAA0B;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAA4B,GAAG,CAC1C;EACEC,IAAI,EAAE,sCAAsC;EAE5C;AACJ;AACA;AACA;AACA;AACA;AACA;EACIC,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAE5C;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEV,kBAAkB,CAACW,QAAQ;QAC/CC,QAAQ,EAAEX,QAAQ,CAACY,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEL,kBAAkB,EAAEV,kBAAkB,CAACW,QAAQ;QAC/CC,QAAQ,EAAEX,QAAQ,CAACY,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","BC01_FF12_SERVICE_UUID","BC01_UART_SERVICE_UUID","bc01MainServices","uuid","writeUuid","mainCommandUuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","uricAcid","caseType","DEPENDENT","caseValue","parseDefinitions","normalizeAdvertisedUuid","normalized","trim","toLowerCase","test","selectBc01MainService","advertisedServiceUuids","advertised","Set","map","find","service","has"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,YAAY;AAE/C,SAASC,QAAQ,QAAQ,6BAA0B;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,sBAAsB,GAC1B,sCAAsC;AAExC,MAAMC,sBAAsB,GAC1B,sCAAsC;AAExC,MAAMC,gBAA4B,GAAG,CACnC;EACEC,IAAI,EAAEH,sBAAsB;EAE5B;AACJ;AACA;AACA;AACA;AACA;AACA;EACII,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAE5C;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEZ,kBAAkB,CAACa,QAAQ;QAC/CC,QAAQ,EAAEb,QAAQ,CAACc,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEL,kBAAkB,EAAEZ,kBAAkB,CAACa,QAAQ;QAC/CC,QAAQ,EAAEb,QAAQ,CAACc,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,EACD;EACEZ,IAAI,EAAEF,sBAAsB;EAC5BG,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAC5CI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEZ,kBAAkB,CAACa,QAAQ;QAC/CC,QAAQ,EAAEb,QAAQ,CAACc,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEL,kBAAkB,EAAEZ,kBAAkB,CAACa,QAAQ;QAC/CC,QAAQ,EAAEb,QAAQ,CAACc,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF;AAED,MAAMC,uBAAuB,GAAIb,IAAY,IAAa;EACxD,MAAMc,UAAU,GAAGd,IAAI,CAACe,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAE5C,IAAI,eAAe,CAACC,IAAI,CAACH,UAAU,CAAC,EAAE;IACpC,OAAO,OAAOA,UAAU,8BAA8B;EACxD;EAEA,IAAI,eAAe,CAACG,IAAI,CAACH,UAAU,CAAC,EAAE;IACpC,OAAO,GAAGA,UAAU,8BAA8B;EACpD;EAEA,OAAOA,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAMI,qBAAqB,GACzBC,sBAA4D,IAC/C;EACb,MAAMC,UAAU,GAAG,IAAIC,GAAG,CACxB,CAACF,sBAAsB,IAAI,EAAE,EAAEG,GAAG,CAACT,uBAAuB,CAC5D,CAAC;EAED,OACEd,gBAAgB,CAACwB,IAAI,CAAEC,OAAO,IAAKJ,UAAU,CAACK,GAAG,CAACD,OAAO,CAACxB,IAAI,CAAC,CAAC,IAChED,gBAAgB,CAAC,CAAC,CAAE;AAExB,CAAC;AAED,SACED,sBAAsB,EACtBC,gBAAgB,EAChBmB,qBAAqB","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export * from "@ovok/core/next";
4
+ export { Ovok } from "./ovok.js";
5
+ export { SecureStoreStorage } from "./secure-store-storage.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Ovok","SecureStoreStorage"],"sourceRoot":"../../../../src","sources":["modules/next/index.ts"],"mappings":";;AAAA,cAAc,iBAAiB;AAC/B,SAASA,IAAI,QAAQ,WAAQ;AAG7B,SAASC,kBAAkB,QAAQ,2BAAwB","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ import { Ovok as CoreOvok } from "@ovok/core/next";
4
+ import { installRandomValues } from "./random-values.js";
5
+ import { SecureStoreStorage } from "./secure-store-storage.js";
6
+
7
+ /** No clientSecret: anything shipped inside an app can be extracted from it. */
8
+
9
+ /** The @ovok/core/next client with the session kept in the device's secure store. */
10
+ class Ovok extends CoreOvok {
11
+ constructor(config) {
12
+ const {
13
+ secureStore,
14
+ secureStoreOptions,
15
+ getRandomValues,
16
+ ...shared
17
+ } = config;
18
+ installRandomValues(getRandomValues);
19
+ super({
20
+ ...shared,
21
+ clientSecret: undefined,
22
+ storage: new SecureStoreStorage(secureStore, secureStoreOptions)
23
+ });
24
+ }
25
+ }
26
+ export { Ovok };
27
+ //# sourceMappingURL=ovok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Ovok","CoreOvok","installRandomValues","SecureStoreStorage","constructor","config","secureStore","secureStoreOptions","getRandomValues","shared","clientSecret","undefined","storage"],"sourceRoot":"../../../../src","sources":["modules/next/ovok.ts"],"mappings":";;AAAA,SAASA,IAAI,IAAIC,QAAQ,QAAQ,iBAAiB;AAMlD,SAASC,mBAAmB,QAAQ,oBAAiB;AACrD,SAASC,kBAAkB,QAAQ,2BAAwB;;AAI3D;;AAOA;AACA,MAAMH,IAAI,SAASC,QAAQ,CAAC;EAC1BG,WAAWA,CAACC,MAAwB,EAAE;IACpC,MAAM;MAAEC,WAAW;MAAEC,kBAAkB;MAAEC,eAAe;MAAE,GAAGC;IAAO,CAAC,GAAGJ,MAAM;IAE9EH,mBAAmB,CAACM,eAAe,CAAC;IACpC,KAAK,CAAC;MACJ,GAAGC,MAAM;MACTC,YAAY,EAAEC,SAAS;MACvBC,OAAO,EAAE,IAAIT,kBAAkB,CAACG,WAAW,EAAEC,kBAAkB;IACjE,CAAC,CAAC;EACJ;AACF;AAEA,SAASP,IAAI","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ /** Hermes has no crypto.getRandomValues, and PKCE sign-in needs it; an existing one always wins. */
4
+ const installRandomValues = (source, runtime = globalThis) => {
5
+ const present = typeof runtime.crypto?.getRandomValues === "function";
6
+ if (present || source === undefined) {
7
+ return;
8
+ }
9
+ runtime.crypto = {
10
+ ...runtime.crypto,
11
+ getRandomValues: source
12
+ };
13
+ };
14
+ export { installRandomValues };
15
+ //# sourceMappingURL=random-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["installRandomValues","source","runtime","globalThis","present","crypto","getRandomValues","undefined"],"sourceRoot":"../../../../src","sources":["modules/next/random-values.ts"],"mappings":";;AAIA;AACA,MAAMA,mBAAmB,GAAGA,CAC1BC,MAAsC,EACtCC,OAA4B,GAAGC,UAAiC,KACvD;EACT,MAAMC,OAAO,GAAG,OAAOF,OAAO,CAACG,MAAM,EAAEC,eAAe,KAAK,UAAU;EAErE,IAAIF,OAAO,IAAIH,MAAM,KAAKM,SAAS,EAAE;IACnC;EACF;EAEAL,OAAO,CAACG,MAAM,GAAG;IAAE,GAAGH,OAAO,CAACG,MAAM;IAAEC,eAAe,EAAEL;EAAO,CAAC;AACjE,CAAC;AAED,SAASD,mBAAmB","ignoreList":[]}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ /** The part of expo-secure-store the storage needs; the host app passes the module in. */
4
+
5
+ /** Expo warns past 2048 bytes per value; 1024 UTF-16 units stays under it for any text. */
6
+ const CHUNK_LENGTH = 1024;
7
+ const KEY_UNSAFE_CHARACTERS = /[^\w.-]/g;
8
+
9
+ /** Splits each value across numbered entries and keeps the count under the key itself. */
10
+ class SecureStoreStorage {
11
+ constructor(store, options) {
12
+ this.store = store;
13
+ this.options = options;
14
+ }
15
+ async getItem(key) {
16
+ try {
17
+ return await this.read(safeKey(key));
18
+ } catch {
19
+ // A locked keychain rejects reads before first unlock; that is not a missing value to delete.
20
+ return null;
21
+ }
22
+ }
23
+ async setItem(key, value) {
24
+ const base = safeKey(key);
25
+ const previousCount = await this.chunkCount(base);
26
+ const chunks = splitIntoChunks(value);
27
+ await Promise.all(chunks.map((chunk, index) => this.store.setItemAsync(chunkKey(base, index), chunk, this.options)));
28
+ await this.store.setItemAsync(base, String(chunks.length), this.options);
29
+ await this.deleteChunks(base, chunks.length, previousCount);
30
+ }
31
+ async removeItem(key) {
32
+ const base = safeKey(key);
33
+ const count = await this.chunkCount(base);
34
+ await this.store.deleteItemAsync(base, this.options);
35
+ await this.deleteChunks(base, 0, count);
36
+ }
37
+ async read(base) {
38
+ const count = await this.chunkCount(base);
39
+ const chunks = await Promise.all(indexes(0, count).map(index => this.store.getItemAsync(chunkKey(base, index), this.options)));
40
+ const complete = count > 0 && chunks.every(chunk => chunk !== null);
41
+ return complete ? chunks.join("") : null;
42
+ }
43
+ async chunkCount(base) {
44
+ const raw = await this.store.getItemAsync(base, this.options);
45
+ const count = Number(raw);
46
+ return raw !== null && Number.isInteger(count) && count > 0 ? count : 0;
47
+ }
48
+ async deleteChunks(base, from, to) {
49
+ await Promise.all(indexes(from, to).map(index => this.store.deleteItemAsync(chunkKey(base, index), this.options)));
50
+ }
51
+ }
52
+ const safeKey = key => key.replace(KEY_UNSAFE_CHARACTERS, "_");
53
+ const chunkKey = (base, index) => `${base}.${index}`;
54
+ const indexes = (from, to) => Array.from({
55
+ length: Math.max(0, to - from)
56
+ }, (_, offset) => from + offset);
57
+
58
+ /** Never ends a chunk inside a surrogate pair, so each stored entry is valid text. */
59
+ const splitIntoChunks = value => {
60
+ const chunks = [];
61
+ for (let start = 0; start < value.length || chunks.length === 0;) {
62
+ const end = Math.min(start + CHUNK_LENGTH, value.length);
63
+ const splitsPair = end < value.length && isHighSurrogate(value.charCodeAt(end - 1));
64
+ const safeEnd = splitsPair ? end - 1 : end;
65
+ chunks.push(value.slice(start, safeEnd));
66
+ start = safeEnd;
67
+ }
68
+ return chunks;
69
+ };
70
+ const isHighSurrogate = code => code >= 0xd800 && code <= 0xdbff;
71
+ export { SecureStoreStorage };
72
+ //# sourceMappingURL=secure-store-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CHUNK_LENGTH","KEY_UNSAFE_CHARACTERS","SecureStoreStorage","constructor","store","options","getItem","key","read","safeKey","setItem","value","base","previousCount","chunkCount","chunks","splitIntoChunks","Promise","all","map","chunk","index","setItemAsync","chunkKey","String","length","deleteChunks","removeItem","count","deleteItemAsync","indexes","getItemAsync","complete","every","join","raw","Number","isInteger","from","to","replace","Array","Math","max","_","offset","start","end","min","splitsPair","isHighSurrogate","charCodeAt","safeEnd","push","slice","code"],"sourceRoot":"../../../../src","sources":["modules/next/secure-store-storage.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAGxE;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAEjC;IAEF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAoB;IACtD,SAAS,CAAC,WAAW,EAAE,eAAe,CAAyB;IAE/D;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,SAAU;gBAExB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;IA4B9E;;;;;OAKG;IACH,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAanD;IAEF;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,GAC7B,MAAM,4BAA4B,CAChC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,KACA,4BAA4B,CAC7B,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,CASC;IAEF;;;;;;OAMG;IAEH,OAAO,CAAC,eAAe;CA6CxB"}
1
+ {"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAMxE;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAEjC;IAEF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAA0B;IAC5D,SAAS,CAAC,WAAW,EAAE,eAAe,CAAyB;IAE/D;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,SAAU;gBAExB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;IA6B9E;;;;;OAKG;IACH,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAanD;IAEF;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,GAC7B,MAAM,4BAA4B,CAChC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,KACA,4BAA4B,CAC7B,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,CASC;IAEF;;;;;;OAMG;IAEH,OAAO,CAAC,eAAe;CA6CxB"}
@@ -1,21 +1,11 @@
1
1
  import { IService } from "../../../types/service.type";
2
+ declare const BC01_UART_SERVICE_UUID = "49535343-fe7d-4ae5-8fa9-9fafd205e455";
3
+ declare const bc01MainServices: IService[];
2
4
  /**
3
- * Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
4
- *
5
- * The BC401 uses Contec's proprietary FF12 service, shared across their
6
- * consumer medical devices. Every stored urine-strip measurement is pushed as a
7
- * 16-byte record on 0xFF02 after the host has walked the handshake documented
8
- * in `bc01-command-sequencer.ts`.
9
- *
10
- * Service 0xFF12
11
- * Notify (result) 0xFF02 — CCCD 0x2902 must be written 01 00 to enable
12
- * Write (command) 0xFF01 — RESET / SET_TIME / GET_COUNT / GET_RECORDS
13
- *
14
- * On the wire a stored URS record opens with 0xE1 (single) or 0xE2 (paginated).
15
- * The remaining fifteen bytes carry the flags nibble, timestamp, seven bytes of
16
- * packed 3-bit analyte indices, and a checksum. `bc01-frame-parser.ts` decodes
17
- * them; this file just declares the GATT surface and hands every E1/E2 frame
18
- * to the driver's dependent-result path so the parser can run.
5
+ * Select the advertised profile, preferring the existing FF12 protocol when
6
+ * a peripheral advertises both. Devices without an advertisement keep the
7
+ * established FF12 behavior.
19
8
  */
20
- export declare const bc01MainServices: IService[];
9
+ declare const selectBc01MainService: (advertisedServiceUuids: readonly string[] | null | undefined) => IService;
10
+ export { BC01_UART_SERVICE_UUID, bc01MainServices, selectBc01MainService, };
21
11
  //# sourceMappingURL=bc01.main-services.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAgDtC,CAAC"}
1
+ {"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAyBvD,QAAA,MAAM,sBAAsB,yCACY,CAAC;AAEzC,QAAA,MAAM,gBAAgB,EAAE,QAAQ,EA6E/B,CAAC;AAgBF;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,GACzB,wBAAwB,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,KAC3D,QASF,CAAC;AAEF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "@ovok/core/next";
2
+ export { Ovok } from "./ovok";
3
+ export type { OvokNativeConfig } from "./ovok";
4
+ export type { RandomValuesSource } from "./random-values";
5
+ export { SecureStoreStorage } from "./secure-store-storage";
6
+ export type { OvokSecureStore } from "./secure-store-storage";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Ovok as CoreOvok } from "@ovok/core/next";
2
+ import type { RandomValuesSource } from "./random-values";
3
+ import type { OvokSecureStore } from "./secure-store-storage";
4
+ import type { OvokConfig } from "@ovok/core/next";
5
+ type UserClientConfig = Extract<OvokConfig, {
6
+ clientSecret?: undefined;
7
+ }>;
8
+ /** No clientSecret: anything shipped inside an app can be extracted from it. */
9
+ type OvokNativeConfig = Omit<UserClientConfig, "storage" | "clientSecret"> & {
10
+ secureStore: OvokSecureStore;
11
+ secureStoreOptions?: Record<string, unknown>;
12
+ getRandomValues?: RandomValuesSource;
13
+ };
14
+ /** The @ovok/core/next client with the session kept in the device's secure store. */
15
+ declare class Ovok extends CoreOvok {
16
+ constructor(config: OvokNativeConfig);
17
+ }
18
+ export { Ovok };
19
+ export type { OvokNativeConfig };
20
+ //# sourceMappingURL=ovok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ovok.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/ovok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,YAAY,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAE1E,gFAAgF;AAChF,KAAK,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,cAAc,CAAC,GAAG;IAC3E,WAAW,EAAE,eAAe,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC,CAAC;AAEF,qFAAqF;AACrF,cAAM,IAAK,SAAQ,QAAQ;gBACb,MAAM,EAAE,gBAAgB;CAUrC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAChB,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ type RandomValuesSource = (array: Uint8Array) => Uint8Array;
2
+ type RandomValuesRuntime = {
3
+ crypto?: {
4
+ getRandomValues?: unknown;
5
+ };
6
+ };
7
+ /** Hermes has no crypto.getRandomValues, and PKCE sign-in needs it; an existing one always wins. */
8
+ declare const installRandomValues: (source: RandomValuesSource | undefined, runtime?: RandomValuesRuntime) => void;
9
+ export { installRandomValues };
10
+ export type { RandomValuesSource };
11
+ //# sourceMappingURL=random-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-values.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/random-values.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAC;AAE5D,KAAK,mBAAmB,GAAG;IAAE,MAAM,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC;AAEtE,oGAAoG;AACpG,QAAA,MAAM,mBAAmB,GACvB,QAAQ,kBAAkB,GAAG,SAAS,EACtC,UAAS,mBAAuD,KAC/D,IAQF,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { OvokStorage } from "@ovok/core/next";
2
+ /** The part of expo-secure-store the storage needs; the host app passes the module in. */
3
+ interface OvokSecureStore {
4
+ getItemAsync: (key: string, options?: Record<string, unknown>) => Promise<string | null>;
5
+ setItemAsync: (key: string, value: string, options?: Record<string, unknown>) => Promise<void>;
6
+ deleteItemAsync: (key: string, options?: Record<string, unknown>) => Promise<void>;
7
+ }
8
+ /** Splits each value across numbered entries and keeps the count under the key itself. */
9
+ declare class SecureStoreStorage implements OvokStorage {
10
+ private readonly store;
11
+ private readonly options?;
12
+ constructor(store: OvokSecureStore, options?: Record<string, unknown> | undefined);
13
+ getItem(key: string): Promise<string | null>;
14
+ setItem(key: string, value: string): Promise<void>;
15
+ removeItem(key: string): Promise<void>;
16
+ private read;
17
+ private chunkCount;
18
+ private deleteChunks;
19
+ }
20
+ export { SecureStoreStorage };
21
+ export type { OvokSecureStore };
22
+ //# sourceMappingURL=secure-store-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-store-storage.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/secure-store-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,0FAA0F;AAC1F,UAAU,eAAe;IACvB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzF,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAMD,0FAA0F;AAC1F,cAAM,kBAAmB,YAAW,WAAW;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBADR,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAG9C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ9B,IAAI;YAYJ,UAAU;YAOV,YAAY;CAG3B;AA2BD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAGxE;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAEjC;IAEF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAoB;IACtD,SAAS,CAAC,WAAW,EAAE,eAAe,CAAyB;IAE/D;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,SAAU;gBAExB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;IA4B9E;;;;;OAKG;IACH,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAanD;IAEF;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,GAC7B,MAAM,4BAA4B,CAChC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,KACA,4BAA4B,CAC7B,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,CASC;IAEF;;;;;;OAMG;IAEH,OAAO,CAAC,eAAe;CA6CxB"}
1
+ {"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAMxE;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAEjC;IAEF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAA0B;IAC5D,SAAS,CAAC,WAAW,EAAE,eAAe,CAAyB;IAE/D;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,SAAU;gBAExB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;IA6B9E;;;;;OAKG;IACH,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAanD;IAEF;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,GAC7B,MAAM,4BAA4B,CAChC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,KACA,4BAA4B,CAC7B,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,CASC;IAEF;;;;;;OAMG;IAEH,OAAO,CAAC,eAAe;CA6CxB"}
@@ -1,21 +1,11 @@
1
1
  import { IService } from "../../../types/service.type";
2
+ declare const BC01_UART_SERVICE_UUID = "49535343-fe7d-4ae5-8fa9-9fafd205e455";
3
+ declare const bc01MainServices: IService[];
2
4
  /**
3
- * Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
4
- *
5
- * The BC401 uses Contec's proprietary FF12 service, shared across their
6
- * consumer medical devices. Every stored urine-strip measurement is pushed as a
7
- * 16-byte record on 0xFF02 after the host has walked the handshake documented
8
- * in `bc01-command-sequencer.ts`.
9
- *
10
- * Service 0xFF12
11
- * Notify (result) 0xFF02 — CCCD 0x2902 must be written 01 00 to enable
12
- * Write (command) 0xFF01 — RESET / SET_TIME / GET_COUNT / GET_RECORDS
13
- *
14
- * On the wire a stored URS record opens with 0xE1 (single) or 0xE2 (paginated).
15
- * The remaining fifteen bytes carry the flags nibble, timestamp, seven bytes of
16
- * packed 3-bit analyte indices, and a checksum. `bc01-frame-parser.ts` decodes
17
- * them; this file just declares the GATT surface and hands every E1/E2 frame
18
- * to the driver's dependent-result path so the parser can run.
5
+ * Select the advertised profile, preferring the existing FF12 protocol when
6
+ * a peripheral advertises both. Devices without an advertisement keep the
7
+ * established FF12 behavior.
19
8
  */
20
- export declare const bc01MainServices: IService[];
9
+ declare const selectBc01MainService: (advertisedServiceUuids: readonly string[] | null | undefined) => IService;
10
+ export { BC01_UART_SERVICE_UUID, bc01MainServices, selectBc01MainService, };
21
11
  //# sourceMappingURL=bc01.main-services.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAgDtC,CAAC"}
1
+ {"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAyBvD,QAAA,MAAM,sBAAsB,yCACY,CAAC;AAEzC,QAAA,MAAM,gBAAgB,EAAE,QAAQ,EA6E/B,CAAC;AAgBF;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,GACzB,wBAAwB,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,KAC3D,QASF,CAAC;AAEF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "@ovok/core/next";
2
+ export { Ovok } from "./ovok";
3
+ export type { OvokNativeConfig } from "./ovok";
4
+ export type { RandomValuesSource } from "./random-values";
5
+ export { SecureStoreStorage } from "./secure-store-storage";
6
+ export type { OvokSecureStore } from "./secure-store-storage";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Ovok as CoreOvok } from "@ovok/core/next";
2
+ import type { RandomValuesSource } from "./random-values";
3
+ import type { OvokSecureStore } from "./secure-store-storage";
4
+ import type { OvokConfig } from "@ovok/core/next";
5
+ type UserClientConfig = Extract<OvokConfig, {
6
+ clientSecret?: undefined;
7
+ }>;
8
+ /** No clientSecret: anything shipped inside an app can be extracted from it. */
9
+ type OvokNativeConfig = Omit<UserClientConfig, "storage" | "clientSecret"> & {
10
+ secureStore: OvokSecureStore;
11
+ secureStoreOptions?: Record<string, unknown>;
12
+ getRandomValues?: RandomValuesSource;
13
+ };
14
+ /** The @ovok/core/next client with the session kept in the device's secure store. */
15
+ declare class Ovok extends CoreOvok {
16
+ constructor(config: OvokNativeConfig);
17
+ }
18
+ export { Ovok };
19
+ export type { OvokNativeConfig };
20
+ //# sourceMappingURL=ovok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ovok.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/ovok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,YAAY,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAE1E,gFAAgF;AAChF,KAAK,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,cAAc,CAAC,GAAG;IAC3E,WAAW,EAAE,eAAe,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC,CAAC;AAEF,qFAAqF;AACrF,cAAM,IAAK,SAAQ,QAAQ;gBACb,MAAM,EAAE,gBAAgB;CAUrC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAChB,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ type RandomValuesSource = (array: Uint8Array) => Uint8Array;
2
+ type RandomValuesRuntime = {
3
+ crypto?: {
4
+ getRandomValues?: unknown;
5
+ };
6
+ };
7
+ /** Hermes has no crypto.getRandomValues, and PKCE sign-in needs it; an existing one always wins. */
8
+ declare const installRandomValues: (source: RandomValuesSource | undefined, runtime?: RandomValuesRuntime) => void;
9
+ export { installRandomValues };
10
+ export type { RandomValuesSource };
11
+ //# sourceMappingURL=random-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-values.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/random-values.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAC;AAE5D,KAAK,mBAAmB,GAAG;IAAE,MAAM,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC;AAEtE,oGAAoG;AACpG,QAAA,MAAM,mBAAmB,GACvB,QAAQ,kBAAkB,GAAG,SAAS,EACtC,UAAS,mBAAuD,KAC/D,IAQF,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { OvokStorage } from "@ovok/core/next";
2
+ /** The part of expo-secure-store the storage needs; the host app passes the module in. */
3
+ interface OvokSecureStore {
4
+ getItemAsync: (key: string, options?: Record<string, unknown>) => Promise<string | null>;
5
+ setItemAsync: (key: string, value: string, options?: Record<string, unknown>) => Promise<void>;
6
+ deleteItemAsync: (key: string, options?: Record<string, unknown>) => Promise<void>;
7
+ }
8
+ /** Splits each value across numbered entries and keeps the count under the key itself. */
9
+ declare class SecureStoreStorage implements OvokStorage {
10
+ private readonly store;
11
+ private readonly options?;
12
+ constructor(store: OvokSecureStore, options?: Record<string, unknown> | undefined);
13
+ getItem(key: string): Promise<string | null>;
14
+ setItem(key: string, value: string): Promise<void>;
15
+ removeItem(key: string): Promise<void>;
16
+ private read;
17
+ private chunkCount;
18
+ private deleteChunks;
19
+ }
20
+ export { SecureStoreStorage };
21
+ export type { OvokSecureStore };
22
+ //# sourceMappingURL=secure-store-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-store-storage.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/next/secure-store-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,0FAA0F;AAC1F,UAAU,eAAe;IACvB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzF,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAMD,0FAA0F;AAC1F,cAAM,kBAAmB,YAAW,WAAW;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBADR,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAG9C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ9B,IAAI;YAYJ,UAAU;YAOV,YAAY;CAG3B;AA2BD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ovok/native",
3
- "version": "1.16.1-dev.2087+a4df79d",
3
+ "version": "1.16.1-dev.2091+a6bf180",
4
4
  "description": "React native component sdk for OVOK",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",
@@ -106,7 +106,7 @@
106
106
  "@medplum/react-hooks": "3.2.23",
107
107
  "@opentelemetry/api": "^1.9.1",
108
108
  "@opentelemetry/api-logs": "^0.222.0",
109
- "@ovok/core": "^0.4.48",
109
+ "@ovok/core": "0.4.49-dev.496",
110
110
  "@react-native-community/datetimepicker": "^9.1.0",
111
111
  "@react-native-community/netinfo": "^12.0.1",
112
112
  "@react-native-google-signin/google-signin": "^16.1.2",
@@ -186,7 +186,7 @@
186
186
  "@kingstinct/react-native-healthkit": "*",
187
187
  "@opentelemetry/api": "^1.9.1",
188
188
  "@opentelemetry/api-logs": "^0.222.0",
189
- "@ovok/core": ">=0.4.48 || >=0.4.49-0",
189
+ "@ovok/core": ">=0.4.49-dev.496 || >=0.4.49-0",
190
190
  "@react-native-community/datetimepicker": "*",
191
191
  "@react-native-community/netinfo": "*",
192
192
  "@react-native-google-signin/google-signin": "*",