@appeeky/expo-healthkit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,22 @@
1
+ {
2
+ "branches": ["main"],
3
+ "plugins": [
4
+ "@semantic-release/commit-analyzer",
5
+ "@semantic-release/release-notes-generator",
6
+ [
7
+ "@semantic-release/changelog",
8
+ {
9
+ "changelogFile": "CHANGELOG.md"
10
+ }
11
+ ],
12
+ "@semantic-release/npm",
13
+ "@semantic-release/github",
14
+ [
15
+ "@semantic-release/git",
16
+ {
17
+ "assets": ["CHANGELOG.md", "package.json", "package-lock.json"],
18
+ "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
19
+ }
20
+ ]
21
+ ]
22
+ }
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [0.2.0](https://github.com/appeeky/expo-healthkit/compare/v0.1.1...v0.2.0) (2026-09-09)
2
+
3
+
4
+ ### Features
5
+
6
+ * **ios:** deliver HealthKit background updates before JS starts and hold the completion handler ([6ac0e6f](https://github.com/appeeky/expo-healthkit/commit/6ac0e6fde217940f3e89a7cd5ff64c68a12a0b2b))
7
+
8
+ ## [0.1.1](https://github.com/appeeky/expo-healthkit/compare/v0.1.0...v0.1.1) (2026-09-05)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * use local datetime for Health Connect daily statistics ([d01e776](https://github.com/appeeky/expo-healthkit/commit/d01e776398fb7f45b2b4c0401593a871f03bb700))
14
+
1
15
  # Changelog
2
16
 
3
17
  ## 0.1.0
@@ -22,5 +36,5 @@
22
36
  - Published as [`@appeeky/expo-healthkit`](https://www.npmjs.com/package/@appeeky/expo-healthkit)
23
37
  - npm-ready `exports`, `.npmignore`, and `prepublishOnly` build
24
38
  - App Store privacy manifest (`PrivacyInfo.xcprivacy`)
25
- - GitHub Actions for lint, typecheck, tests with coverage thresholds, and pack contents
39
+ - GitHub Actions for lint, typecheck, tests with coverage thresholds, pack contents, and automated semver releases to npm
26
40
  - [PolyForm Shield 1.0.0](./LICENSE) (source-available; apps may use the SDK, competing SDKs may not)
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
- ![HealthKit and Health Connect for Expo](https://raw.githubusercontent.com/appeeky/expo-healthkit/main/docs/banner.jpg)
1
+ <img width="1024" height="725" alt="image" src="https://github.com/user-attachments/assets/fadcd831-4187-42b1-b03b-3228ab2d8f32" />
2
+
2
3
 
3
4
  # @appeeky/expo-healthkit
4
5
 
@@ -251,8 +252,10 @@ await HealthKit.deleteObjects({
251
252
  ```ts
252
253
  await HealthKit.observe([HealthKit.QuantityType.stepCount]);
253
254
 
254
- const subscription = HealthKit.addUpdateListener(({ type }) => {
255
- // Re-query that type
255
+ const subscription = HealthKit.addUpdateListener(async ({ type }) => {
256
+ // Re-query that type. Return a promise: iOS keeps the app alive and holds
257
+ // the HealthKit completion handler until it settles (~25s cap).
258
+ await syncSteps();
256
259
  });
257
260
 
258
261
  await HealthKit.enableBackgroundDelivery(
@@ -265,6 +268,12 @@ await HealthKit.enableBackgroundDelivery(
265
268
 
266
269
  Background delivery needs `isBackgroundDeliveryEnabled: true` on the config plugin and the HealthKit background mode.
267
270
 
271
+ **Killed-app relaunch.** Types passed to `observe` are persisted natively. When iOS relaunches the app in the background for a HealthKit delivery, the observer queries are re-registered in `didFinishLaunching` (via an Expo AppDelegate subscriber), before the JS runtime boots. The delivery is queued until JS calls `addUpdateListener`, then dispatched. Register your listener at module scope (or early in the root component) so it exists on cold start; `getObservedTypes()` tells you what is already being observed. `clearObservers()` stops and forgets them.
272
+
273
+ **Apple limits.** Step count, distance, energy, exercise/stand time and similar activity types are delivered at most **once per hour** regardless of `UpdateFrequency`; heart rate, sleep, workouts and body measurements are not capped. Each delivery gets ~30 s of background time; the library completes at 25 s if your listener hasn't. The Simulator never relaunches a killed app for HealthKit — test on a device.
274
+
275
+ **Debugging.** Native logs are under the `expo-healthkit` `os_log` subsystem (`restore`, `delivery`, `complete reason=js|timeout`). Full guide with a device test recipe: [`.cursor/skills/expo-healthkit/background-delivery.md`](.cursor/skills/expo-healthkit/background-delivery.md).
276
+
268
277
  ## 🏷️ Identifiers
269
278
 
270
279
  Pass Apple's raw identifier strings. Named constants are provided for autocomplete; unknown identifiers still work if HealthKit knows them.
@@ -334,7 +343,7 @@ These throw `ERR_HEALTH_CONNECT_UNSUPPORTED` on Android. Health Connect has no e
334
343
  | `queryWorkoutRoute` | Workout GPS polylines |
335
344
  | `queryHeartbeatSeries` | Beat-to-beat series |
336
345
  | `getBiologicalSex`, `getBloodType`, `getDateOfBirth`, `getFitzpatrickSkinType`, `getWheelchairUse` | HealthKit characteristics |
337
- | `observe`, `enableBackgroundDelivery` | HealthKit observer queries / background delivery |
346
+ | `observe`, `getObservedTypes`, `enableBackgroundDelivery` | HealthKit observer queries / background delivery |
338
347
 
339
348
  ### Behavioral differences
340
349
 
@@ -395,6 +404,21 @@ Copy [`.cursor/skills/expo-healthkit/`](https://github.com/appeeky/expo-healthki
395
404
 
396
405
  The skill tells the agent to pass Apple identifier strings through one query/save API on iOS and Android, request every type in `toRead`, and rebuild native code after Swift, Kotlin, or plugin changes.
397
406
 
407
+ ## 🚀 Releases
408
+
409
+ Versions follow [semver](https://semver.org/). Pushing to `main` with a [Conventional Commit](https://www.conventionalcommits.org/) runs `.github/workflows/release.yml`: bump `package.json`, update `CHANGELOG.md`, GitHub Release, and `npm publish`.
410
+
411
+ | Commit | npm bump |
412
+ | --- | --- |
413
+ | `fix: …` | patch (`0.1.0` → `0.1.1`) |
414
+ | `feat: …` | minor (`0.1.0` → `0.2.0`) |
415
+ | `feat!: …` or `BREAKING CHANGE:` in the body | major (`0.1.0` → `1.0.0`) |
416
+ | `docs:`, `chore:`, `ci:`, `test:` | no release |
417
+
418
+ Squash-merge PRs so the merge commit (or PR title) starts with `fix:` / `feat:`. `chore:` and `ci:` do not publish.
419
+
420
+ npm publishes from GitHub Actions via [trusted publishing](https://docs.npmjs.com/trusted-publishers) (no `NPM_TOKEN`). One-time setup: package Settings → Trusted Publisher → GitHub Actions, repository `appeeky/expo-healthkit`, workflow filename `release.yml`, and allow **`npm publish`** (not only staged publish).
421
+
398
422
  ## 🤝 Contributing
399
423
 
400
424
  Issues and pull requests are welcome. Contributions are licensed under [PolyForm Shield 1.0.0](./LICENSE).
@@ -438,7 +462,7 @@ npx expo run:android
438
462
 
439
463
  ### Docs
440
464
 
441
- If the public API or Android mapping changes, update `README.md`, `CHANGELOG.md`, and `.cursor/skills/expo-healthkit/` (`SKILL.md`, `reference.md`, `examples.md`) in the same PR.
465
+ If the public API or Android mapping changes, update `README.md` and `.cursor/skills/expo-healthkit/` (`SKILL.md`, `reference.md`, `examples.md`) in the same PR. `CHANGELOG.md` is generated on release from conventional commits.
442
466
 
443
467
  ## 🔒 Privacy
444
468
 
@@ -450,4 +474,4 @@ Health data stays on-device unless your app uploads it. Request only the types y
450
474
 
451
475
  You **can** install and use this SDK inside your own Expo / React Native apps, including commercial products.
452
476
 
453
- You **cannot** copy this SDK and sell, publish, or otherwise offer a competing HealthKit / Health Connect library based on it.
477
+ You **cannot** copy this SDK and sell, publish, or otherwise offer a competing HealthKit / Health Connect library based on it.
@@ -169,6 +169,14 @@ class ExpoHealthKitModule : Module() {
169
169
  AsyncFunction("clearObserverQueries") {
170
170
  Unit
171
171
  }
172
+
173
+ AsyncFunction("getObservedTypes") {
174
+ emptyList<String>()
175
+ }
176
+
177
+ AsyncFunction("completeUpdate") { _: String ->
178
+ Unit
179
+ }
172
180
  }
173
181
 
174
182
  private suspend fun requestHealthPermissions(permissions: Set<String>): Set<String> {
@@ -47,6 +47,7 @@ import androidx.health.connect.client.units.Temperature
47
47
  import androidx.health.connect.client.units.Volume
48
48
  import java.time.Duration
49
49
  import java.time.Instant
50
+ import java.time.LocalDateTime
50
51
  import java.time.Period
51
52
  import java.time.ZoneId
52
53
  import java.time.ZoneOffset
@@ -124,9 +125,9 @@ internal class HealthConnectService(
124
125
  HealthConnectMapping.SLEEP -> {
125
126
  val sessions = readAll(SleepSessionRecord::class, filter, ascending, 0)
126
127
  val samples = sessions.flatMap { session -> sleepSamples(session) }
127
- applyLimit(if (ascending) samples else samples.reversed(), limit)
128
+ applyLimit(sortSamples(samples, ascending), limit)
128
129
  }
129
- else -> throw InvalidIdentifierException(type)
130
+ else -> throw HealthConnectUnsupportedException(type)
130
131
  }
131
132
  }
132
133
 
@@ -205,7 +206,7 @@ internal class HealthConnectService(
205
206
  correlation(record.metadata, type, record.startTime, record.endTime, objects)
206
207
  }
207
208
  }
208
- else -> throw InvalidIdentifierException(type)
209
+ else -> unmappedType(type)
209
210
  }
210
211
  }
211
212
 
@@ -255,7 +256,7 @@ internal class HealthConnectService(
255
256
  else -> Period.ofDays(1)
256
257
  }
257
258
  client().aggregateGroupByPeriod(
258
- AggregateGroupByPeriodRequest(metrics, filter, period)
259
+ AggregateGroupByPeriodRequest(metrics, localTimeFilter(options), period)
259
260
  ).map { result ->
260
261
  val start = result.startTime.atZone(ZoneId.systemDefault()).toInstant()
261
262
  val end = result.endTime.atZone(ZoneId.systemDefault()).toInstant()
@@ -268,7 +269,7 @@ internal class HealthConnectService(
268
269
  assertAvailable()
269
270
  val type = requiredString(options, "type")
270
271
  val unit = options["unit"] as? String ?: ""
271
- val recordClass = HealthConnectMapping.recordClass(type) ?: throw InvalidIdentifierException(type)
272
+ val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
272
273
  val anchor = options["anchor"] as? String
273
274
  val client = client()
274
275
  if (anchor.isNullOrBlank()) {
@@ -433,7 +434,7 @@ internal class HealthConnectService(
433
434
  val range = ensureRange(start, end)
434
435
  HealthConnectNutrition.build(range.first, range.second, zoneOffset(range.first), zoneOffset(range.second), metadata(), values)
435
436
  }
436
- else -> throw InvalidIdentifierException(type)
437
+ else -> unmappedType(type)
437
438
  }
438
439
  return client().insertRecords(listOf(record)).recordIdsList.first()
439
440
  }
@@ -441,7 +442,7 @@ internal class HealthConnectService(
441
442
  suspend fun deleteObjects(options: Map<String, Any?>): Int {
442
443
  assertAvailable()
443
444
  val type = options["type"] as? String ?: throw MissingDeleteTypeException()
444
- val recordClass = HealthConnectMapping.recordClass(type) ?: throw InvalidIdentifierException(type)
445
+ val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
445
446
  val uuid = options["uuid"] as? String
446
447
  val client = client()
447
448
  if (!uuid.isNullOrBlank()) {
@@ -485,14 +486,22 @@ internal class HealthConnectService(
485
486
  }
486
487
  HealthConnectMapping.BASAL_ENERGY -> emptyList()
487
488
  else -> {
488
- val recordClass = HealthConnectMapping.recordClass(type) ?: throw InvalidIdentifierException(type)
489
+ val recordClass = HealthConnectMapping.recordClass(type) ?: unmappedType(type)
489
490
  readAll(recordClass, filter, ascending, 0).flatMap { record ->
490
491
  quantitySamplesFromRecord(type, unit, record)
491
492
  }
492
493
  }
493
494
  }
494
- val ordered = if (ascending) samples else samples.reversed()
495
- return applyLimit(ordered, limit)
495
+ // `readAll` already honours `ascending` at the record level, but flattened
496
+ // records (heart rate series) can interleave, so sort explicitly by start date.
497
+ return applyLimit(sortSamples(samples, ascending), limit)
498
+ }
499
+
500
+ private fun sortSamples(samples: List<Map<String, Any?>>, ascending: Boolean): List<Map<String, Any?>> {
501
+ val sorted = samples.sortedBy { sample ->
502
+ (sample["startDate"] as? String)?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: Instant.EPOCH
503
+ }
504
+ return if (ascending) sorted else sorted.reversed()
496
505
  }
497
506
 
498
507
  private fun quantitySamplesFromRecord(type: String, unit: String, record: Record): List<Map<String, Any?>> {
@@ -1002,6 +1011,19 @@ internal class HealthConnectService(
1002
1011
  }
1003
1012
  }
1004
1013
 
1014
+ private fun localTimeFilter(options: Map<String, Any?>): TimeRangeFilter {
1015
+ val zone = ZoneId.systemDefault()
1016
+ val from = (options["from"] as? String)?.let { parseInstant(it).atZone(zone).toLocalDateTime() }
1017
+ val to = (options["to"] as? String)?.let { parseInstant(it).atZone(zone).toLocalDateTime() }
1018
+ return when {
1019
+ from != null && to != null ->
1020
+ TimeRangeFilter.between(from, if (to.isAfter(from)) to else from.plusSeconds(1))
1021
+ from != null -> TimeRangeFilter.after(from)
1022
+ to != null -> TimeRangeFilter.before(to)
1023
+ else -> TimeRangeFilter.after(LocalDateTime.ofInstant(Instant.EPOCH, zone))
1024
+ }
1025
+ }
1026
+
1005
1027
  private fun filterStart(options: Map<String, Any?>): Instant =
1006
1028
  (options["from"] as? String)?.let { parseInstant(it) } ?: Instant.EPOCH
1007
1029
 
@@ -1026,6 +1048,13 @@ internal class HealthConnectService(
1026
1048
  return start to end
1027
1049
  }
1028
1050
 
1051
+ private fun unmappedType(type: String): Nothing {
1052
+ if (type.startsWith("HK")) {
1053
+ throw HealthConnectUnsupportedException(type)
1054
+ }
1055
+ throw InvalidIdentifierException(type)
1056
+ }
1057
+
1029
1058
  private fun requiredString(options: Map<String, Any?>, key: String): String =
1030
1059
  options[key] as? String ?: throw InvalidIdentifierException(key)
1031
1060
 
@@ -33,6 +33,8 @@ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents
33
33
  disableAllBackgroundDelivery(): Promise<boolean>;
34
34
  observeTypes(types: string[]): Promise<void>;
35
35
  clearObserverQueries(): Promise<void>;
36
+ getObservedTypes(): Promise<string[]>;
37
+ completeUpdate(token: string): Promise<void>;
36
38
  }
37
39
  declare const _default: ExpoHealthKitModule;
38
40
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoHealthKitModule.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgF1C,MAAM,YAAY,GAAG,mBAAmB,CAAsB,eAAe,CAAC,CAAC;AAE/E,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QACnD,CAAC,CAAC,MAAM,CAAE,KAA2B,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,eAAe,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,YAAY,EAAE;IACrC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAY,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAI,KAA0C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/E,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF,CAAwB,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { HealthKitError } from './errors';\n\nimport type {\n ExpoHealthKitModuleEvents,\n NativeActivitySummary,\n NativeActivitySummaryQueryOptions,\n NativeAnchoredQueryOptions,\n NativeAnchoredQueryResult,\n NativeAudiogramSample,\n NativeAuthorizationOptions,\n NativeCategoryQueryOptions,\n NativeCategorySample,\n NativeCategorySampleInput,\n NativeClinicalRecord,\n NativeClinicalRecordQueryOptions,\n NativeCorrelation,\n NativeCorrelationInput,\n NativeCorrelationQueryOptions,\n NativeDateRangeQueryOptions,\n NativeDeleteObjectsOptions,\n NativeElectrocardiogramQueryOptions,\n NativeElectrocardiogramSample,\n NativeHeartbeatSeriesQueryOptions,\n NativeHeartbeatSeriesSample,\n NativeQuantityQueryOptions,\n NativeQuantitySample,\n NativeQuantitySampleInput,\n NativeStatistics,\n NativeStatisticsCollectionQueryOptions,\n NativeStatisticsQueryOptions,\n NativeWorkoutInput,\n NativeWorkoutQueryOptions,\n NativeWorkoutRoute,\n NativeWorkoutRouteQueryOptions,\n NativeWorkoutSample,\n} from './types';\n\ndeclare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean;\n requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;\n getAuthorizationStatus(identifier: string): Promise<number>;\n getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;\n queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;\n queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;\n queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;\n queryElectrocardiograms(\n options: NativeElectrocardiogramQueryOptions\n ): Promise<NativeElectrocardiogramSample[]>;\n queryActivitySummaries(\n options: NativeActivitySummaryQueryOptions\n ): Promise<NativeActivitySummary[]>;\n queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;\n queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;\n queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;\n queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;\n queryHeartbeatSeries(\n options: NativeHeartbeatSeriesQueryOptions\n ): Promise<NativeHeartbeatSeriesSample[]>;\n queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;\n queryStatisticsCollection(\n options: NativeStatisticsCollectionQueryOptions\n ): Promise<NativeStatistics[]>;\n queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;\n saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;\n saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;\n saveWorkout(workout: NativeWorkoutInput): Promise<string>;\n saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;\n deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;\n getBiologicalSex(): Promise<number>;\n getBloodType(): Promise<number>;\n getDateOfBirth(): Promise<string | null>;\n getFitzpatrickSkinType(): Promise<number>;\n getWheelchairUse(): Promise<number>;\n enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;\n disableBackgroundDelivery(type: string): Promise<boolean>;\n disableAllBackgroundDelivery(): Promise<boolean>;\n observeTypes(types: string[]): Promise<void>;\n clearObserverQueries(): Promise<void>;\n}\n\nconst nativeModule = requireNativeModule<ExpoHealthKitModule>('ExpoHealthKit');\n\nfunction rethrowAsHealthKitError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n const code =\n error && typeof error === 'object' && 'code' in error\n ? String((error as { code: unknown }).code)\n : 'ERR_HEALTHKIT';\n const wrapped = new HealthKitError(message, code);\n if (__DEV__) {\n console.warn(`[expo-healthkit] ${code}: ${message}`);\n }\n throw wrapped;\n}\n\nexport default new Proxy(nativeModule, {\n get(target, property, receiver) {\n const value = Reflect.get(target, property, receiver) as unknown;\n if (typeof value !== 'function') {\n return value;\n }\n return (...args: unknown[]) => {\n try {\n const result = (value as (...inner: unknown[]) => unknown).apply(target, args);\n if (result instanceof Promise) {\n return result.catch(rethrowAsHealthKitError);\n }\n return result;\n } catch (error) {\n rethrowAsHealthKitError(error);\n }\n };\n },\n}) as ExpoHealthKitModule;\n"]}
1
+ {"version":3,"file":"ExpoHealthKitModule.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAiF1C,MAAM,YAAY,GAAG,mBAAmB,CAAsB,eAAe,CAAC,CAAC;AAE/E,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QACnD,CAAC,CAAC,MAAM,CAAE,KAA2B,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,eAAe,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,YAAY,EAAE;IACrC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAY,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAI,KAA0C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/E,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF,CAAwB,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { HealthKitError } from './errors';\nimport type {\n ExpoHealthKitModuleEvents,\n NativeActivitySummary,\n NativeActivitySummaryQueryOptions,\n NativeAnchoredQueryOptions,\n NativeAnchoredQueryResult,\n NativeAudiogramSample,\n NativeAuthorizationOptions,\n NativeCategoryQueryOptions,\n NativeCategorySample,\n NativeCategorySampleInput,\n NativeClinicalRecord,\n NativeClinicalRecordQueryOptions,\n NativeCorrelation,\n NativeCorrelationInput,\n NativeCorrelationQueryOptions,\n NativeDateRangeQueryOptions,\n NativeDeleteObjectsOptions,\n NativeElectrocardiogramQueryOptions,\n NativeElectrocardiogramSample,\n NativeHeartbeatSeriesQueryOptions,\n NativeHeartbeatSeriesSample,\n NativeQuantityQueryOptions,\n NativeQuantitySample,\n NativeQuantitySampleInput,\n NativeStatistics,\n NativeStatisticsCollectionQueryOptions,\n NativeStatisticsQueryOptions,\n NativeWorkoutInput,\n NativeWorkoutQueryOptions,\n NativeWorkoutRoute,\n NativeWorkoutRouteQueryOptions,\n NativeWorkoutSample,\n} from './types';\n\ndeclare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean;\n requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;\n getAuthorizationStatus(identifier: string): Promise<number>;\n getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;\n queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;\n queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;\n queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;\n queryElectrocardiograms(\n options: NativeElectrocardiogramQueryOptions\n ): Promise<NativeElectrocardiogramSample[]>;\n queryActivitySummaries(\n options: NativeActivitySummaryQueryOptions\n ): Promise<NativeActivitySummary[]>;\n queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;\n queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;\n queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;\n queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;\n queryHeartbeatSeries(\n options: NativeHeartbeatSeriesQueryOptions\n ): Promise<NativeHeartbeatSeriesSample[]>;\n queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;\n queryStatisticsCollection(\n options: NativeStatisticsCollectionQueryOptions\n ): Promise<NativeStatistics[]>;\n queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;\n saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;\n saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;\n saveWorkout(workout: NativeWorkoutInput): Promise<string>;\n saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;\n deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;\n getBiologicalSex(): Promise<number>;\n getBloodType(): Promise<number>;\n getDateOfBirth(): Promise<string | null>;\n getFitzpatrickSkinType(): Promise<number>;\n getWheelchairUse(): Promise<number>;\n enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;\n disableBackgroundDelivery(type: string): Promise<boolean>;\n disableAllBackgroundDelivery(): Promise<boolean>;\n observeTypes(types: string[]): Promise<void>;\n clearObserverQueries(): Promise<void>;\n getObservedTypes(): Promise<string[]>;\n completeUpdate(token: string): Promise<void>;\n}\n\nconst nativeModule = requireNativeModule<ExpoHealthKitModule>('ExpoHealthKit');\n\nfunction rethrowAsHealthKitError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n const code =\n error && typeof error === 'object' && 'code' in error\n ? String((error as { code: unknown }).code)\n : 'ERR_HEALTHKIT';\n const wrapped = new HealthKitError(message, code);\n if (__DEV__) {\n console.warn(`[expo-healthkit] ${code}: ${message}`);\n }\n throw wrapped;\n}\n\nexport default new Proxy(nativeModule, {\n get(target, property, receiver) {\n const value = Reflect.get(target, property, receiver) as unknown;\n if (typeof value !== 'function') {\n return value;\n }\n return (...args: unknown[]) => {\n try {\n const result = (value as (...inner: unknown[]) => unknown).apply(target, args);\n if (result instanceof Promise) {\n return result.catch(rethrowAsHealthKitError);\n }\n return result;\n } catch (error) {\n rethrowAsHealthKitError(error);\n }\n };\n },\n}) as ExpoHealthKitModule;\n"]}
@@ -33,6 +33,8 @@ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents
33
33
  disableAllBackgroundDelivery(): Promise<boolean>;
34
34
  observeTypes(): Promise<void>;
35
35
  clearObserverQueries(): Promise<void>;
36
+ getObservedTypes(): Promise<string[]>;
37
+ completeUpdate(): Promise<void>;
36
38
  }
37
39
  declare const _default: typeof ExpoHealthKitModule;
38
40
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoHealthKitModule.web.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,MAAM,CAAC;AAGvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAMzD,cAAM,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACvE,qBAAqB,IAAI,OAAO;IAI1B,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gCAAgC,IAAI,OAAO,CAAC,MAAM,CAAC;IAInD,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,uBAAuB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIxC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,yBAAyB,IAAI,OAAO,CAAC,KAAK,CAAC;IAI3C,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI5C,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5C;;AAED,wBAA6E"}
1
+ {"version":3,"file":"ExpoHealthKitModule.web.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,MAAM,CAAC;AAGvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAMzD,cAAM,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACvE,qBAAqB,IAAI,OAAO;IAI1B,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gCAAgC,IAAI,OAAO,CAAC,MAAM,CAAC;IAInD,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,uBAAuB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIxC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,yBAAyB,IAAI,OAAO,CAAC,KAAK,CAAC;IAI3C,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI5C,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIrC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CACtC;;AAED,wBAA6E"}
@@ -100,6 +100,10 @@ class ExpoHealthKitModule extends NativeModule {
100
100
  async clearObserverQueries() {
101
101
  return unavailable();
102
102
  }
103
+ async getObservedTypes() {
104
+ return [];
105
+ }
106
+ async completeUpdate() { }
103
107
  }
104
108
  export default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');
105
109
  //# sourceMappingURL=ExpoHealthKitModule.web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoHealthKitModule.web.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeModule, registerWebModule } from 'expo';\n\nimport { HealthKitUnavailableError } from './errors';\nimport type { ExpoHealthKitModuleEvents } from './types';\n\nfunction unavailable(): never {\n throw new HealthKitUnavailableError();\n}\n\nclass ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean {\n return false;\n }\n\n async requestAuthorization(): Promise<boolean> {\n return unavailable();\n }\n\n async getAuthorizationStatus(): Promise<number> {\n return unavailable();\n }\n\n async getRequestStatusForAuthorization(): Promise<number> {\n return unavailable();\n }\n\n async queryQuantitySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryCategorySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkouts(): Promise<never> {\n return unavailable();\n }\n\n async queryElectrocardiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryActivitySummaries(): Promise<never> {\n return unavailable();\n }\n\n async queryClinicalRecords(): Promise<never> {\n return unavailable();\n }\n\n async queryAudiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkoutRoute(): Promise<never> {\n return unavailable();\n }\n\n async queryCorrelations(): Promise<never> {\n return unavailable();\n }\n\n async queryHeartbeatSeries(): Promise<never> {\n return unavailable();\n }\n\n async queryStatistics(): Promise<never> {\n return unavailable();\n }\n\n async queryStatisticsCollection(): Promise<never> {\n return unavailable();\n }\n\n async queryAnchored(): Promise<never> {\n return unavailable();\n }\n\n async saveQuantitySample(): Promise<string> {\n return unavailable();\n }\n\n async saveCategorySample(): Promise<string> {\n return unavailable();\n }\n\n async saveWorkout(): Promise<string> {\n return unavailable();\n }\n\n async saveCorrelation(): Promise<string> {\n return unavailable();\n }\n\n async deleteObjects(): Promise<number> {\n return unavailable();\n }\n\n async getBiologicalSex(): Promise<number> {\n return unavailable();\n }\n\n async getBloodType(): Promise<number> {\n return unavailable();\n }\n\n async getDateOfBirth(): Promise<string | null> {\n return unavailable();\n }\n\n async getFitzpatrickSkinType(): Promise<number> {\n return unavailable();\n }\n\n async getWheelchairUse(): Promise<number> {\n return unavailable();\n }\n\n async enableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableAllBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async observeTypes(): Promise<void> {\n return unavailable();\n }\n\n async clearObserverQueries(): Promise<void> {\n return unavailable();\n }\n}\n\nexport default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');\n"]}
1
+ {"version":3,"file":"ExpoHealthKitModule.web.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeModule, registerWebModule } from 'expo';\n\nimport { HealthKitUnavailableError } from './errors';\nimport type { ExpoHealthKitModuleEvents } from './types';\n\nfunction unavailable(): never {\n throw new HealthKitUnavailableError();\n}\n\nclass ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean {\n return false;\n }\n\n async requestAuthorization(): Promise<boolean> {\n return unavailable();\n }\n\n async getAuthorizationStatus(): Promise<number> {\n return unavailable();\n }\n\n async getRequestStatusForAuthorization(): Promise<number> {\n return unavailable();\n }\n\n async queryQuantitySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryCategorySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkouts(): Promise<never> {\n return unavailable();\n }\n\n async queryElectrocardiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryActivitySummaries(): Promise<never> {\n return unavailable();\n }\n\n async queryClinicalRecords(): Promise<never> {\n return unavailable();\n }\n\n async queryAudiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkoutRoute(): Promise<never> {\n return unavailable();\n }\n\n async queryCorrelations(): Promise<never> {\n return unavailable();\n }\n\n async queryHeartbeatSeries(): Promise<never> {\n return unavailable();\n }\n\n async queryStatistics(): Promise<never> {\n return unavailable();\n }\n\n async queryStatisticsCollection(): Promise<never> {\n return unavailable();\n }\n\n async queryAnchored(): Promise<never> {\n return unavailable();\n }\n\n async saveQuantitySample(): Promise<string> {\n return unavailable();\n }\n\n async saveCategorySample(): Promise<string> {\n return unavailable();\n }\n\n async saveWorkout(): Promise<string> {\n return unavailable();\n }\n\n async saveCorrelation(): Promise<string> {\n return unavailable();\n }\n\n async deleteObjects(): Promise<number> {\n return unavailable();\n }\n\n async getBiologicalSex(): Promise<number> {\n return unavailable();\n }\n\n async getBloodType(): Promise<number> {\n return unavailable();\n }\n\n async getDateOfBirth(): Promise<string | null> {\n return unavailable();\n }\n\n async getFitzpatrickSkinType(): Promise<number> {\n return unavailable();\n }\n\n async getWheelchairUse(): Promise<number> {\n return unavailable();\n }\n\n async enableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableAllBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async observeTypes(): Promise<void> {\n return unavailable();\n }\n\n async clearObserverQueries(): Promise<void> {\n return unavailable();\n }\n\n async getObservedTypes(): Promise<string[]> {\n return [];\n }\n\n async completeUpdate(): Promise<void> {}\n}\n\nexport default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');\n"]}
package/build/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AuthorizationRequestStatus, AuthorizationStatus, BiologicalSex, BloodType, FitzpatrickSkinType, UpdateFrequency, WheelchairUse } from './identifiers';
2
- import type { AnchoredQueryOptions, AnchoredQueryResult, AuthorizationOptions, CategorySample, CategorySampleInput, ClinicalRecord, ClinicalRecordQueryOptions, Correlation, CorrelationInput, CorrelationQueryOptions, DeleteObjectsOptions, ElectrocardiogramQueryOptions, ElectrocardiogramSample, ActivitySummary, ActivitySummaryQueryOptions, AudiogramSample, DateRangeQueryOptions, HeartbeatSeriesQueryOptions, HeartbeatSeriesSample, QuantityQueryOptions, QuantitySample, SampleQueryOptions, QuantitySampleInput, Statistics, StatisticsCollectionQueryOptions, StatisticsQueryOptions, WorkoutInput, WorkoutQueryOptions, WorkoutRoute, WorkoutRouteQueryOptions, WorkoutSample } from './types';
2
+ import type { AnchoredQueryOptions, AnchoredQueryResult, AuthorizationOptions, CategorySample, CategorySampleInput, ClinicalRecord, ClinicalRecordQueryOptions, Correlation, CorrelationInput, CorrelationQueryOptions, DeleteObjectsOptions, ElectrocardiogramQueryOptions, ElectrocardiogramSample, ActivitySummary, ActivitySummaryQueryOptions, AudiogramSample, DateRangeQueryOptions, HealthUpdateEvent, HealthUpdateListener, HeartbeatSeriesQueryOptions, HeartbeatSeriesSample, QuantityQueryOptions, QuantitySample, SampleQueryOptions, QuantitySampleInput, Statistics, StatisticsCollectionQueryOptions, StatisticsQueryOptions, WorkoutInput, WorkoutQueryOptions, WorkoutRoute, WorkoutRouteQueryOptions, WorkoutSample } from './types';
3
3
  export * from './identifiers';
4
4
  export * from './errors';
5
5
  export type * from './types';
@@ -35,12 +35,19 @@ export declare function disableBackgroundDelivery(type: string): Promise<boolean
35
35
  export declare function disableAllBackgroundDelivery(): Promise<boolean>;
36
36
  export declare function observe(types: readonly string[]): Promise<void>;
37
37
  export declare function clearObservers(): Promise<void>;
38
- export declare function addUpdateListener(listener: (event: {
39
- type: string;
40
- }) => void): {
38
+ /**
39
+ * Types currently registered with `observe`. Persisted natively on iOS, so it
40
+ * reflects observers re-registered at cold launch too.
41
+ */
42
+ export declare function getObservedTypes(): Promise<string[]>;
43
+ /**
44
+ * Subscribe to observer / background-delivery updates. Return a promise from the
45
+ * listener to hold the iOS completion handler until your async work is done.
46
+ */
47
+ export declare function addUpdateListener(listener: HealthUpdateListener): {
41
48
  remove(): void;
42
49
  };
43
- export declare function useHealthKitUpdates(): import("./types").HealthUpdateEvent | null;
50
+ export declare function useHealthKitUpdates(): HealthUpdateEvent | null;
44
51
  declare const HealthKit: {
45
52
  isAvailable: typeof isAvailable;
46
53
  requestAuthorization: typeof requestAuthorization;
@@ -74,6 +81,7 @@ declare const HealthKit: {
74
81
  disableAllBackgroundDelivery: typeof disableAllBackgroundDelivery;
75
82
  observe: typeof observe;
76
83
  clearObservers: typeof clearObservers;
84
+ getObservedTypes: typeof getObservedTypes;
77
85
  addUpdateListener: typeof addUpdateListener;
78
86
  useHealthKitUpdates: typeof useHealthKitUpdates;
79
87
  QuantityType: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useEvent } from 'expo';
1
+ import { useEffect, useState } from 'react';
2
2
  import { Platform } from 'react-native';
3
3
  import ExpoHealthKitModule from './ExpoHealthKitModule';
4
4
  import { fromIso, resolveEndDate, toIso, toOptionalIso } from './dates';
@@ -349,11 +349,68 @@ export async function clearObservers() {
349
349
  assertAvailable();
350
350
  await ExpoHealthKitModule.clearObserverQueries();
351
351
  }
352
+ /**
353
+ * Types currently registered with `observe`. Persisted natively on iOS, so it
354
+ * reflects observers re-registered at cold launch too.
355
+ */
356
+ export async function getObservedTypes() {
357
+ if (!isAvailable())
358
+ return [];
359
+ return ExpoHealthKitModule.getObservedTypes();
360
+ }
361
+ const updateListeners = new Set();
362
+ let nativeUpdateSubscription = null;
363
+ function runListener(listener, event) {
364
+ try {
365
+ return Promise.resolve(listener(event));
366
+ }
367
+ catch (error) {
368
+ return Promise.reject(error);
369
+ }
370
+ }
371
+ function handleNativeUpdate(nativeEvent) {
372
+ const { token, type } = nativeEvent;
373
+ const event = { type };
374
+ const results = [...updateListeners].map((listener) => runListener(listener, event));
375
+ Promise.allSettled(results).then((settled) => {
376
+ if (__DEV__) {
377
+ for (const result of settled) {
378
+ if (result.status === 'rejected') {
379
+ console.warn('[expo-healthkit] update listener threw', result.reason);
380
+ }
381
+ }
382
+ }
383
+ if (token) {
384
+ ExpoHealthKitModule.completeUpdate(token).catch(() => { });
385
+ }
386
+ });
387
+ }
388
+ /**
389
+ * Subscribe to observer / background-delivery updates. Return a promise from the
390
+ * listener to hold the iOS completion handler until your async work is done.
391
+ */
352
392
  export function addUpdateListener(listener) {
353
- return ExpoHealthKitModule.addListener('onUpdate', listener);
393
+ updateListeners.add(listener);
394
+ if (!nativeUpdateSubscription) {
395
+ nativeUpdateSubscription = ExpoHealthKitModule.addListener('onUpdate', handleNativeUpdate);
396
+ }
397
+ return {
398
+ remove() {
399
+ updateListeners.delete(listener);
400
+ if (updateListeners.size === 0 && nativeUpdateSubscription) {
401
+ nativeUpdateSubscription.remove();
402
+ nativeUpdateSubscription = null;
403
+ }
404
+ },
405
+ };
354
406
  }
355
407
  export function useHealthKitUpdates() {
356
- return useEvent(ExpoHealthKitModule, 'onUpdate');
408
+ const [event, setEvent] = useState(null);
409
+ useEffect(() => {
410
+ const subscription = addUpdateListener((next) => setEvent(next));
411
+ return () => subscription.remove();
412
+ }, []);
413
+ return event;
357
414
  }
358
415
  const HealthKit = {
359
416
  isAvailable,
@@ -388,6 +445,7 @@ const HealthKit = {
388
445
  disableAllBackgroundDelivery,
389
446
  observe,
390
447
  clearObservers,
448
+ getObservedTypes,
391
449
  addUpdateListener,
392
450
  useHealthKitUpdates,
393
451
  QuantityType,