@bricks-soft/capacitor-location-tracking 8.0.0 → 8.1.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.
Files changed (75) hide show
  1. package/README.md +375 -124
  2. package/android/build.gradle +2 -1
  3. package/android/src/main/AndroidManifest.xml +2 -0
  4. package/android/src/main/java/com/brickssoft/locationtracking/bridge/OptionParsers.kt +4 -1
  5. package/android/src/main/java/com/brickssoft/locationtracking/bridge/PluginHandlers.kt +14 -5
  6. package/android/src/main/java/com/brickssoft/locationtracking/config/Config.kt +10 -0
  7. package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigJson.kt +70 -15
  8. package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigStore.kt +6 -0
  9. package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigValidator.kt +8 -3
  10. package/android/src/main/java/com/brickssoft/locationtracking/config/RuntimeStateJson.kt +10 -0
  11. package/android/src/main/java/com/brickssoft/locationtracking/config/SecretStore.kt +188 -0
  12. package/android/src/main/java/com/brickssoft/locationtracking/config/SharedPrefsConfigStore.kt +188 -17
  13. package/android/src/main/java/com/brickssoft/locationtracking/config/State.kt +11 -0
  14. package/android/src/main/java/com/brickssoft/locationtracking/core/Components.kt +21 -5
  15. package/android/src/main/java/com/brickssoft/locationtracking/core/ForceStopProbe.kt +20 -9
  16. package/android/src/main/java/com/brickssoft/locationtracking/core/TrackingEvent.kt +24 -2
  17. package/android/src/main/java/com/brickssoft/locationtracking/data/TrackingDatabase.kt +43 -1
  18. package/android/src/main/java/com/brickssoft/locationtracking/device/DefaultDeviceInfoProvider.kt +17 -0
  19. package/android/src/main/java/com/brickssoft/locationtracking/device/DeviceDetails.kt +167 -0
  20. package/android/src/main/java/com/brickssoft/locationtracking/engine/DefaultTrackingEngine.kt +191 -34
  21. package/android/src/main/java/com/brickssoft/locationtracking/engine/TrackingEngine.kt +6 -0
  22. package/android/src/main/java/com/brickssoft/locationtracking/engine/TrackingTimers.kt +3 -0
  23. package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/DefaultHeartbeatScheduler.kt +52 -8
  24. package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/HeartbeatAlarmReceiver.kt +22 -0
  25. package/android/src/main/java/com/brickssoft/locationtracking/http/AuthorizationManager.kt +78 -27
  26. package/android/src/main/java/com/brickssoft/locationtracking/http/ConfigChecks.kt +140 -0
  27. package/android/src/main/java/com/brickssoft/locationtracking/http/HttpSupport.kt +50 -12
  28. package/android/src/main/java/com/brickssoft/locationtracking/http/HttpSyncer.kt +17 -0
  29. package/android/src/main/java/com/brickssoft/locationtracking/http/OkHttpSyncer.kt +507 -92
  30. package/android/src/main/java/com/brickssoft/locationtracking/http/SyncPolicy.kt +6 -6
  31. package/android/src/main/java/com/brickssoft/locationtracking/http/TemplateRenderer.kt +23 -1
  32. package/android/src/main/java/com/brickssoft/locationtracking/http/UploadJobs.kt +217 -0
  33. package/android/src/main/java/com/brickssoft/locationtracking/http/UploadWait.kt +184 -0
  34. package/android/src/main/java/com/brickssoft/locationtracking/logging/FileLogger.kt +66 -7
  35. package/android/src/main/java/com/brickssoft/locationtracking/logging/LogRedaction.kt +31 -0
  36. package/android/src/main/java/com/brickssoft/locationtracking/model/DeviceModels.kt +44 -1
  37. package/android/src/main/java/com/brickssoft/locationtracking/model/ModelJson.kt +79 -8
  38. package/android/src/main/java/com/brickssoft/locationtracking/model/Record.kt +9 -0
  39. package/android/src/main/java/com/brickssoft/locationtracking/model/TrackedLocation.kt +12 -2
  40. package/android/src/main/java/com/brickssoft/locationtracking/position/DefaultPositionService.kt +10 -2
  41. package/android/src/main/java/com/brickssoft/locationtracking/position/PositionWatch.kt +24 -1
  42. package/android/src/main/java/com/brickssoft/locationtracking/processing/DefaultRecordFactory.kt +31 -10
  43. package/android/src/main/java/com/brickssoft/locationtracking/provider/Backends.kt +48 -3
  44. package/android/src/main/java/com/brickssoft/locationtracking/provider/DefaultProviderFactory.kt +60 -0
  45. package/android/src/main/java/com/brickssoft/locationtracking/provider/LocationSubscriptions.kt +180 -0
  46. package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidLocationBackend.kt +200 -126
  47. package/android/src/main/java/com/brickssoft/locationtracking/provider/android/LocationProviders.kt +20 -0
  48. package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsLocationBackend.kt +39 -51
  49. package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsProviderBundle.kt +8 -0
  50. package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsLocationBackend.kt +47 -53
  51. package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsProviderBundle.kt +34 -2
  52. package/android/src/main/java/com/brickssoft/locationtracking/record/RecordSink.kt +19 -1
  53. package/android/src/main/java/com/brickssoft/locationtracking/service/BootCountStore.kt +7 -0
  54. package/android/src/main/res/xml/lt_file_paths.xml +1 -1
  55. package/dist/esm/definitions.d.ts +107 -4
  56. package/dist/esm/definitions.js.map +1 -1
  57. package/dist/esm/events.d.ts +8 -2
  58. package/dist/esm/events.js +7 -1
  59. package/dist/esm/events.js.map +1 -1
  60. package/dist/esm/index.d.ts +1 -1
  61. package/dist/esm/index.js +1 -1
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/web/config.js +10 -0
  64. package/dist/esm/web/config.js.map +1 -1
  65. package/dist/esm/web/device.d.ts +2 -2
  66. package/dist/esm/web/device.js +9 -2
  67. package/dist/esm/web/device.js.map +1 -1
  68. package/dist/esm/web.d.ts +0 -8
  69. package/dist/esm/web.js +12 -3
  70. package/dist/esm/web.js.map +1 -1
  71. package/dist/plugin.cjs.js +40 -6
  72. package/dist/plugin.cjs.js.map +1 -1
  73. package/dist/plugin.js +40 -6
  74. package/dist/plugin.js.map +1 -1
  75. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["// Owned by Unit 1 (TS wrapper + web).\nimport { WebPlugin } from '@capacitor/core';\n\nimport type {\n BatteryOptimizationStatus,\n CallbackID,\n Config,\n CurrentPositionOptions,\n DesiredAccuracy,\n DeviceInfo,\n Geofence,\n HeartbeatStatus,\n InsertLocationInput,\n Location,\n LocationTrackingEventMap,\n LocationTrackingPlugin,\n LogLevel,\n LogQuery,\n PermissionStatus,\n PermissionType,\n PowerManagerInfo,\n ProviderState,\n ReadyOptions,\n Sensors,\n State,\n WatchPositionCallback,\n WatchPositionOptions,\n} from './definitions';\nimport { cloneJson, defaultConfig, isPlainObject, mergeConfig, webState } from './web/config';\nimport { webDeviceInfo } from './web/device';\nimport { positionErrorInfo, webError } from './web/errors';\nimport {\n browserGeolocation,\n probeLocationPermission,\n queryLocationPermission,\n sampleBestPosition,\n} from './web/geolocation';\nimport { toLocation } from './web/location';\n\nconst ALL_PERMISSIONS: PermissionType[] = ['location', 'notifications', 'activityRecognition', 'backgroundLocation'];\n\ninterface WatchEntry {\n active: boolean;\n geolocation: Geolocation;\n browserId: number;\n}\n\nfunction highAccuracy(accuracy: DesiredAccuracy | undefined): boolean {\n return accuracy === undefined || accuracy === 'high';\n}\n\nfunction nonNegative(value: unknown, fallback: number): number {\n return typeof value === 'number' && value >= 0 ? value : fallback;\n}\n\n/** The defaults plus `options.config` (optional; must be an object when given). */\nfunction configFromDefaults(options: { config?: Config } | undefined): Config {\n const given = options ? options.config : undefined;\n if (given !== undefined && given !== null && !isPlainObject(given)) {\n throw webError('INVALID_ARGUMENT', 'config must be an object.');\n }\n return mergeConfig(defaultConfig(), given || undefined);\n}\n\n/**\n * Web implementation. It covers `getCurrentPosition`, `watchPosition` and `clearWatch` (via `navigator.geolocation`),\n * an in-memory config and state, permissions and device info. Nothing is persisted or uploaded, and tracking cannot\n * be started. Every other method rejects with `UNIMPLEMENTED`.\n *\n * Like the Android bridge, methods other than `ready`, `getState`, `checkPermissions`, `requestPermissions` and\n * `getDeviceInfo` reject with `NOT_READY` until `ready()` has resolved.\n */\nexport class LocationTrackingWeb extends WebPlugin implements LocationTrackingPlugin {\n private config: Config = defaultConfig();\n private isReady = false;\n private lastPosition: GeolocationPosition | null = null;\n private watchSeq = 0;\n private readonly watches = new Map<string, WatchEntry>();\n\n async ready(options?: ReadyOptions): Promise<State> {\n const config = configFromDefaults(options);\n // reset:false applies the given config only on the first ready(); afterwards the current config wins.\n if (!options || options.reset !== false || !this.isReady) {\n this.config = config;\n }\n this.isReady = true;\n return webState(this.config);\n }\n\n async setConfig(options: { config: Config }): Promise<State> {\n this.requireReady();\n if (!options || !isPlainObject(options.config)) {\n throw webError('INVALID_ARGUMENT', 'config must be an object.');\n }\n this.config = mergeConfig(this.config, options.config);\n return webState(this.config);\n }\n\n async reset(options?: { config?: Config }): Promise<State> {\n this.requireReady();\n this.config = configFromDefaults(options);\n return webState(this.config);\n }\n\n async getState(): Promise<State> {\n return webState(this.config);\n }\n\n async start(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async startGeofences(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async stop(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async changePace(_options: { isMoving: boolean }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /**\n * Takes `samples` fixes within `timeout` and resolves the most accurate one. With `maximumAge > 0`, a fix this\n * plugin received at most that long ago is returned right away. Like a persisted record on Android, the result is\n * also emitted as a `location` event unless `persist` is false.\n */\n async getCurrentPosition(options?: CurrentPositionOptions): Promise<Location> {\n this.requireReady();\n const geolocation = this.requireGeolocation();\n const o = options || {};\n const maximumAge = nonNegative(o.maximumAge, 0);\n const cached = this.lastPosition;\n let position: GeolocationPosition;\n if (maximumAge > 0 && cached && Date.now() - cached.timestamp <= maximumAge) {\n position = cached;\n } else {\n const samples = typeof o.samples === 'number' && o.samples >= 1 ? Math.floor(o.samples) : 3;\n position = await sampleBestPosition(geolocation, {\n samples,\n timeout: nonNegative(o.timeout, nonNegative(this.config.geolocation?.locationTimeout, 30000)),\n maximumAge,\n enableHighAccuracy: highAccuracy(o.desiredAccuracy),\n });\n }\n this.lastPosition = position;\n const location = toLocation(position, 'current_position', this.recordExtras(o.extras));\n if (o.persist !== false) {\n this.emit('location', location);\n }\n return location;\n }\n\n /**\n * Starts `navigator.geolocation.watchPosition` and resolves its id. The callback gets each fix as a\n * `watch_position` Location, or `(null, { code, message })` on error. `interval` is ignored: the browser decides\n * how often fixes arrive. With `persist: true` each fix is also emitted as a `location` event.\n */\n async watchPosition(options: WatchPositionOptions, callback: WatchPositionCallback): Promise<CallbackID> {\n this.requireReady();\n if (typeof callback !== 'function') {\n throw webError('INVALID_ARGUMENT', 'watchPosition requires a callback.');\n }\n const geolocation = this.requireGeolocation();\n const o = options || {};\n const callExtras = cloneJson(o.extras);\n const persist = o.persist === true;\n const entry: WatchEntry = { active: true, geolocation, browserId: 0 };\n try {\n entry.browserId = geolocation.watchPosition(\n (position) => {\n // Browsers may still deliver a queued fix after clearWatch.\n if (!entry.active) {\n return;\n }\n this.lastPosition = position;\n const location = toLocation(position, 'watch_position', this.recordExtras(callExtras));\n if (persist) {\n this.emit('location', location);\n }\n callback(location);\n },\n (error) => {\n if (entry.active) {\n callback(null, positionErrorInfo(error));\n }\n },\n { enableHighAccuracy: highAccuracy(o.desiredAccuracy), maximumAge: 0 },\n );\n } catch (e) {\n throw webError('UNAVAILABLE', e instanceof Error ? e.message : String(e));\n }\n const id = `web-watch-${++this.watchSeq}`;\n this.watches.set(id, entry);\n return id;\n }\n\n /** Stops a watch. Unknown ids are ignored. */\n async clearWatch(options: { id: CallbackID }): Promise<void> {\n this.requireReady();\n if (!options || typeof options.id !== 'string') {\n throw webError('INVALID_ARGUMENT', 'id must be a string.');\n }\n const entry = this.watches.get(options.id);\n if (!entry) {\n return;\n }\n this.watches.delete(options.id);\n entry.active = false;\n entry.geolocation.clearWatch(entry.browserId);\n }\n\n async getOdometer(): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async setOdometer(_options: { odometer: number }): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async resetOdometer(): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getLocations(_options?: { limit?: number }): Promise<{ locations: Location[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getCount(): Promise<{ count: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async insertLocation(_options: { location: InsertLocationInput }): Promise<{ uuid: string }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLocations(): Promise<{ count: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLocation(_options: { uuid: string }): Promise<{ deleted: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async sync(): Promise<{ locations: Location[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async addGeofence(_options: { geofence: Geofence }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async addGeofences(_options: { geofences: Geofence[] }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async removeGeofence(_options: { identifier: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async removeGeofences(_options?: { identifiers?: string[] }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeofences(): Promise<{ geofences: Geofence[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeofence(_options: { identifier: string }): Promise<{ geofence: Geofence | null }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async geofenceExists(_options: { identifier: string }): Promise<{ exists: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getHeartbeatStatus(): Promise<HeartbeatStatus> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getProviderState(): Promise<ProviderState> {\n throw this.unimplemented('Not implemented on web.');\n }\n async isPowerSaveMode(): Promise<{ isPowerSaveMode: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getBatteryOptimizationStatus(): Promise<BatteryOptimizationStatus> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openBatteryOptimizationSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getPowerManagerInfo(): Promise<PowerManagerInfo> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openPowerManagerSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openLocationSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openAppSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /** Best-effort values parsed from `navigator.userAgent`; `platform` is `'web'`. */\n async getDeviceInfo(): Promise<DeviceInfo> {\n const nav = typeof navigator !== 'undefined' && navigator ? navigator : undefined;\n return webDeviceInfo(nav && typeof nav.userAgent === 'string' ? nav.userAgent : '', nav ? nav.platform : undefined);\n }\n async getSensors(): Promise<Sensors> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /** `location` comes from the Permissions API (`'prompt'` when it cannot tell); the other three are `'granted'`. */\n async checkPermissions(): Promise<PermissionStatus> {\n const location = await queryLocationPermission();\n return {\n location: location || 'prompt',\n backgroundLocation: 'granted',\n activityRecognition: 'granted',\n notifications: 'granted',\n };\n }\n\n /** When `location` is requested and still undecided, asks for a fix so the browser prompts, then reports. */\n async requestPermissions(options?: { permissions?: PermissionType[] }): Promise<PermissionStatus> {\n const requested = options && Array.isArray(options.permissions) ? options.permissions : ALL_PERMISSIONS;\n const status = await this.checkPermissions();\n const geolocation = browserGeolocation();\n if (requested.indexOf('location') < 0 || status.location !== 'prompt' || !geolocation) {\n return status;\n }\n const answer = await probeLocationPermission(geolocation);\n // A granted probe is proof, even for a one-time grant the Permissions API still reports as 'prompt'. Otherwise\n // prefer the Permissions API: a dismissed prompt fails the probe as denied but leaves the permission at 'prompt'.\n status.location = answer === 'granted' ? answer : (await queryLocationPermission()) || answer;\n return status;\n }\n\n async log(_options: { level: Exclude<LogLevel, 'off'>; message: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getLog(_options?: LogQuery): Promise<{ log: string }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLog(): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async uploadLog(_options: {\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n }): Promise<{ success: boolean; status: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async emailLog(_options: { email: string; subject?: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n private requireReady(): void {\n if (!this.isReady) {\n throw webError('NOT_READY', 'Call ready() before using this method.');\n }\n }\n\n private requireGeolocation(): Geolocation {\n const geolocation = browserGeolocation();\n if (!geolocation) {\n throw webError('UNAVAILABLE', 'navigator.geolocation is not available.');\n }\n return geolocation;\n }\n\n /** `persistence.extras` merged with the call's extras (the call wins), like records created on Android. */\n private recordExtras(extras: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const persisted = this.config.persistence ? this.config.persistence.extras : undefined;\n const merged: Record<string, unknown> = {};\n if (isPlainObject(persisted)) {\n Object.assign(merged, cloneJson(persisted));\n }\n if (isPlainObject(extras)) {\n Object.assign(merged, cloneJson(extras));\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n /**\n * Like `notifyListeners`, but each listener gets its own copy of the payload (as on native, where every listener\n * receives deserialized data), and a throwing listener neither skips the others nor fails the calling method.\n */\n private emit<K extends keyof LocationTrackingEventMap>(eventName: K, data: LocationTrackingEventMap[K]): void {\n const listeners = this.listeners[eventName];\n if (!listeners) {\n return;\n }\n for (const listener of listeners.slice()) {\n try {\n listener(cloneJson(data));\n } catch (e) {\n console.error(`LocationTracking: \"${eventName}\" listener threw`, e);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["// Owned by Unit 1 (TS wrapper + web).\nimport { WebPlugin } from '@capacitor/core';\n\nimport type {\n BatteryOptimizationStatus,\n CallbackID,\n Config,\n CurrentPositionOptions,\n DesiredAccuracy,\n DeviceInfo,\n Geofence,\n HeartbeatStatus,\n InsertLocationInput,\n Location,\n LocationTrackingEventMap,\n LocationTrackingPlugin,\n LogLevel,\n LogQuery,\n PermissionStatus,\n PermissionType,\n PowerManagerInfo,\n ProviderState,\n ReadyOptions,\n Sensors,\n State,\n WatchPositionCallback,\n WatchPositionOptions,\n} from './definitions';\nimport { cloneJson, defaultConfig, isPlainObject, mergeConfig, webState } from './web/config';\nimport { webDeviceInfo } from './web/device';\nimport { positionErrorInfo, webError } from './web/errors';\nimport {\n browserGeolocation,\n probeLocationPermission,\n queryLocationPermission,\n sampleBestPosition,\n} from './web/geolocation';\nimport { toLocation } from './web/location';\n\nconst ALL_PERMISSIONS: PermissionType[] = ['location', 'notifications', 'activityRecognition', 'backgroundLocation'];\n\ninterface WatchEntry {\n active: boolean;\n geolocation: Geolocation;\n browserId: number;\n}\n\nfunction highAccuracy(accuracy: DesiredAccuracy | undefined): boolean {\n return accuracy === undefined || accuracy === 'high';\n}\n\nfunction nonNegative(value: unknown, fallback: number): number {\n return typeof value === 'number' && value >= 0 ? value : fallback;\n}\n\n/** The defaults plus `options.config` (optional; must be an object when given). */\nfunction configFromDefaults(options: { config?: Config } | undefined): Config {\n const given = options ? options.config : undefined;\n if (given !== undefined && given !== null && !isPlainObject(given)) {\n throw webError('INVALID_ARGUMENT', 'config must be an object.');\n }\n return mergeConfig(defaultConfig(), given || undefined);\n}\n\n/**\n * Web implementation. It covers `getCurrentPosition`, `watchPosition` and `clearWatch` (via `navigator.geolocation`),\n * an in-memory config and state, permissions and device info. Nothing is persisted or uploaded, and tracking cannot\n * be started. Every other method rejects with `UNIMPLEMENTED`.\n *\n * Like the Android bridge, methods other than `ready`, `getState`, `checkPermissions`, `requestPermissions` and\n * `getDeviceInfo` reject with `NOT_READY` until `ready()` has resolved.\n */\n/** The State of `ready`, `setConfig` and `reset`, with the `warnings` the Android plugin also returns. */\nfunction withWarnings(state: State): State {\n const url = state.config.http?.url;\n const warnings =\n typeof url === 'string' && /^http:\\/\\//i.test(url.trim())\n ? [\"http.url uses http://: Android 9+ blocks cleartext traffic unless the app's network security config allows it\"]\n : [];\n return { ...state, warnings };\n}\n\nexport class LocationTrackingWeb extends WebPlugin implements LocationTrackingPlugin {\n private config: Config = defaultConfig();\n private isReady = false;\n private lastPosition: GeolocationPosition | null = null;\n private watchSeq = 0;\n private readonly watches = new Map<string, WatchEntry>();\n\n async ready(options?: ReadyOptions): Promise<State> {\n const config = configFromDefaults(options);\n // reset:false applies the given config only on the first ready(); afterwards the current config wins.\n if (!options || options.reset !== false || !this.isReady) {\n this.config = config;\n }\n this.isReady = true;\n return withWarnings(webState(this.config));\n }\n\n async setConfig(options: { config: Config }): Promise<State> {\n this.requireReady();\n if (!options || !isPlainObject(options.config)) {\n throw webError('INVALID_ARGUMENT', 'config must be an object.');\n }\n this.config = mergeConfig(this.config, options.config);\n return withWarnings(webState(this.config));\n }\n\n async reset(options?: { config?: Config }): Promise<State> {\n this.requireReady();\n this.config = configFromDefaults(options);\n return withWarnings(webState(this.config));\n }\n\n async getState(): Promise<State> {\n return webState(this.config);\n }\n\n async start(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async startGeofences(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async stop(): Promise<State> {\n throw this.unimplemented('Not implemented on web.');\n }\n async changePace(_options: { isMoving: boolean }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /**\n * Takes `samples` fixes within `timeout` and resolves the most accurate one. With `maximumAge > 0`, a fix this\n * plugin received at most that long ago is returned right away. Like a persisted record on Android, the result is\n * also emitted as a `location` event unless `persist` is false.\n */\n async getCurrentPosition(options?: CurrentPositionOptions): Promise<Location> {\n this.requireReady();\n const geolocation = this.requireGeolocation();\n const o = options || {};\n const maximumAge = nonNegative(o.maximumAge, 0);\n const cached = this.lastPosition;\n let position: GeolocationPosition;\n if (maximumAge > 0 && cached && Date.now() - cached.timestamp <= maximumAge) {\n position = cached;\n } else {\n const samples = typeof o.samples === 'number' && o.samples >= 1 ? Math.floor(o.samples) : 3;\n position = await sampleBestPosition(geolocation, {\n samples,\n timeout: nonNegative(o.timeout, nonNegative(this.config.geolocation?.locationTimeout, 30000)),\n maximumAge,\n enableHighAccuracy: highAccuracy(o.desiredAccuracy),\n });\n }\n this.lastPosition = position;\n const location = toLocation(position, 'current_position', this.recordExtras(o.extras));\n if (o.persist !== false) {\n this.emit('location', location);\n }\n return location;\n }\n\n /**\n * Starts `navigator.geolocation.watchPosition` and resolves its id. The callback gets each fix as a\n * `watch_position` Location, or `(null, { code, message })` on error. `interval` is ignored: the browser decides\n * how often fixes arrive. With `persist: true` each fix is also emitted as a `location` event.\n */\n async watchPosition(options: WatchPositionOptions, callback: WatchPositionCallback): Promise<CallbackID> {\n this.requireReady();\n if (typeof callback !== 'function') {\n throw webError('INVALID_ARGUMENT', 'watchPosition requires a callback.');\n }\n const geolocation = this.requireGeolocation();\n const o = options || {};\n const callExtras = cloneJson(o.extras);\n const persist = o.persist === true;\n const entry: WatchEntry = { active: true, geolocation, browserId: 0 };\n try {\n entry.browserId = geolocation.watchPosition(\n (position) => {\n // Browsers may still deliver a queued fix after clearWatch.\n if (!entry.active) {\n return;\n }\n this.lastPosition = position;\n const location = toLocation(position, 'watch_position', this.recordExtras(callExtras));\n if (persist) {\n this.emit('location', location);\n }\n callback(location);\n },\n (error) => {\n if (entry.active) {\n callback(null, positionErrorInfo(error));\n }\n },\n { enableHighAccuracy: highAccuracy(o.desiredAccuracy), maximumAge: 0 },\n );\n } catch (e) {\n throw webError('UNAVAILABLE', e instanceof Error ? e.message : String(e));\n }\n const id = `web-watch-${++this.watchSeq}`;\n this.watches.set(id, entry);\n return id;\n }\n\n /** Stops a watch. Unknown ids are ignored. */\n async clearWatch(options: { id: CallbackID }): Promise<void> {\n this.requireReady();\n if (!options || typeof options.id !== 'string') {\n throw webError('INVALID_ARGUMENT', 'id must be a string.');\n }\n const entry = this.watches.get(options.id);\n if (!entry) {\n return;\n }\n this.watches.delete(options.id);\n entry.active = false;\n entry.geolocation.clearWatch(entry.browserId);\n }\n\n async getOdometer(): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async setOdometer(_options: { odometer: number }): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async resetOdometer(): Promise<{ odometer: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getLocations(_options?: { limit?: number }): Promise<{ locations: Location[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getCount(): Promise<{ count: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async insertLocation(_options: { location: InsertLocationInput }): Promise<{ uuid: string }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLocations(): Promise<{ count: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLocation(_options: { uuid: string }): Promise<{ deleted: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async sync(): Promise<{ locations: Location[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async addGeofence(_options: { geofence: Geofence }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async addGeofences(_options: { geofences: Geofence[] }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async removeGeofence(_options: { identifier: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async removeGeofences(_options?: { identifiers?: string[] }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeofences(): Promise<{ geofences: Geofence[] }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeofence(_options: { identifier: string }): Promise<{ geofence: Geofence | null }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async geofenceExists(_options: { identifier: string }): Promise<{ exists: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getHeartbeatStatus(): Promise<HeartbeatStatus> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n async getProviderState(): Promise<ProviderState> {\n throw this.unimplemented('Not implemented on web.');\n }\n async isPowerSaveMode(): Promise<{ isPowerSaveMode: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getBatteryOptimizationStatus(): Promise<BatteryOptimizationStatus> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openBatteryOptimizationSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getPowerManagerInfo(): Promise<PowerManagerInfo> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openPowerManagerSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openLocationSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async openAppSettings(): Promise<{ opened: boolean }> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /** Best-effort values parsed from `navigator.userAgent`; `platform` is `'web'`. */\n async getDeviceInfo(): Promise<DeviceInfo> {\n const nav = typeof navigator !== 'undefined' && navigator ? navigator : undefined;\n return webDeviceInfo(nav && typeof nav.userAgent === 'string' ? nav.userAgent : '', nav ? nav.platform : undefined);\n }\n async getSensors(): Promise<Sensors> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n /** `location` comes from the Permissions API (`'prompt'` when it cannot tell); the other three are `'granted'`. */\n async checkPermissions(): Promise<PermissionStatus> {\n const location = await queryLocationPermission();\n return {\n location: location || 'prompt',\n backgroundLocation: 'granted',\n activityRecognition: 'granted',\n notifications: 'granted',\n };\n }\n\n /** When `location` is requested and still undecided, asks for a fix so the browser prompts, then reports. */\n async requestPermissions(options?: { permissions?: PermissionType[] }): Promise<PermissionStatus> {\n const requested = options && Array.isArray(options.permissions) ? options.permissions : ALL_PERMISSIONS;\n const status = await this.checkPermissions();\n const geolocation = browserGeolocation();\n if (requested.indexOf('location') < 0 || status.location !== 'prompt' || !geolocation) {\n return status;\n }\n const answer = await probeLocationPermission(geolocation);\n // A granted probe is proof, even for a one-time grant the Permissions API still reports as 'prompt'. Otherwise\n // prefer the Permissions API: a dismissed prompt fails the probe as denied but leaves the permission at 'prompt'.\n status.location = answer === 'granted' ? answer : (await queryLocationPermission()) || answer;\n return status;\n }\n\n async log(_options: { level: Exclude<LogLevel, 'off'>; message: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async getLog(_options?: LogQuery): Promise<{ log: string }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async destroyLog(): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n async uploadLog(_options: {\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n }): Promise<{ success: boolean; status: number }> {\n throw this.unimplemented('Not implemented on web.');\n }\n async emailLog(_options: { email: string; subject?: string }): Promise<void> {\n throw this.unimplemented('Not implemented on web.');\n }\n\n private requireReady(): void {\n if (!this.isReady) {\n throw webError('NOT_READY', 'Call ready() before using this method.');\n }\n }\n\n private requireGeolocation(): Geolocation {\n const geolocation = browserGeolocation();\n if (!geolocation) {\n throw webError('UNAVAILABLE', 'navigator.geolocation is not available.');\n }\n return geolocation;\n }\n\n /** `persistence.extras` merged with the call's extras (the call wins), like records created on Android. */\n private recordExtras(extras: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const persisted = this.config.persistence ? this.config.persistence.extras : undefined;\n const merged: Record<string, unknown> = {};\n if (isPlainObject(persisted)) {\n Object.assign(merged, cloneJson(persisted));\n }\n if (isPlainObject(extras)) {\n Object.assign(merged, cloneJson(extras));\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n /**\n * Like `notifyListeners`, but each listener gets its own copy of the payload (as on native, where every listener\n * receives deserialized data), and a throwing listener neither skips the others nor fails the calling method.\n */\n private emit<K extends keyof LocationTrackingEventMap>(eventName: K, data: LocationTrackingEventMap[K]): void {\n const listeners = this.listeners[eventName];\n if (!listeners) {\n return;\n }\n for (const listener of listeners.slice()) {\n try {\n listener(cloneJson(data));\n } catch (e) {\n console.error(`LocationTracking: \"${eventName}\" listener threw`, e);\n }\n }\n }\n}\n"]}
@@ -26,6 +26,8 @@ const Events = {
26
26
  ENABLEDCHANGE: 'enabledchange',
27
27
  NOTIFICATIONACTION: 'notificationaction',
28
28
  AUTHORIZATION: 'authorization',
29
+ LOCATIONERROR: 'locationerror',
30
+ STORAGEFULL: 'storagefull',
29
31
  };
30
32
  /**
31
33
  * Subscribes to any plugin event with a typed payload. Call `remove()` on the resolved handle to unsubscribe.
@@ -55,12 +57,16 @@ const onHttp = (cb) => on('http', cb);
55
57
  const onConnectivityChange = (cb) => on('connectivitychange', cb);
56
58
  /** Battery-saver mode changes. */
57
59
  const onPowerSaveChange = (cb) => on('powersavechange', cb);
58
- /** Tracking enabled / disabled. */
60
+ /** Tracking enabled / disabled, with the reason (the same values as the tracking_start / tracking_stop records). */
59
61
  const onEnabledChange = (cb) => on('enabledchange', cb);
60
62
  /** Taps on the foreground notification's action buttons. */
61
63
  const onNotificationAction = (cb) => on('notificationaction', cb);
62
64
  /** JWT refresh results. */
63
65
  const onAuthorization = (cb) => on('authorization', cb);
66
+ /** The location request failed; the plugin requests updates again after `retryInMs`. */
67
+ const onLocationError = (cb) => on('locationerror', cb);
68
+ /** A record could not be stored because the device storage is full. */
69
+ const onStorageFull = (cb) => on('storagefull', cb);
64
70
 
65
71
  /** Never copied: assigning `__proto__` would change the target's prototype instead of adding a key. */
66
72
  const PROTO_KEY = '__proto__';
@@ -112,6 +118,7 @@ function defaultConfig() {
112
118
  enabled: true,
113
119
  minInterval: 180,
114
120
  maxInterval: 300,
121
+ uploadKeepAwake: 10,
115
122
  },
116
123
  http: {
117
124
  url: null,
@@ -128,6 +135,7 @@ function defaultConfig() {
128
135
  locationTemplate: null,
129
136
  geofenceTemplate: null,
130
137
  timeout: 60000,
138
+ maxRetryAfter: 3600,
131
139
  authorization: null,
132
140
  },
133
141
  persistence: {
@@ -261,6 +269,9 @@ function clamp(config) {
261
269
  heartbeat.maxInterval < heartbeat.minInterval) {
262
270
  heartbeat.maxInterval = heartbeat.minInterval;
263
271
  }
272
+ if (typeof heartbeat.uploadKeepAwake === 'number') {
273
+ heartbeat.uploadKeepAwake = Math.min(60, Math.max(0, heartbeat.uploadKeepAwake));
274
+ }
264
275
  }
265
276
  const activity = config.activity;
266
277
  if (activity && typeof activity.minimumActivityRecognitionConfidence === 'number') {
@@ -273,6 +284,9 @@ function clamp(config) {
273
284
  if (http && typeof http.syncInterval === 'number' && http.syncInterval < 0) {
274
285
  http.syncInterval = 0;
275
286
  }
287
+ if (http && typeof http.maxRetryAfter === 'number' && http.maxRetryAfter < 0) {
288
+ http.maxRetryAfter = 0;
289
+ }
276
290
  const notification = config.notification;
277
291
  if (notification && Array.isArray(notification.actions) && notification.actions.length > 3) {
278
292
  notification.actions = notification.actions.slice(0, 3);
@@ -301,12 +315,14 @@ function webState(config) {
301
315
  odometer: 0,
302
316
  backend: 'web',
303
317
  lastRecordAt: null,
318
+ lastStopReason: null,
319
+ lastStopAt: null,
304
320
  config: cloneJson(config),
305
321
  };
306
322
  }
307
323
 
308
- /** Keep in sync with `package.json` (a test checks this) and `PLUGIN_VERSION` in `android/build.gradle`. */
309
- const PLUGIN_VERSION = '8.0.0';
324
+ /** `npm version` copies the `package.json` version here (scripts/sync-version.mjs); a test checks it. */
325
+ const PLUGIN_VERSION = '8.1.0';
310
326
  /** Tokens after `Android x` that do not name a device ('K' is Chrome's reduced user agent). */
311
327
  const NOT_A_MODEL = ['K', 'U', 'wv', 'Mobile', 'Tablet', 'HarmonyOS'];
312
328
  /** The device model among the `;`-separated tokens that follow `Android x` in the user agent's comment. */
@@ -392,6 +408,13 @@ function webDeviceInfo(userAgent, platform) {
392
408
  hmsAvailable: false,
393
409
  backend: 'web',
394
410
  packagedProviders: [],
411
+ backendFallbackReason: null,
412
+ gmsStatus: null,
413
+ hmsStatus: null,
414
+ hmsCoreOutdated: null,
415
+ locationAvailableHint: null,
416
+ cpuCores: typeof navigator !== 'undefined' && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 0,
417
+ supportedAbis: [],
395
418
  };
396
419
  }
397
420
 
@@ -623,6 +646,15 @@ function configFromDefaults(options) {
623
646
  * Like the Android bridge, methods other than `ready`, `getState`, `checkPermissions`, `requestPermissions` and
624
647
  * `getDeviceInfo` reject with `NOT_READY` until `ready()` has resolved.
625
648
  */
649
+ /** The State of `ready`, `setConfig` and `reset`, with the `warnings` the Android plugin also returns. */
650
+ function withWarnings(state) {
651
+ var _a;
652
+ const url = (_a = state.config.http) === null || _a === void 0 ? void 0 : _a.url;
653
+ const warnings = typeof url === 'string' && /^http:\/\//i.test(url.trim())
654
+ ? ["http.url uses http://: Android 9+ blocks cleartext traffic unless the app's network security config allows it"]
655
+ : [];
656
+ return Object.assign(Object.assign({}, state), { warnings });
657
+ }
626
658
  class LocationTrackingWeb extends core.WebPlugin {
627
659
  constructor() {
628
660
  super(...arguments);
@@ -639,7 +671,7 @@ class LocationTrackingWeb extends core.WebPlugin {
639
671
  this.config = config;
640
672
  }
641
673
  this.isReady = true;
642
- return webState(this.config);
674
+ return withWarnings(webState(this.config));
643
675
  }
644
676
  async setConfig(options) {
645
677
  this.requireReady();
@@ -647,12 +679,12 @@ class LocationTrackingWeb extends core.WebPlugin {
647
679
  throw webError('INVALID_ARGUMENT', 'config must be an object.');
648
680
  }
649
681
  this.config = mergeConfig(this.config, options.config);
650
- return webState(this.config);
682
+ return withWarnings(webState(this.config));
651
683
  }
652
684
  async reset(options) {
653
685
  this.requireReady();
654
686
  this.config = configFromDefaults(options);
655
- return webState(this.config);
687
+ return withWarnings(webState(this.config));
656
688
  }
657
689
  async getState() {
658
690
  return webState(this.config);
@@ -938,8 +970,10 @@ exports.onGeofencesChange = onGeofencesChange;
938
970
  exports.onHeartbeat = onHeartbeat;
939
971
  exports.onHttp = onHttp;
940
972
  exports.onLocation = onLocation;
973
+ exports.onLocationError = onLocationError;
941
974
  exports.onMotionChange = onMotionChange;
942
975
  exports.onNotificationAction = onNotificationAction;
943
976
  exports.onPowerSaveChange = onPowerSaveChange;
944
977
  exports.onProviderChange = onProviderChange;
978
+ exports.onStorageFull = onStorageFull;
945
979
  //# sourceMappingURL=plugin.cjs.js.map