@microbit/microbit-connection 0.9.0-apps.alpha.15 → 0.9.0-apps.alpha.17

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 (452) hide show
  1. package/build/cjs/async-util.js.map +1 -1
  2. package/build/cjs/async-util.test.d.ts +1 -0
  3. package/build/cjs/async-util.test.js +20 -0
  4. package/build/cjs/async-util.test.js.map +1 -0
  5. package/build/cjs/availability.js.map +1 -1
  6. package/build/{esm/bluetooth.d.ts → cjs/bluetooth/connection.d.ts} +30 -26
  7. package/build/cjs/{bluetooth.js → bluetooth/connection.js} +183 -106
  8. package/build/cjs/bluetooth/connection.js.map +1 -0
  9. package/build/cjs/bluetooth/connection.test.d.ts +1 -0
  10. package/build/cjs/bluetooth/connection.test.js +88 -0
  11. package/build/cjs/bluetooth/connection.test.js.map +1 -0
  12. package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
  13. package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +22 -11
  14. package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +99 -42
  15. package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
  16. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  17. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
  18. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
  19. package/build/cjs/bluetooth/flashing/flashing-makecode.d.ts +10 -0
  20. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
  21. package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
  22. package/build/cjs/bluetooth/flashing/flashing-makecode.test.d.ts +1 -0
  23. package/build/cjs/bluetooth/flashing/flashing-makecode.test.js +253 -0
  24. package/build/cjs/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  25. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.d.ts +3 -2
  26. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.js +17 -3
  27. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
  28. package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
  29. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  30. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +25 -11
  31. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
  32. package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
  33. package/build/cjs/bluetooth/flashing/zip.test.d.ts +1 -0
  34. package/build/cjs/bluetooth/flashing/zip.test.js +96 -0
  35. package/build/cjs/bluetooth/flashing/zip.test.js.map +1 -0
  36. package/build/cjs/bluetooth/index.d.ts +5 -0
  37. package/build/cjs/bluetooth/index.js +9 -0
  38. package/build/cjs/bluetooth/index.js.map +1 -0
  39. package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
  40. package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
  41. package/build/cjs/bluetooth/profile.js.map +1 -0
  42. package/build/{esm → cjs/bluetooth/services}/accelerometer-service.d.ts +2 -3
  43. package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +16 -12
  44. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
  45. package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
  46. package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +15 -14
  47. package/build/cjs/bluetooth/services/button-service.js.map +1 -0
  48. package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
  49. package/build/cjs/{device-information-service.js → bluetooth/services/device-information-service.js} +2 -2
  50. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
  51. package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
  52. package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
  53. package/build/cjs/{led-service.d.ts → bluetooth/services/led-service.d.ts} +2 -3
  54. package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +7 -7
  55. package/build/cjs/bluetooth/services/led-service.js.map +1 -0
  56. package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  57. package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +18 -14
  58. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
  59. package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  60. package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
  61. package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
  62. package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  63. package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +12 -9
  64. package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
  65. package/build/cjs/board-id.d.ts +1 -1
  66. package/build/cjs/board-id.js.map +1 -1
  67. package/build/cjs/device.d.ts +82 -75
  68. package/build/cjs/device.js +40 -126
  69. package/build/cjs/device.js.map +1 -1
  70. package/build/cjs/events.d.ts +9 -108
  71. package/build/cjs/events.js +27 -88
  72. package/build/cjs/events.js.map +1 -1
  73. package/build/cjs/events.test.d.ts +1 -0
  74. package/build/cjs/events.test.js +115 -0
  75. package/build/cjs/events.test.js.map +1 -0
  76. package/build/cjs/hex-util.d.ts +1 -0
  77. package/build/cjs/hex-util.js +15 -0
  78. package/build/cjs/hex-util.js.map +1 -0
  79. package/build/cjs/index.d.ts +7 -16
  80. package/build/cjs/index.js +6 -26
  81. package/build/cjs/index.js.map +1 -1
  82. package/build/cjs/logging.js.map +1 -1
  83. package/build/cjs/radio-bridge/connection.d.ts +39 -0
  84. package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
  85. package/build/cjs/radio-bridge/connection.js.map +1 -0
  86. package/build/cjs/radio-bridge/index.d.ts +4 -0
  87. package/build/cjs/radio-bridge/index.js +9 -0
  88. package/build/cjs/radio-bridge/index.js.map +1 -0
  89. package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  90. package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
  91. package/build/cjs/service-events.d.ts +42 -14
  92. package/build/cjs/service-events.js +6 -36
  93. package/build/cjs/service-events.js.map +1 -1
  94. package/build/cjs/setupTests.js +8 -0
  95. package/build/cjs/setupTests.js.map +1 -1
  96. package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -2
  97. package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +7 -15
  98. package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
  99. package/build/cjs/universal-hex/index.d.ts +4 -0
  100. package/build/cjs/universal-hex/index.js +9 -0
  101. package/build/cjs/universal-hex/index.js.map +1 -0
  102. package/build/cjs/usb/arm-debug.d.ts +137 -0
  103. package/build/cjs/usb/arm-debug.js +414 -0
  104. package/build/cjs/usb/arm-debug.js.map +1 -0
  105. package/build/cjs/usb/arm-debug.test.d.ts +1 -0
  106. package/build/cjs/usb/arm-debug.test.js +333 -0
  107. package/build/cjs/usb/arm-debug.test.js.map +1 -0
  108. package/build/cjs/{board-serial-info.d.ts → usb/board-serial-info.d.ts} +2 -1
  109. package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  110. package/build/cjs/usb/board-serial-info.js.map +1 -0
  111. package/build/cjs/usb/board-serial-info.test.d.ts +1 -0
  112. package/build/cjs/usb/board-serial-info.test.js +46 -0
  113. package/build/cjs/usb/board-serial-info.test.js.map +1 -0
  114. package/build/cjs/usb/cdc-saturation.d.ts +36 -0
  115. package/build/cjs/usb/cdc-saturation.js +151 -0
  116. package/build/cjs/usb/cdc-saturation.js.map +1 -0
  117. package/build/cjs/usb/cmsis-dap.d.ts +113 -0
  118. package/build/cjs/usb/cmsis-dap.js +349 -0
  119. package/build/cjs/usb/cmsis-dap.js.map +1 -0
  120. package/build/cjs/usb/cmsis-dap.test.d.ts +1 -0
  121. package/build/cjs/usb/cmsis-dap.test.js +350 -0
  122. package/build/cjs/usb/cmsis-dap.test.js.map +1 -0
  123. package/build/cjs/usb/connection.d.ts +81 -0
  124. package/build/cjs/{usb.js → usb/connection.js} +243 -166
  125. package/build/cjs/usb/connection.js.map +1 -0
  126. package/build/cjs/usb/connection.test.d.ts +1 -0
  127. package/build/cjs/usb/connection.test.js +266 -0
  128. package/build/cjs/usb/connection.test.js.map +1 -0
  129. package/build/cjs/usb/cortex-m.d.ts +72 -0
  130. package/build/cjs/usb/cortex-m.js +165 -0
  131. package/build/cjs/usb/cortex-m.js.map +1 -0
  132. package/build/cjs/usb/cortex-m.test.d.ts +1 -0
  133. package/build/cjs/usb/cortex-m.test.js +217 -0
  134. package/build/cjs/usb/cortex-m.test.js.map +1 -0
  135. package/build/cjs/usb/daplink.d.ts +69 -0
  136. package/build/cjs/usb/daplink.js +238 -0
  137. package/build/cjs/usb/daplink.js.map +1 -0
  138. package/build/cjs/usb/daplink.test.d.ts +1 -0
  139. package/build/cjs/usb/daplink.test.js +290 -0
  140. package/build/cjs/usb/daplink.test.js.map +1 -0
  141. package/build/cjs/usb/device-wrapper.d.ts +34 -0
  142. package/build/cjs/usb/device-wrapper.js +102 -0
  143. package/build/cjs/usb/device-wrapper.js.map +1 -0
  144. package/build/cjs/usb/index.d.ts +5 -0
  145. package/build/cjs/usb/index.js +10 -0
  146. package/build/cjs/usb/index.js.map +1 -0
  147. package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
  148. package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
  149. package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
  150. package/build/cjs/{usb-partial-flashing.d.ts → usb/partial-flashing.d.ts} +15 -7
  151. package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +64 -119
  152. package/build/cjs/usb/partial-flashing.js.map +1 -0
  153. package/build/cjs/usb/promise-queue.js.map +1 -0
  154. package/build/cjs/usb/promise-queue.test.d.ts +1 -0
  155. package/build/cjs/usb/promise-queue.test.js +68 -0
  156. package/build/cjs/usb/promise-queue.test.js.map +1 -0
  157. package/build/cjs/usb/serial-events.d.ts +21 -0
  158. package/build/cjs/{led.js → usb/serial-events.js} +1 -1
  159. package/build/cjs/usb/serial-events.js.map +1 -0
  160. package/build/cjs/usb/transport.d.ts +42 -0
  161. package/build/cjs/usb/transport.js +155 -0
  162. package/build/cjs/usb/transport.js.map +1 -0
  163. package/build/esm/async-util.js.map +1 -1
  164. package/build/esm/async-util.test.d.ts +1 -0
  165. package/build/esm/async-util.test.js +18 -0
  166. package/build/esm/async-util.test.js.map +1 -0
  167. package/build/esm/availability.js.map +1 -1
  168. package/build/{cjs/bluetooth.d.ts → esm/bluetooth/connection.d.ts} +30 -26
  169. package/build/esm/{bluetooth.js → bluetooth/connection.js} +177 -100
  170. package/build/esm/bluetooth/connection.js.map +1 -0
  171. package/build/esm/bluetooth/connection.test.d.ts +1 -0
  172. package/build/esm/bluetooth/connection.test.js +86 -0
  173. package/build/esm/bluetooth/connection.test.js.map +1 -0
  174. package/build/esm/bluetooth/device-bond-state.js.map +1 -0
  175. package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +22 -11
  176. package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +97 -41
  177. package/build/esm/bluetooth/device-wrapper.js.map +1 -0
  178. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  179. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
  180. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
  181. package/build/esm/bluetooth/flashing/flashing-makecode.d.ts +10 -0
  182. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
  183. package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
  184. package/build/esm/bluetooth/flashing/flashing-makecode.test.d.ts +1 -0
  185. package/build/esm/bluetooth/flashing/flashing-makecode.test.js +248 -0
  186. package/build/esm/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  187. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.d.ts +3 -2
  188. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.js +17 -3
  189. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
  190. package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
  191. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  192. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +25 -11
  193. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
  194. package/build/esm/bluetooth/flashing/zip.js.map +1 -0
  195. package/build/esm/bluetooth/flashing/zip.test.d.ts +1 -0
  196. package/build/esm/bluetooth/flashing/zip.test.js +94 -0
  197. package/build/esm/bluetooth/flashing/zip.test.js.map +1 -0
  198. package/build/esm/bluetooth/index.d.ts +5 -0
  199. package/build/esm/bluetooth/index.js +5 -0
  200. package/build/esm/bluetooth/index.js.map +1 -0
  201. package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
  202. package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
  203. package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
  204. package/build/{cjs → esm/bluetooth/services}/accelerometer-service.d.ts +2 -3
  205. package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +10 -6
  206. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
  207. package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
  208. package/build/esm/{button-service.js → bluetooth/services/button-service.js} +10 -9
  209. package/build/esm/bluetooth/services/button-service.js.map +1 -0
  210. package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
  211. package/build/esm/{device-information-service.js → bluetooth/services/device-information-service.js} +1 -1
  212. package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
  213. package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
  214. package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
  215. package/build/esm/{led-service.d.ts → bluetooth/services/led-service.d.ts} +2 -3
  216. package/build/esm/{led-service.js → bluetooth/services/led-service.js} +1 -1
  217. package/build/esm/bluetooth/services/led-service.js.map +1 -0
  218. package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  219. package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +10 -6
  220. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
  221. package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  222. package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
  223. package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
  224. package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  225. package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +8 -5
  226. package/build/esm/bluetooth/services/uart-service.js.map +1 -0
  227. package/build/esm/board-id.d.ts +1 -1
  228. package/build/esm/board-id.js.map +1 -1
  229. package/build/esm/device.d.ts +82 -75
  230. package/build/esm/device.js +38 -120
  231. package/build/esm/device.js.map +1 -1
  232. package/build/esm/events.d.ts +9 -108
  233. package/build/esm/events.js +26 -86
  234. package/build/esm/events.js.map +1 -1
  235. package/build/esm/events.test.d.ts +1 -0
  236. package/build/esm/events.test.js +113 -0
  237. package/build/esm/events.test.js.map +1 -0
  238. package/build/esm/hex-util.d.ts +1 -0
  239. package/build/esm/hex-util.js +11 -0
  240. package/build/esm/hex-util.js.map +1 -0
  241. package/build/esm/index.d.ts +7 -16
  242. package/build/esm/index.js +6 -10
  243. package/build/esm/index.js.map +1 -1
  244. package/build/esm/logging.js.map +1 -1
  245. package/build/esm/radio-bridge/connection.d.ts +39 -0
  246. package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
  247. package/build/esm/radio-bridge/connection.js.map +1 -0
  248. package/build/esm/radio-bridge/index.d.ts +4 -0
  249. package/build/esm/radio-bridge/index.js +5 -0
  250. package/build/esm/radio-bridge/index.js.map +1 -0
  251. package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  252. package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
  253. package/build/esm/service-events.d.ts +42 -14
  254. package/build/esm/service-events.js +5 -34
  255. package/build/esm/service-events.js.map +1 -1
  256. package/build/esm/setupTests.js +7 -0
  257. package/build/esm/setupTests.js.map +1 -1
  258. package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -2
  259. package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -13
  260. package/build/esm/universal-hex/flash-data-source.js.map +1 -0
  261. package/build/esm/universal-hex/index.d.ts +4 -0
  262. package/build/esm/universal-hex/index.js +5 -0
  263. package/build/esm/universal-hex/index.js.map +1 -0
  264. package/build/esm/usb/arm-debug.d.ts +137 -0
  265. package/build/esm/usb/arm-debug.js +409 -0
  266. package/build/esm/usb/arm-debug.js.map +1 -0
  267. package/build/esm/usb/arm-debug.test.d.ts +1 -0
  268. package/build/esm/usb/arm-debug.test.js +331 -0
  269. package/build/esm/usb/arm-debug.test.js.map +1 -0
  270. package/build/esm/{board-serial-info.d.ts → usb/board-serial-info.d.ts} +2 -1
  271. package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  272. package/build/esm/usb/board-serial-info.js.map +1 -0
  273. package/build/esm/usb/board-serial-info.test.d.ts +1 -0
  274. package/build/esm/usb/board-serial-info.test.js +44 -0
  275. package/build/esm/usb/board-serial-info.test.js.map +1 -0
  276. package/build/esm/usb/cdc-saturation.d.ts +36 -0
  277. package/build/esm/usb/cdc-saturation.js +148 -0
  278. package/build/esm/usb/cdc-saturation.js.map +1 -0
  279. package/build/esm/usb/cmsis-dap.d.ts +113 -0
  280. package/build/esm/usb/cmsis-dap.js +342 -0
  281. package/build/esm/usb/cmsis-dap.js.map +1 -0
  282. package/build/esm/usb/cmsis-dap.test.d.ts +1 -0
  283. package/build/esm/usb/cmsis-dap.test.js +348 -0
  284. package/build/esm/usb/cmsis-dap.test.js.map +1 -0
  285. package/build/esm/usb/connection.d.ts +81 -0
  286. package/build/esm/{usb.js → usb/connection.js} +239 -161
  287. package/build/esm/usb/connection.js.map +1 -0
  288. package/build/esm/usb/connection.test.d.ts +1 -0
  289. package/build/esm/usb/connection.test.js +264 -0
  290. package/build/esm/usb/connection.test.js.map +1 -0
  291. package/build/esm/usb/cortex-m.d.ts +72 -0
  292. package/build/esm/usb/cortex-m.js +161 -0
  293. package/build/esm/usb/cortex-m.js.map +1 -0
  294. package/build/esm/usb/cortex-m.test.d.ts +1 -0
  295. package/build/esm/usb/cortex-m.test.js +215 -0
  296. package/build/esm/usb/cortex-m.test.js.map +1 -0
  297. package/build/esm/usb/daplink.d.ts +69 -0
  298. package/build/esm/usb/daplink.js +231 -0
  299. package/build/esm/usb/daplink.js.map +1 -0
  300. package/build/esm/usb/daplink.test.d.ts +1 -0
  301. package/build/esm/usb/daplink.test.js +288 -0
  302. package/build/esm/usb/daplink.test.js.map +1 -0
  303. package/build/esm/usb/device-wrapper.d.ts +34 -0
  304. package/build/esm/usb/device-wrapper.js +98 -0
  305. package/build/esm/usb/device-wrapper.js.map +1 -0
  306. package/build/esm/usb/index.d.ts +5 -0
  307. package/build/esm/usb/index.js +5 -0
  308. package/build/esm/usb/index.js.map +1 -0
  309. package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
  310. package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
  311. package/build/esm/usb/partial-flashing-utils.js.map +1 -0
  312. package/build/esm/{usb-partial-flashing.d.ts → usb/partial-flashing.d.ts} +15 -7
  313. package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +62 -94
  314. package/build/esm/usb/partial-flashing.js.map +1 -0
  315. package/build/esm/usb/promise-queue.js.map +1 -0
  316. package/build/esm/usb/promise-queue.test.d.ts +1 -0
  317. package/build/esm/usb/promise-queue.test.js +66 -0
  318. package/build/esm/usb/promise-queue.test.js.map +1 -0
  319. package/build/esm/usb/serial-events.d.ts +21 -0
  320. package/build/esm/usb/serial-events.js +2 -0
  321. package/build/esm/usb/serial-events.js.map +1 -0
  322. package/build/esm/usb/transport.d.ts +42 -0
  323. package/build/esm/usb/transport.js +151 -0
  324. package/build/esm/usb/transport.js.map +1 -0
  325. package/package.json +55 -15
  326. package/LICENSE.md +0 -21
  327. package/README.md +0 -125
  328. package/build/cjs/accelerometer-service.js.map +0 -1
  329. package/build/cjs/accelerometer.d.ts +0 -9
  330. package/build/cjs/accelerometer.js +0 -16
  331. package/build/cjs/accelerometer.js.map +0 -1
  332. package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
  333. package/build/cjs/bluetooth.js.map +0 -1
  334. package/build/cjs/board-serial-info.js.map +0 -1
  335. package/build/cjs/button-service.js.map +0 -1
  336. package/build/cjs/buttons.d.ts +0 -10
  337. package/build/cjs/buttons.js +0 -22
  338. package/build/cjs/buttons.js.map +0 -1
  339. package/build/cjs/constants.d.ts +0 -48
  340. package/build/cjs/constants.js +0 -73
  341. package/build/cjs/constants.js.map +0 -1
  342. package/build/cjs/device-bond-state.js.map +0 -1
  343. package/build/cjs/device-information-service.js.map +0 -1
  344. package/build/cjs/dfu-service.js.map +0 -1
  345. package/build/cjs/flashing/flashing-full.js.map +0 -1
  346. package/build/cjs/flashing/flashing-makecode.d.ts +0 -6
  347. package/build/cjs/flashing/flashing-makecode.js.map +0 -1
  348. package/build/cjs/flashing/flashing-partial.js.map +0 -1
  349. package/build/cjs/flashing/flashing-v1.js.map +0 -1
  350. package/build/cjs/flashing/nordic-dfu.js.map +0 -1
  351. package/build/cjs/flashing/zip.js.map +0 -1
  352. package/build/cjs/hex-flash-data-source.js.map +0 -1
  353. package/build/cjs/led-service.js.map +0 -1
  354. package/build/cjs/led.d.ts +0 -6
  355. package/build/cjs/led.js.map +0 -1
  356. package/build/cjs/magnetometer-service.js.map +0 -1
  357. package/build/cjs/magnetometer.d.ts +0 -9
  358. package/build/cjs/magnetometer.js +0 -16
  359. package/build/cjs/magnetometer.js.map +0 -1
  360. package/build/cjs/partial-flashing-service.js.map +0 -1
  361. package/build/cjs/promise-queue.js.map +0 -1
  362. package/build/cjs/serial-events.d.ts +0 -20
  363. package/build/cjs/serial-events.js +0 -69
  364. package/build/cjs/serial-events.js.map +0 -1
  365. package/build/cjs/uart-service.js.map +0 -1
  366. package/build/cjs/uart.d.ts +0 -4
  367. package/build/cjs/uart.js +0 -16
  368. package/build/cjs/uart.js.map +0 -1
  369. package/build/cjs/usb-device-wrapper.d.ts +0 -47
  370. package/build/cjs/usb-device-wrapper.js +0 -437
  371. package/build/cjs/usb-device-wrapper.js.map +0 -1
  372. package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
  373. package/build/cjs/usb-partial-flashing.js.map +0 -1
  374. package/build/cjs/usb-radio-bridge.d.ts +0 -24
  375. package/build/cjs/usb-radio-bridge.js.map +0 -1
  376. package/build/cjs/usb-serial-protocol.js.map +0 -1
  377. package/build/cjs/usb.d.ts +0 -66
  378. package/build/cjs/usb.js.map +0 -1
  379. package/build/esm/accelerometer-service.js.map +0 -1
  380. package/build/esm/accelerometer.d.ts +0 -9
  381. package/build/esm/accelerometer.js +0 -12
  382. package/build/esm/accelerometer.js.map +0 -1
  383. package/build/esm/bluetooth-device-wrapper.js.map +0 -1
  384. package/build/esm/bluetooth-profile.js.map +0 -1
  385. package/build/esm/bluetooth.js.map +0 -1
  386. package/build/esm/board-serial-info.js.map +0 -1
  387. package/build/esm/button-service.js.map +0 -1
  388. package/build/esm/buttons.d.ts +0 -10
  389. package/build/esm/buttons.js +0 -18
  390. package/build/esm/buttons.js.map +0 -1
  391. package/build/esm/constants.d.ts +0 -48
  392. package/build/esm/constants.js +0 -70
  393. package/build/esm/constants.js.map +0 -1
  394. package/build/esm/device-bond-state.js.map +0 -1
  395. package/build/esm/device-information-service.js.map +0 -1
  396. package/build/esm/dfu-service.js.map +0 -1
  397. package/build/esm/flashing/flashing-full.js.map +0 -1
  398. package/build/esm/flashing/flashing-makecode.d.ts +0 -6
  399. package/build/esm/flashing/flashing-makecode.js.map +0 -1
  400. package/build/esm/flashing/flashing-partial.js.map +0 -1
  401. package/build/esm/flashing/flashing-v1.js.map +0 -1
  402. package/build/esm/flashing/nordic-dfu.js.map +0 -1
  403. package/build/esm/flashing/zip.js.map +0 -1
  404. package/build/esm/hex-flash-data-source.js.map +0 -1
  405. package/build/esm/led-service.js.map +0 -1
  406. package/build/esm/led.d.ts +0 -6
  407. package/build/esm/led.js +0 -2
  408. package/build/esm/led.js.map +0 -1
  409. package/build/esm/magnetometer-service.js.map +0 -1
  410. package/build/esm/magnetometer.d.ts +0 -9
  411. package/build/esm/magnetometer.js +0 -12
  412. package/build/esm/magnetometer.js.map +0 -1
  413. package/build/esm/partial-flashing-service.js.map +0 -1
  414. package/build/esm/promise-queue.js.map +0 -1
  415. package/build/esm/serial-events.d.ts +0 -20
  416. package/build/esm/serial-events.js +0 -61
  417. package/build/esm/serial-events.js.map +0 -1
  418. package/build/esm/uart-service.js.map +0 -1
  419. package/build/esm/uart.d.ts +0 -4
  420. package/build/esm/uart.js +0 -12
  421. package/build/esm/uart.js.map +0 -1
  422. package/build/esm/usb-device-wrapper.d.ts +0 -47
  423. package/build/esm/usb-device-wrapper.js +0 -410
  424. package/build/esm/usb-device-wrapper.js.map +0 -1
  425. package/build/esm/usb-partial-flashing-utils.js.map +0 -1
  426. package/build/esm/usb-partial-flashing.js.map +0 -1
  427. package/build/esm/usb-radio-bridge.d.ts +0 -24
  428. package/build/esm/usb-radio-bridge.js.map +0 -1
  429. package/build/esm/usb-serial-protocol.js.map +0 -1
  430. package/build/esm/usb.d.ts +0 -66
  431. package/build/esm/usb.js.map +0 -1
  432. package/typedoc.json +0 -14
  433. /package/build/cjs/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  434. /package/build/cjs/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  435. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  436. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  437. /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  438. /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
  439. /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  440. /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  441. /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  442. /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
  443. /package/build/esm/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  444. /package/build/esm/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  445. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  446. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  447. /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  448. /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
  449. /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  450. /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  451. /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  452. /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
