@microbit/microbit-connection 0.0.0-tab.change.177 → 0.9.0-apps.alpha.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 (292) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +94 -5
  3. package/build/cjs/accelerometer-service.d.ts +18 -0
  4. package/build/cjs/accelerometer-service.js +105 -0
  5. package/build/cjs/accelerometer-service.js.map +1 -0
  6. package/build/cjs/accelerometer.js +16 -0
  7. package/build/cjs/accelerometer.js.map +1 -0
  8. package/build/{async-util.d.ts → cjs/async-util.d.ts} +9 -0
  9. package/build/cjs/async-util.js +47 -0
  10. package/build/cjs/async-util.js.map +1 -0
  11. package/build/cjs/bluetooth-device-wrapper.d.ts +97 -0
  12. package/build/cjs/bluetooth-device-wrapper.js +486 -0
  13. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  14. package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +43 -35
  15. package/build/cjs/bluetooth-profile.js +92 -0
  16. package/build/cjs/bluetooth-profile.js.map +1 -0
  17. package/build/cjs/bluetooth.d.ts +112 -0
  18. package/build/cjs/bluetooth.js +458 -0
  19. package/build/cjs/bluetooth.js.map +1 -0
  20. package/build/cjs/board-id.js +81 -0
  21. package/build/cjs/board-id.js.map +1 -0
  22. package/build/cjs/board-serial-info.js +51 -0
  23. package/build/cjs/board-serial-info.js.map +1 -0
  24. package/build/cjs/button-service.d.ts +13 -0
  25. package/build/cjs/button-service.js +66 -0
  26. package/build/cjs/button-service.js.map +1 -0
  27. package/build/cjs/buttons.js +22 -0
  28. package/build/cjs/buttons.js.map +1 -0
  29. package/build/cjs/constants.js +73 -0
  30. package/build/cjs/constants.js.map +1 -0
  31. package/build/cjs/device-information-service.d.ts +6 -0
  32. package/build/cjs/device-information-service.js +34 -0
  33. package/build/cjs/device-information-service.js.map +1 -0
  34. package/build/{device.d.ts → cjs/device.d.ts} +71 -39
  35. package/build/cjs/device.js +147 -0
  36. package/build/cjs/device.js.map +1 -0
  37. package/build/cjs/dfu-service.d.ts +9 -0
  38. package/build/cjs/dfu-service.js +26 -0
  39. package/build/cjs/dfu-service.js.map +1 -0
  40. package/build/{events.d.ts → cjs/events.d.ts} +1 -2
  41. package/build/cjs/events.js +109 -0
  42. package/build/cjs/events.js.map +1 -0
  43. package/build/cjs/flashing/flashing-full.d.ts +14 -0
  44. package/build/cjs/flashing/flashing-full.js +87 -0
  45. package/build/cjs/flashing/flashing-full.js.map +1 -0
  46. package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
  47. package/build/cjs/flashing/flashing-makecode.js +48 -0
  48. package/build/cjs/flashing/flashing-makecode.js.map +1 -0
  49. package/build/cjs/flashing/flashing-partial.d.ts +9 -0
  50. package/build/cjs/flashing/flashing-partial.js +98 -0
  51. package/build/cjs/flashing/flashing-partial.js.map +1 -0
  52. package/build/cjs/flashing/flashing-v1.d.ts +11 -0
  53. package/build/cjs/flashing/flashing-v1.js +24 -0
  54. package/build/cjs/flashing/flashing-v1.js.map +1 -0
  55. package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
  56. package/build/cjs/flashing/nordic-dfu.js +214 -0
  57. package/build/cjs/flashing/nordic-dfu.js.map +1 -0
  58. package/build/cjs/flashing/zip.d.ts +12 -0
  59. package/build/cjs/flashing/zip.js +177 -0
  60. package/build/cjs/flashing/zip.js.map +1 -0
  61. package/build/cjs/hex-flash-data-source.js +26 -0
  62. package/build/cjs/hex-flash-data-source.js.map +1 -0
  63. package/build/cjs/index.d.ts +17 -0
  64. package/build/cjs/index.js +37 -0
  65. package/build/cjs/index.js.map +1 -0
  66. package/build/cjs/led-service.d.ts +18 -0
  67. package/build/cjs/led-service.js +89 -0
  68. package/build/cjs/led-service.js.map +1 -0
  69. package/build/cjs/led.js +3 -0
  70. package/build/cjs/led.js.map +1 -0
  71. package/build/{logging.d.ts → cjs/logging.d.ts} +4 -4
  72. package/build/cjs/logging.js +16 -0
  73. package/build/cjs/logging.js.map +1 -0
  74. package/build/cjs/magnetometer-service.d.ts +18 -0
  75. package/build/cjs/magnetometer-service.js +94 -0
  76. package/build/cjs/magnetometer-service.js.map +1 -0
  77. package/build/cjs/magnetometer.d.ts +9 -0
  78. package/build/cjs/magnetometer.js +16 -0
  79. package/build/cjs/magnetometer.js.map +1 -0
  80. package/build/cjs/package.json +1 -0
  81. package/build/cjs/partial-flashing-service.d.ts +45 -0
  82. package/build/cjs/partial-flashing-service.js +110 -0
  83. package/build/cjs/partial-flashing-service.js.map +1 -0
  84. package/build/cjs/promise-queue.js +78 -0
  85. package/build/cjs/promise-queue.js.map +1 -0
  86. package/build/cjs/serial-events.d.ts +20 -0
  87. package/build/cjs/serial-events.js +69 -0
  88. package/build/cjs/serial-events.js.map +1 -0
  89. package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
  90. package/build/cjs/service-events.js +39 -0
  91. package/build/cjs/service-events.js.map +1 -0
  92. package/build/cjs/setupTests.js.map +1 -0
  93. package/build/cjs/uart-service.d.ts +12 -0
  94. package/build/cjs/uart-service.js +55 -0
  95. package/build/cjs/uart-service.js.map +1 -0
  96. package/build/cjs/uart.d.ts +4 -0
  97. package/build/cjs/uart.js +16 -0
  98. package/build/cjs/uart.js.map +1 -0
  99. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
  100. package/build/cjs/usb-device-wrapper.js +437 -0
  101. package/build/cjs/usb-device-wrapper.js.map +1 -0
  102. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  103. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  104. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -5
  105. package/build/cjs/usb-partial-flashing.js +342 -0
  106. package/build/cjs/usb-partial-flashing.js.map +1 -0
  107. package/build/cjs/usb-radio-bridge.d.ts +24 -0
  108. package/build/cjs/usb-radio-bridge.js +515 -0
  109. package/build/cjs/usb-radio-bridge.js.map +1 -0
  110. package/build/cjs/usb-serial-protocol.js +183 -0
  111. package/build/cjs/usb-serial-protocol.js.map +1 -0
  112. package/build/cjs/usb.d.ts +66 -0
  113. package/build/cjs/usb.js +662 -0
  114. package/build/cjs/usb.js.map +1 -0
  115. package/build/esm/accelerometer-service.d.ts +18 -0
  116. package/build/esm/accelerometer-service.js +101 -0
  117. package/build/esm/accelerometer-service.js.map +1 -0
  118. package/build/esm/accelerometer.d.ts +9 -0
  119. package/build/esm/accelerometer.js.map +1 -0
  120. package/build/esm/async-util.d.ts +22 -0
  121. package/build/esm/async-util.js +38 -0
  122. package/build/esm/async-util.js.map +1 -0
  123. package/build/esm/bluetooth-device-wrapper.d.ts +97 -0
  124. package/build/esm/bluetooth-device-wrapper.js +481 -0
  125. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  126. package/build/esm/bluetooth-profile.d.ts +147 -0
  127. package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +35 -29
  128. package/build/esm/bluetooth-profile.js.map +1 -0
  129. package/build/esm/bluetooth.d.ts +112 -0
  130. package/build/esm/bluetooth.js +428 -0
  131. package/build/esm/bluetooth.js.map +1 -0
  132. package/build/esm/board-id.d.ts +36 -0
  133. package/build/esm/board-id.js.map +1 -0
  134. package/build/esm/board-serial-info.d.ts +14 -0
  135. package/build/esm/board-serial-info.js.map +1 -0
  136. package/build/esm/button-service.d.ts +13 -0
  137. package/build/esm/button-service.js +62 -0
  138. package/build/esm/button-service.js.map +1 -0
  139. package/build/esm/buttons.d.ts +10 -0
  140. package/build/esm/buttons.js.map +1 -0
  141. package/build/esm/constants.d.ts +48 -0
  142. package/build/esm/constants.js.map +1 -0
  143. package/build/esm/device-information-service.d.ts +6 -0
  144. package/build/esm/device-information-service.js +30 -0
  145. package/build/esm/device-information-service.js.map +1 -0
  146. package/build/esm/device.d.ts +238 -0
  147. package/build/{device.js → esm/device.js} +16 -58
  148. package/build/esm/device.js.map +1 -0
  149. package/build/esm/dfu-service.d.ts +9 -0
  150. package/build/esm/dfu-service.js +22 -0
  151. package/build/esm/dfu-service.js.map +1 -0
  152. package/build/esm/events.d.ts +110 -0
  153. package/build/esm/events.js.map +1 -0
  154. package/build/esm/flashing/flashing-full.d.ts +14 -0
  155. package/build/esm/flashing/flashing-full.js +84 -0
  156. package/build/esm/flashing/flashing-full.js.map +1 -0
  157. package/build/esm/flashing/flashing-makecode.d.ts +6 -0
  158. package/build/esm/flashing/flashing-makecode.js +44 -0
  159. package/build/esm/flashing/flashing-makecode.js.map +1 -0
  160. package/build/esm/flashing/flashing-partial.d.ts +9 -0
  161. package/build/esm/flashing/flashing-partial.js +95 -0
  162. package/build/esm/flashing/flashing-partial.js.map +1 -0
  163. package/build/esm/flashing/flashing-v1.d.ts +11 -0
  164. package/build/esm/flashing/flashing-v1.js +20 -0
  165. package/build/esm/flashing/flashing-v1.js.map +1 -0
  166. package/build/esm/flashing/nordic-dfu.d.ts +3 -0
  167. package/build/esm/flashing/nordic-dfu.js +211 -0
  168. package/build/esm/flashing/nordic-dfu.js.map +1 -0
  169. package/build/esm/flashing/zip.d.ts +12 -0
  170. package/build/esm/flashing/zip.js +174 -0
  171. package/build/esm/flashing/zip.js.map +1 -0
  172. package/build/esm/hex-flash-data-source.d.ts +7 -0
  173. package/build/esm/hex-flash-data-source.js.map +1 -0
  174. package/build/esm/index.d.ts +17 -0
  175. package/build/esm/index.js +12 -0
  176. package/build/esm/index.js.map +1 -0
  177. package/build/esm/led-service.d.ts +18 -0
  178. package/build/esm/led-service.js +85 -0
  179. package/build/esm/led-service.js.map +1 -0
  180. package/build/esm/led.d.ts +6 -0
  181. package/build/esm/led.js.map +1 -0
  182. package/build/esm/logging.d.ts +21 -0
  183. package/build/{logging.js → esm/logging.js} +1 -1
  184. package/build/esm/logging.js.map +1 -0
  185. package/build/esm/magnetometer-service.d.ts +18 -0
  186. package/build/esm/magnetometer-service.js +90 -0
  187. package/build/esm/magnetometer-service.js.map +1 -0
  188. package/build/esm/magnetometer.d.ts +9 -0
  189. package/build/esm/magnetometer.js +12 -0
  190. package/build/esm/magnetometer.js.map +1 -0
  191. package/build/esm/package.json +1 -0
  192. package/build/esm/partial-flashing-service.d.ts +45 -0
  193. package/build/esm/partial-flashing-service.js +106 -0
  194. package/build/esm/partial-flashing-service.js.map +1 -0
  195. package/build/esm/promise-queue.d.ts +27 -0
  196. package/build/esm/promise-queue.js.map +1 -0
  197. package/build/esm/serial-events.d.ts +20 -0
  198. package/build/esm/serial-events.js +61 -0
  199. package/build/esm/serial-events.js.map +1 -0
  200. package/build/esm/service-events.d.ts +17 -0
  201. package/build/{service-events.js → esm/service-events.js} +12 -0
  202. package/build/esm/service-events.js.map +1 -0
  203. package/build/esm/setupTests.d.ts +6 -0
  204. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  205. package/build/esm/uart-service.d.ts +12 -0
  206. package/build/esm/uart-service.js +51 -0
  207. package/build/esm/uart-service.js.map +1 -0
  208. package/build/esm/uart.d.ts +4 -0
  209. package/build/esm/uart.js +12 -0
  210. package/build/esm/uart.js.map +1 -0
  211. package/build/esm/usb-device-wrapper.d.ts +47 -0
  212. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +43 -17
  213. package/build/esm/usb-device-wrapper.js.map +1 -0
  214. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  215. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  216. package/build/esm/usb-partial-flashing.d.ts +67 -0
  217. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +12 -13
  218. package/build/esm/usb-partial-flashing.js.map +1 -0
  219. package/build/esm/usb-radio-bridge.d.ts +24 -0
  220. package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +13 -7
  221. package/build/esm/usb-radio-bridge.js.map +1 -0
  222. package/build/esm/usb-serial-protocol.d.ts +66 -0
  223. package/build/esm/usb-serial-protocol.js.map +1 -0
  224. package/build/esm/usb.d.ts +66 -0
  225. package/build/{usb.js → esm/usb.js} +257 -49
  226. package/build/esm/usb.js.map +1 -0
  227. package/package.json +25 -8
  228. package/typedoc.json +14 -0
  229. package/build/accelerometer-service.d.ts +0 -18
  230. package/build/accelerometer-service.js +0 -102
  231. package/build/accelerometer-service.js.map +0 -1
  232. package/build/accelerometer.js.map +0 -1
  233. package/build/async-util.js +0 -22
  234. package/build/async-util.js.map +0 -1
  235. package/build/bluetooth-device-wrapper.d.ts +0 -57
  236. package/build/bluetooth-device-wrapper.js +0 -433
  237. package/build/bluetooth-device-wrapper.js.map +0 -1
  238. package/build/bluetooth-profile.js.map +0 -1
  239. package/build/bluetooth.d.ts +0 -54
  240. package/build/bluetooth.js +0 -243
  241. package/build/bluetooth.js.map +0 -1
  242. package/build/board-id.js.map +0 -1
  243. package/build/board-serial-info.js.map +0 -1
  244. package/build/button-service.d.ts +0 -13
  245. package/build/button-service.js +0 -76
  246. package/build/button-service.js.map +0 -1
  247. package/build/buttons.js.map +0 -1
  248. package/build/constants.js.map +0 -1
  249. package/build/device.js.map +0 -1
  250. package/build/events.js.map +0 -1
  251. package/build/hex-flash-data-source.js.map +0 -1
  252. package/build/index.d.ts +0 -10
  253. package/build/index.js +0 -8
  254. package/build/index.js.map +0 -1
  255. package/build/led-service.d.ts +0 -20
  256. package/build/led-service.js +0 -116
  257. package/build/led-service.js.map +0 -1
  258. package/build/led.js.map +0 -1
  259. package/build/logging.js.map +0 -1
  260. package/build/promise-queue.js.map +0 -1
  261. package/build/service-events.js.map +0 -1
  262. package/build/usb-device-wrapper.js.map +0 -1
  263. package/build/usb-partial-flashing-utils.js.map +0 -1
  264. package/build/usb-partial-flashing.js.map +0 -1
  265. package/build/usb-radio-bridge.d.ts +0 -41
  266. package/build/usb-radio-bridge.js.map +0 -1
  267. package/build/usb-serial-protocol.js.map +0 -1
  268. package/build/usb.d.ts +0 -54
  269. package/build/usb.js.map +0 -1
  270. package/vite.config.ts +0 -34
  271. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  272. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  273. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  274. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  275. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  276. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  277. /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
  278. /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
  279. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  280. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  281. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  282. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  283. /package/build/{board-id.js → esm/board-id.js} +0 -0
  284. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  285. /package/build/{buttons.js → esm/buttons.js} +0 -0
  286. /package/build/{constants.js → esm/constants.js} +0 -0
  287. /package/build/{events.js → esm/events.js} +0 -0
  288. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  289. /package/build/{led.js → esm/led.js} +0 -0
  290. /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
  291. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  292. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
