@glassly/miniapp 0.1.0-dev.26

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 (312) hide show
  1. package/README.md +275 -0
  2. package/dist/background/index.d.ts +64 -0
  3. package/dist/background/index.d.ts.map +1 -0
  4. package/dist/background/index.js +26 -0
  5. package/dist/background/index.js.map +1 -0
  6. package/dist/background/register.d.ts +39 -0
  7. package/dist/background/register.d.ts.map +1 -0
  8. package/dist/background/register.js +72 -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 +60 -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/hardware.d.ts +24 -0
  23. package/dist/hardware.d.ts.map +1 -0
  24. package/dist/hardware.js +20 -0
  25. package/dist/hardware.js.map +1 -0
  26. package/dist/index.d.ts +65 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +34 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/actions.d.ts +81 -0
  31. package/dist/modules/actions.d.ts.map +1 -0
  32. package/dist/modules/actions.js +137 -0
  33. package/dist/modules/actions.js.map +1 -0
  34. package/dist/modules/ai.d.ts +211 -0
  35. package/dist/modules/ai.d.ts.map +1 -0
  36. package/dist/modules/ai.js +117 -0
  37. package/dist/modules/ai.js.map +1 -0
  38. package/dist/modules/auth.d.ts +25 -0
  39. package/dist/modules/auth.d.ts.map +1 -0
  40. package/dist/modules/auth.js +52 -0
  41. package/dist/modules/auth.js.map +1 -0
  42. package/dist/modules/base64.d.ts +16 -0
  43. package/dist/modules/base64.d.ts.map +1 -0
  44. package/dist/modules/base64.js +92 -0
  45. package/dist/modules/base64.js.map +1 -0
  46. package/dist/modules/blob.d.ts +161 -0
  47. package/dist/modules/blob.d.ts.map +1 -0
  48. package/dist/modules/blob.js +277 -0
  49. package/dist/modules/blob.js.map +1 -0
  50. package/dist/modules/camera.d.ts +183 -0
  51. package/dist/modules/camera.d.ts.map +1 -0
  52. package/dist/modules/camera.js +119 -0
  53. package/dist/modules/camera.js.map +1 -0
  54. package/dist/modules/cloud.d.ts +34 -0
  55. package/dist/modules/cloud.d.ts.map +1 -0
  56. package/dist/modules/cloud.js +70 -0
  57. package/dist/modules/cloud.js.map +1 -0
  58. package/dist/modules/dashboard.d.ts +24 -0
  59. package/dist/modules/dashboard.d.ts.map +1 -0
  60. package/dist/modules/dashboard.js +39 -0
  61. package/dist/modules/dashboard.js.map +1 -0
  62. package/dist/modules/display.d.ts +174 -0
  63. package/dist/modules/display.d.ts.map +1 -0
  64. package/dist/modules/display.js +83 -0
  65. package/dist/modules/display.js.map +1 -0
  66. package/dist/modules/events.d.ts +178 -0
  67. package/dist/modules/events.d.ts.map +1 -0
  68. package/dist/modules/events.js +168 -0
  69. package/dist/modules/events.js.map +1 -0
  70. package/dist/modules/glasses.d.ts +36 -0
  71. package/dist/modules/glasses.d.ts.map +1 -0
  72. package/dist/modules/glasses.js +52 -0
  73. package/dist/modules/glasses.js.map +1 -0
  74. package/dist/modules/heading.d.ts +16 -0
  75. package/dist/modules/heading.d.ts.map +1 -0
  76. package/dist/modules/heading.js +20 -0
  77. package/dist/modules/heading.js.map +1 -0
  78. package/dist/modules/imu.d.ts +31 -0
  79. package/dist/modules/imu.d.ts.map +1 -0
  80. package/dist/modules/imu.js +40 -0
  81. package/dist/modules/imu.js.map +1 -0
  82. package/dist/modules/input.d.ts +50 -0
  83. package/dist/modules/input.d.ts.map +1 -0
  84. package/dist/modules/input.js +70 -0
  85. package/dist/modules/input.js.map +1 -0
  86. package/dist/modules/keys.d.ts +30 -0
  87. package/dist/modules/keys.d.ts.map +1 -0
  88. package/dist/modules/keys.js +37 -0
  89. package/dist/modules/keys.js.map +1 -0
  90. package/dist/modules/languages.d.ts +42 -0
  91. package/dist/modules/languages.d.ts.map +1 -0
  92. package/dist/modules/languages.js +57 -0
  93. package/dist/modules/languages.js.map +1 -0
  94. package/dist/modules/led.d.ts +35 -0
  95. package/dist/modules/led.d.ts.map +1 -0
  96. package/dist/modules/led.js +39 -0
  97. package/dist/modules/led.js.map +1 -0
  98. package/dist/modules/location.d.ts +27 -0
  99. package/dist/modules/location.d.ts.map +1 -0
  100. package/dist/modules/location.js +35 -0
  101. package/dist/modules/location.js.map +1 -0
  102. package/dist/modules/memory.d.ts +126 -0
  103. package/dist/modules/memory.d.ts.map +1 -0
  104. package/dist/modules/memory.js +141 -0
  105. package/dist/modules/memory.js.map +1 -0
  106. package/dist/modules/mic.d.ts +61 -0
  107. package/dist/modules/mic.d.ts.map +1 -0
  108. package/dist/modules/mic.js +94 -0
  109. package/dist/modules/mic.js.map +1 -0
  110. package/dist/modules/miniapps.d.ts +82 -0
  111. package/dist/modules/miniapps.d.ts.map +1 -0
  112. package/dist/modules/miniapps.js +58 -0
  113. package/dist/modules/miniapps.js.map +1 -0
  114. package/dist/modules/navigation.d.ts +332 -0
  115. package/dist/modules/navigation.d.ts.map +1 -0
  116. package/dist/modules/navigation.js +387 -0
  117. package/dist/modules/navigation.js.map +1 -0
  118. package/dist/modules/permissions.d.ts +58 -0
  119. package/dist/modules/permissions.d.ts.map +1 -0
  120. package/dist/modules/permissions.js +66 -0
  121. package/dist/modules/permissions.js.map +1 -0
  122. package/dist/modules/phone.d.ts +95 -0
  123. package/dist/modules/phone.d.ts.map +1 -0
  124. package/dist/modules/phone.js +110 -0
  125. package/dist/modules/phone.js.map +1 -0
  126. package/dist/modules/pivots/engine.d.ts +169 -0
  127. package/dist/modules/pivots/engine.d.ts.map +1 -0
  128. package/dist/modules/pivots/engine.js +778 -0
  129. package/dist/modules/pivots/engine.js.map +1 -0
  130. package/dist/modules/pivots/geometry.d.ts +84 -0
  131. package/dist/modules/pivots/geometry.d.ts.map +1 -0
  132. package/dist/modules/pivots/geometry.js +371 -0
  133. package/dist/modules/pivots/geometry.js.map +1 -0
  134. package/dist/modules/pivots/instructions.d.ts +139 -0
  135. package/dist/modules/pivots/instructions.d.ts.map +1 -0
  136. package/dist/modules/pivots/instructions.js +281 -0
  137. package/dist/modules/pivots/instructions.js.map +1 -0
  138. package/dist/modules/speaker.d.ts +175 -0
  139. package/dist/modules/speaker.d.ts.map +1 -0
  140. package/dist/modules/speaker.js +249 -0
  141. package/dist/modules/speaker.js.map +1 -0
  142. package/dist/modules/speakers.d.ts +29 -0
  143. package/dist/modules/speakers.d.ts.map +1 -0
  144. package/dist/modules/speakers.js +38 -0
  145. package/dist/modules/speakers.js.map +1 -0
  146. package/dist/modules/storage.d.ts +50 -0
  147. package/dist/modules/storage.d.ts.map +1 -0
  148. package/dist/modules/storage.js +99 -0
  149. package/dist/modules/storage.js.map +1 -0
  150. package/dist/modules/stream.d.ts +133 -0
  151. package/dist/modules/stream.d.ts.map +1 -0
  152. package/dist/modules/stream.js +53 -0
  153. package/dist/modules/stream.js.map +1 -0
  154. package/dist/modules/system.d.ts +71 -0
  155. package/dist/modules/system.d.ts.map +1 -0
  156. package/dist/modules/system.js +65 -0
  157. package/dist/modules/system.js.map +1 -0
  158. package/dist/modules/transcription.d.ts +99 -0
  159. package/dist/modules/transcription.d.ts.map +1 -0
  160. package/dist/modules/transcription.js +126 -0
  161. package/dist/modules/transcription.js.map +1 -0
  162. package/dist/modules/translation.d.ts +65 -0
  163. package/dist/modules/translation.d.ts.map +1 -0
  164. package/dist/modules/translation.js +121 -0
  165. package/dist/modules/translation.js.map +1 -0
  166. package/dist/modules/ui.d.ts +186 -0
  167. package/dist/modules/ui.d.ts.map +1 -0
  168. package/dist/modules/ui.js +289 -0
  169. package/dist/modules/ui.js.map +1 -0
  170. package/dist/protocol.d.ts +390 -0
  171. package/dist/protocol.d.ts.map +1 -0
  172. package/dist/protocol.js +419 -0
  173. package/dist/protocol.js.map +1 -0
  174. package/dist/react/MiniappHeader.d.ts +44 -0
  175. package/dist/react/MiniappHeader.d.ts.map +1 -0
  176. package/dist/react/MiniappHeader.js +32 -0
  177. package/dist/react/MiniappHeader.js.map +1 -0
  178. package/dist/react/MiniappProvider.d.ts +33 -0
  179. package/dist/react/MiniappProvider.d.ts.map +1 -0
  180. package/dist/react/MiniappProvider.js +15 -0
  181. package/dist/react/MiniappProvider.js.map +1 -0
  182. package/dist/react/capsuleHeaderLayout.d.ts +3 -0
  183. package/dist/react/capsuleHeaderLayout.d.ts.map +1 -0
  184. package/dist/react/capsuleHeaderLayout.js +5 -0
  185. package/dist/react/capsuleHeaderLayout.js.map +1 -0
  186. package/dist/react/index.d.ts +13 -0
  187. package/dist/react/index.d.ts.map +1 -0
  188. package/dist/react/index.js +9 -0
  189. package/dist/react/index.js.map +1 -0
  190. package/dist/react/useCapabilities.d.ts +26 -0
  191. package/dist/react/useCapabilities.d.ts.map +1 -0
  192. package/dist/react/useCapabilities.js +27 -0
  193. package/dist/react/useCapabilities.js.map +1 -0
  194. package/dist/react/useCapsuleHeaderStyle.d.ts +27 -0
  195. package/dist/react/useCapsuleHeaderStyle.d.ts.map +1 -0
  196. package/dist/react/useCapsuleHeaderStyle.js +39 -0
  197. package/dist/react/useCapsuleHeaderStyle.js.map +1 -0
  198. package/dist/react/useColorScheme.d.ts +18 -0
  199. package/dist/react/useColorScheme.d.ts.map +1 -0
  200. package/dist/react/useColorScheme.js +24 -0
  201. package/dist/react/useColorScheme.js.map +1 -0
  202. package/dist/react/useConnected.d.ts +17 -0
  203. package/dist/react/useConnected.d.ts.map +1 -0
  204. package/dist/react/useConnected.js +39 -0
  205. package/dist/react/useConnected.js.map +1 -0
  206. package/dist/react/useRpc.d.ts +29 -0
  207. package/dist/react/useRpc.d.ts.map +1 -0
  208. package/dist/react/useRpc.js +82 -0
  209. package/dist/react/useRpc.js.map +1 -0
  210. package/dist/react/useSafeArea.d.ts +21 -0
  211. package/dist/react/useSafeArea.d.ts.map +1 -0
  212. package/dist/react/useSafeArea.js +22 -0
  213. package/dist/react/useSafeArea.js.map +1 -0
  214. package/dist/session.d.ts +355 -0
  215. package/dist/session.d.ts.map +1 -0
  216. package/dist/session.js +688 -0
  217. package/dist/session.js.map +1 -0
  218. package/dist/sub-path-types.test-d.d.ts +40 -0
  219. package/dist/sub-path-types.test-d.d.ts.map +1 -0
  220. package/dist/sub-path-types.test-d.js +37 -0
  221. package/dist/sub-path-types.test-d.js.map +1 -0
  222. package/dist/transport/auto.d.ts +35 -0
  223. package/dist/transport/auto.d.ts.map +1 -0
  224. package/dist/transport/auto.js +124 -0
  225. package/dist/transport/auto.js.map +1 -0
  226. package/dist/transport/dispatch.d.ts +43 -0
  227. package/dist/transport/dispatch.d.ts.map +1 -0
  228. package/dist/transport/dispatch.js +91 -0
  229. package/dist/transport/dispatch.js.map +1 -0
  230. package/dist/transport/local-socket.d.ts +28 -0
  231. package/dist/transport/local-socket.d.ts.map +1 -0
  232. package/dist/transport/local-socket.js +80 -0
  233. package/dist/transport/local-socket.js.map +1 -0
  234. package/dist/transport/mock.d.ts +54 -0
  235. package/dist/transport/mock.d.ts.map +1 -0
  236. package/dist/transport/mock.js +210 -0
  237. package/dist/transport/mock.js.map +1 -0
  238. package/dist/transport/postmessage.d.ts +36 -0
  239. package/dist/transport/postmessage.d.ts.map +1 -0
  240. package/dist/transport/postmessage.js +78 -0
  241. package/dist/transport/postmessage.js.map +1 -0
  242. package/dist/transport/types.d.ts +25 -0
  243. package/dist/transport/types.d.ts.map +1 -0
  244. package/dist/transport/types.js +11 -0
  245. package/dist/transport/types.js.map +1 -0
  246. package/dist/ui/index.d.ts +107 -0
  247. package/dist/ui/index.d.ts.map +1 -0
  248. package/dist/ui/index.js +32 -0
  249. package/dist/ui/index.js.map +1 -0
  250. package/package.json +88 -0
  251. package/src/background/index.ts +177 -0
  252. package/src/background/register.ts +89 -0
  253. package/src/dev-reload.ts +59 -0
  254. package/src/envelope.ts +54 -0
  255. package/src/globals.ts +62 -0
  256. package/src/hardware.ts +25 -0
  257. package/src/index.ts +216 -0
  258. package/src/modules/actions.ts +189 -0
  259. package/src/modules/ai.ts +281 -0
  260. package/src/modules/auth.ts +68 -0
  261. package/src/modules/base64.ts +87 -0
  262. package/src/modules/blob.ts +341 -0
  263. package/src/modules/camera.ts +258 -0
  264. package/src/modules/cloud.ts +94 -0
  265. package/src/modules/dashboard.ts +51 -0
  266. package/src/modules/display.ts +214 -0
  267. package/src/modules/events.ts +318 -0
  268. package/src/modules/glasses.ts +58 -0
  269. package/src/modules/heading.ts +23 -0
  270. package/src/modules/imu.ts +44 -0
  271. package/src/modules/input.ts +87 -0
  272. package/src/modules/keys.ts +46 -0
  273. package/src/modules/languages.ts +72 -0
  274. package/src/modules/led.ts +61 -0
  275. package/src/modules/location.ts +39 -0
  276. package/src/modules/memory.ts +224 -0
  277. package/src/modules/mic.ts +103 -0
  278. package/src/modules/miniapps.ts +103 -0
  279. package/src/modules/navigation.ts +674 -0
  280. package/src/modules/permissions.ts +83 -0
  281. package/src/modules/phone.ts +155 -0
  282. package/src/modules/pivots/engine.ts +863 -0
  283. package/src/modules/pivots/geometry.ts +409 -0
  284. package/src/modules/pivots/instructions.ts +341 -0
  285. package/src/modules/speaker.ts +347 -0
  286. package/src/modules/speakers.ts +40 -0
  287. package/src/modules/storage.ts +109 -0
  288. package/src/modules/stream.ts +168 -0
  289. package/src/modules/system.ts +113 -0
  290. package/src/modules/transcription.ts +180 -0
  291. package/src/modules/translation.ts +156 -0
  292. package/src/modules/ui.ts +481 -0
  293. package/src/protocol.ts +482 -0
  294. package/src/react/MiniappHeader.tsx +114 -0
  295. package/src/react/MiniappProvider.tsx +50 -0
  296. package/src/react/capsuleHeaderLayout.ts +11 -0
  297. package/src/react/index.ts +12 -0
  298. package/src/react/useCapabilities.ts +29 -0
  299. package/src/react/useCapsuleHeaderStyle.ts +55 -0
  300. package/src/react/useColorScheme.ts +26 -0
  301. package/src/react/useConnected.ts +47 -0
  302. package/src/react/useRpc.ts +103 -0
  303. package/src/react/useSafeArea.ts +36 -0
  304. package/src/session.ts +969 -0
  305. package/src/sub-path-types.test-d.ts +60 -0
  306. package/src/transport/auto.ts +143 -0
  307. package/src/transport/dispatch.ts +106 -0
  308. package/src/transport/local-socket.ts +91 -0
  309. package/src/transport/mock.ts +255 -0
  310. package/src/transport/postmessage.ts +95 -0
  311. package/src/transport/types.ts +26 -0
  312. package/src/ui/index.ts +129 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * session.ui — bus between a background JSContext miniapp and its
