@mentra/miniapp 0.3.0-beta.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 (277) hide show
  1. package/README.md +259 -0
  2. package/dist/background/index.d.ts +60 -0
  3. package/dist/background/index.d.ts.map +1 -0
  4. package/dist/background/index.js +25 -0
  5. package/dist/background/index.js.map +1 -0
  6. package/dist/background/register.d.ts +38 -0
  7. package/dist/background/register.d.ts.map +1 -0
  8. package/dist/background/register.js +75 -0
  9. package/dist/background/register.js.map +1 -0
  10. package/dist/dev-reload.d.ts +21 -0
  11. package/dist/dev-reload.d.ts.map +1 -0
  12. package/dist/dev-reload.js +62 -0
  13. package/dist/dev-reload.js.map +1 -0
  14. package/dist/envelope.d.ts +23 -0
  15. package/dist/envelope.d.ts.map +1 -0
  16. package/dist/envelope.js +47 -0
  17. package/dist/envelope.js.map +1 -0
  18. package/dist/globals.d.ts +54 -0
  19. package/dist/globals.d.ts.map +1 -0
  20. package/dist/globals.js +12 -0
  21. package/dist/globals.js.map +1 -0
  22. package/dist/index.d.ts +59 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +31 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/modules/actions.d.ts +54 -0
  27. package/dist/modules/actions.d.ts.map +1 -0
  28. package/dist/modules/actions.js +122 -0
  29. package/dist/modules/actions.js.map +1 -0
  30. package/dist/modules/auth.d.ts +25 -0
  31. package/dist/modules/auth.d.ts.map +1 -0
  32. package/dist/modules/auth.js +52 -0
  33. package/dist/modules/auth.js.map +1 -0
  34. package/dist/modules/base64.d.ts +16 -0
  35. package/dist/modules/base64.d.ts.map +1 -0
  36. package/dist/modules/base64.js +92 -0
  37. package/dist/modules/base64.js.map +1 -0
  38. package/dist/modules/blob.d.ts +161 -0
  39. package/dist/modules/blob.d.ts.map +1 -0
  40. package/dist/modules/blob.js +277 -0
  41. package/dist/modules/blob.js.map +1 -0
  42. package/dist/modules/camera.d.ts +170 -0
  43. package/dist/modules/camera.d.ts.map +1 -0
  44. package/dist/modules/camera.js +116 -0
  45. package/dist/modules/camera.js.map +1 -0
  46. package/dist/modules/cloud.d.ts +34 -0
  47. package/dist/modules/cloud.d.ts.map +1 -0
  48. package/dist/modules/cloud.js +70 -0
  49. package/dist/modules/cloud.js.map +1 -0
  50. package/dist/modules/dashboard.d.ts +16 -0
  51. package/dist/modules/dashboard.d.ts.map +1 -0
  52. package/dist/modules/dashboard.js +27 -0
  53. package/dist/modules/dashboard.js.map +1 -0
  54. package/dist/modules/display.d.ts +106 -0
  55. package/dist/modules/display.d.ts.map +1 -0
  56. package/dist/modules/display.js +57 -0
  57. package/dist/modules/display.js.map +1 -0
  58. package/dist/modules/events.d.ts +160 -0
  59. package/dist/modules/events.d.ts.map +1 -0
  60. package/dist/modules/events.js +168 -0
  61. package/dist/modules/events.js.map +1 -0
  62. package/dist/modules/glasses.d.ts +28 -0
  63. package/dist/modules/glasses.d.ts.map +1 -0
  64. package/dist/modules/glasses.js +39 -0
  65. package/dist/modules/glasses.js.map +1 -0
  66. package/dist/modules/heading.d.ts +16 -0
  67. package/dist/modules/heading.d.ts.map +1 -0
  68. package/dist/modules/heading.js +20 -0
  69. package/dist/modules/heading.js.map +1 -0
  70. package/dist/modules/imu.d.ts +31 -0
  71. package/dist/modules/imu.d.ts.map +1 -0
  72. package/dist/modules/imu.js +40 -0
  73. package/dist/modules/imu.js.map +1 -0
  74. package/dist/modules/input.d.ts +34 -0
  75. package/dist/modules/input.d.ts.map +1 -0
  76. package/dist/modules/input.js +50 -0
  77. package/dist/modules/input.js.map +1 -0
  78. package/dist/modules/led.d.ts +35 -0
  79. package/dist/modules/led.d.ts.map +1 -0
  80. package/dist/modules/led.js +39 -0
  81. package/dist/modules/led.js.map +1 -0
  82. package/dist/modules/location.d.ts +27 -0
  83. package/dist/modules/location.d.ts.map +1 -0
  84. package/dist/modules/location.js +35 -0
  85. package/dist/modules/location.js.map +1 -0
  86. package/dist/modules/mic.d.ts +44 -0
  87. package/dist/modules/mic.d.ts.map +1 -0
  88. package/dist/modules/mic.js +67 -0
  89. package/dist/modules/mic.js.map +1 -0
  90. package/dist/modules/miniapps.d.ts +72 -0
  91. package/dist/modules/miniapps.d.ts.map +1 -0
  92. package/dist/modules/miniapps.js +48 -0
  93. package/dist/modules/miniapps.js.map +1 -0
  94. package/dist/modules/navigation.d.ts +326 -0
  95. package/dist/modules/navigation.d.ts.map +1 -0
  96. package/dist/modules/navigation.js +386 -0
  97. package/dist/modules/navigation.js.map +1 -0
  98. package/dist/modules/permissions.d.ts +58 -0
  99. package/dist/modules/permissions.d.ts.map +1 -0
  100. package/dist/modules/permissions.js +66 -0
  101. package/dist/modules/permissions.js.map +1 -0
  102. package/dist/modules/phone.d.ts +95 -0
  103. package/dist/modules/phone.d.ts.map +1 -0
  104. package/dist/modules/phone.js +110 -0
  105. package/dist/modules/phone.js.map +1 -0
  106. package/dist/modules/pivots/engine.d.ts +169 -0
  107. package/dist/modules/pivots/engine.d.ts.map +1 -0
  108. package/dist/modules/pivots/engine.js +779 -0
  109. package/dist/modules/pivots/engine.js.map +1 -0
  110. package/dist/modules/pivots/geometry.d.ts +84 -0
  111. package/dist/modules/pivots/geometry.d.ts.map +1 -0
  112. package/dist/modules/pivots/geometry.js +371 -0
  113. package/dist/modules/pivots/geometry.js.map +1 -0
  114. package/dist/modules/pivots/instructions.d.ts +139 -0
  115. package/dist/modules/pivots/instructions.d.ts.map +1 -0
  116. package/dist/modules/pivots/instructions.js +280 -0
  117. package/dist/modules/pivots/instructions.js.map +1 -0
  118. package/dist/modules/speaker.d.ts +169 -0
  119. package/dist/modules/speaker.d.ts.map +1 -0
  120. package/dist/modules/speaker.js +251 -0
  121. package/dist/modules/speaker.js.map +1 -0
  122. package/dist/modules/storage.d.ts +50 -0
  123. package/dist/modules/storage.d.ts.map +1 -0
  124. package/dist/modules/storage.js +99 -0
  125. package/dist/modules/storage.js.map +1 -0
  126. package/dist/modules/stream.d.ts +129 -0
  127. package/dist/modules/stream.d.ts.map +1 -0
  128. package/dist/modules/stream.js +52 -0
  129. package/dist/modules/stream.js.map +1 -0
  130. package/dist/modules/system.d.ts +45 -0
  131. package/dist/modules/system.d.ts.map +1 -0
  132. package/dist/modules/system.js +42 -0
  133. package/dist/modules/system.js.map +1 -0
  134. package/dist/modules/transcription.d.ts +75 -0
  135. package/dist/modules/transcription.d.ts.map +1 -0
  136. package/dist/modules/transcription.js +106 -0
  137. package/dist/modules/transcription.js.map +1 -0
  138. package/dist/modules/translation.d.ts +59 -0
  139. package/dist/modules/translation.d.ts.map +1 -0
  140. package/dist/modules/translation.js +119 -0
  141. package/dist/modules/translation.js.map +1 -0
  142. package/dist/modules/ui.d.ts +186 -0
  143. package/dist/modules/ui.d.ts.map +1 -0
  144. package/dist/modules/ui.js +293 -0
  145. package/dist/modules/ui.js.map +1 -0
  146. package/dist/protocol.d.ts +299 -0
  147. package/dist/protocol.d.ts.map +1 -0
  148. package/dist/protocol.js +325 -0
  149. package/dist/protocol.js.map +1 -0
  150. package/dist/react/MentraProvider.d.ts +33 -0
  151. package/dist/react/MentraProvider.d.ts.map +1 -0
  152. package/dist/react/MentraProvider.js +15 -0
  153. package/dist/react/MentraProvider.js.map +1 -0
  154. package/dist/react/MiniappHeader.d.ts +44 -0
  155. package/dist/react/MiniappHeader.d.ts.map +1 -0
  156. package/dist/react/MiniappHeader.js +32 -0
  157. package/dist/react/MiniappHeader.js.map +1 -0
  158. package/dist/react/index.d.ts +13 -0
  159. package/dist/react/index.d.ts.map +1 -0
  160. package/dist/react/index.js +9 -0
  161. package/dist/react/index.js.map +1 -0
  162. package/dist/react/useCapabilities.d.ts +26 -0
  163. package/dist/react/useCapabilities.d.ts.map +1 -0
  164. package/dist/react/useCapabilities.js +27 -0
  165. package/dist/react/useCapabilities.js.map +1 -0
  166. package/dist/react/useCapsuleHeaderStyle.d.ts +27 -0
  167. package/dist/react/useCapsuleHeaderStyle.d.ts.map +1 -0
  168. package/dist/react/useCapsuleHeaderStyle.js +36 -0
  169. package/dist/react/useCapsuleHeaderStyle.js.map +1 -0
  170. package/dist/react/useColorScheme.d.ts +18 -0
  171. package/dist/react/useColorScheme.d.ts.map +1 -0
  172. package/dist/react/useColorScheme.js +24 -0
  173. package/dist/react/useColorScheme.js.map +1 -0
  174. package/dist/react/useConnected.d.ts +17 -0
  175. package/dist/react/useConnected.d.ts.map +1 -0
  176. package/dist/react/useConnected.js +39 -0
  177. package/dist/react/useConnected.js.map +1 -0
  178. package/dist/react/useRpc.d.ts +29 -0
  179. package/dist/react/useRpc.d.ts.map +1 -0
  180. package/dist/react/useRpc.js +82 -0
  181. package/dist/react/useRpc.js.map +1 -0
  182. package/dist/react/useSafeArea.d.ts +21 -0
  183. package/dist/react/useSafeArea.d.ts.map +1 -0
  184. package/dist/react/useSafeArea.js +22 -0
  185. package/dist/react/useSafeArea.js.map +1 -0
  186. package/dist/session.d.ts +312 -0
  187. package/dist/session.d.ts.map +1 -0
  188. package/dist/session.js +653 -0
  189. package/dist/session.js.map +1 -0
  190. package/dist/sub-path-types.test-d.d.ts +28 -0
  191. package/dist/sub-path-types.test-d.d.ts.map +1 -0
  192. package/dist/sub-path-types.test-d.js +37 -0
  193. package/dist/sub-path-types.test-d.js.map +1 -0
  194. package/dist/transport/auto.d.ts +35 -0
  195. package/dist/transport/auto.d.ts.map +1 -0
  196. package/dist/transport/auto.js +125 -0
  197. package/dist/transport/auto.js.map +1 -0
  198. package/dist/transport/dispatch.d.ts +43 -0
  199. package/dist/transport/dispatch.d.ts.map +1 -0
  200. package/dist/transport/dispatch.js +91 -0
  201. package/dist/transport/dispatch.js.map +1 -0
  202. package/dist/transport/local-socket.d.ts +28 -0
  203. package/dist/transport/local-socket.d.ts.map +1 -0
  204. package/dist/transport/local-socket.js +80 -0
  205. package/dist/transport/local-socket.js.map +1 -0
  206. package/dist/transport/mock.d.ts +54 -0
  207. package/dist/transport/mock.d.ts.map +1 -0
  208. package/dist/transport/mock.js +207 -0
  209. package/dist/transport/mock.js.map +1 -0
  210. package/dist/transport/postmessage.d.ts +36 -0
  211. package/dist/transport/postmessage.d.ts.map +1 -0
  212. package/dist/transport/postmessage.js +78 -0
  213. package/dist/transport/postmessage.js.map +1 -0
  214. package/dist/transport/types.d.ts +25 -0
  215. package/dist/transport/types.d.ts.map +1 -0
  216. package/dist/transport/types.js +11 -0
  217. package/dist/transport/types.js.map +1 -0
  218. package/dist/ui/index.d.ts +98 -0
  219. package/dist/ui/index.d.ts.map +1 -0
  220. package/dist/ui/index.js +32 -0
  221. package/dist/ui/index.js.map +1 -0
  222. package/package.json +84 -0
  223. package/src/background/index.ts +152 -0
  224. package/src/background/register.ts +85 -0
  225. package/src/dev-reload.ts +60 -0
  226. package/src/envelope.ts +54 -0
  227. package/src/globals.ts +62 -0
  228. package/src/index.ts +171 -0
  229. package/src/modules/actions.ts +156 -0
  230. package/src/modules/auth.ts +68 -0
  231. package/src/modules/base64.ts +87 -0
  232. package/src/modules/blob.ts +341 -0
  233. package/src/modules/camera.ts +242 -0
  234. package/src/modules/cloud.ts +94 -0
  235. package/src/modules/dashboard.ts +31 -0
  236. package/src/modules/display.ts +122 -0
  237. package/src/modules/events.ts +291 -0
  238. package/src/modules/glasses.ts +44 -0
  239. package/src/modules/heading.ts +23 -0
  240. package/src/modules/imu.ts +44 -0
  241. package/src/modules/input.ts +71 -0
  242. package/src/modules/led.ts +61 -0
  243. package/src/modules/location.ts +39 -0
  244. package/src/modules/mic.ts +74 -0
  245. package/src/modules/miniapps.ts +90 -0
  246. package/src/modules/navigation.ts +670 -0
  247. package/src/modules/permissions.ts +84 -0
  248. package/src/modules/phone.ts +155 -0
  249. package/src/modules/pivots/engine.ts +863 -0
  250. package/src/modules/pivots/geometry.ts +409 -0
  251. package/src/modules/pivots/instructions.ts +343 -0
  252. package/src/modules/speaker.ts +335 -0
  253. package/src/modules/storage.ts +109 -0
  254. package/src/modules/stream.ts +163 -0
  255. package/src/modules/system.ts +76 -0
  256. package/src/modules/transcription.ts +145 -0
  257. package/src/modules/translation.ts +149 -0
  258. package/src/modules/ui.ts +498 -0
  259. package/src/protocol.ts +378 -0
  260. package/src/react/MentraProvider.tsx +50 -0
  261. package/src/react/MiniappHeader.tsx +122 -0
  262. package/src/react/index.ts +12 -0
  263. package/src/react/useCapabilities.ts +29 -0
  264. package/src/react/useCapsuleHeaderStyle.ts +54 -0
  265. package/src/react/useColorScheme.ts +26 -0
  266. package/src/react/useConnected.ts +47 -0
  267. package/src/react/useRpc.ts +106 -0
  268. package/src/react/useSafeArea.ts +40 -0
  269. package/src/session.ts +886 -0
  270. package/src/sub-path-types.test-d.ts +49 -0
  271. package/src/transport/auto.ts +143 -0
  272. package/src/transport/dispatch.ts +106 -0
  273. package/src/transport/local-socket.ts +93 -0
  274. package/src/transport/mock.ts +251 -0
  275. package/src/transport/postmessage.ts +95 -0
  276. package/src/transport/types.ts +26 -0
  277. package/src/ui/index.ts +122 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @fileoverview PhoneModule — phone device-state events.
