@microbit/microbit-connection 0.0.0-alpha.32 → 0.0.0-alpha.33

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 (221) hide show
  1. package/README.md +89 -6
  2. package/build/cjs/accelerometer-service.js +106 -0
  3. package/build/cjs/accelerometer-service.js.map +1 -0
  4. package/build/cjs/accelerometer.js +16 -0
  5. package/build/cjs/accelerometer.js.map +1 -0
  6. package/build/cjs/async-util.js +27 -0
  7. package/build/cjs/async-util.js.map +1 -0
  8. package/build/cjs/bluetooth-device-wrapper.js +467 -0
  9. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  10. package/build/cjs/bluetooth-profile.js +86 -0
  11. package/build/cjs/bluetooth-profile.js.map +1 -0
  12. package/build/{bluetooth.d.ts → cjs/bluetooth.d.ts} +1 -2
  13. package/build/cjs/bluetooth.js +268 -0
  14. package/build/cjs/bluetooth.js.map +1 -0
  15. package/build/cjs/board-id.js +81 -0
  16. package/build/cjs/board-id.js.map +1 -0
  17. package/build/cjs/board-serial-info.js +51 -0
  18. package/build/cjs/board-serial-info.js.map +1 -0
  19. package/build/cjs/button-service.js +80 -0
  20. package/build/cjs/button-service.js.map +1 -0
  21. package/build/cjs/buttons.js +22 -0
  22. package/build/cjs/buttons.js.map +1 -0
  23. package/build/cjs/constants.js +73 -0
  24. package/build/cjs/constants.js.map +1 -0
  25. package/build/cjs/device.js +199 -0
  26. package/build/cjs/device.js.map +1 -0
  27. package/build/cjs/events.js +109 -0
  28. package/build/cjs/events.js.map +1 -0
  29. package/build/cjs/hex-flash-data-source.js +26 -0
  30. package/build/cjs/hex-flash-data-source.js.map +1 -0
  31. package/build/cjs/index.d.ts +16 -0
  32. package/build/cjs/index.js +33 -0
  33. package/build/cjs/index.js.map +1 -0
  34. package/build/cjs/led-service.js +120 -0
  35. package/build/{led-service.js.map → cjs/led-service.js.map} +1 -1
  36. package/build/cjs/led.js +3 -0
  37. package/build/cjs/led.js.map +1 -0
  38. package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
  39. package/build/cjs/logging.js +16 -0
  40. package/build/cjs/logging.js.map +1 -0
  41. package/build/cjs/magnetometer-service.js +129 -0
  42. package/build/cjs/magnetometer-service.js.map +1 -0
  43. package/build/cjs/magnetometer.js +16 -0
  44. package/build/cjs/magnetometer.js.map +1 -0
  45. package/build/cjs/package.json +1 -0
  46. package/build/cjs/promise-queue.js +78 -0
  47. package/build/cjs/promise-queue.js.map +1 -0
  48. package/build/cjs/service-events.js +39 -0
  49. package/build/cjs/service-events.js.map +1 -0
  50. package/build/cjs/setupTests.js.map +1 -0
  51. package/build/cjs/uart-service.js +76 -0
  52. package/build/cjs/uart-service.js.map +1 -0
  53. package/build/cjs/uart.js +16 -0
  54. package/build/cjs/uart.js.map +1 -0
  55. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
  56. package/build/cjs/usb-device-wrapper.js +412 -0
  57. package/build/cjs/usb-device-wrapper.js.map +1 -0
  58. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  59. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  60. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
  61. package/build/cjs/usb-partial-flashing.js +341 -0
  62. package/build/cjs/usb-partial-flashing.js.map +1 -0
  63. package/build/cjs/usb-radio-bridge.js +509 -0
  64. package/build/cjs/usb-radio-bridge.js.map +1 -0
  65. package/build/cjs/usb-serial-protocol.js +183 -0
  66. package/build/cjs/usb-serial-protocol.js.map +1 -0
  67. package/build/cjs/usb.js +520 -0
  68. package/build/cjs/usb.js.map +1 -0
  69. package/build/esm/accelerometer-service.d.ts +18 -0
  70. package/build/esm/accelerometer-service.js.map +1 -0
  71. package/build/esm/accelerometer.d.ts +9 -0
  72. package/build/esm/accelerometer.js.map +1 -0
  73. package/build/esm/async-util.d.ts +13 -0
  74. package/build/esm/async-util.js.map +1 -0
  75. package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
  76. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  77. package/build/esm/bluetooth-profile.d.ts +139 -0
  78. package/build/esm/bluetooth-profile.js.map +1 -0
  79. package/build/esm/bluetooth.d.ts +60 -0
  80. package/build/esm/bluetooth.js.map +1 -0
  81. package/build/esm/board-id.d.ts +36 -0
  82. package/build/esm/board-id.js.map +1 -0
  83. package/build/esm/board-serial-info.d.ts +14 -0
  84. package/build/esm/board-serial-info.js.map +1 -0
  85. package/build/esm/button-service.d.ts +13 -0
  86. package/build/esm/button-service.js.map +1 -0
  87. package/build/esm/buttons.d.ts +10 -0
  88. package/build/esm/buttons.js.map +1 -0
  89. package/build/esm/constants.d.ts +48 -0
  90. package/build/esm/constants.js.map +1 -0
  91. package/build/esm/device.d.ts +208 -0
  92. package/build/esm/device.js.map +1 -0
  93. package/build/esm/events.d.ts +111 -0
  94. package/build/esm/events.js.map +1 -0
  95. package/build/esm/hex-flash-data-source.d.ts +7 -0
  96. package/build/esm/hex-flash-data-source.js.map +1 -0
  97. package/build/esm/index.d.ts +16 -0
  98. package/build/esm/index.js +11 -0
  99. package/build/esm/index.js.map +1 -0
  100. package/build/esm/led-service.d.ts +20 -0
  101. package/build/esm/led-service.js.map +1 -0
  102. package/build/esm/led.d.ts +6 -0
  103. package/build/esm/led.js.map +1 -0
  104. package/build/esm/logging.d.ts +21 -0
  105. package/build/esm/logging.js.map +1 -0
  106. package/build/esm/magnetometer-service.d.ts +22 -0
  107. package/build/esm/magnetometer-service.js.map +1 -0
  108. package/build/esm/magnetometer.d.ts +9 -0
  109. package/build/esm/magnetometer.js.map +1 -0
  110. package/build/esm/package.json +1 -0
  111. package/build/esm/promise-queue.d.ts +27 -0
  112. package/build/esm/promise-queue.js.map +1 -0
  113. package/build/esm/service-events.d.ts +17 -0
  114. package/build/esm/service-events.js.map +1 -0
  115. package/build/esm/setupTests.d.ts +6 -0
  116. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  117. package/build/esm/uart-service.d.ts +13 -0
  118. package/build/esm/uart-service.js.map +1 -0
  119. package/build/esm/uart.d.ts +4 -0
  120. package/build/esm/uart.js.map +1 -0
  121. package/build/esm/usb-device-wrapper.d.ts +47 -0
  122. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +10 -9
  123. package/build/esm/usb-device-wrapper.js.map +1 -0
  124. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  125. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  126. package/build/esm/usb-partial-flashing.d.ts +69 -0
  127. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
  128. package/build/esm/usb-partial-flashing.js.map +1 -0
  129. package/build/esm/usb-radio-bridge.d.ts +41 -0
  130. package/build/esm/usb-radio-bridge.js.map +1 -0
  131. package/build/esm/usb-serial-protocol.d.ts +66 -0
  132. package/build/esm/usb-serial-protocol.js.map +1 -0
  133. package/build/esm/usb.d.ts +58 -0
  134. package/build/esm/usb.js.map +1 -0
  135. package/package.json +19 -6
  136. package/typedoc.json +13 -0
  137. package/build/accelerometer-service.js.map +0 -1
  138. package/build/accelerometer.js.map +0 -1
  139. package/build/async-util.js.map +0 -1
  140. package/build/bluetooth-device-wrapper.js.map +0 -1
  141. package/build/bluetooth-profile.js.map +0 -1
  142. package/build/bluetooth.js.map +0 -1
  143. package/build/board-id.js.map +0 -1
  144. package/build/board-serial-info.js.map +0 -1
  145. package/build/button-service.js.map +0 -1
  146. package/build/buttons.js.map +0 -1
  147. package/build/constants.js.map +0 -1
  148. package/build/device.js.map +0 -1
  149. package/build/events.js.map +0 -1
  150. package/build/hex-flash-data-source.js.map +0 -1
  151. package/build/index.d.ts +0 -13
  152. package/build/index.js +0 -10
  153. package/build/index.js.map +0 -1
  154. package/build/led.js.map +0 -1
  155. package/build/logging.js.map +0 -1
  156. package/build/magnetometer-service.js.map +0 -1
  157. package/build/magnetometer.js.map +0 -1
  158. package/build/promise-queue.js.map +0 -1
  159. package/build/service-events.js.map +0 -1
  160. package/build/uart-service.js.map +0 -1
  161. package/build/uart.js.map +0 -1
  162. package/build/usb-device-wrapper.js.map +0 -1
  163. package/build/usb-partial-flashing-utils.js.map +0 -1
  164. package/build/usb-partial-flashing.js.map +0 -1
  165. package/build/usb-radio-bridge.js.map +0 -1
  166. package/build/usb-serial-protocol.js.map +0 -1
  167. package/build/usb.js.map +0 -1
  168. package/vite.config.ts +0 -34
  169. /package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +0 -0
  170. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  171. /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
  172. /package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +0 -0
  173. /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
  174. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  175. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  176. /package/build/{button-service.d.ts → cjs/button-service.d.ts} +0 -0
  177. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  178. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  179. /package/build/{device.d.ts → cjs/device.d.ts} +0 -0
  180. /package/build/{events.d.ts → cjs/events.d.ts} +0 -0
  181. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  182. /package/build/{led-service.d.ts → cjs/led-service.d.ts} +0 -0
  183. /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
  184. /package/build/{magnetometer-service.d.ts → cjs/magnetometer-service.d.ts} +0 -0
  185. /package/build/{magnetometer.d.ts → cjs/magnetometer.d.ts} +0 -0
  186. /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
  187. /package/build/{service-events.d.ts → cjs/service-events.d.ts} +0 -0
  188. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  189. /package/build/{uart-service.d.ts → cjs/uart-service.d.ts} +0 -0
  190. /package/build/{uart.d.ts → cjs/uart.d.ts} +0 -0
  191. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  192. /package/build/{usb-radio-bridge.d.ts → cjs/usb-radio-bridge.d.ts} +0 -0
  193. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  194. /package/build/{usb.d.ts → cjs/usb.d.ts} +0 -0
  195. /package/build/{accelerometer-service.js → esm/accelerometer-service.js} +0 -0
  196. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  197. /package/build/{async-util.js → esm/async-util.js} +0 -0
  198. /package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +0 -0
  199. /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
  200. /package/build/{bluetooth.js → esm/bluetooth.js} +0 -0
  201. /package/build/{board-id.js → esm/board-id.js} +0 -0
  202. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  203. /package/build/{button-service.js → esm/button-service.js} +0 -0
  204. /package/build/{buttons.js → esm/buttons.js} +0 -0
  205. /package/build/{constants.js → esm/constants.js} +0 -0
  206. /package/build/{device.js → esm/device.js} +0 -0
  207. /package/build/{events.js → esm/events.js} +0 -0
  208. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  209. /package/build/{led-service.js → esm/led-service.js} +0 -0
  210. /package/build/{led.js → esm/led.js} +0 -0
  211. /package/build/{logging.js → esm/logging.js} +0 -0
  212. /package/build/{magnetometer-service.js → esm/magnetometer-service.js} +0 -0
  213. /package/build/{magnetometer.js → esm/magnetometer.js} +0 -0
  214. /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
  215. /package/build/{service-events.js → esm/service-events.js} +0 -0
  216. /package/build/{uart-service.js → esm/uart-service.js} +0 -0
  217. /package/build/{uart.js → esm/uart.js} +0 -0
  218. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  219. /package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +0 -0
  220. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
  221. /package/build/{usb.js → esm/usb.js} +0 -0