@@ -37,20 +37,12 @@
37
37
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38
38
  * SOFTWARE.
39
39
  */
40
- /**
41
- * Implementation of partial flashing for the micro:bit.
42
- *
43
- * Latest Microsoft implementation is here:
44
- * https://github.com/microsoft/pxt-microbit/blob/master/editor/flash.ts
45
- */
46
- // dapjs import faff needed for Vitest https://github.com/ARMmbed/dapjs/issues/118
47
- import * as dapjs from "dapjs";
48
- const { DAPLink: DAPLinkValue } = dapjs;
49
- import { withTimeout, TimeoutError } from "./async-util.js";
50
- import { CoreRegister, onlyChanged, pageAlignBlocks, read32FromUInt8Array, } from "./usb-partial-flashing-utils.js";
51
- import { ProgressStage } from "./device.js";
52
- import { truncateHexAfterEof } from "./hex-flash-data-source.js";
40
+ import { ProgressStage } from "../device.js";
41
+ import { truncateHexAfterEof } from "../hex-util.js";
53
42
  import MemoryMap from "nrf-intel-hex";
43
+ import { CoreRegister } from "./cortex-m.js";
44
+ import { dapLinkFlash } from "./daplink.js";
45
+ import { onlyChanged, pageAlignBlocks, read32FromUInt8Array, } from "./partial-flashing-utils.js";
54
46
  // Source code for binaries in can be found at https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/external/sha/source/main.c
