@robdobsn/raftjs 1.8.5 → 1.11.5
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.
- package/.editorconfig +14 -0
- package/.gitattributes +11 -0
- package/.nvmrc +1 -0
- package/TODO.md +1 -0
- package/dist/react-native/RaftAttributeHandler.d.ts +14 -0
- package/dist/react-native/RaftAttributeHandler.js +375 -0
- package/dist/react-native/RaftAttributeHandler.js.map +1 -0
- package/dist/react-native/RaftChannel.d.ts +20 -0
- package/dist/react-native/RaftChannel.js +12 -0
- package/dist/react-native/RaftChannel.js.map +1 -0
- package/dist/react-native/RaftChannelBLE.native.d.ts +95 -0
- package/dist/react-native/RaftChannelBLE.native.js +483 -0
- package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
- package/dist/react-native/RaftChannelBLE.web.d.ts +40 -0
- package/dist/react-native/RaftChannelBLE.web.js +302 -0
- package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
- package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
- package/dist/react-native/RaftChannelBLEFactory.js +17 -0
- package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
- package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js +138 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
- package/dist/react-native/RaftChannelSimulated.d.ts +42 -0
- package/dist/react-native/RaftChannelSimulated.js +1001 -0
- package/dist/react-native/RaftChannelSimulated.js.map +1 -0
- package/dist/react-native/RaftChannelWebSerial.d.ts +39 -0
- package/dist/react-native/RaftChannelWebSerial.js +329 -0
- package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
- package/dist/react-native/RaftChannelWebSocket.d.ts +30 -0
- package/dist/react-native/RaftChannelWebSocket.js +222 -0
- package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
- package/dist/react-native/RaftCommsStats.d.ts +39 -0
- package/dist/react-native/RaftCommsStats.js +128 -0
- package/dist/react-native/RaftCommsStats.js.map +1 -0
- package/dist/react-native/RaftConnEvents.d.ts +39 -0
- package/dist/react-native/RaftConnEvents.js +54 -0
- package/dist/react-native/RaftConnEvents.js.map +1 -0
- package/dist/react-native/RaftConnector.d.ts +257 -0
- package/dist/react-native/RaftConnector.js +671 -0
- package/dist/react-native/RaftConnector.js.map +1 -0
- package/dist/react-native/RaftCustomAttrHandler.d.ts +6 -0
- package/dist/react-native/RaftCustomAttrHandler.js +93 -0
- package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
- package/dist/react-native/RaftDeviceInfo.d.ts +71 -0
- package/dist/react-native/RaftDeviceInfo.js +50 -0
- package/dist/react-native/RaftDeviceInfo.js.map +1 -0
- package/dist/react-native/RaftDeviceManager.d.ts +73 -0
- package/dist/react-native/RaftDeviceManager.js +812 -0
- package/dist/react-native/RaftDeviceManager.js.map +1 -0
- package/dist/react-native/RaftDeviceMgrIF.d.ts +19 -0
- package/dist/react-native/RaftDeviceMgrIF.js +11 -0
- package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
- package/dist/react-native/RaftDeviceMsg.d.ts +9 -0
- package/dist/react-native/RaftDeviceMsg.js +11 -0
- package/dist/react-native/RaftDeviceMsg.js.map +1 -0
- package/dist/react-native/RaftDeviceStates.d.ts +55 -0
- package/dist/react-native/RaftDeviceStates.js +81 -0
- package/dist/react-native/RaftDeviceStates.js.map +1 -0
- package/dist/react-native/RaftFileHandler.d.ts +52 -0
- package/dist/react-native/RaftFileHandler.js +502 -0
- package/dist/react-native/RaftFileHandler.js.map +1 -0
- package/dist/react-native/RaftLog.d.ts +22 -0
- package/dist/react-native/RaftLog.js +63 -0
- package/dist/react-native/RaftLog.js.map +1 -0
- package/dist/react-native/RaftMiniHDLC.d.ts +18 -0
- package/dist/react-native/RaftMiniHDLC.js +383 -0
- package/dist/react-native/RaftMiniHDLC.js.map +1 -0
- package/dist/react-native/RaftMsgHandler.d.ts +62 -0
- package/dist/react-native/RaftMsgHandler.js +511 -0
- package/dist/react-native/RaftMsgHandler.js.map +1 -0
- package/dist/react-native/RaftMsgTrackInfo.d.ts +17 -0
- package/dist/react-native/RaftMsgTrackInfo.js +42 -0
- package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
- package/dist/react-native/RaftProtocolDefs.d.ts +30 -0
- package/dist/react-native/RaftProtocolDefs.js +48 -0
- package/dist/react-native/RaftProtocolDefs.js.map +1 -0
- package/dist/react-native/RaftPublish.d.ts +2 -0
- package/dist/react-native/RaftPublish.js +81 -0
- package/dist/react-native/RaftPublish.js.map +1 -0
- package/dist/react-native/RaftStreamHandler.d.ts +49 -0
- package/dist/react-native/RaftStreamHandler.js +324 -0
- package/dist/react-native/RaftStreamHandler.js.map +1 -0
- package/dist/react-native/RaftStruct.d.ts +3 -0
- package/dist/react-native/RaftStruct.js +258 -0
- package/dist/react-native/RaftStruct.js.map +1 -0
- package/dist/react-native/RaftSysTypeManager.d.ts +16 -0
- package/dist/react-native/RaftSysTypeManager.js +78 -0
- package/dist/react-native/RaftSysTypeManager.js.map +1 -0
- package/dist/react-native/RaftSystemType.d.ts +30 -0
- package/dist/react-native/RaftSystemType.js +3 -0
- package/dist/react-native/RaftSystemType.js.map +1 -0
- package/dist/react-native/RaftSystemUtils.d.ts +152 -0
- package/dist/react-native/RaftSystemUtils.js +463 -0
- package/dist/react-native/RaftSystemUtils.js.map +1 -0
- package/dist/react-native/RaftTypes.d.ts +216 -0
- package/dist/react-native/RaftTypes.js +153 -0
- package/dist/react-native/RaftTypes.js.map +1 -0
- package/dist/react-native/RaftUpdateEvents.d.ts +33 -0
- package/dist/react-native/RaftUpdateEvents.js +46 -0
- package/dist/react-native/RaftUpdateEvents.js.map +1 -0
- package/dist/react-native/RaftUpdateManager.d.ts +61 -0
- package/dist/react-native/RaftUpdateManager.js +621 -0
- package/dist/react-native/RaftUpdateManager.js.map +1 -0
- package/dist/react-native/RaftUtils.d.ts +128 -0
- package/dist/react-native/RaftUtils.js +487 -0
- package/dist/react-native/RaftUtils.js.map +1 -0
- package/dist/react-native/RaftWifiTypes.d.ts +23 -0
- package/dist/react-native/RaftWifiTypes.js +43 -0
- package/dist/react-native/RaftWifiTypes.js.map +1 -0
- package/dist/react-native/main.d.ts +27 -0
- package/dist/react-native/main.js +52 -0
- package/dist/react-native/main.js.map +1 -0
- package/dist/web/RaftAttributeHandler.js +1 -1
- package/dist/web/RaftAttributeHandler.js.map +1 -1
- package/dist/web/RaftChannelBLE.web.js +8 -6
- package/dist/web/RaftChannelBLE.web.js.map +1 -1
- package/dist/web/RaftChannelSimulated.d.ts +10 -0
- package/dist/web/RaftChannelSimulated.js +665 -82
- package/dist/web/RaftChannelSimulated.js.map +1 -1
- package/dist/web/RaftChannelWebSerial.js +2 -2
- package/dist/web/RaftChannelWebSerial.js.map +1 -1
- package/dist/web/RaftChannelWebSocket.js +16 -1
- package/dist/web/RaftChannelWebSocket.js.map +1 -1
- package/dist/web/RaftConnector.d.ts +12 -1
- package/dist/web/RaftConnector.js +45 -9
- package/dist/web/RaftConnector.js.map +1 -1
- package/dist/web/RaftCustomAttrHandler.d.ts +2 -0
- package/dist/web/RaftCustomAttrHandler.js +54 -26
- package/dist/web/RaftCustomAttrHandler.js.map +1 -1
- package/dist/web/RaftDeviceInfo.d.ts +3 -1
- package/dist/web/RaftDeviceInfo.js +17 -3
- package/dist/web/RaftDeviceInfo.js.map +1 -1
- package/dist/web/RaftDeviceManager.d.ts +32 -2
- package/dist/web/RaftDeviceManager.js +307 -74
- package/dist/web/RaftDeviceManager.js.map +1 -1
- package/dist/web/RaftDeviceMgrIF.d.ts +5 -1
- package/dist/web/RaftDeviceStates.d.ts +20 -2
- package/dist/web/RaftDeviceStates.js +25 -4
- package/dist/web/RaftDeviceStates.js.map +1 -1
- package/dist/web/RaftMsgHandler.js.map +1 -1
- package/dist/web/RaftPublish.d.ts +2 -0
- package/dist/web/RaftPublish.js +81 -0
- package/dist/web/RaftPublish.js.map +1 -0
- package/dist/web/RaftStreamHandler.d.ts +11 -0
- package/dist/web/RaftStreamHandler.js +68 -1
- package/dist/web/RaftStreamHandler.js.map +1 -1
- package/dist/web/RaftStruct.js +197 -147
- package/dist/web/RaftStruct.js.map +1 -1
- package/dist/web/RaftSystemUtils.d.ts +17 -1
- package/dist/web/RaftSystemUtils.js +51 -0
- package/dist/web/RaftSystemUtils.js.map +1 -1
- package/dist/web/RaftTypes.d.ts +21 -0
- package/dist/web/RaftTypes.js.map +1 -1
- package/dist/web/RaftUpdateManager.js +1 -1
- package/dist/web/RaftUpdateManager.js.map +1 -1
- package/dist/web/RaftUtils.d.ts +2 -0
- package/dist/web/RaftUtils.js +20 -0
- package/dist/web/RaftUtils.js.map +1 -1
- package/dist/web/main.d.ts +2 -0
- package/dist/web/main.js +1 -0
- package/dist/web/main.js.map +1 -1
- package/eslint.config.mjs +33 -0
- package/examples/dashboard/package.json +36 -0
- package/examples/dashboard/src/CommandPanel.tsx +147 -0
- package/examples/dashboard/src/ConnManager.ts +166 -0
- package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
- package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
- package/examples/dashboard/src/DeviceLineChart.tsx +163 -0
- package/examples/dashboard/src/DevicePanel.tsx +247 -0
- package/examples/dashboard/src/DeviceStatsPanel.tsx +65 -0
- package/examples/dashboard/src/DevicesPanel.tsx +69 -0
- package/examples/dashboard/src/DispLedGrid.tsx +110 -0
- package/examples/dashboard/src/DispOneLed.tsx +20 -0
- package/examples/dashboard/src/LatencyTest.ts +130 -0
- package/examples/dashboard/src/LatencyTestPanel.tsx +92 -0
- package/examples/dashboard/src/Main.tsx +234 -0
- package/examples/dashboard/src/SettingsManager.ts +67 -0
- package/examples/dashboard/src/SettingsScreen.tsx +179 -0
- package/examples/dashboard/src/StatusPanel.tsx +71 -0
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +170 -0
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +125 -0
- package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +38 -0
- package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +125 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
- package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
- package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
- package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
- package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +105 -0
- package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
- package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +119 -0
- package/examples/dashboard/src/index.html +15 -0
- package/examples/dashboard/src/index.tsx +13 -0
- package/examples/dashboard/src/styles.css +570 -0
- package/examples/dashboard/tsconfig.json +18 -0
- package/jest.config.js +11 -0
- package/package.json +49 -52
- package/src/RaftAttributeHandler.ts +450 -0
- package/src/RaftChannel.ts +32 -0
- package/src/RaftChannelBLE.native.ts +617 -0
- package/src/RaftChannelBLE.web.ts +374 -0
- package/src/RaftChannelBLEFactory.ts +13 -0
- package/src/RaftChannelBLEScanner.native.ts +184 -0
- package/src/RaftChannelSimulated.ts +1177 -0
- package/src/RaftChannelWebSerial.ts +420 -0
- package/src/RaftChannelWebSocket.ts +272 -0
- package/src/RaftCommsStats.ts +142 -0
- package/src/RaftConnEvents.ts +58 -0
- package/src/RaftConnector.ts +806 -0
- package/src/RaftCustomAttrHandler.ts +117 -0
- package/src/RaftDeviceInfo.ts +125 -0
- package/src/RaftDeviceManager.ts +1014 -0
- package/src/RaftDeviceMgrIF.ts +37 -0
- package/src/RaftDeviceMsg.ts +20 -0
- package/src/RaftDeviceStates.ts +122 -0
- package/src/RaftFileHandler.ts +668 -0
- package/src/RaftLog.ts +70 -0
- package/src/RaftMiniHDLC.ts +396 -0
- package/src/RaftMsgHandler.ts +812 -0
- package/src/RaftMsgTrackInfo.ts +51 -0
- package/src/RaftProtocolDefs.ts +46 -0
- package/src/RaftPublish.ts +92 -0
- package/src/RaftStreamHandler.ts +412 -0
- package/src/RaftStruct.ts +282 -0
- package/src/RaftSysTypeManager.ts +87 -0
- package/src/RaftSystemType.ts +34 -0
- package/src/RaftSystemUtils.ts +548 -0
- package/src/RaftTypes.ts +306 -0
- package/src/RaftUpdateEvents.ts +48 -0
- package/src/RaftUpdateManager.ts +781 -0
- package/src/RaftUtils.ts +514 -0
- package/src/RaftWifiTypes.ts +36 -0
- package/src/main.ts +40 -0
- package/testdata/TestDeviceTypeRecs.json +492 -0
- package/tsconfig.json +30 -0
- package/tsconfig.react-native.json +29 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// Raft Protocol Definitions
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson & Chris Greening 2020-2024
|
|
8
|
+
// (C) 2020-2024 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RaftCommsMsgProtocol = exports.RaftCommsMsgTypeCode = exports.RICRESTElemCode = exports.RICREST_BRIDGE_PAYLOAD_POS = exports.RICREST_BRIDGE_ID_POS = exports.RICREST_FILEBLOCK_PAYLOAD_POS = exports.RICREST_FILEBLOCK_FILEPOS_POS_BYTES = exports.RICREST_FILEBLOCK_FILEPOS_POS = exports.RICREST_FILEBLOCK_CHANNEL_POS = exports.RICREST_HEADER_PAYLOAD_POS = exports.RICREST_REST_ELEM_CODE_POS = exports.RICSERIAL_PAYLOAD_POS = exports.RICSERIAL_PROTOCOL_POS = exports.RICSERIAL_MSG_NUM_POS = void 0;
|
|
13
|
+
// RIC Protocols
|
|
14
|
+
exports.RICSERIAL_MSG_NUM_POS = 0;
|
|
15
|
+
exports.RICSERIAL_PROTOCOL_POS = 1;
|
|
16
|
+
exports.RICSERIAL_PAYLOAD_POS = 2;
|
|
17
|
+
exports.RICREST_REST_ELEM_CODE_POS = 0;
|
|
18
|
+
exports.RICREST_HEADER_PAYLOAD_POS = 1;
|
|
19
|
+
exports.RICREST_FILEBLOCK_CHANNEL_POS = 0;
|
|
20
|
+
exports.RICREST_FILEBLOCK_FILEPOS_POS = 0;
|
|
21
|
+
exports.RICREST_FILEBLOCK_FILEPOS_POS_BYTES = 4;
|
|
22
|
+
exports.RICREST_FILEBLOCK_PAYLOAD_POS = 4;
|
|
23
|
+
exports.RICREST_BRIDGE_ID_POS = 2;
|
|
24
|
+
exports.RICREST_BRIDGE_PAYLOAD_POS = 3;
|
|
25
|
+
// Protocol enums
|
|
26
|
+
var RICRESTElemCode;
|
|
27
|
+
(function (RICRESTElemCode) {
|
|
28
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_URL"] = 0] = "RICREST_ELEM_CODE_URL";
|
|
29
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_CMDRESPJSON"] = 1] = "RICREST_ELEM_CODE_CMDRESPJSON";
|
|
30
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_BODY"] = 2] = "RICREST_ELEM_CODE_BODY";
|
|
31
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_COMMAND_FRAME"] = 3] = "RICREST_ELEM_CODE_COMMAND_FRAME";
|
|
32
|
+
RICRESTElemCode[RICRESTElemCode["RICREST_ELEM_CODE_FILEBLOCK"] = 4] = "RICREST_ELEM_CODE_FILEBLOCK";
|
|
33
|
+
})(RICRESTElemCode || (exports.RICRESTElemCode = RICRESTElemCode = {}));
|
|
34
|
+
var RaftCommsMsgTypeCode;
|
|
35
|
+
(function (RaftCommsMsgTypeCode) {
|
|
36
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_COMMAND"] = 0] = "MSG_TYPE_COMMAND";
|
|
37
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_RESPONSE"] = 1] = "MSG_TYPE_RESPONSE";
|
|
38
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_PUBLISH"] = 2] = "MSG_TYPE_PUBLISH";
|
|
39
|
+
RaftCommsMsgTypeCode[RaftCommsMsgTypeCode["MSG_TYPE_REPORT"] = 3] = "MSG_TYPE_REPORT";
|
|
40
|
+
})(RaftCommsMsgTypeCode || (exports.RaftCommsMsgTypeCode = RaftCommsMsgTypeCode = {}));
|
|
41
|
+
var RaftCommsMsgProtocol;
|
|
42
|
+
(function (RaftCommsMsgProtocol) {
|
|
43
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_ROSSERIAL"] = 0] = "MSG_PROTOCOL_ROSSERIAL";
|
|
44
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_RESERVED_1"] = 1] = "MSG_PROTOCOL_RESERVED_1";
|
|
45
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_RICREST"] = 2] = "MSG_PROTOCOL_RICREST";
|
|
46
|
+
RaftCommsMsgProtocol[RaftCommsMsgProtocol["MSG_PROTOCOL_BRIDGE_RICREST"] = 3] = "MSG_PROTOCOL_BRIDGE_RICREST";
|
|
47
|
+
})(RaftCommsMsgProtocol || (exports.RaftCommsMsgProtocol = RaftCommsMsgProtocol = {}));
|
|
48
|
+
//# sourceMappingURL=RaftProtocolDefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftProtocolDefs.js","sourceRoot":"","sources":["../../src/RaftProtocolDefs.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,4BAA4B;AAC5B,iBAAiB;AACjB,EAAE;AACF,wCAAwC;AACxC,oCAAoC;AACpC,EAAE;AACF,iHAAiH;;;AAEjH,gBAAgB;AACH,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAC/B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAC/B,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,mCAAmC,GAAG,CAAC,CAAC;AACxC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,0BAA0B,GAAG,CAAC,CAAC;AAE5C,iBAAiB;AACjB,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,uFAAqB,CAAA;IACrB,uGAA6B,CAAA;IAC7B,yFAAsB,CAAA;IACtB,2GAA+B,CAAA;IAC/B,mGAA2B,CAAA;AAC7B,CAAC,EANW,eAAe,+BAAf,eAAe,QAM1B;AAED,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,uFAAgB,CAAA;IAChB,yFAAiB,CAAA;IACjB,uFAAgB,CAAA;IAChB,qFAAe,CAAA;AACjB,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B;AAED,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,mGAA0B,CAAA;IAC1B,qGAA2B,CAAA;IAC3B,+FAAwB,CAAA;IACxB,6GAA+B,CAAA;AACjC,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// RaftSystem
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson 2025
|
|
8
|
+
// (C) 2020-2025 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.inspectPublishFrame = inspectPublishFrame;
|
|
13
|
+
const RAFT_PUBLISH_PREFIX_LEN = 2;
|
|
14
|
+
const DEVBIN_MAGIC_MIN = 0xDB;
|
|
15
|
+
const DEVBIN_MAGIC_MAX = 0xDF;
|
|
16
|
+
const DEVBIN_VERSION_BASE = 0xDA;
|
|
17
|
+
function inspectPublishFrame(payload, topicLookup) {
|
|
18
|
+
if (payload.length < RAFT_PUBLISH_PREFIX_LEN) {
|
|
19
|
+
return { frameType: "unknown" };
|
|
20
|
+
}
|
|
21
|
+
const payloadStartPos = RAFT_PUBLISH_PREFIX_LEN;
|
|
22
|
+
if (payload.length <= payloadStartPos) {
|
|
23
|
+
return { frameType: "unknown" };
|
|
24
|
+
}
|
|
25
|
+
// Try JSON first
|
|
26
|
+
if (payload[payloadStartPos] === 0x7B) {
|
|
27
|
+
try {
|
|
28
|
+
const jsonString = new TextDecoder("utf-8").decode(payload.slice(payloadStartPos));
|
|
29
|
+
const jsonObj = JSON.parse(jsonString);
|
|
30
|
+
let topicIndex = undefined;
|
|
31
|
+
let topicName = undefined;
|
|
32
|
+
if (typeof jsonObj._t === "number") {
|
|
33
|
+
topicIndex = jsonObj._t;
|
|
34
|
+
topicName = topicLookup ? topicLookup(topicIndex) : undefined;
|
|
35
|
+
}
|
|
36
|
+
else if (typeof jsonObj._t === "string") {
|
|
37
|
+
topicName = jsonObj._t;
|
|
38
|
+
}
|
|
39
|
+
const version = typeof jsonObj._v === "number" ? jsonObj._v : undefined;
|
|
40
|
+
return {
|
|
41
|
+
frameType: "json",
|
|
42
|
+
topicIndex,
|
|
43
|
+
topicName,
|
|
44
|
+
version,
|
|
45
|
+
jsonString,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (_a) {
|
|
49
|
+
return { frameType: "unknown" };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Binary (devbin legacy or enveloped)
|
|
53
|
+
const firstBinaryByte = payload[payloadStartPos];
|
|
54
|
+
if ((firstBinaryByte & 0xF0) === 0xD0) {
|
|
55
|
+
if (firstBinaryByte < DEVBIN_MAGIC_MIN || firstBinaryByte > DEVBIN_MAGIC_MAX) {
|
|
56
|
+
return {
|
|
57
|
+
frameType: "binary",
|
|
58
|
+
binaryHasEnvelope: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const topicIndex = payload.length > payloadStartPos + 1 ? payload[payloadStartPos + 1] : undefined;
|
|
62
|
+
const topicName = (topicIndex !== undefined && topicIndex !== 0xFF && topicLookup)
|
|
63
|
+
? topicLookup(topicIndex)
|
|
64
|
+
: undefined;
|
|
65
|
+
return {
|
|
66
|
+
frameType: "binary",
|
|
67
|
+
topicIndex,
|
|
68
|
+
topicName,
|
|
69
|
+
version: firstBinaryByte - DEVBIN_VERSION_BASE,
|
|
70
|
+
binaryHasEnvelope: true,
|
|
71
|
+
binaryPayloadOffset: payloadStartPos + 2,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Legacy binary format (no envelope)
|
|
75
|
+
return {
|
|
76
|
+
frameType: "binary",
|
|
77
|
+
binaryHasEnvelope: false,
|
|
78
|
+
binaryPayloadOffset: payloadStartPos,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=RaftPublish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftPublish.js","sourceRoot":"","sources":["../../src/RaftPublish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import RaftMsgHandler from './RaftMsgHandler';
|
|
2
|
+
import RaftCommsStats from './RaftCommsStats';
|
|
3
|
+
import { RaftStreamDataProgressCBType } from './RaftTypes';
|
|
4
|
+
import RaftConnector from './RaftConnector';
|
|
5
|
+
export default class RaftStreamHandler {
|
|
6
|
+
private _streamID;
|
|
7
|
+
DEFAULT_MAX_BLOCK_SIZE: number;
|
|
8
|
+
private _maxBlockSize;
|
|
9
|
+
private _msgHandler;
|
|
10
|
+
private _commsStats;
|
|
11
|
+
private _raftConnector;
|
|
12
|
+
private _soktoReceived;
|
|
13
|
+
private _soktoPos;
|
|
14
|
+
private _streamIsStarting;
|
|
15
|
+
private _lastStreamStartTime;
|
|
16
|
+
private _isStreaming;
|
|
17
|
+
private _isPaused;
|
|
18
|
+
private _streamBuffer;
|
|
19
|
+
private _audioDuration;
|
|
20
|
+
private _audioByteRate;
|
|
21
|
+
private _streamPos;
|
|
22
|
+
private _numBlocksWithoutPause;
|
|
23
|
+
private _legacySoktoMode;
|
|
24
|
+
private soundFinishPoint;
|
|
25
|
+
constructor(msgHandler: RaftMsgHandler, commsStats: RaftCommsStats, raftConnector: RaftConnector);
|
|
26
|
+
setNumBlocksWithoutPause(numBlocks: number): void;
|
|
27
|
+
setLegacySoktoMode(legacyMode: boolean): void;
|
|
28
|
+
/**
|
|
29
|
+
* streamData - stream arbitrary data to a named firmware endpoint using the RT_STREAM protocol.
|
|
30
|
+
* Returns a promise that resolves when the stream is complete or rejects on failure.
|
|
31
|
+
* @param streamContents data to stream
|
|
32
|
+
* @param fileName logical filename sent in ufStart (used by firmware to detect format, e.g. "pattern.thr")
|
|
33
|
+
* @param targetEndpoint REST API endpoint name registered on the firmware (e.g. "streampattern")
|
|
34
|
+
* @param progressCallback optional callback reporting (bytesSent, totalBytes, progressFraction)
|
|
35
|
+
* @returns Promise<boolean> true if stream completed successfully
|
|
36
|
+
*/
|
|
37
|
+
streamData(streamContents: Uint8Array, fileName: string, targetEndpoint: string, progressCallback?: RaftStreamDataProgressCBType): Promise<boolean>;
|
|
38
|
+
streamAudio(streamContents: Uint8Array, clearExisting: boolean, audioDuration: number): void;
|
|
39
|
+
streamCancel(): Promise<void>;
|
|
40
|
+
isStreamStarting(): boolean;
|
|
41
|
+
clearFinishPointTimeout(): void;
|
|
42
|
+
streamingPerformanceChecker(): void;
|
|
43
|
+
private _sendStreamStartMsg;
|
|
44
|
+
get maxBlockSize(): number;
|
|
45
|
+
set maxBlockSize(maxBlockSize: number);
|
|
46
|
+
private _sendStreamEndMsg;
|
|
47
|
+
private _sendStreamBuffer;
|
|
48
|
+
onSoktoMsg(soktoPos: number): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// RafStreamHandler
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson & Chris Greening 2020-2024
|
|
8
|
+
// (C) 2020-2024 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const tslib_1 = require("tslib");
|
|
13
|
+
const RaftLog_1 = tslib_1.__importDefault(require("./RaftLog"));
|
|
14
|
+
const RaftTypes_1 = require("./RaftTypes");
|
|
15
|
+
const RaftConnEvents_1 = require("./RaftConnEvents");
|
|
16
|
+
const RaftProtocolDefs_1 = require("./RaftProtocolDefs");
|
|
17
|
+
const RaftUtils_1 = tslib_1.__importDefault(require("./RaftUtils"));
|
|
18
|
+
class RaftStreamHandler {
|
|
19
|
+
constructor(msgHandler, commsStats, raftConnector) {
|
|
20
|
+
// Queue of audio stream requests
|
|
21
|
+
/*
|
|
22
|
+
private _streamAudioQueue: {
|
|
23
|
+
streamContents: Uint8Array;
|
|
24
|
+
audioDuration: number;
|
|
25
|
+
}[] = [];
|
|
26
|
+
*/
|
|
27
|
+
// Stream state
|
|
28
|
+
this._streamID = null;
|
|
29
|
+
this.DEFAULT_MAX_BLOCK_SIZE = 475;
|
|
30
|
+
this._maxBlockSize = this.DEFAULT_MAX_BLOCK_SIZE;
|
|
31
|
+
// Flow control
|
|
32
|
+
this._soktoReceived = false;
|
|
33
|
+
this._soktoPos = 0;
|
|
34
|
+
this._streamIsStarting = false;
|
|
35
|
+
this._lastStreamStartTime = 0;
|
|
36
|
+
this._isStreaming = false;
|
|
37
|
+
this._isPaused = false;
|
|
38
|
+
this._streamBuffer = new Uint8Array();
|
|
39
|
+
this._audioDuration = 0;
|
|
40
|
+
this._audioByteRate = 0;
|
|
41
|
+
this._streamPos = 0;
|
|
42
|
+
this._numBlocksWithoutPause = 15;
|
|
43
|
+
this._legacySoktoMode = false;
|
|
44
|
+
// soundFinishPoint timer
|
|
45
|
+
this.soundFinishPoint = null;
|
|
46
|
+
this._raftConnector = raftConnector;
|
|
47
|
+
this._msgHandler = msgHandler;
|
|
48
|
+
this._commsStats = commsStats;
|
|
49
|
+
this.onSoktoMsg = this.onSoktoMsg.bind(this);
|
|
50
|
+
}
|
|
51
|
+
setNumBlocksWithoutPause(numBlocks) {
|
|
52
|
+
this._numBlocksWithoutPause = numBlocks;
|
|
53
|
+
}
|
|
54
|
+
setLegacySoktoMode(legacyMode) {
|
|
55
|
+
RaftLog_1.default.debug(`Setting legacy sokto mode to ${legacyMode}`);
|
|
56
|
+
this._legacySoktoMode = legacyMode;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* streamData - stream arbitrary data to a named firmware endpoint using the RT_STREAM protocol.
|
|
60
|
+
* Returns a promise that resolves when the stream is complete or rejects on failure.
|
|
61
|
+
* @param streamContents data to stream
|
|
62
|
+
* @param fileName logical filename sent in ufStart (used by firmware to detect format, e.g. "pattern.thr")
|
|
63
|
+
* @param targetEndpoint REST API endpoint name registered on the firmware (e.g. "streampattern")
|
|
64
|
+
* @param progressCallback optional callback reporting (bytesSent, totalBytes, progressFraction)
|
|
65
|
+
* @returns Promise<boolean> true if stream completed successfully
|
|
66
|
+
*/
|
|
67
|
+
async streamData(streamContents, fileName, targetEndpoint, progressCallback) {
|
|
68
|
+
// Reject if another stream is starting
|
|
69
|
+
if (this._streamIsStarting || this._lastStreamStartTime > (Date.now() - 500)) {
|
|
70
|
+
RaftLog_1.default.warn(`streamData: unable to start, too soon since last request`);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
this._streamIsStarting = true;
|
|
74
|
+
this._lastStreamStartTime = Date.now();
|
|
75
|
+
this._soktoReceived = false;
|
|
76
|
+
this._soktoPos = 0;
|
|
77
|
+
this._streamPos = 0;
|
|
78
|
+
this._streamBuffer = RaftUtils_1.default.toArrayBufferView(streamContents);
|
|
79
|
+
// Send ufStart
|
|
80
|
+
const startOk = await this._sendStreamStartMsg(fileName, targetEndpoint, RaftTypes_1.RaftStreamType.REAL_TIME_STREAM, streamContents);
|
|
81
|
+
this._streamIsStarting = false;
|
|
82
|
+
if (!startOk) {
|
|
83
|
+
RaftLog_1.default.warn(`streamData: ufStart failed`);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Send blocks
|
|
87
|
+
if (this._streamID === null) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
let pos = 0;
|
|
91
|
+
while (pos < this._streamBuffer.length) {
|
|
92
|
+
// Respect SOKTO feedback — if firmware reported a position mismatch, rewind
|
|
93
|
+
if (this._soktoReceived) {
|
|
94
|
+
RaftLog_1.default.verbose(`streamData: sokto received, pos was ${pos}, soktoPos ${this._soktoPos}`);
|
|
95
|
+
this._soktoReceived = false;
|
|
96
|
+
// Slow down on backpressure
|
|
97
|
+
await new Promise(r => setTimeout(r, 50));
|
|
98
|
+
}
|
|
99
|
+
const blockSize = Math.min(this._streamBuffer.length - pos, this._maxBlockSize);
|
|
100
|
+
const block = this._streamBuffer.slice(pos, pos + blockSize);
|
|
101
|
+
if (block.length > 0) {
|
|
102
|
+
const sentOk = await this._msgHandler.sendStreamBlock(block, pos, this._streamID);
|
|
103
|
+
this._commsStats.recordStreamBytes(block.length);
|
|
104
|
+
if (!sentOk) {
|
|
105
|
+
RaftLog_1.default.warn(`streamData: sendStreamBlock failed at pos ${pos}`);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
pos += blockSize;
|
|
109
|
+
this._streamPos = pos;
|
|
110
|
+
// Progress callback
|
|
111
|
+
if (progressCallback) {
|
|
112
|
+
const progress = this._streamBuffer.length > 0 ? pos / this._streamBuffer.length : 1;
|
|
113
|
+
progressCallback(pos, this._streamBuffer.length, progress);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Yield to avoid hogging the event loop
|
|
117
|
+
await new Promise(r => setTimeout(r, 1));
|
|
118
|
+
}
|
|
119
|
+
// Send ufEnd
|
|
120
|
+
const endOk = await this._sendStreamEndMsg(this._streamID);
|
|
121
|
+
RaftLog_1.default.debug(`streamData: complete, endOk=${endOk}`);
|
|
122
|
+
return endOk;
|
|
123
|
+
}
|
|
124
|
+
// Start streaming audio
|
|
125
|
+
streamAudio(streamContents, clearExisting, audioDuration) {
|
|
126
|
+
if (!clearExisting)
|
|
127
|
+
RaftLog_1.default.debug(`only clearExisting = true is supported right now.`);
|
|
128
|
+
// TODO - if clearExisting is not set, form a queue
|
|
129
|
+
if (this._streamIsStarting || this._lastStreamStartTime > (Date.now() - 500)) {
|
|
130
|
+
RaftLog_1.default.warn(`Unable to start sound, too soon since last request`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
this._isPaused = true;
|
|
134
|
+
this._streamIsStarting = true;
|
|
135
|
+
this._lastStreamStartTime = Date.now();
|
|
136
|
+
this._soktoReceived = false;
|
|
137
|
+
this._soktoPos = 0;
|
|
138
|
+
this._streamPos = 0;
|
|
139
|
+
this._streamBuffer = RaftUtils_1.default.toArrayBufferView(streamContents);
|
|
140
|
+
this._audioDuration = audioDuration;
|
|
141
|
+
this._audioByteRate = (streamContents.length / audioDuration) * 1000;
|
|
142
|
+
this.clearFinishPointTimeout();
|
|
143
|
+
this._sendStreamStartMsg("audio.mp3", "streamaudio", RaftTypes_1.RaftStreamType.REAL_TIME_STREAM, streamContents).then((result) => {
|
|
144
|
+
this._isPaused = false;
|
|
145
|
+
this._streamIsStarting = false;
|
|
146
|
+
if (!result) {
|
|
147
|
+
RaftLog_1.default.warn(`Unable to start stream. ufStart message send failed`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
//this.streamingPerformanceChecker();
|
|
151
|
+
if (!this._isStreaming) {
|
|
152
|
+
this._isStreaming = true;
|
|
153
|
+
this._sendStreamBuffer();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async streamCancel() {
|
|
158
|
+
this._streamBuffer = new Uint8Array();
|
|
159
|
+
this.clearFinishPointTimeout();
|
|
160
|
+
}
|
|
161
|
+
isStreamStarting() {
|
|
162
|
+
return this._streamIsStarting;
|
|
163
|
+
}
|
|
164
|
+
clearFinishPointTimeout() {
|
|
165
|
+
if (this.soundFinishPoint) {
|
|
166
|
+
clearTimeout(this.soundFinishPoint);
|
|
167
|
+
this.soundFinishPoint = null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
streamingPerformanceChecker() {
|
|
171
|
+
if (this._audioDuration) {
|
|
172
|
+
this.clearFinishPointTimeout();
|
|
173
|
+
this.soundFinishPoint = setTimeout(() => {
|
|
174
|
+
// if the streaming hasn't finished before the end of the audio
|
|
175
|
+
// we can assume we are having streaming issues
|
|
176
|
+
// publish event in case we are having issues
|
|
177
|
+
this._raftConnector.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_STREAMING_ISSUE);
|
|
178
|
+
this.clearFinishPointTimeout();
|
|
179
|
+
}, this._audioDuration + 500);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Send the start message
|
|
183
|
+
async _sendStreamStartMsg(streamName, targetEndpoint, streamTypeEnum, streamContents) {
|
|
184
|
+
// Stream start command message
|
|
185
|
+
const streamType = 'rtstream';
|
|
186
|
+
const cmdMsg = `{"cmdName":"ufStart","reqStr":"ufStart","fileType":"${streamType}","fileName":"${streamName}","endpoint":"${targetEndpoint}","fileLen":${streamContents.length}}`;
|
|
187
|
+
// Debug
|
|
188
|
+
RaftLog_1.default.debug(`sendStreamStartMsg ${cmdMsg}`);
|
|
189
|
+
// Send
|
|
190
|
+
let streamStartResp = null;
|
|
191
|
+
try {
|
|
192
|
+
streamStartResp = await this._msgHandler.sendRICREST(cmdMsg, RaftProtocolDefs_1.RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
RaftLog_1.default.warn(`sendStreamStartMsg error ${err}`);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Extract params
|
|
199
|
+
if (streamStartResp && (streamStartResp.rslt === 'ok')) {
|
|
200
|
+
this._streamID = streamStartResp.streamID;
|
|
201
|
+
this._maxBlockSize = streamStartResp.maxBlockSize || this.DEFAULT_MAX_BLOCK_SIZE;
|
|
202
|
+
this.streamingPerformanceChecker();
|
|
203
|
+
RaftLog_1.default.verbose(`sendStreamStartMsg streamID ${this._streamID} maxBlockSize ${this._maxBlockSize} streamType ${streamTypeEnum}`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
RaftLog_1.default.warn(`sendStreamStartMsg failed ${streamStartResp ? streamStartResp.rslt : 'no response'}`);
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
get maxBlockSize() {
|
|
212
|
+
return this._maxBlockSize;
|
|
213
|
+
}
|
|
214
|
+
set maxBlockSize(maxBlockSize) {
|
|
215
|
+
this._maxBlockSize = maxBlockSize;
|
|
216
|
+
this.DEFAULT_MAX_BLOCK_SIZE = maxBlockSize;
|
|
217
|
+
}
|
|
218
|
+
async _sendStreamEndMsg(streamID) {
|
|
219
|
+
if (streamID === null) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
// Stram end command message
|
|
223
|
+
const cmdMsg = `{"cmdName":"ufEnd","reqStr":"ufEnd","streamID":${streamID}}`;
|
|
224
|
+
// Debug
|
|
225
|
+
RaftLog_1.default.debug(`sendStreamEndMsg ${cmdMsg}`);
|
|
226
|
+
// Send
|
|
227
|
+
let streamEndResp = null;
|
|
228
|
+
try {
|
|
229
|
+
streamEndResp = await this._msgHandler.sendRICREST(cmdMsg, RaftProtocolDefs_1.RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
RaftLog_1.default.warn(`sendStreamEndMsg error ${err}`);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
return streamEndResp.rslt === 'ok';
|
|
236
|
+
}
|
|
237
|
+
/*
|
|
238
|
+
private async _sendAudioStopMsg(): Promise<RaftOKFail> {
|
|
239
|
+
const cmdMsg = `{"cmdName":"audio/stop"}`;
|
|
240
|
+
|
|
241
|
+
// Debug
|
|
242
|
+
RaftLog.debug(`sendAudioStopMsg ${cmdMsg}`);
|
|
243
|
+
|
|
244
|
+
// Send
|
|
245
|
+
return this._msgHandler.sendRICREST<RaftOKFail>(
|
|
246
|
+
cmdMsg,
|
|
247
|
+
RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME,
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
private async _sendStreamCancelMsg(): Promise<RaftOKFail> {
|
|
253
|
+
// File cancel command message
|
|
254
|
+
const cmdMsg = `{"cmdName":"ufCancel","reqStr":"ufCancel","streamID":${this._streamID}}`;
|
|
255
|
+
|
|
256
|
+
// Debug
|
|
257
|
+
RaftLog.debug(`sendStreamCancelMsg ${cmdMsg}`);
|
|
258
|
+
|
|
259
|
+
// Send
|
|
260
|
+
return this._msgHandler.sendRICREST<RaftOKFail>(
|
|
261
|
+
cmdMsg,
|
|
262
|
+
RICRESTElemCode.RICREST_ELEM_CODE_COMMAND_FRAME,
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
*/
|
|
266
|
+
async _sendStreamBuffer() {
|
|
267
|
+
const streamStartTime = Date.now();
|
|
268
|
+
// Check streamID is valid
|
|
269
|
+
if (this._streamID === null) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
let blockNum = 0;
|
|
273
|
+
// Send stream blocks
|
|
274
|
+
while (this._soktoPos < this._streamBuffer.length || this._isPaused) {
|
|
275
|
+
if (this._isPaused) {
|
|
276
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
// Check for new sokto
|
|
280
|
+
if (this._soktoReceived) {
|
|
281
|
+
if (this._legacySoktoMode)
|
|
282
|
+
this._streamPos = this._soktoPos;
|
|
283
|
+
// apart from when in legacy mode, the sokto message is now informational only,
|
|
284
|
+
// to allow the central to slow down sending of data if it is swamping the peripheral
|
|
285
|
+
RaftLog_1.default.verbose(`sendStreamContents ${Date.now() - streamStartTime}ms soktoReceived for ${this._streamPos}`);
|
|
286
|
+
this._soktoReceived = false;
|
|
287
|
+
// receiving an sokto message before the completion of the stream means that the streaming is not keeping up
|
|
288
|
+
this._raftConnector.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_STREAMING_ISSUE);
|
|
289
|
+
}
|
|
290
|
+
// Send stream block
|
|
291
|
+
const blockSize = Math.min(this._streamBuffer.length - this._streamPos, this._maxBlockSize);
|
|
292
|
+
const block = this._streamBuffer.slice(this._streamPos, this._streamPos + blockSize);
|
|
293
|
+
if (block.length > 0) {
|
|
294
|
+
const sentOk = await this._msgHandler.sendStreamBlock(block, this._streamPos, this._streamID);
|
|
295
|
+
this._commsStats.recordStreamBytes(block.length);
|
|
296
|
+
RaftLog_1.default.verbose(`sendStreamContents ${sentOk ? "OK" : "FAILED"} ${Date.now() - streamStartTime}ms pos ${this._streamPos} ${blockSize} ${block.length} ${this._soktoPos}`);
|
|
297
|
+
if (!sentOk) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
this._streamPos += blockSize;
|
|
301
|
+
blockNum += 1;
|
|
302
|
+
if (this._audioByteRate && blockNum > this._numBlocksWithoutPause) {
|
|
303
|
+
const pauseTime = ((blockSize / this._audioByteRate) * 1000) - 10;
|
|
304
|
+
RaftLog_1.default.verbose(`Pausing for ${pauseTime} ms between audio packets. Bit rate ${this._audioByteRate * 8}`);
|
|
305
|
+
await new Promise((resolve) => setTimeout(resolve, pauseTime));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Wait to ensure we don't hog the CPU
|
|
309
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
310
|
+
}
|
|
311
|
+
this._isStreaming = false;
|
|
312
|
+
this.clearFinishPointTimeout();
|
|
313
|
+
await this._sendStreamEndMsg(this._streamID);
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
onSoktoMsg(soktoPos) {
|
|
317
|
+
// Get how far we've progressed in file
|
|
318
|
+
this._soktoPos = soktoPos;
|
|
319
|
+
this._soktoReceived = true;
|
|
320
|
+
RaftLog_1.default.debug(`onSoktoMsg received file up to ${this._soktoPos}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
exports.default = RaftStreamHandler;
|
|
324
|
+
//# sourceMappingURL=RaftStreamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftStreamHandler.js","sourceRoot":"","sources":["../../src/RaftStreamHandler.ts"],"names":[],"mappings":"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"}
|