@@ -0,0 +1,520 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MicrobitWebUSBConnection = exports.isChromeOS105 = void 0;
4
+ /**
5
+ * (c) 2021, Micro:bit Educational Foundation and contributors
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+ const async_util_js_1 = require("./async-util.js");
10
+ const device_js_1 = require("./device.js");
11
+ const events_js_1 = require("./events.js");
12
+ const logging_js_1 = require("./logging.js");
13
+ const promise_queue_js_1 = require("./promise-queue.js");
14
+ const usb_device_wrapper_js_1 = require("./usb-device-wrapper.js");
15
+ const usb_partial_flashing_js_1 = require("./usb-partial-flashing.js");
16
+ // Temporary workaround for ChromeOS 105 bug.
17
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=1363712&q=usb&can=2
18
+ const isChromeOS105 = () => {
19
+ const userAgent = navigator.userAgent;
20
+ return /CrOS/.test(userAgent) && /Chrome\/105\b/.test(userAgent);
21
+ };
22
+ exports.isChromeOS105 = isChromeOS105;
23
+ /**
24
+ * A WebUSB connection to a micro:bit device.
25
+ */
26
+ class MicrobitWebUSBConnection extends events_js_1.TypedEventTarget {
27
+ constructor(options = { logging: new logging_js_1.NullLogging() }) {
28
+ super();
29
+ Object.defineProperty(this, "status", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: navigator.usb && !(0, exports.isChromeOS105)()
34
+ ? device_js_1.ConnectionStatus.NO_AUTHORIZED_DEVICE
35
+ : device_js_1.ConnectionStatus.NOT_SUPPORTED
36
+ });
37
+ Object.defineProperty(this, "exclusionFilters", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
43
+ /**
44
+ * The USB device we last connected to.
45
+ * Cleared if it is disconnected.
46
+ */
47
+ Object.defineProperty(this, "device", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: void 0
52
+ });
53
+ /**
54
+ * The connection to the device.
55
+ */
56
+ Object.defineProperty(this, "connection", {
57
+ enumerable: true,
58
+ configurable: true,
59
+ writable: true,
60
+ value: void 0
61
+ });
62
+ Object.defineProperty(this, "serialState", {
63
+ enumerable: true,
64
+ configurable: true,
65
+ writable: true,
66
+ value: false
67
+ });
68
+ Object.defineProperty(this, "serialStateChangeQueue", {
69
+ enumerable: true,
70
+ configurable: true,
71
+ writable: true,
72
+ value: new promise_queue_js_1.PromiseQueue()
73
+ });
74
+ Object.defineProperty(this, "serialListener", {
75
+ enumerable: true,
76
+ configurable: true,
77
+ writable: true,
78
+ value: (data) => {
79
+ this.dispatchTypedEvent("serialdata", new device_js_1.SerialDataEvent(data));
80
+ }
81
+ });
82
+ Object.defineProperty(this, "flashing", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: false
87
+ });
88
+ Object.defineProperty(this, "disconnectAfterFlash", {
89
+ enumerable: true,
90
+ configurable: true,
91
+ writable: true,
92
+ value: false
93
+ });
94
+ Object.defineProperty(this, "visibilityReconnect", {
95
+ enumerable: true,
96
+ configurable: true,
97
+ writable: true,
98
+ value: false
99
+ });
100
+ Object.defineProperty(this, "visibilityChangeListener", {
101
+ enumerable: true,
102
+ configurable: true,
103
+ writable: true,
104
+ value: () => {
105
+ if (document.visibilityState === "visible") {
106
+ if (this.visibilityReconnect &&
107
+ this.status !== device_js_1.ConnectionStatus.CONNECTED) {
108
+ this.disconnectAfterFlash = false;
109
+ this.visibilityReconnect = false;
110
+ if (!this.flashing) {
111
+ this.log("Reconnecting visible tab");
112
+ this.connect();
113
+ }
114
+ }
115
+ }
116
+ else {
117
+ if (!this.unloading && this.status === device_js_1.ConnectionStatus.CONNECTED) {
118
+ if (!this.flashing) {
119
+ this.log("Disconnecting hidden tab");
120
+ this.disconnect().then(() => {
121
+ this.visibilityReconnect = true;
122
+ });
123
+ }
124
+ else {
125
+ this.log("Scheduling disconnect of hidden tab for after flash");
126
+ this.disconnectAfterFlash = true;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ });
132
+ Object.defineProperty(this, "unloading", {
133
+ enumerable: true,
134
+ configurable: true,
135
+ writable: true,
136
+ value: false
137
+ });
138
+ Object.defineProperty(this, "beforeUnloadListener", {
139
+ enumerable: true,
140
+ configurable: true,
141
+ writable: true,
142
+ value: () => {
143
+ // If serial is in progress when the page unloads with V1 DAPLink 0254 or V2 0255
144
+ // then it'll fail to reconnect with mismatched command/response errors.
145
+ // Try hard to disconnect as a workaround.
146
+ // https://github.com/microbit-foundation/python-editor-v3/issues/89
147
+ this.unloading = true;
148
+ this.stopSerialInternal();
149
+ // The user might stay on the page if they have unsaved changes and there's another beforeunload listener.
150
+ window.addEventListener("focus", () => {
151
+ const assumePageIsStayingOpenDelay = 1000;
152
+ setTimeout(() => {
153
+ if (this.status === device_js_1.ConnectionStatus.CONNECTED) {
154
+ this.unloading = false;
155
+ if (this.addedListeners.serialdata) {
156
+ this.startSerialInternal();
157
+ }
158
+ }
159
+ }, assumePageIsStayingOpenDelay);
160
+ }, { once: true });
161
+ }
162
+ });
163
+ Object.defineProperty(this, "logging", {
164
+ enumerable: true,
165
+ configurable: true,
166
+ writable: true,
167
+ value: void 0
168
+ });
169
+ Object.defineProperty(this, "addedListeners", {
170
+ enumerable: true,
171
+ configurable: true,
172
+ writable: true,
173
+ value: {
174
+ serialdata: 0,
175
+ }
176
+ });
177
+ Object.defineProperty(this, "handleDisconnect", {
178
+ enumerable: true,
179
+ configurable: true,
180
+ writable: true,
181
+ value: (event) => {
182
+ if (event.device === this.device) {
183
+ this.connection = undefined;
184
+ this.device = undefined;
185
+ this.setStatus(device_js_1.ConnectionStatus.NO_AUTHORIZED_DEVICE);
186
+ }
187
+ }
188
+ });
189
+ this.logging = options.logging;
190
+ }
191
+ log(v) {
192
+ this.logging.log(v);
193
+ }
194
+ async initialize() {
195
+ if (navigator.usb) {
196
+ navigator.usb.addEventListener("disconnect", this.handleDisconnect);
197
+ }
198
+ if (typeof window !== "undefined") {
199
+ window.addEventListener("beforeunload", this.beforeUnloadListener);
200
+ if (window.document) {
201
+ window.document.addEventListener("visibilitychange", this.visibilityChangeListener);
202
+ }
203
+ }
204
+ }
205
+ dispose() {
206
+ if (navigator.usb) {
207
+ navigator.usb.removeEventListener("disconnect", this.handleDisconnect);
208
+ }
209
+ if (typeof window !== "undefined") {
210
+ window.removeEventListener("beforeunload", this.beforeUnloadListener);
211
+ if (window.document) {
212
+ window.document.removeEventListener("visibilitychange", this.visibilityChangeListener);
213
+ }
214
+ }
215
+ }
216
+ setRequestDeviceExclusionFilters(exclusionFilters) {
217
+ this.exclusionFilters = exclusionFilters;
218
+ }
219
+ async connect() {
220
+ return this.withEnrichedErrors(async () => {
221
+ await this.connectInternal();
222
+ return this.status;
223
+ });
224
+ }
225
+ getDeviceId() {
226
+ return this.connection?.deviceId;
227
+ }
228
+ getDevice() {
229
+ return this.device;
230
+ }
231
+ getBoardVersion() {
232
+ return this.connection?.boardSerialInfo?.id.toBoardVersion();
233
+ }
234
+ async flash(dataSource, options) {
235
+ this.flashing = true;
236
+ try {
237
+ const startTime = new Date().getTime();
238
+ await this.withEnrichedErrors(() => this.flashInternal(dataSource, options));
239
+ this.dispatchTypedEvent("flash", new device_js_1.FlashEvent());
240
+ const flashTime = new Date().getTime() - startTime;
241
+ this.logging.event({
242
+ type: "WebUSB-time",
243
+ detail: {
244
+ flashTime,
245
+ },
246
+ });
247
+ this.logging.log("Flash complete");
248
+ }
249
+ finally {
250
+ this.flashing = false;
251
+ }
252
+ }
253
+ async flashInternal(dataSource, options) {
254
+ this.log("Stopping serial before flash");
255
+ await this.stopSerialInternal();
256
+ this.log("Reconnecting before flash");
257
+ await this.connectInternal();
258
+ if (!this.connection) {
259
+ throw new Error("Must be connected now");
260
+ }
261
+ const partial = options.partial;
262
+ const progress = rateLimitProgress(options.minimumProgressIncrement ?? 0.0025, options.progress || (() => { }));
263
+ const boardId = this.connection.boardSerialInfo.id;
264
+ const boardVersion = boardId.toBoardVersion();
265
+ const data = await dataSource(boardVersion);
266
+ const flashing = new usb_partial_flashing_js_1.PartialFlashing(this.connection, this.logging, boardVersion);
267
+ let wasPartial = false;
268
+ try {
269
+ if (partial) {
270
+ wasPartial = await flashing.flashAsync(data, progress);
271
+ }
272
+ else {
273
+ await flashing.fullFlashAsync(data, progress);
274
+ }
275
+ }
276
+ finally {
277
+ progress(undefined, wasPartial);
278
+ if (this.disconnectAfterFlash) {
279
+ this.log("Disconnecting after flash due to tab visibility");
280
+ this.disconnectAfterFlash = false;
281
+ await this.disconnect();
282
+ this.visibilityReconnect = true;
283
+ }
284
+ else {
285
+ if (this.addedListeners.serialdata) {
286
+ this.log("Reinstating serial after flash");
287
+ if (this.connection.daplink) {
288
+ await this.connection.daplink.connect();
289
+ await this.startSerialInternal();
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ async startSerialInternal() {
296
+ return this.serialStateChangeQueue.add(async () => {
297
+ if (!this.connection || this.serialState) {
298
+ return;
299
+ }
300
+ this.log("Starting serial");
301
+ this.serialState = true;
302
+ this.connection
303
+ .startSerial(this.serialListener)
304
+ .then(() => {
305
+ this.log("Finished listening for serial data");
306
+ })
307
+ .catch((e) => {
308
+ this.dispatchTypedEvent("serialerror", new device_js_1.SerialErrorEvent(e));
309
+ })
310
+ .finally(() => {
311
+ this.serialState = false;
312
+ });
313
+ });
314
+ }
315
+ async stopSerialInternal() {
316
+ return this.serialStateChangeQueue.add(async () => {
317
+ if (!this.connection || !this.serialState) {
318
+ return;
319
+ }
320
+ this.connection.stopSerial(this.serialListener);
321
+ this.dispatchTypedEvent("serialreset", new device_js_1.SerialResetEvent());
322
+ });
323
+ }
324
+ async disconnect() {
325
+ try {
326
+ if (this.connection) {
327
+ await this.stopSerialInternal();
328
+ await this.connection.disconnectAsync();
329
+ }
330
+ }
331
+ catch (e) {
332
+ this.log("Error during disconnection:\r\n" + e);
333
+ this.logging.event({
334
+ type: "WebUSB-error",
335
+ message: "error-disconnecting",
336
+ });
337
+ }
338
+ finally {
339
+ this.connection = undefined;
340
+ this.setStatus(device_js_1.ConnectionStatus.DISCONNECTED);
341
+ this.logging.log("Disconnection complete");
342
+ this.logging.event({
343
+ type: "WebUSB-info",
344
+ message: "disconnected",
345
+ });
346
+ }
347
+ }
348
+ setStatus(newStatus) {
349
+ this.status = newStatus;
350
+ this.visibilityReconnect = false;
351
+ this.log("USB connection status " + newStatus);
352
+ this.dispatchTypedEvent("status", new device_js_1.ConnectionStatusEvent(newStatus));
353
+ }
354
+ async withEnrichedErrors(f) {
355
+ try {
356
+ return await f();
357
+ }
358
+ catch (e) {
359
+ if (e instanceof device_js_1.FlashDataError) {
360
+ throw e;
361
+ }
362
+ // Log error to console for feedback
363
+ this.log("An error occurred whilst attempting to use WebUSB.");
364
+ this.log("Details of the error can be found below, and may be useful when trying to replicate and debug the error.");
365
+ this.log(e);
366
+ // Disconnect from the microbit.
367
+ // Any new connection reallocates all the internals.
368
+ // Use the top-level API so any listeners reflect that we're disconnected.
369
+ await this.disconnect();
370
+ const enriched = enrichedError(e);
371
+ // Sanitise error message, replace all special chars with '-', if last char is '-' remove it
372
+ const errorMessage = e.message
373
+ ? e.message.replace(/\W+/g, "-").replace(/\W$/, "").toLowerCase()
374
+ : "";
375
+ this.logging.event({
376
+ type: "WebUSB-error",
377
+ message: e.code + "/" + errorMessage,
378
+ });
379
+ throw enriched;
380
+ }
381
+ }
382
+ serialWrite(data) {
383
+ return this.withEnrichedErrors(async () => {
384
+ if (this.connection) {
385
+ // Using WebUSB/DAPJs we're limited to 64 byte packet size with a two byte header.
386
+ // https://github.com/microbit-foundation/python-editor-v3/issues/215
387
+ const maxSerialWrite = 62;
388
+ let start = 0;
389
+ while (start < data.length) {
390
+ const end = Math.min(start + maxSerialWrite, data.length);
391
+ const chunkData = data.slice(start, end);
392
+ await this.connection.daplink.serialWrite(chunkData);
393
+ start = end;
394
+ }
395
+ }
396
+ });
397
+ }
398
+ async softwareReset() {
399
+ return this.serialStateChangeQueue.add(async () => await this.connection?.softwareReset());
400
+ }
401
+ async clearDevice() {
402
+ await this.disconnect();
403
+ this.device = undefined;
404
+ this.setStatus(device_js_1.ConnectionStatus.NO_AUTHORIZED_DEVICE);
405
+ }
406
+ async connectInternal() {
407
+ if (!this.connection) {
408
+ const device = await this.chooseDevice();
409
+ this.connection = new usb_device_wrapper_js_1.DAPWrapper(device, this.logging);
410
+ }
411
+ await (0, async_util_js_1.withTimeout)(this.connection.reconnectAsync(), 10_000);
412
+ if (this.addedListeners.serialdata && !this.flashing) {
413
+ this.startSerialInternal();
414
+ }
415
+ this.setStatus(device_js_1.ConnectionStatus.CONNECTED);
416
+ }
417
+ async chooseDevice() {
418
+ if (this.device) {
419
+ return this.device;
420
+ }
421
+ this.dispatchTypedEvent("beforerequestdevice", new device_js_1.BeforeRequestDevice());
422
+ this.device = await navigator.usb.requestDevice({
423
+ exclusionFilters: this.exclusionFilters,
424
+ filters: [{ vendorId: 0x0d28, productId: 0x0204 }],
425
+ });
426
+ this.dispatchTypedEvent("afterrequestdevice", new device_js_1.AfterRequestDevice());
427
+ return this.device;
428
+ }
429
+ eventActivated(type) {
430
+ switch (type) {
431
+ case "serialdata": {
432
+ this.startSerialInternal();
433
+ break;
434
+ }
435
+ }
436
+ }
437
+ async eventDeactivated(type) {
438
+ switch (type) {
439
+ case "serialdata": {
440
+ this.stopSerialInternal();
441
+ break;
442
+ }
443
+ }
444
+ }
445
+ }
446
+ exports.MicrobitWebUSBConnection = MicrobitWebUSBConnection;
447
+ const genericErrorSuggestingReconnect = (e) => new device_js_1.DeviceError({
448
+ code: "reconnect-microbit",
449
+ message: e.message,
450
+ });
451
+ // tslint:disable-next-line: no-any
452
+ const enrichedError = (err) => {
453
+ if (err instanceof device_js_1.DeviceError) {
454
+ return err;
455
+ }
456
+ if (err instanceof async_util_js_1.TimeoutError) {
457
+ return new device_js_1.DeviceError({
458
+ code: "timeout-error",
459
+ message: err.message,
460
+ });
461
+ }
462
+ switch (typeof err) {
463
+ case "object":
464
+ // We might get Error objects as Promise rejection arguments
465
+ if (!err.message && err.promise && err.reason) {
466
+ err = err.reason;
467
+ }
468
+ // This is somewhat fragile but worth it for scenario specific errors.
469
+ // These messages changed to be prefixed in 2023 so we've relaxed the checks.
470
+ if (/No valid interfaces found/.test(err.message)) {
471
+ // This comes from DAPjs's WebUSB open.
472
+ return new device_js_1.DeviceError({
473
+ code: "update-req",
474
+ message: err.message,
475
+ });
476
+ }
477
+ else if (/No device selected/.test(err.message)) {
478
+ return new device_js_1.DeviceError({
479
+ code: "no-device-selected",
480
+ message: err.message,
481
+ });
482
+ }
483
+ else if (/Unable to claim interface/.test(err.message)) {
484
+ return new device_js_1.DeviceError({
485
+ code: "clear-connect",
486
+ message: err.message,
487
+ });
488
+ }
489
+ else if (err.name === "device-disconnected") {
490
+ return new device_js_1.DeviceError({
491
+ code: "device-disconnected",
492
+ message: err.message,
493
+ });
494
+ }
495
+ else {
496
+ // Unhandled error. User will need to reconnect their micro:bit
497
+ return genericErrorSuggestingReconnect(err);
498
+ }
499
+ case "string": {
500
+ // Caught a string. Example case: "Flash error" from DAPjs
501
+ return genericErrorSuggestingReconnect(err);
502
+ }
503
+ default: {
504
+ return genericErrorSuggestingReconnect(err);
505
+ }
506
+ }
507
+ };
508
+ const rateLimitProgress = (minimumProgressIncrement, callback) => {
509
+ let lastCallValue = -1;
510
+ return (value, partial) => {
511
+ if (value === undefined ||
512
+ value === 0 ||
513
+ value === 1 ||
514
+ value >= lastCallValue + minimumProgressIncrement) {
515
+ lastCallValue = value ?? -1;
516
+ callback(value, partial);
517
+ }
518
+ };
519
+ };
520
+ //# sourceMappingURL=usb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb.js","sourceRoot":"","sources":["../../lib/usb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
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
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerometer-service.js","sourceRoot":"","sources":["../../lib/accelerometer-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface AccelerometerData {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+ export declare class AccelerometerDataEvent extends Event {
7
+ readonly data: AccelerometerData;
8
+ constructor(data: AccelerometerData);
9
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerometer.js","sourceRoot":"","sources":["../../lib/accelerometer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAA4B,IAAuB;QACjD,KAAK,CAAC,0BAA0B,CAAC,CAAC;QADxB;;;;mBAAgB,IAAI;WAAmB;IAEnD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export declare class TimeoutError extends Error {
7
+ }
8
+ /**
9
+ * Utility to time out an action after a delay.
10
+ *
11
+ * The action cannot be cancelled; it may still proceed after the timeout.
12
+ */
13
+ export declare function withTimeout<T>(actionPromise: Promise<T>, timeout: number): Promise<T>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../lib/async-util.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAE1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,8DAA8D;IAC9D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAe,CAAC;AACrE,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * (c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { AccelerometerService } from "./accelerometer-service.js";
7
+ import { BoardVersion } from "./device.js";
8
+ import { LedService } from "./led-service.js";
9
+ import { Logging } from "./logging.js";
10
+ import { MagnetometerService } from "./magnetometer-service.js";
11
+ import { ServiceConnectionEventMap, TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
12
+ import { UARTService } from "./uart-service.js";
13
+ export interface Service {
14
+ startNotifications(type: TypedServiceEvent): Promise<void>;
15
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
16
+ }
17
+ interface ConnectCallbacks {
18
+ onConnecting: () => void;
19
+ onReconnecting: () => void;
20
+ onFail: () => void;
21
+ onSuccess: () => void;
22
+ }
23
+ export declare class BluetoothDeviceWrapper {
24
+ readonly device: BluetoothDevice;
25
+ private logging;
26
+ private dispatchTypedEvent;
27
+ private currentEvents;
28
+ private callbacks;
29
+ private duringExplicitConnectDisconnect;
30
+ private gattConnectPromise;
31
+ private disconnectPromise;
32
+ private connecting;
33
+ private isReconnect;
34
+ private connectReadyPromise;
35
+ private accelerometer;
36
+ private buttons;
37
+ private led;
38
+ private magnetometer;
39
+ private uart;
40
+ private serviceInfo;
41
+ boardVersion: BoardVersion | undefined;
42
+ private disconnectedRejectionErrorFactory;
43
+ private gattOperations;
44
+ constructor(device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks);
45
+ connect(): Promise<void>;
46
+ disconnect(): Promise<void>;
47
+ private disconnectInternal;
48
+ reconnect(): Promise<void>;
49
+ handleDisconnectEvent: () => Promise<void>;
50
+ private assertGattServer;
51
+ private getBoardVersion;
52
+ private queueGattOperation;
53
+ private createIfNeeded;
54
+ getAccelerometerService(): Promise<AccelerometerService | undefined>;
55
+ getLedService(): Promise<LedService | undefined>;
56
+ getMagnetometerService(): Promise<MagnetometerService | undefined>;
57
+ getUARTService(): Promise<UARTService | undefined>;
58
+ startNotifications(type: TypedServiceEvent): Promise<void>;
59
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
60
+ private disposeServices;
61
+ }
62
+ export declare const createBluetoothDeviceWrapper: (device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks) => Promise<BluetoothDeviceWrapper | undefined>;
63
+ export {};