@robdobsn/raftjs 1.8.5 → 1.10.7

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 (224) hide show
  1. package/.editorconfig +14 -0
  2. package/.gitattributes +11 -0
  3. package/.nvmrc +1 -0
  4. package/TODO.md +1 -0
  5. package/dist/react-native/RaftAttributeHandler.d.ts +14 -0
  6. package/dist/react-native/RaftAttributeHandler.js +375 -0
  7. package/dist/react-native/RaftAttributeHandler.js.map +1 -0
  8. package/dist/react-native/RaftChannel.d.ts +20 -0
  9. package/dist/react-native/RaftChannel.js +12 -0
  10. package/dist/react-native/RaftChannel.js.map +1 -0
  11. package/dist/react-native/RaftChannelBLE.native.d.ts +95 -0
  12. package/dist/react-native/RaftChannelBLE.native.js +483 -0
  13. package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
  14. package/dist/react-native/RaftChannelBLE.web.d.ts +40 -0
  15. package/dist/react-native/RaftChannelBLE.web.js +302 -0
  16. package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
  17. package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
  18. package/dist/react-native/RaftChannelBLEFactory.js +17 -0
  19. package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
  20. package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
  21. package/dist/react-native/RaftChannelBLEScanner.native.js +138 -0
  22. package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
  23. package/dist/react-native/RaftChannelSimulated.d.ts +42 -0
  24. package/dist/react-native/RaftChannelSimulated.js +1000 -0
  25. package/dist/react-native/RaftChannelSimulated.js.map +1 -0
  26. package/dist/react-native/RaftChannelWebSerial.d.ts +39 -0
  27. package/dist/react-native/RaftChannelWebSerial.js +329 -0
  28. package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
  29. package/dist/react-native/RaftChannelWebSocket.d.ts +30 -0
  30. package/dist/react-native/RaftChannelWebSocket.js +222 -0
  31. package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
  32. package/dist/react-native/RaftCommsStats.d.ts +39 -0
  33. package/dist/react-native/RaftCommsStats.js +128 -0
  34. package/dist/react-native/RaftCommsStats.js.map +1 -0
  35. package/dist/react-native/RaftConnEvents.d.ts +39 -0
  36. package/dist/react-native/RaftConnEvents.js +54 -0
  37. package/dist/react-native/RaftConnEvents.js.map +1 -0
  38. package/dist/react-native/RaftConnector.d.ts +248 -0
  39. package/dist/react-native/RaftConnector.js +658 -0
  40. package/dist/react-native/RaftConnector.js.map +1 -0
  41. package/dist/react-native/RaftCustomAttrHandler.d.ts +6 -0
  42. package/dist/react-native/RaftCustomAttrHandler.js +93 -0
  43. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
  44. package/dist/react-native/RaftDeviceInfo.d.ts +71 -0
  45. package/dist/react-native/RaftDeviceInfo.js +50 -0
  46. package/dist/react-native/RaftDeviceInfo.js.map +1 -0
  47. package/dist/react-native/RaftDeviceManager.d.ts +61 -0
  48. package/dist/react-native/RaftDeviceManager.js +665 -0
  49. package/dist/react-native/RaftDeviceManager.js.map +1 -0
  50. package/dist/react-native/RaftDeviceMgrIF.d.ts +15 -0
  51. package/dist/react-native/RaftDeviceMgrIF.js +11 -0
  52. package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
  53. package/dist/react-native/RaftDeviceMsg.d.ts +9 -0
  54. package/dist/react-native/RaftDeviceMsg.js +11 -0
  55. package/dist/react-native/RaftDeviceMsg.js.map +1 -0
  56. package/dist/react-native/RaftDeviceStates.d.ts +37 -0
  57. package/dist/react-native/RaftDeviceStates.js +60 -0
  58. package/dist/react-native/RaftDeviceStates.js.map +1 -0
  59. package/dist/react-native/RaftFileHandler.d.ts +52 -0
  60. package/dist/react-native/RaftFileHandler.js +502 -0
  61. package/dist/react-native/RaftFileHandler.js.map +1 -0
  62. package/dist/react-native/RaftLog.d.ts +22 -0
  63. package/dist/react-native/RaftLog.js +63 -0
  64. package/dist/react-native/RaftLog.js.map +1 -0
  65. package/dist/react-native/RaftMiniHDLC.d.ts +18 -0
  66. package/dist/react-native/RaftMiniHDLC.js +383 -0
  67. package/dist/react-native/RaftMiniHDLC.js.map +1 -0
  68. package/dist/react-native/RaftMsgHandler.d.ts +62 -0
  69. package/dist/react-native/RaftMsgHandler.js +511 -0
  70. package/dist/react-native/RaftMsgHandler.js.map +1 -0
  71. package/dist/react-native/RaftMsgTrackInfo.d.ts +17 -0
  72. package/dist/react-native/RaftMsgTrackInfo.js +42 -0
  73. package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
  74. package/dist/react-native/RaftProtocolDefs.d.ts +30 -0
  75. package/dist/react-native/RaftProtocolDefs.js +48 -0
  76. package/dist/react-native/RaftProtocolDefs.js.map +1 -0
  77. package/dist/react-native/RaftStreamHandler.d.ts +38 -0
  78. package/dist/react-native/RaftStreamHandler.js +258 -0
  79. package/dist/react-native/RaftStreamHandler.js.map +1 -0
  80. package/dist/react-native/RaftStruct.d.ts +3 -0
  81. package/dist/react-native/RaftStruct.js +258 -0
  82. package/dist/react-native/RaftStruct.js.map +1 -0
  83. package/dist/react-native/RaftSysTypeManager.d.ts +16 -0
  84. package/dist/react-native/RaftSysTypeManager.js +78 -0
  85. package/dist/react-native/RaftSysTypeManager.js.map +1 -0
  86. package/dist/react-native/RaftSystemType.d.ts +30 -0
  87. package/dist/react-native/RaftSystemType.js +3 -0
  88. package/dist/react-native/RaftSystemType.js.map +1 -0
  89. package/dist/react-native/RaftSystemUtils.d.ts +136 -0
  90. package/dist/react-native/RaftSystemUtils.js +412 -0
  91. package/dist/react-native/RaftSystemUtils.js.map +1 -0
  92. package/dist/react-native/RaftTypes.d.ts +195 -0
  93. package/dist/react-native/RaftTypes.js +153 -0
  94. package/dist/react-native/RaftTypes.js.map +1 -0
  95. package/dist/react-native/RaftUpdateEvents.d.ts +33 -0
  96. package/dist/react-native/RaftUpdateEvents.js +46 -0
  97. package/dist/react-native/RaftUpdateEvents.js.map +1 -0
  98. package/dist/react-native/RaftUpdateManager.d.ts +61 -0
  99. package/dist/react-native/RaftUpdateManager.js +621 -0
  100. package/dist/react-native/RaftUpdateManager.js.map +1 -0
  101. package/dist/react-native/RaftUtils.d.ts +128 -0
  102. package/dist/react-native/RaftUtils.js +487 -0
  103. package/dist/react-native/RaftUtils.js.map +1 -0
  104. package/dist/react-native/RaftWifiTypes.d.ts +23 -0
  105. package/dist/react-native/RaftWifiTypes.js +43 -0
  106. package/dist/react-native/RaftWifiTypes.js.map +1 -0
  107. package/dist/react-native/main.d.ts +26 -0
  108. package/dist/react-native/main.js +51 -0
  109. package/dist/react-native/main.js.map +1 -0
  110. package/dist/web/RaftAttributeHandler.js +1 -1
  111. package/dist/web/RaftAttributeHandler.js.map +1 -1
  112. package/dist/web/RaftChannelBLE.web.js +8 -6
  113. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  114. package/dist/web/RaftChannelSimulated.d.ts +10 -0
  115. package/dist/web/RaftChannelSimulated.js +662 -80
  116. package/dist/web/RaftChannelSimulated.js.map +1 -1
  117. package/dist/web/RaftChannelWebSerial.js +2 -2
  118. package/dist/web/RaftChannelWebSerial.js.map +1 -1
  119. package/dist/web/RaftChannelWebSocket.js +16 -1
  120. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  121. package/dist/web/RaftConnector.d.ts +2 -0
  122. package/dist/web/RaftConnector.js +38 -15
  123. package/dist/web/RaftConnector.js.map +1 -1
  124. package/dist/web/RaftCustomAttrHandler.d.ts +2 -0
  125. package/dist/web/RaftCustomAttrHandler.js +54 -26
  126. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  127. package/dist/web/RaftDeviceInfo.d.ts +3 -1
  128. package/dist/web/RaftDeviceInfo.js +17 -3
  129. package/dist/web/RaftDeviceInfo.js.map +1 -1
  130. package/dist/web/RaftDeviceManager.d.ts +19 -1
  131. package/dist/web/RaftDeviceManager.js +89 -3
  132. package/dist/web/RaftDeviceManager.js.map +1 -1
  133. package/dist/web/RaftDeviceStates.d.ts +1 -1
  134. package/dist/web/RaftDeviceStates.js +2 -2
  135. package/dist/web/RaftDeviceStates.js.map +1 -1
  136. package/dist/web/RaftMsgHandler.js.map +1 -1
  137. package/dist/web/RaftStreamHandler.js +2 -1
  138. package/dist/web/RaftStreamHandler.js.map +1 -1
  139. package/dist/web/RaftStruct.js +197 -147
  140. package/dist/web/RaftStruct.js.map +1 -1
  141. package/dist/web/RaftUpdateManager.js +1 -1
  142. package/dist/web/RaftUpdateManager.js.map +1 -1
  143. package/dist/web/RaftUtils.d.ts +2 -0
  144. package/dist/web/RaftUtils.js +20 -0
  145. package/dist/web/RaftUtils.js.map +1 -1
  146. package/dist/web/main.d.ts +1 -0
  147. package/dist/web/main.js.map +1 -1
  148. package/eslint.config.mjs +33 -0
  149. package/examples/dashboard/package.json +36 -0
  150. package/examples/dashboard/src/CommandPanel.tsx +147 -0
  151. package/examples/dashboard/src/ConnManager.ts +166 -0
  152. package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
  153. package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
  154. package/examples/dashboard/src/DeviceLineChart.tsx +163 -0
  155. package/examples/dashboard/src/DevicePanel.tsx +171 -0
  156. package/examples/dashboard/src/DevicesPanel.tsx +58 -0
  157. package/examples/dashboard/src/DispLedGrid.tsx +110 -0
  158. package/examples/dashboard/src/DispOneLed.tsx +20 -0
  159. package/examples/dashboard/src/LatencyTest.ts +130 -0
  160. package/examples/dashboard/src/LatencyTestPanel.tsx +92 -0
  161. package/examples/dashboard/src/Main.tsx +234 -0
  162. package/examples/dashboard/src/SettingsManager.ts +67 -0
  163. package/examples/dashboard/src/SettingsScreen.tsx +174 -0
  164. package/examples/dashboard/src/StatusPanel.tsx +71 -0
  165. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +162 -0
  166. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +91 -0
  167. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +30 -0
  168. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +91 -0
  169. package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
  170. package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
  171. package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
  172. package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
  173. package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
  174. package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
  175. package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
  176. package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
  177. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +97 -0
  178. package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
  179. package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
  180. package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +119 -0
  181. package/examples/dashboard/src/index.html +15 -0
  182. package/examples/dashboard/src/index.tsx +13 -0
  183. package/examples/dashboard/src/styles.css +408 -0
  184. package/examples/dashboard/tsconfig.json +18 -0
  185. package/jest.config.js +11 -0
  186. package/package.json +4 -7
  187. package/src/RaftAttributeHandler.ts +450 -0
  188. package/src/RaftChannel.ts +32 -0
  189. package/src/RaftChannelBLE.native.ts +617 -0
  190. package/src/RaftChannelBLE.web.ts +374 -0
  191. package/src/RaftChannelBLEFactory.ts +13 -0
  192. package/src/RaftChannelBLEScanner.native.ts +184 -0
  193. package/src/RaftChannelSimulated.ts +1176 -0
  194. package/src/RaftChannelWebSerial.ts +420 -0
  195. package/src/RaftChannelWebSocket.ts +272 -0
  196. package/src/RaftCommsStats.ts +142 -0
  197. package/src/RaftConnEvents.ts +58 -0
  198. package/src/RaftConnector.ts +785 -0
  199. package/src/RaftCustomAttrHandler.ts +117 -0
  200. package/src/RaftDeviceInfo.ts +125 -0
  201. package/src/RaftDeviceManager.ts +844 -0
  202. package/src/RaftDeviceMgrIF.ts +33 -0
  203. package/src/RaftDeviceMsg.ts +20 -0
  204. package/src/RaftDeviceStates.ts +92 -0
  205. package/src/RaftFileHandler.ts +668 -0
  206. package/src/RaftLog.ts +70 -0
  207. package/src/RaftMiniHDLC.ts +396 -0
  208. package/src/RaftMsgHandler.ts +812 -0
  209. package/src/RaftMsgTrackInfo.ts +51 -0
  210. package/src/RaftProtocolDefs.ts +46 -0
  211. package/src/RaftStreamHandler.ts +329 -0
  212. package/src/RaftStruct.ts +282 -0
  213. package/src/RaftSysTypeManager.ts +87 -0
  214. package/src/RaftSystemType.ts +34 -0
  215. package/src/RaftSystemUtils.ts +489 -0
  216. package/src/RaftTypes.ts +279 -0
  217. package/src/RaftUpdateEvents.ts +48 -0
  218. package/src/RaftUpdateManager.ts +781 -0
  219. package/src/RaftUtils.ts +514 -0
  220. package/src/RaftWifiTypes.ts +36 -0
  221. package/src/main.ts +39 -0
  222. package/testdata/TestDeviceTypeRecs.json +492 -0
  223. package/tsconfig.json +30 -0
  224. package/tsconfig.react-native.json +29 -0