@@ -4,10 +4,11 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  import { TimeoutError, withTimeout } from "./async-util.js";
7
- import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, DeviceError, FlashDataError, FlashEvent, SerialDataEvent, SerialErrorEvent, SerialResetEvent, } from "./device.js";
7
+ import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, DeviceError, FlashDataError, ProgressStage, } from "./device.js";
8
8
  import { TypedEventTarget } from "./events.js";
9
- import { NullLogging } from "./logging.js";
9
+ import { ConsoleLogging } from "./logging.js";
10
10
  import { PromiseQueue } from "./promise-queue.js";
11
+ import { FlashEvent, SerialDataEvent, SerialErrorEvent, SerialResetEvent, } from "./serial-events.js";
11
12
  import { DAPWrapper } from "./usb-device-wrapper.js";
12
13
  import { PartialFlashing } from "./usb-partial-flashing.js";
13
14
  // Temporary workaround for ChromeOS 105 bug.
@@ -16,11 +17,29 @@ export const isChromeOS105 = () => {
16
17
  const userAgent = navigator.userAgent;
17
18
  return /CrOS/.test(userAgent) && /Chrome\/105\b/.test(userAgent);
18
19
  };
20
+ const defaultFilters = [{ vendorId: 0x0d28, productId: 0x0204 }];
21
+ export var DeviceSelectionMode;
22
+ (function (DeviceSelectionMode) {
23
+ /**
24
+ * Attempts to connect to known device, otherwise asks which device to
25
+ * connect to.
26
+ */
27
+ DeviceSelectionMode["AlwaysAsk"] = "AlwaysAsk";
28
+ /**
29
+ * Attempts to connect to known device, otherwise attempts to connect to any
30
+ * allowed devices. If that fails, asks which device to connect to.
31
+ */
32
+ DeviceSelectionMode["UseAnyAllowed"] = "UseAnyAllowed";
33
+ })(DeviceSelectionMode || (DeviceSelectionMode = {}));
34
+ /**
35
+ * A WebUSB connection factory.
36
+ */
37
+ export const createWebUSBConnection = (options) => new MicrobitWebUSBConnectionImpl(options);
19
38
  /**
20
39
  * A WebUSB connection to a micro:bit device.
21
40
  */