3
+ * on-demand UI WebView. Supports two interaction patterns:
4
+ *
5
+ * 1. **Broadcast** (fire-and-forget, either direction)
6
+ * - background → UI: `session.ui.send(channel, payload)`
7
+ * - UI → background: `glassly.send(channel, payload)`
8
+ * - subscribe: `session.ui.on(channel, cb)` / `glassly.on(channel, cb)`
9
+ *
10
+ * 2. **RPC** (request/response, UI → background only)
11
+ * - UI side: `await glassly.request(channel, payload, options?)`
12
+ * - background side: `session.ui.handle(channel, (payload, ctx?) => result)`
13
+ * - single handler per channel; double-register throws synchronously.
14
+ * - errors thrown in the handler reject the caller's promise.
15
+ * - cancellation via `options.signal` aborts the handler's `ctx.signal`
16
+ * and drops the eventual reply.
17
+ *
18
+ * Broadcast vs. RPC is declared at the channel level: wrap a channel's
19
+ * payload type in `Rpc<Req, Res>` in the shared registry to make it RPC.
20
+ * Wrong-API-for-channel is a compile-time error.
21
+ *
22
+ * Buffering:
23
+ * - `glassly.send` BUFFERS until `glassly.ready()` acks. The WebView is
24
+ * the short-lived side and shouldn't drop user input.
25
+ * - `session.ui.send` silently DROPS when no WebView is bound.
26
+ * Background is the source of truth; UI state shouldn't accumulate.
27
+ * - Per-channel inbound buffering (up to 32 payloads) covers the
28
+ * `controller pushed before React attached the listener` race — see
29
+ * the WebView shim for details.
30
+ *
31
+ * Wire envelopes (internal — not part of the SDK surface):
32
+ * - `UI_OPEN` — WebView posted `{type:"ready"}`.
33
+ * - `UI_CLOSE` — host tore down the WebView.
34
+ * - `UI_MESSAGE` — WebView → background. `requestId` set on RPC calls.
35
+ * - `UI_SEND` — background → WebView. `requestId` set on RPC replies.
36
+ * - `UI_CANCEL` — either direction. Carries only `requestId`; aborts
37
+ * the in-flight handler's signal.
38
+ */
39
+ import type { MiniappSession } from "../session";
40
+ export type UIChannelHandler<T = unknown> = (payload: T) => void;
41
+ export type UIUnsubscribe = () => void;
42
+ /**
43
+ * Brand for declaring an RPC channel in the shared Channels registry.
44
+ *
45
+ * Wrap a channel's payload type in `Rpc<Req, Res>` to mark it as
46
+ * request/response. The SDK's `glassly.request` / `session.ui.handle`
47
+ * accept only `Rpc<...>` channels; `glassly.send` / `session.ui.on`
48
+ * accept only non-RPC channels. Using the wrong API for the wrong
49
+ * channel is a compile-time error.
50
+ *
51
+ * export interface Channels {
52
+ * "live-transcript": {text: string} // broadcast
53
+ * "compute-route": Rpc<RouteOpts, RouteResult> // RPC
54
+ * }
55
+ */
56
+ declare const __rpc_brand: unique symbol;
57
+ export type Rpc<Req, Res> = {
58
+ readonly [__rpc_brand]: true;
59
+ readonly req: Req;
60
+ readonly res: Res;
61
+ };
62
+ /** True if `T` is an `Rpc<...>` channel entry. */
63
+ export type IsRpc<T> = T extends Rpc<unknown, unknown> ? true : false;
64
+ /** Request payload type of an `Rpc<Req, Res>` entry. */
65
+ export type RpcReq<T> = T extends Rpc<infer Req, unknown> ? Req : never;
66
+ /** Response payload type of an `Rpc<Req, Res>` entry. */
67
+ export type RpcRes<T> = T extends Rpc<unknown, infer Res> ? Res : never;
68
+ /** Options accepted by `glassly.request`. */
69
+ export interface RpcRequestOptions {
70
+ /** Abort the in-flight call. Sends UI_CANCEL to the handler. */
71
+ signal?: AbortSignal;
72
+ /** Reject with `RpcTimeoutError` after this many ms. No default. */
73
+ timeout?: number;
74
+ }
75
+ /** Context passed as the optional 2nd arg to an `ui.handle` handler. */
76
+ export interface RpcHandlerContext {
77
+ /** Aborts when the UI side cancels the call (or its timeout fires). */
78
+ signal: AbortSignal;
79
+ }
80
+ /**
81
+ * Error thrown by `glassly.request` when the handler threw or returned an
82
+ * error envelope. Plain `Error` subclass — distinguished by `err.name`.
83
+ * `err.cause` is `{code?: string}` if the handler attached one.
84
+ */
85
+ export declare class RpcError extends Error {
86
+ constructor(message: string, options?: {
87
+ cause?: {
88
+ code?: string;
89
+ };
90
+ });
91
+ }
92
+ /** Thrown by `glassly.request` when its `{timeout}` elapses. */
93
+ export declare class RpcTimeoutError extends Error {
94
+ constructor(message?: string);
95
+ }
96
+ /**
97
+ * Public surface mirrored on `session.ui`. Generic over a `Channels`
98
+ * type-map so miniapps importing the typed `shared/channels.ts` get
99
+ * compile-time enforcement on channel names + payload shapes.
100
+ *
101
+ * Broadcast vs. RPC channels are distinguished at the type level:
102
+ * - Channel value `Rpc<Req, Res>` → only `handle()` accepts it on
103
+ * background; only `glassly.request(...)` accepts it on UI.
104
+ * - Channel value anything else → only `send()`/`on()` accept it
105
+ * on both sides.
106
+ *
107
+ * The default `Record<string, unknown>` mapping lets unannotated usage
108
+ * compile — the SDK doesn't impose a registry of its own.
109
+ */
110
+ export interface UIModule<TChannels extends object = Record<string, unknown>> {
111
+ /** True iff a WebView is currently bound to this miniapp. */
112
+ isOpen(): boolean;
113
+ /**
114
+ * Subscribe to the "WebView mounted + ready()" lifecycle event. If
115
+ * a WebView is already mounted when subscribe() is called, the
116
+ * handler fires immediately for the current binding.
117
+ */
118
+ onOpen(cb: () => void): UIUnsubscribe;
119
+ /**
120
+ * Subscribe to the "WebView unmounted" lifecycle event. Fires once
121
+ * per close; if no WebView is bound at subscribe time the handler
122
+ * stays armed for the next mount → close cycle.
123
+ */
124
+ onClose(cb: () => void): UIUnsubscribe;
125
+ /**
126
+ * Broadcast a typed message to the bound WebView. Silently drops if
127
+ * no WebView is bound. Compile-error if `C` is an RPC channel.
128
+ */
129
+ send<C extends keyof TChannels & string>(channel: IsRpc<TChannels[C]> extends true ? never : C, payload: TChannels[C]): void;
130
+ /**
131
+ * Subscribe to broadcast messages from the bound WebView. Returns an
132
+ * unsubscribe fn. Compile-error if `C` is an RPC channel — use
133
+ * `handle()` for RPC channels.
134
+ */
135
+ on<C extends keyof TChannels & string>(channel: IsRpc<TChannels[C]> extends true ? never : C, cb: UIChannelHandler<TChannels[C]>): UIUnsubscribe;
136
+ /**
137
+ * Register the single handler for an RPC channel. The UI side calls
138
+ * `glassly.request(channel, payload, options?)`; this handler resolves
139
+ * the call.
140
+ *
141
+ * Throws synchronously if a handler is already registered for the
142
+ * channel. Returns a deregister fn that removes the handler.
143
+ *
144
+ * Compile-error if `C` is a broadcast (non-Rpc) channel.
145
+ */
146
+ handle<C extends keyof TChannels & string>(channel: IsRpc<TChannels[C]> extends true ? C : never, handler: (payload: RpcReq<TChannels[C]>, ctx?: RpcHandlerContext) => Promise<RpcRes<TChannels[C]>> | RpcRes<TChannels[C]>): UIUnsubscribe;
147
+ }
148
+ export interface RpcErrorEnvelope {
149
+ message: string;
150
+ code?: string;
151
+ stage?: string;
152
+ transport?: string;
153
+ }
154
+ export declare class UIModuleImpl<TChannels extends object = Record<string, unknown>> implements UIModule<TChannels> {
155
+ private readonly session;
156
+ /** True between UI_OPEN and the matching UI_CLOSE. */
157
+ private bound;
158
+ /** Monotonic outbound seq number. Reset on bind. */
159
+ private nextSeq;
160
+ /** Open-lifecycle handlers — fire on every UI_OPEN. */
161
+ private readonly openHandlers;
162
+ private readonly closeHandlers;
163
+ /** channel → set of subscribers. */
164
+ private readonly channelHandlers;
165
+ /** channel → single registered RPC handler. */
166
+ private readonly rpcHandlers;
167
+ /** requestId → AbortController for in-flight RPC handler invocations. */
168
+ private readonly inflightRpc;
169
+ constructor(session: MiniappSession);
170
+ isOpen: () => boolean;
171
+ onOpen: (cb: () => void) => UIUnsubscribe;
172
+ onClose: (cb: () => void) => UIUnsubscribe;
173
+ send: <C extends keyof TChannels & string>(channel: C, payload: TChannels[C]) => void;
174
+ on: <C extends keyof TChannels & string>(channel: C, cb: UIChannelHandler<TChannels[C]>) => UIUnsubscribe;
175
+ handle: <C extends keyof TChannels & string>(channel: IsRpc<TChannels[C]> extends true ? C : never, handler: (payload: RpcReq<TChannels[C]>, ctx?: RpcHandlerContext) => Promise<RpcRes<TChannels[C]>> | RpcRes<TChannels[C]>) => UIUnsubscribe;
176
+ /** Fire every registered open handler once. Guarded per-handler. */
177
+ private fireOpenHandlers;
178
+ /** @internal — handle UI_OPEN / UI_CLOSE / UI_MESSAGE envelopes from the host. */
179
+ private handleInbound;
180
+ /** @internal — invoke a registered RPC handler and send back the reply. */
181
+ private dispatchRpcCall;
182
+ /** @internal — send a UI_SEND envelope tagged with a requestId. */
183
+ private sendRpcReply;
184
+ }
185
+ export {};
186
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/modules/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Error thrown by `glassly.request` when the handler threw or returned an
3
+ * error envelope. Plain `Error` subclass — distinguished by `err.name`.
4
+ * `err.cause` is `{code?: string}` if the handler attached one.
5
+ */
6
+ export class RpcError extends Error {
7
+ constructor(message, options) {
8
+ super(message);
9
+ this.name = "RpcError";
10
+ // Assign `cause` directly: the package's tsconfig targets ES2020 lib
11
+ // where `Error`'s ctor is typed as 1-arity (no `ErrorOptions`).
12
+ // Modern JS engines still allow setting `cause` as a plain property.
13
+ if (options?.cause !== undefined) {
14
+ ;
15
+ this.cause = options.cause;
16
+ }
17
+ }
18
+ }
19
+ /** Thrown by `glassly.request` when its `{timeout}` elapses. */
20
+ export class RpcTimeoutError extends Error {
21
+ constructor(message = "RPC timed out") {
22
+ super(message);
23
+ this.name = "RpcTimeoutError";
24
+ }
25
+ }
26
+ function rpcErrorFromUnknown(e) {
27
+ if (e instanceof Error) {
28
+ // `cause` is ES2022; this package's lib targets ES2020 where Error
29
+ // has no `cause` field. Read it via a structural cast. Diagnostic fields
30
+ // (code/stage/transport) may live as own props (PhotoError-style) or on
31
+ // the cause — own props win.
32
+ const own = e;
33
+ const cause = own.cause;
34
+ return compactEnvelope({
35
+ message: e.message,
36
+ code: own.code ?? cause?.code,
37
+ stage: own.stage,
38
+ transport: own.transport,
39
+ });
40
+ }
41
+ if (e && typeof e === "object") {
42
+ // Hosts reject RPCs with plain structured objects ({code, message, stage,
43
+ // transport}); stringifying them produced the infamous "[object Object]".
44
+ const o = e;
45
+ return compactEnvelope({
46
+ message: typeof o.message === "string" ? o.message : JSON.stringify(e),
47
+ code: typeof o.code === "string" ? o.code : undefined,
48
+ stage: typeof o.stage === "string" ? o.stage : undefined,
49
+ transport: typeof o.transport === "string" ? o.transport : undefined,
50
+ });
51
+ }
52
+ return { message: String(e) };
53
+ }
54
+ function compactEnvelope(env) {
55
+ const out = { message: env.message };
56
+ if (env.code)
57
+ out.code = env.code;
58
+ if (env.stage)
59
+ out.stage = env.stage;
60
+ if (env.transport)
61
+ out.transport = env.transport;
62
+ return out;
63
+ }
64
+ export class UIModuleImpl {
65
+ constructor(session) {
66
+ this.session = session;
67
+ /** True between UI_OPEN and the matching UI_CLOSE. */
68
+ this.bound = false;
69
+ /** Monotonic outbound seq number. Reset on bind. */
70
+ this.nextSeq = 1;
71
+ /** Open-lifecycle handlers — fire on every UI_OPEN. */
72
+ this.openHandlers = new Set();
73
+ this.closeHandlers = new Set();
74
+ /** channel → set of subscribers. */
75
+ this.channelHandlers = new Map();
76
+ /** channel → single registered RPC handler. */
77
+ this.rpcHandlers = new Map();
78
+ /** requestId → AbortController for in-flight RPC handler invocations. */
79
+ this.inflightRpc = new Map();
80
+ // Arrow-property bindings make every public method safe to destructure
81
+ // (`const {send} = session.ui`) or pass as a bare callback — a plain
82
+ // method loses `this` and crashes on `this.bound`.
83
+ this.isOpen = () => {
84
+ return this.bound;
85
+ };
86
+ this.onOpen = (cb) => {
87
+ this.openHandlers.add(cb);
88
+ if (this.bound) {
89
+ // Late subscriber — fire once for the current binding so callers
90
+ // that wire onOpen *after* the WebView mounted don't miss it.
91
+ // Gate on session readiness for the same reason handleInbound does:
92
+ // a late onOpen must still observe populated capabilities, not the
93
+ // pre-CONNECT_ACK null snapshot. If not yet ready, the "ready"
94
+ // listener registered in handleInbound's UI_OPEN branch will fan
95
+ // out to every openHandler (this one included), so we don't wire a
96
+ // second listener here.
97
+ if (this.session.ready) {
98
+ try {
99
+ cb();
100
+ }
101
+ catch (e) {
102
+ console.warn("session.ui.onOpen late-fire threw:", e);
103
+ }
104
+ }
105
+ }
106
+ return () => {
107
+ this.openHandlers.delete(cb);
108
+ };
109
+ };
110
+ this.onClose = (cb) => {
111
+ this.closeHandlers.add(cb);
112
+ return () => {
113
+ this.closeHandlers.delete(cb);
114
+ };
115
+ };
116
+ this.send = (channel, payload) => {
117
+ if (!this.bound) {
118
+ // Per spec: drop silently when no WebView is bound. Background
119
+ // is the source of truth — the WebView re-fetches state on next
120
+ // open via session.ui.onOpen.
121
+ return;
122
+ }
123
+ const seq = this.nextSeq++;
124
+ const envelope = { type: "UI_SEND", channel, payload, seq };
125
+ this.session.sendOneShot(envelope);
126
+ };
127
+ this.on = (channel, cb) => {
128
+ let set = this.channelHandlers.get(channel);
129
+ if (!set) {
130
+ set = new Set();
131
+ this.channelHandlers.set(channel, set);
132
+ }
133
+ set.add(cb);
134
+ return () => {
135
+ set.delete(cb);
136
+ };
137
+ };
138
+ this.handle = (channel, handler) => {
139
+ const key = channel;
140
+ if (this.rpcHandlers.has(key)) {
141
+ throw new Error(`session.ui.handle: a handler is already registered for "${key}"`);
142
+ }
143
+ this.rpcHandlers.set(key, handler);
144
+ return () => {
145
+ this.rpcHandlers.delete(key);
146
+ };
147
+ };
148
+ // The session forwards UI_OPEN / UI_CLOSE / UI_MESSAGE envelopes via
149
+ // its internal stream subscriber surface. The UIModule registers
150
+ // once via session._subscribe to receive them. The "_ui" stream
151
+ // name is internal — not exposed in the public stream list — so
152
+ // the host router knows to route lifecycle frames here without
153
+ // bumping any existing stream type.
154
+ this.session._subscribe("_ui", (env) => this.handleInbound(env));
155
+ }
156
+ /** Fire every registered open handler once. Guarded per-handler. */
157
+ fireOpenHandlers() {
158
+ for (const h of this.openHandlers) {
159
+ try {
160
+ h();
161
+ }
162
+ catch (e) {
163
+ console.warn("session.ui.onOpen handler threw", e);
164
+ }
165
+ }
166
+ }
167
+ /** @internal — handle UI_OPEN / UI_CLOSE / UI_MESSAGE envelopes from the host. */
168
+ handleInbound(env) {
169
+ if (env.type === "UI_OPEN") {
170
+ this.bound = true;
171
+ this.nextSeq = 1;
172
+ // onOpen handlers almost always read session.capabilities /
173
+ // session.ready to hydrate the fresh WebView. The WebView's
174
+ // `glassly.ready()` (which produces this UI_OPEN) races the
175
+ // background session's CONNECT_ACK — on a fast bridge UI_OPEN can
176
+ // arrive first, leaving capabilities null and the UI rendering a
177
+ // "no glasses" snapshot that never self-corrects. Gate the open
178
+ // fan-out on session readiness so handlers always observe a
179
+ // populated session. The WebView is marked bound immediately
180
+ // (send/isOpen work, inbound stays buffered) — only the open
181
+ // callbacks wait.
182
+ if (this.session.ready) {
183
+ this.fireOpenHandlers();
184
+ }
185
+ else {
186
+ const off = this.session.on("ready", () => {
187
+ off();
188
+ // If the WebView closed during the connect window, don't fire
189
+ // stale open handlers — a later UI_OPEN will re-trigger them.
190
+ if (this.bound)
191
+ this.fireOpenHandlers();
192
+ });
193
+ }
194
+ return;
195
+ }
196
+ if (env.type === "UI_CLOSE") {
197
+ this.bound = false;
198
+ for (const h of this.closeHandlers) {
199
+ try {
200
+ h();
201
+ }
202
+ catch (e) {
203
+ console.warn("session.ui.onClose handler threw", e);
204
+ }
205
+ }
206
+ return;
207
+ }
208
+ if (env.type === "UI_MESSAGE") {
209
+ // RPC call: requestId set → dispatch to handle() handler.
210
+ if (typeof env.requestId === "string") {
211
+ this.dispatchRpcCall(env.channel, env.payload, env.requestId);
212
+ return;
213
+ }
214
+ // Broadcast: fan out to on() subscribers.
215
+ const set = this.channelHandlers.get(env.channel);
216
+ if (!set || set.size === 0)
217
+ return;
218
+ for (const h of set) {
219
+ try {
220
+ h(env.payload);
221
+ }
222
+ catch (e) {
223
+ console.warn(`session.ui.on(${env.channel}) threw`, e);
224
+ }
225
+ }
226
+ return;
227
+ }
228
+ if (env.type === "UI_CANCEL") {
229
+ const ctrl = this.inflightRpc.get(env.requestId);
230
+ if (ctrl) {
231
+ try {
232
+ ctrl.abort();
233
+ }
234
+ catch {
235
+ /* ignore */
236
+ }
237
+ }
238
+ return;
239
+ }
240
+ }
241
+ /** @internal — invoke a registered RPC handler and send back the reply. */
242
+ dispatchRpcCall(channel, payload, requestId) {
243
+ const handler = this.rpcHandlers.get(channel);
244
+ if (!handler) {
245
+ // No handler registered. Reply with a structured error so the
246
+ // UI's request promise rejects with a useful message.
247
+ this.sendRpcReply(channel, requestId, {
248
+ ok: false,
249
+ error: { message: `no handler registered for "${channel}"` },
250
+ });
251
+ return;
252
+ }
253
+ const ctrl = new AbortController();
254
+ this.inflightRpc.set(requestId, ctrl);
255
+ const ctx = { signal: ctrl.signal };
256
+ const finish = (envelope) => {
257
+ this.inflightRpc.delete(requestId);
258
+ // If the controller already aborted (UI cancelled), drop the
259
+ // reply — the UI side has already removed its listener.
260
+ if (ctrl.signal.aborted)
261
+ return;
262
+ this.sendRpcReply(channel, requestId, envelope);
263
+ };
264
+ let result;
265
+ try {
266
+ result = handler(payload, ctx);
267
+ }
268
+ catch (e) {
269
+ finish({ ok: false, error: rpcErrorFromUnknown(e) });
270
+ return;
271
+ }
272
+ if (result && typeof result.then === "function") {
273
+ ;
274
+ result.then((v) => finish({ ok: true, result: v }), (e) => finish({ ok: false, error: rpcErrorFromUnknown(e) }));
275
+ }
276
+ else {
277
+ finish({ ok: true, result });
278
+ }
279
+ }
280
+ /** @internal — send a UI_SEND envelope tagged with a requestId. */
281
+ sendRpcReply(channel, requestId, payload) {
282
+ if (!this.bound)
283
+ return;
284
+ const seq = this.nextSeq++;
285
+ const envelope = { type: "UI_SEND", channel, payload, seq, requestId };
286
+ this.session.sendOneShot(envelope);
287
+ }
288
+ }
289
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/modules/ui.ts"],"names":[],"mappings":"AAiFA;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe,EAAE,OAAmC;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,qEAAqE;QACrE,gEAAgE;QAChE,qEAAqE;QACrE,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,CAAC;YAAC,IAAkC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC5D,CAAC;IACH,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,GAAG,eAAe;QACnC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAyFD,SAAS,mBAAmB,CAAC,CAAU;IACrC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,mEAAmE;QACnE,yEAAyE;QACzE,wEAAwE;QACxE,6BAA6B;QAC7B,MAAM,GAAG,GAAG,CAAiF,CAAA;QAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,KAAoC,CAAA;QACtD,OAAO,eAAe,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI;YAC7B,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/B,0EAA0E;QAC1E,0EAA0E;QAC1E,MAAM,CAAC,GAAG,CAA8E,CAAA;QACxF,OAAO,eAAe,CAAC;YACrB,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACtE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACrD,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACxD,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,CAAA;AAC7B,CAAC;AASD,SAAS,eAAe,CAAC,GAAqB;IAC5C,MAAM,GAAG,GAAqB,EAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAC,CAAA;IACpD,IAAI,GAAG,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IACjC,IAAI,GAAG,CAAC,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;IACpC,IAAI,GAAG,CAAC,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAA;IAChD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,OAAO,YAAY;IAkBvB,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAjBpD,sDAAsD;QAC9C,UAAK,GAAG,KAAK,CAAA;QACrB,oDAAoD;QAC5C,YAAO,GAAG,CAAC,CAAA;QACnB,uDAAuD;QACtC,iBAAY,GAAoB,IAAI,GAAG,EAAE,CAAA;QACzC,kBAAa,GAAoB,IAAI,GAAG,EAAE,CAAA;QAC3D,oCAAoC;QACnB,oBAAe,GAAuC,IAAI,GAAG,EAAE,CAAA;QAEhF,+CAA+C;QAC9B,gBAAW,GAC1B,IAAI,GAAG,EAAE,CAAA;QAEX,yEAAyE;QACxD,gBAAW,GAAiC,IAAI,GAAG,EAAE,CAAA;QAYtE,uEAAuE;QACvE,qEAAqE;QACrE,mDAAmD;QACnD,WAAM,GAAG,GAAY,EAAE;YACrB,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC,CAAA;QAED,WAAM,GAAG,CAAC,EAAc,EAAiB,EAAE;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,iEAAiE;gBACjE,8DAA8D;gBAC9D,oEAAoE;gBACpE,mEAAmE;gBACnE,+DAA+D;gBAC/D,iEAAiE;gBACjE,mEAAmE;gBACnE,wBAAwB;gBACxB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC;wBACH,EAAE,EAAE,CAAA;oBACN,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC9B,CAAC,CAAA;QACH,CAAC,CAAA;QAED,YAAO,GAAG,CAAC,EAAc,EAAiB,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1B,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC/B,CAAC,CAAA;QACH,CAAC,CAAA;QAED,SAAI,GAAG,CAAqC,OAAU,EAAE,OAAqB,EAAQ,EAAE;YACrF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,+DAA+D;gBAC/D,gEAAgE;gBAChE,8BAA8B;gBAC9B,OAAM;YACR,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YAC1B,MAAM,QAAQ,GAAmB,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAC,CAAA;YACzE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC,CAAA;QAED,OAAE,GAAG,CAAqC,OAAU,EAAE,EAAkC,EAAiB,EAAE;YACzG,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAiB,CAAC,CAAA;YACrD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;gBACf,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAiB,EAAE,GAAG,CAAC,CAAA;YAClD,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,EAAsB,CAAC,CAAA;YAC/B,OAAO,GAAG,EAAE;gBACV,GAAI,CAAC,MAAM,CAAC,EAAsB,CAAC,CAAA;YACrC,CAAC,CAAA;QACH,CAAC,CAAA;QAED,WAAM,GAAG,CACP,OAAqD,EACrD,OAGyD,EAC1C,EAAE;YACjB,MAAM,GAAG,GAAG,OAA4B,CAAA;YACxC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,GAAG,CAAC,CAAA;YACpF,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,GAAG,EACH,OAA8F,CAC/F,CAAA;YACD,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC,CAAA;QACH,CAAC,CAAA;QAzFC,qEAAqE;QACrE,iEAAiE;QACjE,gEAAgE;QAChE,gEAAgE;QAChE,+DAA+D;QAC/D,oCAAoC;QACpC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAwB,CAAC,CAAC,CAAA;IAChG,CAAC;IAoFD,oEAAoE;IAC5D,gBAAgB;QACtB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,CAAC,EAAE,CAAA;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,kFAAkF;IAC1E,aAAa,CAAC,GAAsB;QAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;YAChB,4DAA4D;YAC5D,4DAA4D;YAC5D,4DAA4D;YAC5D,kEAAkE;YAClE,iEAAiE;YACjE,gEAAgE;YAChE,4DAA4D;YAC5D,6DAA6D;YAC7D,6DAA6D;YAC7D,kBAAkB;YAClB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxC,GAAG,EAAE,CAAA;oBACL,8DAA8D;oBAC9D,8DAA8D;oBAC9D,IAAI,IAAI,CAAC,KAAK;wBAAE,IAAI,CAAC,gBAAgB,EAAE,CAAA;gBACzC,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;YAClB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,CAAC,EAAE,CAAA;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAA;gBACrD,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,0DAA0D;YAC1D,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC7D,OAAM;YACR,CAAC;YACD,0CAA0C;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACjD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAM;YAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAChB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAChD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,EAAE,CAAA;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;IACH,CAAC;IAED,2EAA2E;IACnE,eAAe,CAAC,OAAe,EAAE,OAAgB,EAAE,SAAiB;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,8DAA8D;YAC9D,sDAAsD;YACtD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE;gBACpC,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAC,OAAO,EAAE,8BAA8B,OAAO,GAAG,EAAC;aAC3D,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAA;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,GAAG,GAAsB,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,CAAC,QAA4E,EAAQ,EAAE;YACpG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAClC,6DAA6D;YAC7D,wDAAwD;YACxD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;QACjD,CAAC,CAAA;QAED,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAC,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QACD,IAAI,MAAM,IAAI,OAAQ,MAA2B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtE,CAAC;YAAC,MAA2B,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC,EACpC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAC,CAAC,CAC1D,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAC,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,mEAAmE;IAC3D,YAAY,CAClB,OAAe,EACf,SAAiB,EACjB,OAA2E;QAE3E,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAM;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC1B,MAAM,QAAQ,GAAmB,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAC,CAAA;QACpF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC;CACF"}