@@ -0,0 +1,514 @@
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // RaftUtils
4
+ // Part of RaftJS
5
+ //
6
+ // Rob Dobson & Chris Greening 2020-2024
7
+ // (C) 2020-2024 All rights reserved
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+
11
+ import RaftLog from "./RaftLog";
12
+
13
+ export default class RaftUtils {
14
+ static _isEndianSet = false;
15
+ static _isLittleEndian = false;
16
+
17
+ /**
18
+ *
19
+ * Add a string to a Uint8Array buffer
20
+ *
21
+ * @param buffer - buffer to add to
22
+ * @param strToAdd - string to be added
23
+ * @param startPos - start position in buffer (i.e. offset to place string at)
24
+ */
25
+ static addStringToBuffer(
26
+ buffer: Uint8Array,
27
+ strToAdd: string,
28
+ startPos: number
29
+ ): void {
30
+ // Check valid
31
+ if (buffer.length < startPos + strToAdd.length + 1) {
32
+ RaftLog.warn("addStringToBuffer buffer too short");
33
+ return;
34
+ }
35
+ let curPos = startPos;
36
+ for (let i = 0; i < strToAdd.length; i++) {
37
+ let charAt = strToAdd.charCodeAt(i);
38
+ if (charAt > 255) charAt = 255;
39
+ buffer.set([charAt], curPos++);
40
+ }
41
+ buffer.set([0], buffer.length - 1);
42
+ }
43
+
44
+ /**
45
+ *
46
+ * Get a string from a Uint8Array buffer
47
+ *
48
+ * @param buffer - buffer to get from
49
+ * @param startPos - start position in buffer (i.e. offset to start of string at)
50
+ * @param strLen - length of string to get
51
+ * @returns strGot - string got from buffer
52
+ */
53
+ static getStringFromBuffer(
54
+ buffer: Uint8Array,
55
+ startPos: number,
56
+ strLen: number
57
+ ): string {
58
+ // Check valid
59
+ if (buffer.length < startPos + strLen) {
60
+ strLen = buffer.length - startPos;
61
+ if (strLen <= 0) return "";
62
+ }
63
+ let curPos = startPos;
64
+ let outStr = "";
65
+ for (let i = 0; i < strLen; i++) {
66
+ outStr += String.fromCharCode(buffer[curPos++]);
67
+ }
68
+ return outStr;
69
+ }
70
+
71
+ /**
72
+ *
73
+ * Debug code to format a Uint8Array to string for logging
74
+ *
75
+ * @param buffer - Uint8Array to be converted to hex string
76
+ */
77
+ static bufferToHex(buffer: Uint8Array | null): string {
78
+ if (buffer == null) return "null";
79
+ return Array.from(new Uint8Array(buffer))
80
+ .map((b) => RaftUtils.padStartFn(b.toString(16), 2, "0"))
81
+ .join("");
82
+ }
83
+
84
+ /**
85
+ *
86
+ * Extract a big-endian float from a uint8array
87
+ *
88
+ * @param buf - Uint8Array containing float
89
+ * @returns float
90
+ */
91
+ static getBEFloatFromBuf(buf: Uint8Array): number {
92
+ const revBuf = new Uint8Array(4);
93
+ if (RaftUtils.isLittleEndian()) {
94
+ for (let i = 0; i < 4; i++) revBuf[3 - i] = buf[i];
95
+ } else {
96
+ for (let i = 0; i < 4; i++) revBuf[i] = buf[i];
97
+ }
98
+
99
+ const floatVal = new Float32Array(revBuf.buffer);
100
+ // RaftUtils.debug('revFloat ' + RaftUtils.bufferToHex(revBuf) + floatVal[0]);
101
+ return floatVal[0];
102
+ }
103
+
104
+ /**
105
+ * Extract a big-endian uint64 from a uint8array
106
+ *
107
+ * @param buf - Uint8Array containing uint64
108
+ * @param pos - position (offset in buf) to get from
109
+ * @returns uint64
110
+ */
111
+
112
+ static getBEUint64FromBuf(buf: Uint8Array, bufPos: number): number {
113
+ if (RaftUtils.isLittleEndian())
114
+ return (
115
+ (buf[bufPos] << 56) +
116
+ (buf[bufPos + 1] << 48) +
117
+ (buf[bufPos + 2] << 40) +
118
+ (buf[bufPos + 3] << 32) +
119
+ (buf[bufPos + 4] << 24) +
120
+ (buf[bufPos + 5] << 16) +
121
+ (buf[bufPos + 6] << 8) +
122
+ buf[bufPos + 7]
123
+ );
124
+ return (
125
+ (buf[bufPos + 7] << 56) +
126
+ (buf[bufPos + 6] << 48) +
127
+ (buf[bufPos + 5] << 40) +
128
+ (buf[bufPos + 4] << 32) +
129
+ (buf[bufPos + 3] << 24) +
130
+ (buf[bufPos + 2] << 16) +
131
+ (buf[bufPos + 1] << 8) +
132
+ buf[bufPos]
133
+ );
134
+ }
135
+
136
+ /**
137
+ *
138
+ * Extract a big-endian uint32 from a uint8array
139
+ *
140
+ * @param buf - Uint8Array containing uint32
141
+ * @param pos - position (offset in buf) to get from
142
+ * @returns uint32
143
+ */
144
+ static getBEUint32FromBuf(buf: Uint8Array, bufPos: number): number {
145
+ if (RaftUtils.isLittleEndian())
146
+ return (
147
+ (buf[bufPos] << 24) +
148
+ (buf[bufPos + 1] << 16) +
149
+ (buf[bufPos + 2] << 8) +
150
+ buf[bufPos + 3]
151
+ );
152
+ return (
153
+ (buf[bufPos + 3] << 24) +
154
+ (buf[bufPos + 2] << 16) +
155
+ (buf[bufPos + 1] << 8) +
156
+ buf[bufPos]
157
+ );
158
+ }
159
+
160
+ /**
161
+ *
162
+ * Extract a big-endian int16 from a uint8array
163
+ *
164
+ * @param buf - Uint8Array containing int16
165
+ * @param pos - position (offset in buf) to get from
166
+ * @returns int16
167
+ */
168
+ static getBEInt16FromBuf(buf: Uint8Array, bufPos: number): number {
169
+ if (RaftUtils.isLittleEndian()) {
170
+ const val = buf[bufPos] * 256 + buf[bufPos + 1];
171
+ return val > 32767 ? val - 65536 : val;
172
+ }
173
+ const val = buf[bufPos + 1] * 256 + buf[bufPos];
174
+ return val > 32767 ? val - 65536 : val;
175
+ }
176
+
177
+ /**
178
+ *
179
+ * Extract a big-endian uint16 from a uint8array
180
+ *
181
+ * @param buf - Uint8Array containing uint16
182
+ * @param pos - position (offset in buf) to get from
183
+ * @returns int16
184
+ */
185
+ static getBEUint16FromBuf(buf: Uint8Array, bufPos: number): number {
186
+ if (RaftUtils.isLittleEndian()) return buf[bufPos] * 256 + buf[bufPos + 1];
187
+ return buf[bufPos + 1] * 256 + buf[bufPos];
188
+ }
189
+
190
+ /**
191
+ *
192
+ * Extract a big-endian uint8 from a uint8array
193
+ *
194
+ * @param buf - Uint8Array containing uint8
195
+ * @param pos - position (offset in buf) to get from
196
+ * @returns int16
197
+ */
198
+ static getBEUint8FromBuf(buf: Uint8Array, pos: number): number {
199
+ return buf[pos];
200
+ }
201
+
202
+ /**
203
+ *
204
+ * Extract a big-endian int8 from a uint8array
205
+ *
206
+ * @param buf - Uint8Array containing int8
207
+ * @param pos - position (offset in buf) to get from
208
+ * @returns int16
209
+ */
210
+ static getBEInt8FromBuf(buf: Uint8Array, pos: number): number {
211
+ return buf[pos] > 127 ? buf[pos] - 256 : buf[pos];
212
+ }
213
+
214
+ static isLittleEndian(): boolean {
215
+ // If already known just return
216
+ if (this._isEndianSet) return this._isLittleEndian;
217
+
218
+ // Figure out endian-ness
219
+ const a = new Uint32Array([0x12345678]);
220
+ const b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
221
+ this._isEndianSet = true;
222
+ this._isLittleEndian = b[0] != 0x12;
223
+ return this._isLittleEndian;
224
+ // RaftUtils.debug("bigendian " + BigEndian);
225
+
226
+ // let buf = new ArrayBuffer(2);
227
+ // let shView = new Uint16Array(buf);
228
+ // buf[0] = 1;
229
+ // buf[1] = 0;
230
+ // RaftUtils.debug("Resulting short " + shView[0]);
231
+ // return shView[0] == 1;
232
+ }
233
+
234
+ // The following code from https://github.com/jsdom/abab
235
+ /**
236
+ * Implementation of atob() according to the HTML and Infra specs, except that
237
+ * instead of throwing INVALID_CHARACTER_ERR we return null.
238
+ *
239
+ * @param data - string containing base64 representation
240
+ * @returns Uint8Array
241
+ *
242
+ */
243
+ static atob(data: string): Uint8Array | null {
244
+ // Web IDL requires DOMStrings to just be converted using ECMAScript
245
+ // ToString, which in our case amounts to using a template literal.
246
+ data = `${data}`;
247
+ // "Remove all ASCII whitespace from data."
248
+ data = data.replace(/[ \t\n\f\r]/g, "");
249
+ // "If data's length divides by 4 leaving no remainder, then: if data ends
250
+ // with one or two U+003D (=) code points, then remove them from data."
251
+ if (data.length % 4 === 0) {
252
+ data = data.replace(/==?$/, "");
253
+ }
254
+ // "If data's length divides by 4 leaving a remainder of 1, then return
255
+ // failure."
256
+ //
257
+ // "If data contains a code point that is not one of
258
+ //
259
+ // U+002B (+)
260
+ // U+002F (/)
261
+ // ASCII alphanumeric
262
+ //
263
+ // then return failure."
264
+ if (data.length % 4 === 1 || /[^+/0-9A-Za-z]/.test(data)) {
265
+ return null;
266
+ }
267
+ // "Let output be an empty byte sequence."
268
+ const output = new Uint8Array((data.length * 3) / 4 + 1);
269
+ // "Let buffer be an empty buffer that can have bits appended to it."
270
+ //
271
+ // We append bits via left-shift and or. accumulatedBits is used to track
272
+ // when we've gotten to 24 bits.
273
+ let buffer = 0;
274
+ let accumulatedBits = 0;
275
+ // "Let position be a position variable for data, initially pointing at the
276
+ // start of data."
277
+ //
278
+ // "While position does not point past the end of data:"
279
+ let bytePos = 0;
280
+ for (let i = 0; i < data.length; i++) {
281
+ // "Find the code point pointed to by position in the second column of
282
+ // Table 1: The Base 64 Alphabet of RFC 4648. Let n be the number given in
283
+ // the first cell of the same row.
284
+ //
285
+ // "Append to buffer the six bits corresponding to n, most significant bit
286
+ // first."
287
+ //
288
+ // atobLookup() implements the table from RFC 4648.
289
+ buffer <<= 6;
290
+ const atobVal = RaftUtils.atobLookup(data[i]);
291
+ if (atobVal !== undefined) {
292
+ buffer |= atobVal;
293
+ }
294
+ accumulatedBits += 6;
295
+ // "If buffer has accumulated 24 bits, interpret them as three 8-bit
296
+ // big-endian numbers. Append three bytes with values equal to those
297
+ // numbers to output, in the same order, and then empty buffer."
298
+ if (accumulatedBits === 24) {
299
+ output[bytePos++] = (buffer & 0xff0000) >> 16;
300
+ output[bytePos++] = (buffer & 0xff00) >> 8;
301
+ output[bytePos++] = buffer & 0xff;
302
+ buffer = accumulatedBits = 0;
303
+ }
304
+ // "Advance position by 1."
305
+ }
306
+ // "If buffer is not empty, it contains either 12 or 18 bits. If it contains
307
+ // 12 bits, then discard the last four and interpret the remaining eight as
308
+ // an 8-bit big-endian number. If it contains 18 bits, then discard the last
309
+ // two and interpret the remaining 16 as two 8-bit big-endian numbers. Append
310
+ // the one or two bytes with values equal to those one or two numbers to
311
+ // output, in the same order."
312
+ if (accumulatedBits === 12) {
313
+ buffer >>= 4;
314
+ output[bytePos++] = buffer & 0xff;
315
+ } else if (accumulatedBits === 18) {
316
+ buffer >>= 2;
317
+ output[bytePos++] = (buffer & 0xff00) >> 8;
318
+ output[bytePos++] = buffer & 0xff;
319
+ }
320
+ // "Return output."
321
+ return output.slice(0, bytePos);
322
+ }
323
+
324
+ /**
325
+ * A lookup table for atob(), which converts an ASCII character to the
326
+ * corresponding six-bit number.
327
+ */
328
+ static atobLookup(chr: string): number | undefined {
329
+ if (/[A-Z]/.test(chr)) {
330
+ return chr.charCodeAt(0) - "A".charCodeAt(0);
331
+ }
332
+ if (/[a-z]/.test(chr)) {
333
+ return chr.charCodeAt(0) - "a".charCodeAt(0) + 26;
334
+ }
335
+ if (/[0-9]/.test(chr)) {
336
+ return chr.charCodeAt(0) - "0".charCodeAt(0) + 52;
337
+ }
338
+ if (chr === "+") {
339
+ return 62;
340
+ }
341
+ if (chr === "/") {
342
+ return 63;
343
+ }
344
+ // Throw exception; should not be hit in tests
345
+ return undefined;
346
+ }
347
+
348
+ /**
349
+ * btoa() as defined by the HTML and Infra specs, which mostly just references
350
+ * RFC 4648.
351
+ *
352
+ * @param data - Uint8Array
353
+ * @returns string containing base64 representation
354
+ *
355
+ */
356
+ static btoa(inBuf: Uint8Array): string {
357
+ let i;
358
+ // String conversion as required by Web IDL.
359
+ // s = `${s}`;
360
+ // "The btoa() method must throw an "InvalidCharacterError" DOMException if
361
+ // data contains any character whose code point is greater than U+00FF."
362
+ // for (i = 0; i < s.length; i++) {
363
+ // if (s.charCodeAt(i) > 255) {
364
+ // return null;
365
+ // }
366
+ // }
367
+ let out = "";
368
+ for (i = 0; i < inBuf.length; i += 3) {
369
+ const groupsOfSix: Array<number | undefined> = [
370
+ undefined,
371
+ undefined,
372
+ undefined,
373
+ undefined,
374
+ ];
375
+ groupsOfSix[0] = inBuf[i] >> 2;
376
+ groupsOfSix[1] = (inBuf[i] & 0x03) << 4;
377
+ if (inBuf.length > i + 1) {
378
+ groupsOfSix[1] |= inBuf[i + 1] >> 4;
379
+ groupsOfSix[2] = (inBuf[i + 1] & 0x0f) << 2;
380
+ if (inBuf.length > i + 2) {
381
+ groupsOfSix[2] |= inBuf[i + 2] >> 6;
382
+ groupsOfSix[3] = inBuf[i + 2] & 0x3f;
383
+ }
384
+ }
385
+ for (let j = 0; j < groupsOfSix.length; j++) {
386
+ if (typeof groupsOfSix[j] === "undefined") {
387
+ out += "=";
388
+ } else {
389
+ out += this.btoaLookup(groupsOfSix[j]);
390
+ }
391
+ }
392
+ }
393
+ return out;
394
+ }
395
+
396
+ /**
397
+ * Lookup table for btoa(), which converts a six-bit number into the
398
+ * corresponding ASCII character.
399
+ */
400
+ static btoaLookup(idx: number | undefined): string | undefined {
401
+ if (idx === undefined) {
402
+ return undefined;
403
+ }
404
+ if (idx < 26) {
405
+ return String.fromCharCode(idx + "A".charCodeAt(0));
406
+ }
407
+ if (idx < 52) {
408
+ return String.fromCharCode(idx - 26 + "a".charCodeAt(0));
409
+ }
410
+ if (idx < 62) {
411
+ return String.fromCharCode(idx - 52 + "0".charCodeAt(0));
412
+ }
413
+ if (idx === 62) {
414
+ return "+";
415
+ }
416
+ if (idx === 63) {
417
+ return "/";
418
+ }
419
+ // Throw INVALID_CHARACTER_ERR exception here -- won't be hit in the tests.
420
+ return undefined;
421
+ }
422
+
423
+ static buf2hex(buffer: Uint8Array) {
424
+ return Array.prototype.map
425
+ .call(buffer, (x: number) => ("00" + x.toString(16)).slice(-2))
426
+ .join("");
427
+ }
428
+
429
+ static padStartFn(
430
+ inStr: string,
431
+ targetLength: number,
432
+ padString: string
433
+ ): string {
434
+ targetLength = targetLength >> 0; //truncate if number or convert non-number to 0;
435
+ padString = String(typeof padString !== "undefined" ? padString : " ");
436
+ if (inStr.length > targetLength) {
437
+ return String(inStr);
438
+ } else {
439
+ targetLength = targetLength - inStr.length;
440
+ if (targetLength > padString.length) {
441
+ padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed
442
+ }
443
+ return padString.slice(0, targetLength) + String(inStr);
444
+ }
445
+ }
446
+
447
+ static semverGt(v1: string, v2: string): boolean {
448
+ const [major1, minor1, patch1] = v1.split('.').map(Number);
449
+ const [major2, minor2, patch2] = v2.split('.').map(Number);
450
+ if (major1 !== major2) return major1 > major2;
451
+ if (minor1 !== minor2) return minor1 > minor2;
452
+ return patch1 > patch2;
453
+ }
454
+
455
+ static isVersionGreater(v1: string, v2: string) {
456
+ try {
457
+ const [major1, minor1, patch1] = v1.split('.').map(Number);
458
+ const [major2, minor2, patch2] = v2.split('.').map(Number);
459
+ if (major1 !== major2) return major1 > major2;
460
+ if (minor1 !== minor2) return minor1 > minor2;
461
+ return patch1 > patch2;
462
+ } catch (e) {
463
+ // one of the two versions is invalid, return true
464
+ RaftLog.warn(`isVersionGreater - invalid version ${v1} or ${v2} ${e}`);
465
+ return true;
466
+ }
467
+ }
468
+
469
+ static isVersionEqual(v1: string, v2: string) {
470
+ try {
471
+ return v1 === v2;
472
+ } catch (e) {
473
+ // one of the two versions is invalid, return false
474
+ RaftLog.warn(`isVersionEqual - invalid version ${v1} or ${v2} ${e}`);
475
+ return false;
476
+ }
477
+ }
478
+
479
+ static withTimeout(ms: number, promise: Promise<any>) {
480
+ let id: NodeJS.Timeout;
481
+ const timeout = new Promise((_, reject) => {
482
+ id = setTimeout(() => {
483
+ clearTimeout(id);
484
+ reject('Timed out in ' + ms + 'ms.')
485
+ }, ms)
486
+ })
487
+
488
+ return Promise.race([
489
+ promise,
490
+ timeout
491
+ ])
492
+ }
493
+
494
+ static toBufferSource(u8: Uint8Array<ArrayBufferLike>): BufferSource {
495
+ if (u8.buffer instanceof ArrayBuffer) {
496
+ // Respect byteOffset/byteLength
497
+ return u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);
498
+ }
499
+ // e.g., SharedArrayBuffer -> copy into a real ArrayBuffer
500
+ const ab = new ArrayBuffer(u8.byteLength);
501
+ new Uint8Array(ab).set(u8);
502
+ return ab;
503
+ }
504
+ static toArrayBufferView(u8: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBuffer> {
505
+ if (u8.buffer instanceof ArrayBuffer) {
506
+ // keep the same bytes/offset/length, but the return type is now locked to ArrayBuffer
507
+ return new Uint8Array(u8.buffer, u8.byteOffset, u8.byteLength);
508
+ }
509
+ // e.g., SharedArrayBuffer → copy into a real ArrayBuffer
510
+ const ab = new ArrayBuffer(u8.byteLength);
511
+ new Uint8Array(ab).set(u8);
512
+ return new Uint8Array(ab);
513
+ }
514
+ }
@@ -0,0 +1,36 @@
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // RaftWifiTypes
4
+ // Part of RaftJS
5
+ //
6
+ // Rob Dobson & Chris Greening 2020-2024
7
+ // (C) 2020-2024 All rights reserved
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+
11
+ export enum RaftWifiConnState {
12
+ WIFI_CONN_NONE,
13
+ WIFI_CONN_CONNECTED,
14
+ }
15
+
16
+ export class RaftWifiConnStatus {
17
+ connState = RaftWifiConnState.WIFI_CONN_NONE;
18
+ isPaused = false;
19
+ ipAddress = '';
20
+ hostname = '';
21
+ ssid = '';
22
+ bssid = '';
23
+ validMs = 0;
24
+ }
25
+
26
+ export class RaftSysModInfoWiFi {
27
+ rslt = 'ok';
28
+ isConn = 0;
29
+ isPaused = 0;
30
+ connState = 'None';
31
+ SSID = '';
32
+ IP = '';
33
+ Hostname = '';
34
+ WiFiMAC = '';
35
+ }
36
+
package/src/main.ts ADDED
@@ -0,0 +1,39 @@
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // RaftJS
4
+ // Commms library for the Raft ESP32 application framework supporting BLE, WebSockets and Serial
5
+ //
6
+ // Rob Dobson & Chris Greening 2020-2024
7
+ // (C) 2020-2024 All rights reserved
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+
11
+ import { createBLEChannel } from './RaftChannelBLEFactory';
12
+ const raftChannel = createBLEChannel();
13
+ export { raftChannel as RaftChannelBLE };
14
+
15
+ export { default as RaftCommsStats } from './RaftCommsStats';
16
+ export { default as RaftConnector } from './RaftConnector';
17
+ export { default as RaftChannel } from './RaftChannel';
18
+ export { default as RaftChannelWebSocket } from './RaftChannelWebSocket';
19
+ export { default as RaftChannelSimulated } from './RaftChannelSimulated';
20
+ export { default as RaftFileHandler } from './RaftFileHandler';
21
+ export { default as RaftLog } from './RaftLog';
22
+ export { default as RaftMiniHDLC } from './RaftMiniHDLC';
23
+ export { default as RaftMsgHandler } from './RaftMsgHandler'
24
+ export { default as RaftStreamHandler } from './RaftStreamHandler';
25
+ export { default as RaftSystemUtils } from './RaftSystemUtils';
26
+ export { default as RaftUtils } from './RaftUtils';
27
+ export { default as RaftSysTypeManager } from './RaftSysTypeManager';
28
+ export { default as RaftDeviceMgrIF } from './RaftDeviceMgrIF';
29
+ export { DeviceManager as RaftDeviceManager } from './RaftDeviceManager';
30
+ export type { DeviceDecodedData } from './RaftDeviceManager';
31
+
32
+ export * from './RaftTypes';
33
+ export * from './RaftSystemType';
34
+ export * from './RaftWifiTypes';
35
+ export * from './RaftConnEvents';
36
+ export * from './RaftUpdateEvents';
37
+ export * from "./RaftProtocolDefs";
38
+ export * from "./RaftDeviceStates";
39
+ export * from "./RaftDeviceInfo";