22
- export class MicrobitWebUSBConnection extends TypedEventTarget {
23
- constructor(options = { logging: new NullLogging() }) {
41
+ class MicrobitWebUSBConnectionImpl extends TypedEventTarget {
42
+ constructor(options = {}) {
24
43
  super();
25
44
  Object.defineProperty(this, "status", {
26
45
  enumerable: true,
@@ -81,6 +100,56 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
81
100
  writable: true,
82
101
  value: false
83
102
  });
103
+ Object.defineProperty(this, "disconnectAfterFlash", {
104
+ enumerable: true,
105
+ configurable: true,
106
+ writable: true,
107
+ value: false
108
+ });
109
+ Object.defineProperty(this, "visibilityReconnect", {
110
+ enumerable: true,
111
+ configurable: true,
112
+ writable: true,
113
+ value: false
114
+ });
115
+ Object.defineProperty(this, "visibilityChangeListener", {
116
+ enumerable: true,
117
+ configurable: true,
118
+ writable: true,
119
+ value: () => {
120
+ if (document.visibilityState === "visible") {
121
+ if (this.visibilityReconnect &&
122
+ this.status !== ConnectionStatus.CONNECTED) {
123
+ this.disconnectAfterFlash = false;
124
+ this.visibilityReconnect = false;
125
+ if (!this.flashing) {
126
+ this.log("Reconnecting visible tab");
127
+ this.connect();
128
+ }
129
+ }
130
+ }
131
+ else {
132
+ if (!this.unloading && this.status === ConnectionStatus.CONNECTED) {
133
+ if (!this.flashing) {
134
+ this.log("Disconnecting hidden tab");
135
+ this.disconnect().then(() => {
136
+ this.visibilityReconnect = true;
137
+ });
138
+ }
139
+ else {
140
+ this.log("Scheduling disconnect of hidden tab for after flash");
141
+ this.disconnectAfterFlash = true;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ });
147
+ Object.defineProperty(this, "unloading", {
148
+ enumerable: true,
149
+ configurable: true,
150
+ writable: true,
151
+ value: false
152
+ });
84
153
  Object.defineProperty(this, "beforeUnloadListener", {
85
154
  enumerable: true,
86
155
  configurable: true,
@@ -90,12 +159,14 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
90
159
  // then it'll fail to reconnect with mismatched command/response errors.
91
160
  // Try hard to disconnect as a workaround.
92
161
  // https://github.com/microbit-foundation/python-editor-v3/issues/89
162
+ this.unloading = true;
93
163
  this.stopSerialInternal();
94
164
  // The user might stay on the page if they have unsaved changes and there's another beforeunload listener.
95
165
  window.addEventListener("focus", () => {
96
166
  const assumePageIsStayingOpenDelay = 1000;
97
167
  setTimeout(() => {
98
168
  if (this.status === ConnectionStatus.CONNECTED) {
169
+ this.unloading = false;
99
170
  if (this.addedListeners.serialdata) {
100
171
  this.startSerialInternal();
101
172
  }
@@ -110,6 +181,12 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
110
181
  writable: true,
111
182
  value: void 0
112
183
  });
184
+ Object.defineProperty(this, "deviceSelectionMode", {
185
+ enumerable: true,
186
+ configurable: true,
187
+ writable: true,
188
+ value: void 0
189
+ });
113
190
  Object.defineProperty(this, "addedListeners", {
114
191
  enumerable: true,
115
192
  configurable: true,
@@ -130,7 +207,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
130
207
  }
131
208
  }
132
209
  });
133
- this.logging = options.logging;
210
+ this.logging = options.logging || new ConsoleLogging();
211
+ this.deviceSelectionMode =
212
+ options.deviceSelectionMode || DeviceSelectionMode.AlwaysAsk;
134
213
  }
135
214
  log(v) {
136
215
  this.logging.log(v);
@@ -141,6 +220,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
141
220
  }
142
221
  if (typeof window !== "undefined") {
143
222
  window.addEventListener("beforeunload", this.beforeUnloadListener);
223
+ if (window.document) {
224
+ window.document.addEventListener("visibilitychange", this.visibilityChangeListener);
225
+ }
144
226
  }
145
227
  }
146
228
  dispose() {
@@ -149,14 +231,17 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
149
231
  }
150
232
  if (typeof window !== "undefined") {
151
233
  window.removeEventListener("beforeunload", this.beforeUnloadListener);
234
+ if (window.document) {
235
+ window.document.removeEventListener("visibilitychange", this.visibilityChangeListener);
236
+ }
152
237
  }
153
238
  }
154
239
  setRequestDeviceExclusionFilters(exclusionFilters) {
155
240
  this.exclusionFilters = exclusionFilters;
156
241
  }
157
- async connect() {
158
- return this.withEnrichedErrors(async () => {
159
- await this.connectInternal();
242
+ async connect(options) {
243
+ await this.withEnrichedErrors(async () => {
244
+ await this.connectInternal(options?.progress);
160
245
  return this.status;
161
246
  });
162
247
  }
@@ -188,16 +273,20 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
188
273
  this.flashing = false;
189
274
  }
190
275
  }
191
- async flashInternal(dataSource, options) {
276
+ async flashInternal(dataSource, options = {}) {
277
+ const partial = options.partial ?? true;
278
+ const progress = rateLimitProgress(options.minimumProgressIncrement ?? 0.0025, options.progress || (() => { }));
192
279
  this.log("Stopping serial before flash");
193
280
  await this.stopSerialInternal();
194
281
  this.log("Reconnecting before flash");
195
- await this.connectInternal();
282
+ await this.connectInternal(progress);
196
283
  if (!this.connection) {
197
- throw new Error("Must be connected now");
284
+ throw new DeviceError({
285
+ code: "device-disconnected",
286
+ message: "Must be connected now",
287
+ });
198
288
  }
199
- const partial = options.partial;
200
- const progress = rateLimitProgress(options.minimumProgressIncrement ?? 0.0025, options.progress || (() => { }));
289
+ progress(ProgressStage.Initializing, undefined);
201
290
  const boardId = this.connection.boardSerialInfo.id;
202
291
  const boardVersion = boardId.toBoardVersion();
203
292
  const data = await dataSource(boardVersion);
@@ -212,12 +301,20 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
212
301
  }
213
302
  }
214
303
  finally {
215
- progress(undefined, wasPartial);
216
- if (this.addedListeners.serialdata) {
217
- this.log("Reinstating serial after flash");
218
- if (this.connection.daplink) {
219
- await this.connection.daplink.connect();
220
- await this.startSerialInternal();
304
+ progress(wasPartial ? ProgressStage.PartialFlashing : ProgressStage.FullFlashing, undefined);
305
+ if (this.disconnectAfterFlash) {
306
+ this.log("Disconnecting after flash due to tab visibility");
307
+ this.disconnectAfterFlash = false;
308
+ await this.disconnect();
309
+ this.visibilityReconnect = true;
310
+ }
311
+ else {
312
+ if (this.addedListeners.serialdata) {
313
+ this.log("Reinstating serial after flash");
314
+ if (this.connection.daplink) {
315
+ await this.connection.daplink.connect();
316
+ await this.startSerialInternal();
317
+ }
221
318
  }
222
319
  }
223
320
  }
@@ -251,7 +348,7 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
251
348
  this.dispatchTypedEvent("serialreset", new SerialResetEvent());
252
349
  });
253
350
  }
254
- async disconnect() {
351
+ async disconnect(quiet) {
255
352
  try {
256
353
  if (this.connection) {
257
354
  await this.stopSerialInternal();
@@ -259,24 +356,29 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
259
356
  }
260
357
  }
261
358
  catch (e) {
262
- this.log("Error during disconnection:\r\n" + e);
263
- this.logging.event({
264
- type: "WebUSB-error",
265
- message: "error-disconnecting",
266
- });
359
+ if (!quiet) {
360
+ this.log("Error during disconnection:\r\n" + e);
361
+ this.logging.event({
362
+ type: "WebUSB-error",
363
+ message: "error-disconnecting",
364
+ });
365
+ }
267
366
  }
268
367
  finally {
269
368
  this.connection = undefined;
270
369
  this.setStatus(ConnectionStatus.DISCONNECTED);
271
- this.logging.log("Disconnection complete");
272
- this.logging.event({
273
- type: "WebUSB-info",
274
- message: "disconnected",
275
- });
370
+ if (!quiet) {
371
+ this.logging.log("Disconnection complete");
372
+ this.logging.event({
373
+ type: "WebUSB-info",
374
+ message: "disconnected",
375
+ });
376
+ }
276
377
  }
277
378
  }
278
379
  setStatus(newStatus) {
279
380
  this.status = newStatus;
381
+ this.visibilityReconnect = false;
280
382
  this.log("USB connection status " + newStatus);
281
383
  this.dispatchTypedEvent("status", new ConnectionStatusEvent(newStatus));
282
384
  }
@@ -288,6 +390,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
288
390
  if (e instanceof FlashDataError) {
289
391
  throw e;
290
392
  }
393
+ if (e instanceof DeviceError) {
394
+ throw e;
395
+ }
291
396
  // Log error to console for feedback
292
397
  this.log("An error occurred whilst attempting to use WebUSB.");
293
398
  this.log("Details of the error can be found below, and may be useful when trying to replicate and debug the error.");
@@ -295,7 +400,7 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
295
400
  // Disconnect from the microbit.
296
401
  // Any new connection reallocates all the internals.
297
402
  // Use the top-level API so any listeners reflect that we're disconnected.
298
- await this.disconnect();
403
+ await this.disconnect(true);
299
404
  const enriched = enrichedError(e);
300
405
  // Sanitise error message, replace all special chars with '-', if last char is '-' remove it
301
406
  const errorMessage = e.message
@@ -332,33 +437,87 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
332
437
  this.device = undefined;
333
438
  this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
334
439
  }
335
- async connectInternal() {
336
- if (!this.connection) {
337
- const device = await this.chooseDevice();
338
- this.connection = new DAPWrapper(device, this.logging);
440
+ async connectInternal(progress) {
441
+ const reportProgress = progress ?? (() => { });
442
+ if (!this.connection && this.device) {
443
+ reportProgress(ProgressStage.Connecting);
444
+ this.connection = new DAPWrapper(this.device, this.logging);
445
+ await withTimeout(this.connection.reconnectAsync(), 10_000);
446
+ }
447
+ else if (!this.connection) {
448
+ await this.connectWithOtherDevice(reportProgress);
449
+ }
450
+ else {
451
+ reportProgress(ProgressStage.Connecting);
452
+ await withTimeout(this.connection.reconnectAsync(), 10_000);
339
453
  }
340
- await withTimeout(this.connection.reconnectAsync(), 10_000);
341
454
  if (this.addedListeners.serialdata && !this.flashing) {
342
455
  this.startSerialInternal();
343
456
  }
344
457
  this.setStatus(ConnectionStatus.CONNECTED);
345
458
  }
346
- async chooseDevice() {
347
- if (this.device) {
348
- return this.device;
459
+ async connectWithOtherDevice(progress) {
460
+ if (this.deviceSelectionMode === DeviceSelectionMode.UseAnyAllowed) {
461
+ await this.attemptConnectAllowedDevices();
462
+ }
463
+ if (!this.connection) {
464
+ progress(ProgressStage.FindingDevice);
465
+ this.device = await this.chooseDevice();
466
+ progress(ProgressStage.Connecting);
467
+ this.connection = new DAPWrapper(this.device, this.logging);
468
+ await withTimeout(this.connection.reconnectAsync(), 10_000);
349
469
  }
470
+ }
471
+ // Based on: https://github.com/microsoft/pxt/blob/ab97a2422879824c730f009b15d4bf446b0e8547/pxtlib/webusb.ts#L361
472
+ async attemptConnectAllowedDevices() {
473
+ const pairedDevices = await this.getFilteredAllowedDevices();
474
+ for (const device of pairedDevices) {
475
+ const connection = await this.attemptDeviceConnection(device);
476
+ if (connection) {
477
+ this.device = device;
478
+ this.connection = connection;
479
+ return;
480
+ }
481
+ }
482
+ }
483
+ // Based on: https://github.com/microsoft/pxt/blob/ab97a2422879824c730f009b15d4bf446b0e8547/pxtlib/webusb.ts#L530
484
+ async getFilteredAllowedDevices() {
485
+ this.log("Retrieving previously paired USB devices");
486
+ const devices = await navigator.usb?.getDevices();
487
+ if (devices === undefined) {
488
+ return [];
489
+ }
490
+ const filteredDevices = devices.filter((device) => applyDeviceFilters(device, defaultFilters, this.exclusionFilters ?? []));
491
+ return filteredDevices;
492
+ }
493
+ async attemptDeviceConnection(device) {
494
+ this.log(`Attempting connection to: ${device.manufacturerName} ${device.productName}`);
495
+ this.log(`Serial number: ${device.serialNumber}`);
496
+ const connection = new DAPWrapper(device, this.logging);
497
+ await withTimeout(connection.reconnectAsync(), 10_000);
498
+ return connection;
499
+ }
500
+ async chooseDevice() {
350
501
  this.dispatchTypedEvent("beforerequestdevice", new BeforeRequestDevice());
351
- this.device = await navigator.usb.requestDevice({
352
- exclusionFilters: this.exclusionFilters,
353
- filters: [{ vendorId: 0x0d28, productId: 0x0204 }],
354
- });
355
- this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
502
+ try {
503
+ this.device = await navigator.usb.requestDevice({
504
+ exclusionFilters: this.exclusionFilters,
505
+ filters: defaultFilters,
506
+ });
507
+ }
508
+ finally {
509
+ this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
510
+ }
356
511
  return this.device;
357
512
  }
358
513
  eventActivated(type) {
359
514
  switch (type) {
360
515
  case "serialdata": {
361
- this.startSerialInternal();
516
+ // Prevent starting serial if already started and when flashing.
517
+ if (!this.addedListeners.serialdata && !this.flashing) {
518
+ this.startSerialInternal();
519
+ }
520
+ this.addedListeners.serialdata++;
362
521
  break;
363
522
  }
364
523
  }
@@ -366,12 +525,58 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
366
525
  async eventDeactivated(type) {
367
526
  switch (type) {
368
527
  case "serialdata": {
369
- this.stopSerialInternal();
528
+ this.addedListeners.serialdata--;
529
+ if (!this.addedListeners.serialdata) {
530
+ this.stopSerialInternal();
531
+ }
370
532
  break;
371
533
  }
372
534
  }
373
535
  }
374
536
  }
537
+ /**
538
+ * Applying WebUSB device filter. Exported for testing.
539
+ * Based on: https://wicg.github.io/webusb/#enumeration
540
+ */
541
+ export const applyDeviceFilters = (device, filters, exclusionFilters) => {
542
+ return ((filters.length === 0 ||
543
+ filters.some((filter) => matchFilter(device, filter))) &&
544
+ (exclusionFilters.length === 0 ||
545
+ exclusionFilters.every((filter) => !matchFilter(device, filter))));
546
+ };
547
+ const matchFilter = (device, filter) => {
548
+ if (filter.vendorId && device.vendorId !== filter.vendorId) {
549
+ return false;
550
+ }
551
+ if (filter.productId && device.productId !== filter.productId) {
552
+ return false;
553
+ }
554
+ if (filter.serialNumber && device.serialNumber !== filter.serialNumber) {
555
+ return false;
556
+ }
557
+ return hasMatchingInterface(device, filter);
558
+ };
559
+ const hasMatchingInterface = (device, filter) => {
560
+ if (filter.classCode === undefined &&
561
+ filter.subclassCode === undefined &&
562
+ filter.protocolCode === undefined) {
563
+ return true;
564
+ }
565
+ if (!device.configuration?.interfaces) {
566
+ return false;
567
+ }
568
+ return device.configuration.interfaces.some((configInterface) => {
569
+ return configInterface.alternates?.some((alternate) => {
570
+ const classCodeNotMatch = filter.classCode !== undefined &&
571
+ alternate.interfaceClass !== filter.classCode;
572
+ const subClassCodeNotMatch = filter.subclassCode !== undefined &&
573
+ alternate.interfaceSubclass !== filter.subclassCode;
574
+ const protocolCodeNotMatch = filter.protocolCode !== undefined &&
575
+ alternate.interfaceProtocol !== filter.protocolCode;
576
+ return (!classCodeNotMatch || !subClassCodeNotMatch || !protocolCodeNotMatch);
577
+ });
578
+ });
579
+ };
375
580
  const genericErrorSuggestingReconnect = (e) => new DeviceError({
376
581
  code: "reconnect-microbit",
377
582
  message: e.message,
@@ -435,13 +640,16 @@ const enrichedError = (err) => {
435
640
  };
436
641
  const rateLimitProgress = (minimumProgressIncrement, callback) => {
437
642
  let lastCallValue = -1;
438
- return (value, partial) => {
439
- if (value === undefined ||
643
+ let lastStage;
644
+ return (stage, value) => {
645
+ if (lastStage !== stage ||
646
+ value === undefined ||
440
647
  value === 0 ||
441
648
  value === 1 ||
442
649
  value >= lastCallValue + minimumProgressIncrement) {
650
+ lastStage = stage;
443
651
  lastCallValue = value ?? -1;
444
- callback(value, partial);
652
+ callback(stage, value);
445
653
  }
446
654
  };
447
655
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb.js","sourceRoot":"","sources":["../../lib/usb.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EAGnB,gBAAgB,EAChB,qBAAqB,EAGrB,WAAW,EACX,cAAc,EAId,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAW,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,UAAU,EAEV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,6CAA6C;AAC7C,gFAAgF;AAChF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE;IACzC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAEjE,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,8CAAuB,CAAA;IAEvB;;;OAGG;IACH,sDAA+B,CAAA;AACjC,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;AAsDD;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAAyC,EACf,EAAE,CAAC,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,4BACJ,SAAQ,gBAAqE;IA4F7E,YAAY,UAA2C,EAAE;QACvD,KAAK,EAAE,CAAC;QA1FV;;;;mBACE,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE;gBAC/B,CAAC,CAAC,gBAAgB,CAAC,oBAAoB;gBACvC,CAAC,CAAC,gBAAgB,CAAC,aAAa;WAAC;QAE7B;;;;;WAAgD;QACxD;;;WAGG;QACK;;;;;WAA8B;QACtC;;WAEG;QACK;;;;;WAAmC;QAEnC;;;;mBAAuB,KAAK;WAAC;QAE7B;;;;mBAAyB,IAAI,YAAY,EAAE;WAAC;QAE5C;;;;mBAAiB,CAAC,IAAY,EAAE,EAAE;gBACxC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC;WAAC;QAEM;;;;mBAAoB,KAAK;WAAC;QAC1B;;;;mBAAgC,KAAK;WAAC;QACtC;;;;mBAA+B,KAAK;WAAC;QACrC;;;;mBAA2B,GAAG,EAAE;gBACtC,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;oBAC3C,IACE,IAAI,CAAC,mBAAmB;wBACxB,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAC1C,CAAC;wBACD,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;wBAClC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACnB,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;4BACrC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;wBAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACnB,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;4BACrC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gCAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;4BAClC,CAAC,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;4BAChE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBACnC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;WAAC;QAEM;;;;mBAAY,KAAK;WAAC;QAElB;;;;mBAAuB,GAAG,EAAE;gBAClC,iFAAiF;gBACjF,wEAAwE;gBACxE,0CAA0C;gBAC1C,oEAAoE;gBACpE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,0GAA0G;gBAC1G,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;oBACH,MAAM,4BAA4B,GAAG,IAAI,CAAC;oBAC1C,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;4BAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;4BACvB,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gCACnC,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BAC7B,CAAC;wBACH,CAAC;oBACH,CAAC,EAAE,4BAA4B,CAAC,CAAC;gBACnC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACJ,CAAC;WAAC;QAEM;;;;;WAAiB;QACjB;;;;;WAAyC;QAEzC;;;;mBAAyC;gBAC/C,UAAU,EAAE,CAAC;aACd;WAAC;QAqRM;;;;mBAAmB,CAAC,KAAyB,EAAE,EAAE;gBACvD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;oBAC5B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;oBACxB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;WAAC;QAvRA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,cAAc,EAAE,CAAC;QACvD,IAAI,CAAC,mBAAmB;YACtB,OAAO,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,SAAS,CAAC;IACjE,CAAC;IAEO,GAAG,CAAC,CAAM;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAC9B,kBAAkB,EAClB,IAAI,CAAC,wBAAwB,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CACjC,kBAAkB,EAClB,IAAI,CAAC,wBAAwB,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC,CAAC,gBAAmC;QAClE,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACvC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CACT,UAA2B,EAC3B,OAAqB;QAErB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CACjC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CACxC,CAAC;YACF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;YAEnD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE;oBACN,SAAS;iBACV;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,UAA2B,EAC3B,UAAwB,EAAE;QAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACxC,MAAM,QAAQ,GAAG,iBAAiB,CAChC,OAAO,CAAC,wBAAwB,IAAI,MAAM,EAC1C,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAC/B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEhC,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,eAAe,CAClC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,OAAO,EACZ,YAAY,CACb,CAAC;QACF,IAAI,UAAU,GAAY,KAAK,CAAC;QAChC,IAAI,CAAC;YACH,IAAI,OAAO,EAAE,CAAC;gBACZ,UAAU,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,QAAQ,CACN,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,EACvE,SAAS,CACV,CAAC;YAEF,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;gBAC5D,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;gBAClC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;oBAC3C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;wBAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBACxC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,UAAU;iBACZ,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;iBAChC,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACjD,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACX,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,gBAAgB,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,iCAAiC,GAAG,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjB,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,qBAAqB;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjB,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,SAA2B;QAC3C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAI,CAAmB;QACrD,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;gBAChC,MAAM,CAAC,CAAC;YACV,CAAC;YACD,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,CAAC;YACV,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,CACN,0GAA0G,CAC3G,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEZ,gCAAgC;YAChC,oDAAoD;YACpD,0EAA0E;YAC1E,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE5B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAClC,4FAA4F;YAC5F,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO;gBAC5B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;gBACjE,CAAC,CAAC,EAAE,CAAC;YAEP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,YAAY;aACrC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,kFAAkF;gBAClF,qEAAqE;gBACrE,MAAM,cAAc,GAAG,EAAE,CAAC;gBAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACzC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;oBACrD,KAAK,GAAG,GAAG,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,CACpC,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CACnD,CAAC;IACJ,CAAC;IAUD,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,QAA2B;QACvD,MAAM,cAAc,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,QAA0B;QAE1B,IAAI,IAAI,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,aAAa,EAAE,CAAC;YACnE,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,iHAAiH;IACzG,KAAK,CAAC,4BAA4B;QACxC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC7D,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC7B,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,iHAAiH;IACzG,KAAK,CAAC,yBAAyB;QACrC,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;QAClD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAChD,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CACxE,CAAC;QACF,OAAO,eAAe,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,MAAiB;QAEjB,IAAI,CAAC,GAAG,CACN,6BAA6B,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,WAAW,EAAE,CAC7E,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,IAAI,mBAAmB,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;gBAC9C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,OAAO,EAAE,cAAc;aACxB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAES,cAAc,CAAC,IAAY;QACnC,QAAQ,IAAsC,EAAE,CAAC;YAC/C,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,gEAAgE;gBAChE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtD,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,QAAQ,IAAsC,EAAE,CAAC;YAC/C,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;oBACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAiB,EACjB,OAA0B,EAC1B,gBAAmC,EACnC,EAAE;IACF,OAAO,CACL,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CACpE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAiB,EAAE,MAAuB,EAAE,EAAE;IACjE,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,MAAiB,EAAE,MAAuB,EAAE,EAAE;IAC1E,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,MAAM,CAAC,YAAY,KAAK,SAAS;QACjC,MAAM,CAAC,YAAY,KAAK,SAAS,EACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE;QAC9D,OAAO,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACpD,MAAM,iBAAiB,GACrB,MAAM,CAAC,SAAS,KAAK,SAAS;gBAC9B,SAAS,CAAC,cAAc,KAAK,MAAM,CAAC,SAAS,CAAC;YAChD,MAAM,oBAAoB,GACxB,MAAM,CAAC,YAAY,KAAK,SAAS;gBACjC,SAAS,CAAC,iBAAiB,KAAK,MAAM,CAAC,YAAY,CAAC;YACtD,MAAM,oBAAoB,GACxB,MAAM,CAAC,YAAY,KAAK,SAAS;gBACjC,SAAS,CAAC,iBAAiB,KAAK,MAAM,CAAC,YAAY,CAAC;YACtD,OAAO,CACL,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,CACrE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG,CAAC,CAAM,EAAE,EAAE,CACjD,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;CACnB,CAAC,CAAC;AAEL,mCAAmC;AACnC,MAAM,aAAa,GAAG,CAAC,GAAQ,EAAe,EAAE;IAC9C,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;QAChC,OAAO,IAAI,WAAW,CAAC;YACrB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,4DAA4D;YAC5D,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC9C,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;YACnB,CAAC;YACD,sEAAsE;YACtE,6EAA6E;YAC7E,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,uCAAuC;gBACvC,OAAO,IAAI,WAAW,CAAC;oBACrB,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,WAAW,CAAC;oBACrB,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,WAAW,CAAC;oBACrB,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAC9C,OAAO,IAAI,WAAW,CAAC;oBACrB,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,OAAO,+BAA+B,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,0DAA0D;YAC1D,OAAO,+BAA+B,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,+BAA+B,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,wBAAgC,EAChC,QAAmE,EACnE,EAAE;IACF,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,SAAoC,CAAC;IACzC,OAAO,CAAC,KAAoB,EAAE,KAAyB,EAAE,EAAE;QACzD,IACE,SAAS,KAAK,KAAK;YACnB,KAAK,KAAK,SAAS;YACnB,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,IAAI,aAAa,GAAG,wBAAwB,EACjD,CAAC;YACD,SAAS,GAAG,KAAK,CAAC;YAClB,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;YAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,29 @@
1
1
  {
2
2
  "name": "@microbit/microbit-connection",
3
- "version": "0.0.0-tab.change.177",
4
- "type": "module",
5
- "module": "./build/index.js",
3
+ "version": "0.9.0-apps.alpha.0",
4
+ "main": "./build/cjs/index.js",
5
+ "module": "./build/esm/index.js",
6
+ "types": "./build/esm/index.d.ts",
6
7
  "exports": {
7
8
  ".": {
8
- "import": "./build/index.js"
9
+ "import": {
10
+ "types": "./build/esm/index.d.js",
11
+ "default": "./build/esm/index.js"
12
+ },
13
+ "require": {
14
+ "types": "./build/cjs/index.d.js",
15
+ "default": "./build/cjs/index.js"
16
+ }
9
17
  }
10
18
  },
11
19
  "scripts": {
12
20
  "dev": "vite",
13
- "build:lib": "tsc",
21
+ "build:esm": "tsc -p tsconfig.json && echo '{\"type\": \"module\"}' > build/esm/package.json",
22
+ "build:cjs": "tsc -p tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > build/cjs/package.json",
23
+ "build:lib": "npm run build:esm && npm run build:cjs",
14
24
  "build:demo": "vite build --mode=demo",
25
+ "build": "npm run build:lib && npm run build:demo",
26
+ "docs": "typedoc",
15
27
  "ci": "npm run build:lib && npm run test && npx prettier --check lib src",
16
28
  "test": "vitest",
17
29
  "preview": "vite preview"
@@ -20,15 +32,20 @@
20
32
  "@types/node": "^20.14.10",
21
33
  "jsdom": "^24.1.0",
22
34
  "prettier": "3.3.2",
35
+ "typedoc": "^0.27.6",
23
36
  "typescript": "^5.2.2",
24
- "vite": "^5.3.1",
25
- "vitest": "^2.0.0"
37
+ "vite": "^6.3.5",
38
+ "vitest": "^3.2.4"
26
39
  },
27
40
  "dependencies": {
41
+ "@capacitor-community/bluetooth-le": "^7.3.0",
42
+ "@capacitor/core": "^7.4.4",
43
+ "@capacitor/filesystem": "^7.1.6",
44
+ "@microbit/capacitor-community-nordic-dfu": "^7.0.0-microbit.3",
28
45
  "@microbit/microbit-universal-hex": "^0.2.2",
29
46
  "@types/web-bluetooth": "^0.0.20",
30
47
  "crelt": "^1.0.6",
31
- "dapjs": "github:microbit-matt-hillsdon/dapjs#v2.3.0-microbit.2",
48
+ "dapjs": "^2.3.0",
32
49
  "nrf-intel-hex": "^1.4.0"
33
50
  }
34
51
  }
package/typedoc.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "micro:bit connection library",
3
+ "navigationLinks": {
4
+ "micro:bit tech site": "https://tech.microbit.org",
5
+ "GitHub": "https://github.com/microbit-foundation/microbit-connection"
6
+ },
7
+ "entryPoints": ["./lib/index.ts"],
8
+ "out": "./docs/build",
9
+ "readme": "./README.md",
10
+ "headings": {
11
+ "readme": false
12
+ },
13
+ "customCss": "./docs/custom.css"
14
+ }
@@ -1,18 +0,0 @@
1
- import { AccelerometerData } from "./accelerometer.js";
2
- import { Service } from "./bluetooth-device-wrapper.js";
3
- import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
4
- export declare class AccelerometerService implements Service {
5
- private accelerometerDataCharacteristic;
6
- private accelerometerPeriodCharacteristic;
7
- private dispatchTypedEvent;
8
- private queueGattOperation;
9
- constructor(accelerometerDataCharacteristic: BluetoothRemoteGATTCharacteristic, accelerometerPeriodCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
10
- static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<AccelerometerService | undefined>;
11
- private dataViewToData;
12
- getData(): Promise<AccelerometerData>;
13
- getPeriod(): Promise<number>;
14
- setPeriod(value: number): Promise<void>;
15
- startNotifications(type: TypedServiceEvent): Promise<void>;
16
- stopNotifications(type: TypedServiceEvent): Promise<void>;
17
- private characteristicForEvent;
18
- }