55
47
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L243
56
48
  // Update from https://github.com/microsoft/pxt-microbit/commit/a35057717222b8e48335144f497b55e29e9b0f25
@@ -82,17 +74,17 @@ const loadAddr = membase;
82
74
  const dataAddr = 0x20002000;
83
75
  const stackAddr = 0x20001000;
84
76
  /**
85
- * Uses a DAPWrapper to flash the micro:bit.
77
+ * Uses a USBDeviceWrapper to flash the micro:bit.
86
78
  *
87
- * Intented to be used for a single flash with a pre-connected DAPWrapper.
79
+ * Intended to be used for a single flash with a pre-connected USBDeviceWrapper.
88
80
  */
89
81
  export class PartialFlashing {
90
- constructor(dapwrapper, logging, boardVersion) {
91
- Object.defineProperty(this, "dapwrapper", {
82
+ constructor(device, logging, boardVersion, pageSize, numPages) {
83
+ Object.defineProperty(this, "device", {
92
84
  enumerable: true,
93
85
  configurable: true,
94
86
  writable: true,
95
- value: dapwrapper
87
+ value: device
96
88
  });
97
89
  Object.defineProperty(this, "logging", {
98
90
  enumerable: true,
@@ -106,6 +98,18 @@ export class PartialFlashing {
106
98
  writable: true,
107
99
  value: boardVersion
108
100
  });
101
+ Object.defineProperty(this, "pageSize", {
102
+ enumerable: true,
103
+ configurable: true,
104
+ writable: true,
105
+ value: pageSize
106
+ });
107
+ Object.defineProperty(this, "numPages", {
108
+ enumerable: true,
109
+ configurable: true,
110
+ writable: true,
111
+ value: numPages
112
+ });
109
113
  }
110
114
  log(v) {
111
115
  this.logging.log(v);
@@ -113,23 +117,21 @@ export class PartialFlashing {
113
117
  // Runs the checksum algorithm on the micro:bit's whole flash memory, and returns the results.
114
118
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L365
115
119
  async getFlashChecksumsAsync() {
116
- await this.dapwrapper.executeAsync(loadAddr, computeChecksums2, stackAddr, loadAddr + 1, 0xffffffff, dataAddr, 0, this.dapwrapper.pageSize, this.dapwrapper.numPages);
117
- return this.dapwrapper.readBlockAsync(dataAddr, this.dapwrapper.numPages * 2);
120
+ await this.device.cortexM.execute(loadAddr, computeChecksums2, stackAddr, loadAddr + 1, 0xffffffff, dataAddr, 0, this.pageSize, this.numPages);
121
+ return this.device.adi.readBlock(dataAddr, this.numPages * 2);
118
122
  }
119
123
  // Runs the code on the micro:bit to copy a single page of data from RAM address addr to the ROM address specified by the page.
120
124
  // Does not wait for execution to halt.
121
125
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L340
122
126
  async runFlash(page, addr) {
123
- await this.dapwrapper.cortexM.halt(true);
124
- await Promise.all([
125
- this.dapwrapper.cortexM.writeCoreRegister(CoreRegister.PC, loadAddr + 4 + 1),
126
- this.dapwrapper.cortexM.writeCoreRegister(CoreRegister.LR, loadAddr + 1),
127
- this.dapwrapper.cortexM.writeCoreRegister(CoreRegister.SP, stackAddr),
128
- this.dapwrapper.cortexM.writeCoreRegister(0, page.targetAddr),
129
- this.dapwrapper.cortexM.writeCoreRegister(1, addr),
130
- this.dapwrapper.cortexM.writeCoreRegister(2, this.dapwrapper.pageSize >> 2),
131
- ]);
132
- return this.dapwrapper.cortexM.resume(false);
127
+ await this.device.cortexM.halt(true);
128
+ await this.device.cortexM.writeCoreRegister(CoreRegister.PC, loadAddr + 4 + 1);
129
+ await this.device.cortexM.writeCoreRegister(CoreRegister.LR, loadAddr + 1);
130
+ await this.device.cortexM.writeCoreRegister(CoreRegister.SP, stackAddr);
131
+ await this.device.cortexM.writeCoreRegister(0, page.targetAddr);
132
+ await this.device.cortexM.writeCoreRegister(1, addr);
133
+ await this.device.cortexM.writeCoreRegister(2, this.pageSize >> 2);
134
+ return this.device.cortexM.resume(false);
133
135
  }
134
136
  // Write a single page of data to micro:bit ROM by writing it to micro:bit RAM and copying to ROM.
135
137
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L385
@@ -141,8 +143,8 @@ export class PartialFlashing {
141
143
  // Use two slots in RAM to allow parallelisation of the following two tasks.
142
144
  // 1. DAPjs writes a page to one slot.
143
145
  // 2. flashPageBIN copies a page to flash from the other slot.
144
- let thisAddr = i & 1 ? dataAddr : dataAddr + this.dapwrapper.pageSize;
145
- let nextAddr = i & 1 ? dataAddr + this.dapwrapper.pageSize : dataAddr;
146
+ let thisAddr = i & 1 ? dataAddr : dataAddr + this.pageSize;
147
+ let nextAddr = i & 1 ? dataAddr + this.pageSize : dataAddr;
146
148
  // Write first page to slot in RAM.
147
149
  // All subsequent pages will have already been written to RAM.
148
150
  if (i === 0) {
@@ -150,19 +152,20 @@ export class PartialFlashing {
150
152
  for (let j = 0; j < page.data.length; j += 4) {
151
153
  u32data[j >> 2] = read32FromUInt8Array(page.data, j);
152
154
  }
153
- await this.dapwrapper.writeBlockAsync(thisAddr, u32data);
155
+ await this.device.adi.writeBlock(thisAddr, u32data);
154
156
  }
155
157
  await this.runFlash(page, thisAddr);
156
158
  // Write next page to micro:bit RAM if it exists.
157
159
  if (nextPage) {
158
160
  let buf = new Uint32Array(nextPage.data.buffer);
159
- await this.dapwrapper.writeBlockAsync(nextAddr, buf);
161
+ await this.device.adi.writeBlock(nextAddr, buf);
160
162
  }
161
- return this.dapwrapper.waitForHalt();
163
+ return this.device.cortexM.waitForHalt();
162
164
  }
163
165
  // Write pages of data to micro:bit ROM.
164
166
  async partialFlashCoreAsync(pages, updateProgress) {
165
167
  this.log("Partial flash");
168
+ await this.device.adi.writeBlock(loadAddr, flashPageBIN);
166
169
  for (let i = 0; i < pages.length; ++i) {
167
170
  updateProgress(ProgressStage.PartialFlashing, i / pages.length);
168
171
  await this.partialFlashPageAsync(pages[i], pages[i + 1], i);
@@ -175,11 +178,10 @@ export class PartialFlashing {
175
178
  async partialFlashAsync(data, updateProgress) {
176
179
  const flashBytes = this.convertDataToPaddedBytes(data);
177
180
  const checksums = await this.getFlashChecksumsAsync();
178
- await this.dapwrapper.writeBlockAsync(loadAddr, flashPageBIN);
179
- let aligned = pageAlignBlocks(flashBytes, 0, this.dapwrapper.pageSize);
181
+ let aligned = pageAlignBlocks(flashBytes, 0, this.pageSize);
180
182
  const totalPages = aligned.length;
181
183
  this.log("Total pages: " + totalPages);
182
- aligned = onlyChanged(aligned, checksums, this.dapwrapper.pageSize);
184
+ aligned = onlyChanged(aligned, checksums, this.pageSize);
183
185
  this.log("Changed pages: " + aligned.length);
184
186
  let partial;
185
187
  if (aligned.length > totalPages / 2) {
@@ -190,6 +192,10 @@ export class PartialFlashing {
190
192
  catch (e) {
191
193
  this.log(e);
192
194
  this.log("Full flash failed, attempting partial flash.");
195
+ // FLASH_CLOSE (called during full flash cleanup) disables SWD,
196
+ // so we must reconnect before partial flash can use it.
197
+ await this.device.adi.reinit();
198
+ await this.device.cortexM.reset(true);
193
199
  await this.partialFlashCoreAsync(aligned, updateProgress);
194
200
  partial = true;
195
201
  }
@@ -206,76 +212,38 @@ export class PartialFlashing {
206
212
  partial = false;
207
213
  }
208
214
  }
209
- try {
210
- await this.dapwrapper.reset();
211
- }
212
- catch (e) {
213
- // Allow errors on resetting, user can always manually reset if necessary.
214
- }
215
215
  this.log("Flashing complete");
216
216
  return partial;
217
217
  }
218
- // Perform full flash of micro:bit's ROM using daplink.
218
+ // Perform full flash of micro:bit's ROM using DAPLink vendor commands.
219
219
  async fullFlashAsync(data, updateProgress) {
220
220
  this.log("Full flash");
221
221
  const fullFlashProgress = (progress) => {
222
222
  updateProgress(ProgressStage.FullFlashing, progress);
223
223
  };
224
- this.dapwrapper.daplink.on(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
225
- try {
226
- data = this.convertDataToHexString(data);
227
- await this.dapwrapper.transport.open();
228
- await this.dapwrapper.daplink.flash(new TextEncoder().encode(data));
229
- this.logging.event({
230
- type: "WebUSB-info",
231
- message: "full-flash-successful",
232
- });
233
- }
234
- finally {
235
- this.dapwrapper.daplink.removeListener(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
236
- }
224
+ const hexData = this.convertDataToHexString(data);
225
+ await dapLinkFlash(this.device.adi, new TextEncoder().encode(hexData), fullFlashProgress);
226
+ this.logging.event({
227
+ type: "WebUSB-info",
228
+ message: "full-flash-successful",
229
+ });
237
230
  }
238
231
  // Flash the micro:bit's ROM with the provided image, resetting the micro:bit first.
239
232
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L439
240
233
  async flashAsync(data, updateProgress) {
241
- let resetPromise = (async () => {
242
- // Reset micro:bit to ensure interface responds correctly.
243
- this.log("Begin reset");
244
- try {
245
- await this.dapwrapper.reset(true);
246
- }
247
- catch (e) {
248
- this.log("Retrying reset");
249
- await this.dapwrapper.reconnectAsync();
250
- await this.dapwrapper.reset(true);
251
- }
252
- })();
234
+ // Reset into halted state so partial flash can execute code from a clean
235
+ // state.
236
+ this.log("Begin reset");
253
237
  try {
254
- try {
255
- await withTimeout(resetPromise, 1000);
256
- this.log("Begin flashing");
257
- return await this.partialFlashAsync(data, updateProgress);
258
- }
259
- catch (e) {
260
- if (e instanceof TimeoutError) {
261
- this.log("Resetting micro:bit timed out");
262
- this.log("Partial flashing failed. Attempting full flash");
263
- this.logging.event({
264
- type: "WebUSB-info",
265
- message: "flash-failed/attempting-full-flash",
266
- });
267
- await this.fullFlashAsync(data, updateProgress);
268
- return false;
269
- }
270
- else {
271
- throw e;
272
- }
273
- }
238
+ await this.device.cortexM.reset(true);
274
239
  }
275
- finally {
276
- // NB cannot return Promises above!
277
- await this.dapwrapper.disconnectAsync();
240
+ catch (e) {
241
+ this.log("Retrying reset");
242
+ await this.device.reconnect();
243
+ await this.device.cortexM.reset(true);
278
244
  }
245
+ this.log("Begin flashing");
246
+ return this.partialFlashAsync(data, updateProgress);
279
247
  }
280
248
  convertDataToHexString(data) {
281
249
  if (typeof data === "string") {
@@ -310,4 +278,4 @@ export class PartialFlashing {
310
278
  return memoryMap.slicePad(0, flashSize);
311
279
  }
312
280
  }
313
- //# sourceMappingURL=usb-partial-flashing.js.map
281
+ //# sourceMappingURL=partial-flashing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-flashing.js","sourceRoot":"","sources":["../../../src/usb/partial-flashing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAUH,OAAO,EAAkC,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,WAAW,EAEX,eAAe,EACf,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AAErC,iKAAiK;AACjK,+HAA+H;AAC/H,wGAAwG;AACxG,kBAAkB;AAClB,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC;IACnC,UAAU,EAAE,2BAA2B;IACvC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CAC3D,CAAC,CAAC;AAEH,wFAAwF;AACxF,+HAA+H;AAC/H,kBAAkB;AAClB,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAAC;IACxC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CACvE,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,UAAU,CAAC;AAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAC1B,YACU,MAAwB,EACxB,OAAgB,EAChB,YAA0B,EAC1B,QAAgB,EAChB,QAAgB;QAJxB;;;;mBAAQ,MAAM;WAAkB;QAChC;;;;mBAAQ,OAAO;WAAS;QACxB;;;;mBAAQ,YAAY;WAAc;QAClC;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,QAAQ;WAAQ;IACvB,CAAC;IAEI,GAAG,CAAC,CAAM;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,8FAA8F;IAC9F,+HAA+H;IACvH,KAAK,CAAC,sBAAsB;QAClC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAC/B,QAAQ,EACR,iBAAiB,EACjB,SAAS,EACT,QAAQ,GAAG,CAAC,EACZ,UAAU,EACV,QAAQ,EACR,CAAC,EACD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,+HAA+H;IAC/H,uCAAuC;IACvC,+HAA+H;IACvH,KAAK,CAAC,QAAQ,CAAC,IAAU,EAAE,IAAY;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CACzC,YAAY,CAAC,EAAE,EACf,QAAQ,GAAG,CAAC,GAAG,CAAC,CACjB,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,kGAAkG;IAClG,+HAA+H;IACvH,KAAK,CAAC,qBAAqB,CACjC,IAAU,EACV,QAAc,EACd,CAAS;QAET,6DAA6D;QAC7D,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,sCAAsC;QACtC,8DAA8D;QAC9D,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3D,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE3D,mCAAmC;QACnC,8DAA8D;QAC9D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,iDAAiD;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,wCAAwC;IAChC,KAAK,CAAC,qBAAqB,CACjC,KAAa,EACb,cAAgC;QAEhC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,cAAc,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,cAAc,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,gGAAgG;IAChG,wDAAwD;IACxD,+HAA+H;IACvH,KAAK,CAAC,iBAAiB,CAC7B,IAAqC,EACrC,cAAgC;QAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACtD,IAAI,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC;QACvC,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,OAA4B,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBAChD,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBACzD,+DAA+D;gBAC/D,wDAAwD;gBACxD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAC1D,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAC1D,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBACzD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBAChD,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,cAAc,CAClB,IAAqC,EACrC,cAAgC;QAEhC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAEvB,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC7C,cAAc,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,YAAY,CAChB,IAAI,CAAC,MAAM,CAAC,GAAG,EACf,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EACjC,iBAAiB,CAClB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;IACL,CAAC;IAED,oFAAoF;IACpF,+HAA+H;IAC/H,KAAK,CAAC,UAAU,CACd,IAAqC,EACrC,cAAgC;QAEhC,yEAAyE;QACzE,SAAS;QACT,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAEO,sBAAsB,CAC5B,IAAqC;QAErC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEO,wBAAwB,CAC9B,IAAqC;QAErC,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,sBAAsB,CAAC,GAAW;QACxC,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,sBAAsB,CAAC,IAAgB;QAC7C,OAAO,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,CAAC;IAEO,sBAAsB,CAAC,SAAoB;QACjD,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,GAAG,GAAG,IAAI;YACd,EAAE,EAAE,GAAG,GAAG,IAAI;SACf,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise-queue.js","sourceRoot":"","sources":["../../../src/usb/promise-queue.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,YAAY;IAKvB,YAAY,UAAmB,EAAE;QAJzB;;;;mBAAgB,KAAK;WAAC;QACtB;;;;mBAA6B,EAAE;WAAC;QAChC;;;;;WAA4C;QAGlD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAI,MAAwB;QACpC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAkB;gBAC3B,OAAO;gBACP,MAAM;gBACN,MAAM;aACP,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAsB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,66 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { PromiseQueue } from "./promise-queue.js";
3
+ describe("PromiseQueue", () => {
4
+ it("waits for previous items", async () => {
5
+ const sequence = [];
6
+ const queue = new PromiseQueue();
7
+ queue.add(async () => {
8
+ expect(sequence).toEqual([]);
9
+ sequence.push(1);
10
+ });
11
+ queue.add(async () => {
12
+ expect(sequence).toEqual([1]);
13
+ sequence.push(2);
14
+ });
15
+ expect(await queue.add(async () => {
16
+ expect(sequence).toEqual([1, 2]);
17
+ sequence.push(3);
18
+ return 3;
19
+ })).toEqual(3);
20
+ expect(sequence).toEqual([1, 2, 3]);
21
+ });
22
+ it("copes with errors", async () => {
23
+ const queue = new PromiseQueue();
24
+ const sequence = [];
25
+ const p1 = queue.add(() => {
26
+ sequence.push(1);
27
+ throw new Error("Oops");
28
+ });
29
+ const p2 = queue.add(() => {
30
+ sequence.push(2);
31
+ return Promise.resolve(2);
32
+ });
33
+ expect(await p2).toEqual(2);
34
+ await expect(p1).rejects.toThrow("Oops");
35
+ expect(sequence).toEqual([1, 2]);
36
+ });
37
+ it("clears", async () => {
38
+ const queue = new PromiseQueue();
39
+ const rejected = [];
40
+ const p1 = queue.add(() => new Promise((resolve) => setTimeout(resolve, 1000)));
41
+ const p2 = queue.add(() => new Promise((resolve) => setTimeout(resolve, 1000)));
42
+ const p3 = queue.add(() => new Promise((resolve) => setTimeout(resolve, 1000)));
43
+ p1.catch(() => rejected.push(p1));
44
+ p2.catch(() => rejected.push(p2));
45
+ p3.catch(() => rejected.push(p3));
46
+ queue.clear(() => new Error("Cleared!"));
47
+ await expect(p2).rejects.toThrow("Cleared!");
48
+ await expect(p3).rejects.toThrow("Cleared!");
49
+ expect(rejected).toEqual([p2, p3]);
50
+ });
51
+ it("detects abort", async () => {
52
+ let abort = false;
53
+ const queue = new PromiseQueue({
54
+ abortCheck: () => (abort ? () => new Error("Aborted") : undefined),
55
+ });
56
+ const p1 = queue.add(async () => {
57
+ abort = true;
58
+ });
59
+ const p2 = queue.add(async () => {
60
+ throw new Error("Does not happen");
61
+ });
62
+ expect(await p1).toBeUndefined();
63
+ await expect(p2).rejects.toThrow("Aborted");
64
+ });
65
+ });
66
+ //# sourceMappingURL=promise-queue.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise-queue.test.js","sourceRoot":"","sources":["../../../src/usb/promise-queue.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface SerialData {
2
+ data: string;
3
+ }
4
+ export interface SerialErrorData {
5
+ error: unknown;
6
+ }
7
+ export interface SerialConnectionEventMap {
8
+ /** Fired when serial data is received from the micro:bit. */
9
+ serialdata: SerialData;
10
+ /**
11
+ * Fired when the serial session ends, indicating that subsequent serial
12
+ * output may be from a different program (e.g. after flashing or a full
13
+ * disconnect). Consumers typically use this to clear the terminal.
14
+ *
15
+ * Not fired when the connection is paused (tab hidden) because the same
16
+ * program continues running and serial resumes when the tab becomes visible.
17
+ */
18
+ serialreset: void;
19
+ /** Fired when a serial read error occurs. */
20
+ serialerror: SerialErrorData;
21
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serial-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-events.js","sourceRoot":"","sources":["../../../src/usb/serial-events.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * Derived from dapjs (https://github.com/ARMmbed/dapjs) which is
5
+ * Copyright (c) Arm Limited 2018
6
+ * Copyright (c) Microsoft Corporation
7
+ *
8
+ * SPDX-License-Identifier: MIT
9
+ *
10
+ * See arm-debug.ts for the full dapjs license.
11
+ *
12
+ * WebUSB transport layer. Handles opening/closing the USB interface,
13
+ * finding the correct CMSIS-DAP endpoints, and reading/writing raw packets.
14
+ *
15
+ * This is the lowest layer in the USB stack, sitting beneath the CMSIS-DAP
16
+ * protocol layer. It knows nothing about DAP commands — it just moves
17
+ * fixed-size packets between the host and the USB device.
18
+ *
19
+ * micro:bit V2 uses CMSIS-DAP v2 (bulk endpoints). micro:bit V1 uses
20
+ * CMSIS-DAP v1 (HID) which has no bulk endpoints — we fall back to
21
+ * control transfers (SET_REPORT/GET_REPORT) in that case.
22
+ */
23
+ export declare const PACKET_SIZE = 64;
24
+ export interface Transport {
25
+ readonly isOpen: boolean;
26
+ open(): Promise<void>;
27
+ close(): Promise<void>;
28
+ read(): Promise<DataView>;
29
+ write(data: Uint8Array): Promise<void>;
30
+ }
31
+ export declare class UsbTransport implements Transport {
32
+ private device;
33
+ private interfaceNumber?;
34
+ private endpointIn?;
35
+ private endpointOut?;
36
+ constructor(device: USBDevice);
37
+ get isOpen(): boolean;
38
+ open(): Promise<void>;
39
+ close(): Promise<void>;
40
+ read(): Promise<DataView>;
41
+ write(data: Uint8Array): Promise<void>;
42
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * Derived from dapjs (https://github.com/ARMmbed/dapjs) which is
5
+ * Copyright (c) Arm Limited 2018
6
+ * Copyright (c) Microsoft Corporation
7
+ *
8
+ * SPDX-License-Identifier: MIT
9
+ *
10
+ * See arm-debug.ts for the full dapjs license.
11
+ *
12
+ * WebUSB transport layer. Handles opening/closing the USB interface,
13
+ * finding the correct CMSIS-DAP endpoints, and reading/writing raw packets.
14
+ *
15
+ * This is the lowest layer in the USB stack, sitting beneath the CMSIS-DAP
16
+ * protocol layer. It knows nothing about DAP commands — it just moves
17
+ * fixed-size packets between the host and the USB device.
18
+ *
19
+ * micro:bit V2 uses CMSIS-DAP v2 (bulk endpoints). micro:bit V1 uses
20
+ * CMSIS-DAP v1 (HID) which has no bulk endpoints — we fall back to
21
+ * control transfers (SET_REPORT/GET_REPORT) in that case.
22
+ */
23
+ import { DeviceError } from "../device.js";
24
+ // WebUSB interface class for CMSIS-DAP
25
+ const CMSIS_DAP_INTERFACE_CLASS = 0xff;
26
+ // HID report types for control transfer fallback (CMSIS-DAP v1 / no bulk endpoints)
27
+ const GET_REPORT = 0x01;
28
+ const SET_REPORT = 0x09;
29
+ const OUT_REPORT = 0x200;
30
+ const IN_REPORT = 0x100;
31
+ export const PACKET_SIZE = 64;
32
+ export class UsbTransport {
33
+ constructor(device) {
34
+ Object.defineProperty(this, "device", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: device
39
+ });
40
+ Object.defineProperty(this, "interfaceNumber", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: void 0
45
+ });
46
+ Object.defineProperty(this, "endpointIn", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: void 0
51
+ });
52
+ Object.defineProperty(this, "endpointOut", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: void 0
57
+ });
58
+ }
59
+ get isOpen() {
60
+ return this.interfaceNumber !== undefined;
61
+ }
62
+ async open() {
63
+ if (this.isOpen)
64
+ return;
65
+ await this.device.open();
66
+ await this.device.selectConfiguration(1);
67
+ const interfaces = this.device.configuration.interfaces.filter((iface) => iface.alternates[0].interfaceClass === CMSIS_DAP_INTERFACE_CLASS);
68
+ if (!interfaces.length) {
69
+ throw new DeviceError({
70
+ code: "update-req",
71
+ message: "No valid interfaces found.",
72
+ });
73
+ }
74
+ // Prefer interface with bulk endpoints (CMSIS-DAP v2).
75
+ // Fall back to an interface without endpoints (CMSIS-DAP v1 / HID),
76
+ // which will use control transfers instead.
77
+ const selectedInterface = interfaces.find((iface) => iface.alternates[0].endpoints.length > 0) ??
78
+ interfaces[0];
79
+ this.interfaceNumber = selectedInterface.interfaceNumber;
80
+ const endpoints = selectedInterface.alternates[0].endpoints;
81
+ this.endpointIn = undefined;
82
+ this.endpointOut = undefined;
83
+ for (const endpoint of endpoints) {
84
+ if (endpoint.direction === "in" && !this.endpointIn)
85
+ this.endpointIn = endpoint;
86
+ else if (endpoint.direction === "out" && !this.endpointOut)
87
+ this.endpointOut = endpoint;
88
+ }
89
+ await this.device.claimInterface(this.interfaceNumber);
90
+ }
91
+ async close() {
92
+ this.interfaceNumber = undefined;
93
+ this.endpointIn = undefined;
94
+ this.endpointOut = undefined;
95
+ await this.device.close();
96
+ }
97
+ async read() {
98
+ if (this.interfaceNumber === undefined) {
99
+ throw new DeviceError({
100
+ code: "reconnect-microbit",
101
+ message: "No device opened",
102
+ });
103
+ }
104
+ let result;
105
+ if (this.endpointIn) {
106
+ result = await this.device.transferIn(this.endpointIn.endpointNumber, PACKET_SIZE);
107
+ }
108
+ else {
109
+ // Control transfer fallback for interfaces without bulk endpoints
110
+ result = await this.device.controlTransferIn({
111
+ requestType: "class",
112
+ recipient: "interface",
113
+ request: GET_REPORT,
114
+ value: IN_REPORT,
115
+ index: this.interfaceNumber,
116
+ }, PACKET_SIZE);
117
+ }
118
+ if (result.status !== "ok" || !result.data) {
119
+ throw new DeviceError({
120
+ code: "reconnect-microbit",
121
+ message: "USB read failed",
122
+ });
123
+ }
124
+ return result.data;
125
+ }
126
+ async write(data) {
127
+ if (this.interfaceNumber === undefined) {
128
+ throw new DeviceError({
129
+ code: "reconnect-microbit",
130
+ message: "No device opened",
131
+ });
132
+ }
133
+ // Always pad to PACKET_SIZE (required for HID control transfer fallback)
134
+ const buffer = new Uint8Array(PACKET_SIZE);
135
+ buffer.set(data.subarray(0, PACKET_SIZE));
136
+ if (this.endpointOut) {
137
+ await this.device.transferOut(this.endpointOut.endpointNumber, buffer);
138
+ }
139
+ else {
140
+ // Control transfer fallback for interfaces without bulk endpoints
141
+ await this.device.controlTransferOut({
142
+ requestType: "class",
143
+ recipient: "interface",
144
+ request: SET_REPORT,
145
+ value: OUT_REPORT,
146
+ index: this.interfaceNumber,
147
+ }, buffer);
148
+ }
149
+ }
150
+ }
151
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/usb/transport.ts"],"names":[],"mappings":"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"}