3
+ *
4
+ * Mirrors cloud SDK v3's PhoneManager structure. Sub-namespaced by concern:
5
+ *
6
+ * session.phone.notifications.{on, hasPermission, stop}
7
+ * session.phone.calendar.{listEvents, hasPermission}
8
+ * session.phone.onBattery(...) // stays flat
9
+ *
10
+ * Imperative phone-OS calls (share, openUrl, copyToClipboard, download) live
11
+ * on `session.system` — different shape (one-shot calls vs. event subs) so
12
+ * we don't conflate them.
13
+ *
14
+ * `phone.notifications.onDismissed` is Android-only. iOS doesn't expose
15
+ * notification-dismiss callbacks to apps (Apple privacy restriction);
16
+ * subscribing on iOS is a no-op even though the API is present.
17
+ */
18
+ import { MiniappRequestType, MiniappStreamType } from "../protocol";
19
+ class TrackedSubs {
20
+ constructor() {
21
+ this.unsubs = new Set();
22
+ }
23
+ track(unsub) {
24
+ this.unsubs.add(unsub);
25
+ return () => {
26
+ this.unsubs.delete(unsub);
27
+ unsub();
28
+ };
29
+ }
30
+ stop() {
31
+ for (const u of this.unsubs) {
32
+ try {
33
+ u();
34
+ }
35
+ catch {
36
+ /* ignore */
37
+ }
38
+ }
39
+ this.unsubs.clear();
40
+ }
41
+ }
42
+ export class PhoneNotificationsModule extends TrackedSubs {
43
+ constructor(session) {
44
+ super();
45
+ this.session = session;
46
+ }
47
+ on(handler) {
48
+ return this.track(this.session._subscribe(MiniappStreamType.PHONE_NOTIFICATION, handler));
49
+ }
50
+ /**
51
+ * Subscribe to dismiss events for phone notifications. Fires when the user
52
+ * dismisses (swipes away or clears) a notification.
53
+ *
54
+ * **Android only.** iOS does not expose dismiss callbacks to apps (Apple
55
+ * privacy restriction); subscribing on iOS succeeds but no events ever
56
+ * fire. The matching `notifications.on()` post-event still works on both
57
+ * platforms.
58
+ */
59
+ onDismissed(handler) {
60
+ return this.track(this.session._subscribe(MiniappStreamType.PHONE_NOTIFICATION_DISMISSED, handler));
61
+ }
62
+ /** True iff `READ_NOTIFICATIONS` is declared in the miniapp's manifest. */
63
+ get hasPermission() {
64
+ return this.session._hasManifestPermission("READ_NOTIFICATIONS");
65
+ }
66
+ }
67
+ export class PhoneCalendarModule {
68
+ constructor(session) {
69
+ this.session = session;
70
+ }
71
+ /**
72
+ * Read calendar events in a bounded window. CALENDAR must be declared in
73
+ * miniapp.json and granted before the miniapp opens.
74
+ */
75
+ listEvents(options) {
76
+ const startsAt = normalizeCalendarDate(options?.startsAt, "startsAt");
77
+ const endsAt = normalizeCalendarDate(options?.endsAt, "endsAt");
78
+ return this.session.sendRequest({
79
+ type: MiniappRequestType.CALENDAR_LIST_EVENTS,
80
+ startsAt,
81
+ endsAt,
82
+ ...(options.limit === undefined ? {} : { limit: options.limit }),
83
+ });
84
+ }
85
+ /** True iff `CALENDAR` is declared in the miniapp's manifest. */
86
+ get hasPermission() {
87
+ return this.session._hasManifestPermission("CALENDAR");
88
+ }
89
+ }
90
+ function normalizeCalendarDate(value, field) {
91
+ const date = value instanceof Date ? value : new Date(value ?? "");
92
+ if (Number.isNaN(date.getTime()))
93
+ throw new TypeError(`${field} must be a valid Date or ISO 8601 string`);
94
+ return date.toISOString();
95
+ }
96
+ export class PhoneModule {
97
+ constructor(session) {
98
+ this.session = session;
99
+ this.notifications = new PhoneNotificationsModule(session);
100
+ this.calendar = new PhoneCalendarModule(session);
101
+ }
102
+ /**
103
+ * Phone battery events. Stays flat (not sub-namespaced) — single event,
104
+ * no extra surface.
105
+ */
106
+ onBattery(handler) {
107
+ return this.session._subscribe(MiniappStreamType.PHONE_BATTERY, handler);
108
+ }
109
+ }
110
+ //# sourceMappingURL=phone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.js","sourceRoot":"","sources":["../../src/modules/phone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * @fileoverview Pivot engine — internal to NavigationModule.
3
+ *
4
+ * Owns the per-trip pivot list and the cursor that walks it as GPS
5
+ * ticks come in. Public consumers of the SDK never touch this class
6
+ * directly — they go through `navigation.onPivot()` / `getPivots()` /
7
+ * `getActivePivot()` / `getUpcomingPivot()`.
8
+ *
9
+ * Lifecycle:
10
+ * - `reset()` on `navigation.start()`. Clears pivot list, cursor,
11
+ * all subscribers stay attached.
12
+ * - `setRoute(route)` on the first `onRoute` after start, and on
13
+ * every subsequent reroute. Rebuilds the pivot list from
14
+ * scratch.
15
+ * - `onLocationUpdate(coords)` on every GPS fix. Computes which
16
+ * events to fire and emits them to subscribers.
17
+ * - `reset()` on `stop()` / `arrived`.
18
+ *
19
+ * The engine doesn't subscribe to GPS itself — `NavigationModule`
20
+ * owns that, calling `onLocationUpdate(coords)` from its own GPS
21
+ * subscription. Keeps this class pure-state with no side effects.
22
+ */
23
+ import type { LatLng, ManeuverKind, NavRoute, Pivot, PivotEvent, PivotOptions, TravelMode } from "../navigation";
24
+ import { bearingDeg, haversineMeters, signedAngleDiff } from "./geometry";
25
+ type Subscriber = (event: PivotEvent) => void;
26
+ export declare class PivotEngine {
27
+ private opts;
28
+ private pivots;
29
+ private states;
30
+ /** Index of the next pivot we expect the user to encounter. */
31
+ private cursor;
32
+ /** Pivot currently between `entered` and `exited`, or null. */
33
+ private activePivotIndex;
34
+ /**
35
+ * Latest route polyline + its cumulative-distance array. Retained
36
+ * after `setRoute()` so `onLocationUpdate` can project the user onto
37
+ * the path and compare along-path distance to each pivot's
38
+ * `distanceAlongRouteMeters`. This is what makes a pedestrian on the
39
+ * wrong sidewalk still trigger the upcoming turn — straight-line
40
+ * distance to the pivot point would miss it.
41
+ */
42
+ private points;
43
+ private cumulative;
44
+ /**
45
+ * Async road-name resolver injected by NavigationModule. Backs the
46
+ * engine's last-resort fallback: when a pivot's `fromRoad` or
47
+ * `toRoad` is null after Routes-API instruction parsing, the
48
+ * engine samples a coordinate ~SAMPLE_OFFSET_M behind/ahead along
49
+ * the polyline and asks the host to reverse-geocode it. Patched
50
+ * onto the pivot in place when the response lands. Null when no
51
+ * resolver is wired — the engine simply leaves the field null.
52
+ */
53
+ private roadNameResolver;
54
+ /**
55
+ * Generation counter bumped on every route rebuild. Geocode
56
+ * responses from a stale route are discarded by comparing the
57
+ * generation captured at request time against the current value.
58
+ * Without this, a slow geocode reply from a previous route can
59
+ * stamp a fresh route's pivot with the wrong road name.
60
+ */
61
+ private routeGeneration;
62
+ private subscribers;
63
+ constructor(mode: TravelMode, opts: PivotOptions | undefined);
64
+ /** Replace the trip-level options. Used if `start()` is called
65
+ * with new options without a full reset. */
66
+ updateOptions(mode: TravelMode, opts: PivotOptions | undefined): void;
67
+ /**
68
+ * Install the host-backed reverse-geocode resolver. NavigationModule
69
+ * calls this once after constructing the engine, wiring through to
70
+ * the host's Geocoding REST adapter. When unset, the engine simply
71
+ * leaves null road names in place — geocoding is a best-effort
72
+ * enhancement, not a requirement.
73
+ */
74
+ setRoadNameResolver(resolver: ((coord: LatLng) => Promise<string | null>) | null): void;
75
+ /**
76
+ * Clear all pivot state. Pivots = []. Cursor reset. Active pivot
77
+ * cleared. Subscribers stay attached so the next `setRoute` can
78
+ * fire events.
79
+ */
80
+ reset(): void;
81
+ /**
82
+ * Rebuild the pivot list from a Routes-API computed step list. This
83
+ * is the high-accuracy path used during live trips: `instruction`
84
+ * strings on each step name the road being entered unambiguously
85
+ * ("Turn left onto Octavia Blvd"), and the explicit `endLat/endLng`
86
+ * gives us the exact corner location without polyline-walking math.
87
+ *
88
+ * NavigationModule calls this once per route lifecycle — at trip
89
+ * start (after firing NAVIGATION_COMPUTE_ROUTE), and again on every
90
+ * reroute. The cursor + state machinery (approaching / entered /
91
+ * exited) is identical to `setRoute` — only the pivot construction
92
+ * differs.
93
+ *
94
+ * If the computed-step list is empty or no pivots survive the
95
+ * filters in `extractPivotsFromComputedSteps`, this falls back to
96
+ * `setRoute(route)` so the geometry-derived pivots are still
97
+ * available. That keeps the engine working on platforms that don't
98
+ * yet have Routes API plumbing.
99
+ */
100
+ setRouteFromComputedSteps(route: NavRoute, computedSteps: Array<{
101
+ lat: number;
102
+ lng: number;
103
+ endLat: number;
104
+ endLng: number;
105
+ distanceMeters: number;
106
+ maneuver?: ManeuverKind;
107
+ instruction?: string;
108
+ /** Host-resolved road name (Phase 1). Optional for backward
109
+ * compat with callers that only supply `instruction`. */
110
+ road?: string | null;
111
+ }> | undefined): void;
112
+ /**
113
+ * Rebuild the pivot list from a fresh route. Called on every
114
+ * `onRoute` event. Any prior pivot list is discarded; cursor
115
+ * resets to 0.
116
+ */
117
+ setRoute(route: NavRoute, _userPosition: LatLng | null): void;
118
+ /**
119
+ * For every pivot in the current list that has a missing road
120
+ * label, fill it in. Two-stage strategy:
121
+ *
122
+ * 1. **Inherit from neighbors.** Adjacent pivots on the route
123
+ * share roads by definition: between pivot N and pivot N+1
124
+ * there are no turns, so pivot N's toRoad == pivot N+1's
125
+ * fromRoad. If one side is known, copy it. This is free
126
+ * (no network) and avoids the geocode-mismatch class of bug
127
+ * where two different sample points return two different
128
+ * strings for what is conceptually the same road.
129
+ *
130
+ * 2. **Reverse-geocode the remainder.** For any field still
131
+ * null after inheritance, sample a coordinate ~18m behind
132
+ * (fromRoad) or ahead (toRoad) along the polyline and ask
133
+ * the host to reverse-geocode it. Best-effort — failures
134
+ * leave the field null.
135
+ *
136
+ * The `generation` guard rejects geocode replies arriving after
137
+ * a fresh route rebuild superseded them.
138
+ */
139
+ private _resolveMissingRoadNames;
140
+ /**
141
+ * Drive the cursor with a new GPS fix. Fires `approaching` /
142
+ * `entered` / `exited` as thresholds are crossed.
143
+ *
144
+ * Two distance metrics are used:
145
+ *
146
+ * 1. **Along-path distance** — the user's projected position on the
147
+ * route polyline gives `userAlong`; each pivot's
148
+ * `distanceAlongRouteMeters` is its `pivotAlong`. The signed
149
+ * delta `pivotAlong - userAlong` says how far the user still has
150
+ * to walk to reach the pivot's perpendicular line (positive =
151
+ * ahead, negative = past). This is the primary metric for
152
+ * pedestrians, because it doesn't care which sidewalk they're on
153
+ * — only that they've crossed the pivot's latitude/longitude
154
+ * band.
155
+ *
156
+ * 2. **Straight-line distance** — fallback when the user is more
157
+ * than ON_ROUTE_PERP_TOLERANCE_M from the polyline (they've
158
+ * really wandered off, not just onto the wrong sidewalk). Keeps
159
+ * the legacy behavior for that case.
160
+ */
161
+ onLocationUpdate(coords: LatLng): void;
162
+ subscribe(fn: Subscriber): () => void;
163
+ getPivots(): Pivot[];
164
+ getActivePivot(): Pivot | null;
165
+ getUpcomingPivot(): Pivot | null;
166
+ private emit;
167
+ }
168
+ export { bearingDeg, haversineMeters, signedAngleDiff };
169
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/modules/pivots/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAW,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,eAAe,CAAA;AACvH,OAAO,EACL,UAAU,EAGV,eAAe,EACf,eAAe,EAEhB,MAAM,YAAY,CAAA;AAkDnB,KAAK,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAY7C,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,+DAA+D;IAC/D,OAAO,CAAC,MAAM,CAAI;IAClB,+DAA+D;IAC/D,OAAO,CAAC,gBAAgB,CAAsB;IAC9C;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAe;IACjC;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB,CAA2D;IACnF;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,WAAW,CAAwB;gBAE/B,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS;IAI5D;iDAC6C;IAC7C,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI;IAQrE;;;;;;OAMG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI;IAIvF;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAeb;;;;;;;;;;;;;;;;;;OAkBG;IACH,yBAAyB,CACvB,KAAK,EAAE,QAAQ,EACf,aAAa,EACT,KAAK,CAAC;QACJ,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,cAAc,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,EAAE,YAAY,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB;kEAC0D;QAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,CAAC,GACF,SAAS,GACZ,IAAI;IA2FP;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA0E7D;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,wBAAwB;IAiGtC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA2FtC,SAAS,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,IAAI;IAOrC,SAAS,IAAI,KAAK,EAAE;IAIpB,cAAc,IAAI,KAAK,GAAG,IAAI;IAK9B,gBAAgB,IAAI,KAAK,GAAG,IAAI;IAUhC,OAAO,CAAC,IAAI;CASb;AAuND,OAAO,EAAC,UAAU,EAAE,eAAe,EAAE,eAAe,EAAC,CAAA"}