@robotical/webapp-types 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/application-manager.ts +20 -0
  2. package/dist-types/src/application/ApplicationManager/ApplicationManager.d.ts +91 -0
  3. package/dist-types/src/application/ApplicationManager/ApplicationManager.js +448 -0
  4. package/dist-types/src/application/RAFTs/Cog/Cog.d.ts +39 -0
  5. package/dist-types/src/application/RAFTs/Cog/Cog.js +171 -0
  6. package/dist-types/src/application/RAFTs/Marty/Marty.d.ts +40 -0
  7. package/dist-types/src/application/RAFTs/Marty/Marty.js +179 -0
  8. package/dist-types/src/application/RAFTs/RAFT.d.ts +109 -0
  9. package/dist-types/src/application/RAFTs/RAFT.js +313 -0
  10. package/dist-types/src/application/RAFTs/RAFTInterface.d.ts +13 -0
  11. package/dist-types/src/application/RAFTs/RAFTInterface.js +6 -0
  12. package/dist-types/src/application/RAFTs/RaftObserver.d.ts +10 -0
  13. package/dist-types/src/application/RAFTs/RaftObserver.js +1 -0
  14. package/dist-types/src/application/RAFTs/raft-subscription-helpers.d.ts +59 -0
  15. package/dist-types/src/application/RAFTs/raft-subscription-helpers.js +324 -0
  16. package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.d.ts +10 -0
  17. package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.js +31 -0
  18. package/dist-types/src/application/communicators/WrapperCommunicator.d.ts +24 -0
  19. package/dist-types/src/application/communicators/WrapperCommunicator.js +137 -0
  20. package/dist-types/src/components/disposables/LoadingSpinner/index.d.ts +7 -0
  21. package/dist-types/src/components/disposables/LoadingSpinner/index.js +29 -0
  22. package/dist-types/src/components/disposables/buttons/SVGImageButton/index.d.ts +14 -0
  23. package/dist-types/src/components/disposables/buttons/SVGImageButton/index.js +19 -0
  24. package/dist-types/src/components/disposables/buttons/SimpleButton/index.d.ts +14 -0
  25. package/dist-types/src/components/disposables/buttons/SimpleButton/index.js +18 -0
  26. package/dist-types/src/components/modals/DisconnectConfirmation/index.d.ts +6 -0
  27. package/dist-types/src/components/modals/DisconnectConfirmation/index.js +63 -0
  28. package/dist-types/src/components/modals/DisconnectConfirmation/styles.d.ts +1 -0
  29. package/dist-types/src/components/modals/DisconnectConfirmation/styles.js +7 -0
  30. package/dist-types/src/components/modals/InUnplugged/index.d.ts +1 -0
  31. package/dist-types/src/components/modals/InUnplugged/index.js +12 -0
  32. package/dist-types/src/components/modals/InUnplugged/styles.d.ts +5 -0
  33. package/dist-types/src/components/modals/InUnplugged/styles.js +11 -0
  34. package/dist-types/src/components/modals/VerificationModal/index.d.ts +6 -0
  35. package/dist-types/src/components/modals/VerificationModal/index.js +124 -0
  36. package/dist-types/src/components/modals/VerificationModalPhoneApp/index.d.ts +6 -0
  37. package/dist-types/src/components/modals/VerificationModalPhoneApp/index.js +190 -0
  38. package/dist-types/src/components/oneoffs/LEDs/index.d.ts +8 -0
  39. package/dist-types/src/components/oneoffs/LEDs/index.js +39 -0
  40. package/dist-types/src/components/oneoffs/RICSignal/index.d.ts +7 -0
  41. package/dist-types/src/components/oneoffs/RICSignal/index.js +29 -0
  42. package/dist-types/src/services/logger/Logger.d.ts +7 -0
  43. package/dist-types/src/services/logger/Logger.js +19 -0
  44. package/dist-types/src/state-observables/modal/ModalObserver.d.ts +17 -0
  45. package/dist-types/src/state-observables/modal/ModalObserver.js +1 -0
  46. package/dist-types/src/state-observables/modal/ModalState.d.ts +24 -0
  47. package/dist-types/src/state-observables/modal/ModalState.js +69 -0
  48. package/dist-types/src/store/SelectedRaftContext.d.ts +17 -0
  49. package/dist-types/src/store/SelectedRaftContext.js +80 -0
  50. package/dist-types/src/styles/colors.d.ts +35 -0
  51. package/dist-types/src/styles/colors.js +42 -0
  52. package/dist-types/src/types/communication-between-apps/wrapper-communication.d.ts +45 -0
  53. package/dist-types/src/types/communication-between-apps/wrapper-communication.js +25 -0
  54. package/dist-types/src/types/events/raft-info.d.ts +10 -0
  55. package/dist-types/src/types/events/raft-info.js +11 -0
  56. package/dist-types/src/types/phone-app-communicator.d.ts +20 -0
  57. package/dist-types/src/types/phone-app-communicator.js +5 -0
  58. package/dist-types/src/types/raft.d.ts +18 -0
  59. package/dist-types/src/types/raft.js +14 -0
  60. package/dist-types/src/utils/Toaster.d.ts +13 -0
  61. package/dist-types/src/utils/Toaster.js +38 -0
  62. package/dist-types/src/utils/helpers/compare-version.d.ts +2 -0
  63. package/dist-types/src/utils/helpers/compare-version.js +19 -0
  64. package/dist-types/src/utils/helpers/randomHashGenerator.d.ts +1 -0
  65. package/dist-types/src/utils/helpers/randomHashGenerator.js +10 -0
  66. package/dist-types/src/utils/helpers/rescale-range.d.ts +2 -0
  67. package/dist-types/src/utils/helpers/rescale-range.js +4 -0
  68. package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.d.ts +3 -0
  69. package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.js +34 -0
  70. package/dist-types/src/utils/phone-app-communication/is-phone-app.d.ts +5 -0
  71. package/dist-types/src/utils/phone-app-communication/is-phone-app.js +7 -0
  72. package/dist-types/src/wrapper-app/WrapperAppManager.d.ts +58 -0
  73. package/dist-types/src/wrapper-app/WrapperAppManager.js +176 -0
  74. package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.d.ts +24 -0
  75. package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.js +243 -0
  76. package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.d.ts +35 -0
  77. package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.js +177 -0
  78. package/dist-types/src/wrapper-app/connectors/Connector.d.ts +69 -0
  79. package/dist-types/src/wrapper-app/connectors/Connector.js +315 -0
  80. package/dist-types/src/wrapper-app/connectors/ConnectorFactory.d.ts +15 -0
  81. package/dist-types/src/wrapper-app/connectors/ConnectorFactory.js +99 -0
  82. package/dist-types/src/wrapper-app/connectors/ConnectorInterface.d.ts +10 -0
  83. package/dist-types/src/wrapper-app/connectors/ConnectorInterface.js +6 -0
  84. package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.d.ts +35 -0
  85. package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.js +219 -0
  86. package/dist-types/types-package/application-manager.d.ts +17 -0
  87. package/dist-types/types-package/application-manager.js +5 -0
  88. package/package.json +13 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * This file is needed so we can build and publish the ApplicationManager interface to the children projects
3
+ */
4
+ import ApplicationManager from "../src/application/ApplicationManager/ApplicationManager";
5
+ import WrapperCommunicator from "../src/application/communicators/WrapperCommunicator";
6
+ import Logger from "../src/services/logger/Logger";
7
+ import WebAppCommunicator from "../src/wrapper-app/communicators/WebAppCommunicator";
8
+
9
+ export { ApplicationManager }
10
+
11
+ declare global {
12
+ interface Window {
13
+ ReactNativeWebView: any;
14
+ // marty: Marty;
15
+ WebAppCommunicator: WebAppCommunicator;
16
+ wrapperCommunicator: WrapperCommunicator;
17
+ applicationManager: ApplicationManager;
18
+ Logger: Logger;
19
+ }
20
+ }
@@ -0,0 +1,91 @@
1
+ import { RaftConnectionMethod } from "../../types/raft";
2
+ import WebAppCommunicator from "../../wrapper-app/communicators/WebAppCommunicator";
3
+ import RAFT from "../RAFTs/RAFT";
4
+ import Marty from "../RAFTs/Marty/Marty";
5
+ import Cog from "../RAFTs/Cog/Cog";
6
+ import { FOUND_RAFT_ON_DISCOVERY_RESPONSE } from "../../types/phone-app-communicator";
7
+ import { RaftObserver } from "../RAFTs/RaftObserver";
8
+ import { RaftInfoEvents } from "../../types/events/raft-info";
9
+ import { RaftConnEvent, RaftUpdateEvent, RaftPublishEvent } from "@robdobsn/raftjs";
10
+ import { ConnectedRaftItem } from "../../store/SelectedRaftContext";
11
+ import Toaster from "../../utils/Toaster";
12
+ export default class ApplicationManager {
13
+ private _observers;
14
+ static wrapperAppCommunicator: WebAppCommunicator;
15
+ connectedRafts: {
16
+ [key: string]: RAFT;
17
+ };
18
+ ricSelectedCb: ((raft: RAFT) => void) | null;
19
+ toaster: typeof Toaster;
20
+ connectedRaftContextMethods: {
21
+ addConnectedRaft: (connectedRaft: ConnectedRaftItem) => void;
22
+ removeConnectedRaft: (connectedRaftId: string) => void;
23
+ setSelectedRaft: (connectedRaftId: string) => void;
24
+ };
25
+ isPhoneApp: () => boolean;
26
+ constructor();
27
+ createNewCog(id: string): Cog;
28
+ createNewMarty(id: string): Marty;
29
+ /**
30
+ * Generic Connect method
31
+ * This method is called from various environments (connection button, blocksjr, blocks etc.)
32
+ * Known issue: connecting to a raft from within a platform won't add the newly connected raft to the connectedRafts hook
33
+ */
34
+ connectGeneric(afterRaftConnectedCb: (raft: RAFT) => void): Promise<void>;
35
+ /**
36
+ * Disconnect from RAFT generic
37
+ * This method is called from various environments (connection button, blocksjr, blocks etc.)
38
+ */
39
+ disconnectGeneric(raft: RAFT): Promise<void>;
40
+ /**
41
+ * Selects a RAFT in Phone's verification modal
42
+ */
43
+ selectRaft(ricToConnectTo: FOUND_RAFT_ON_DISCOVERY_RESPONSE['foundRIC'], method: RaftConnectionMethod): Promise<RAFT | null>;
44
+ connectToRIC(method: RaftConnectionMethod): Promise<RAFT | null>;
45
+ /**
46
+ * Disconnect from RAFT
47
+ */
48
+ disconnectFromRaft(raftId: string): Promise<void>;
49
+ /**
50
+ * Removes raft after a certain time
51
+ * Removes from the rics list after x seconds so that we can still get the last event
52
+ */
53
+ _removeRIC(raftId: string, timeout: number): void;
54
+ /**
55
+ * Start looking for rics to connect to
56
+ * This is used from the Phone App only
57
+ */
58
+ startDiscovery(ricSelectedCb: (raft: RAFT) => void): Promise<void>;
59
+ /**
60
+ * Stop verifying raft
61
+ */
62
+ stopVerifyingRaft(raftId: string, isCorrectRIC: boolean): Promise<void>;
63
+ /**
64
+ * Publishing events to observers
65
+ * It could be either events we get from RAFT, or custom events related to the app
66
+ */
67
+ publish(eventType: string, eventEnum: RaftConnEvent | RaftUpdateEvent | RaftPublishEvent | RaftInfoEvents, eventName: string, eventData: any): void;
68
+ subscribe(observer: RaftObserver, topics: Array<string>): void;
69
+ unsubscribe(observer: RaftObserver): void;
70
+ receivedRICEvent(raftId: string, eventType: any, eventEnum: any, eventName: any, eventData: any): void;
71
+ /**
72
+ * Save the file on the device
73
+ */
74
+ saveFileOnDevice(fileName: string, base64: string): void | Promise<unknown>;
75
+ /**
76
+ * Save the file on the device's local storage
77
+ */
78
+ saveFileOnDeviceLocalStorage(dirname: string, fileName: string, base64: string): void | Promise<unknown>;
79
+ /**
80
+ * Load the file from the device's local storage
81
+ */
82
+ loadFileFromDeviceLocalStorage(dirname: string, fileName: string): void | Promise<unknown>;
83
+ /**
84
+ * Delete the file from the device's local storage
85
+ */
86
+ deleteFileFromDeviceLocalStorage(dirname: string, fileName: string): void | Promise<unknown>;
87
+ /**
88
+ * List the files from the device's local storage
89
+ */
90
+ listFilesFromDeviceLocalStorage(dirname: string): Promise<unknown>;
91
+ }
@@ -0,0 +1,448 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { createElement } from "react";
38
+ import modalState from "../../state-observables/modal/ModalState";
39
+ import { RaftConnectionMethod, RaftTypeE } from "../../types/raft";
40
+ import WebAppCommunicator from "../../wrapper-app/communicators/WebAppCommunicator";
41
+ import RAFT from "../RAFTs/RAFT";
42
+ import Marty from "../RAFTs/Marty/Marty";
43
+ import Cog from "../RAFTs/Cog/Cog";
44
+ import VerificationModal from "../../components/modals/VerificationModal";
45
+ import { raftFoundSubscriptionHelper } from "../RAFTs/raft-subscription-helpers";
46
+ import { AppSentMessage } from "../../types/communication-between-apps/wrapper-communication";
47
+ import VerificationModalPhoneApp from "../../components/modals/VerificationModalPhoneApp";
48
+ import Logger from "../../services/logger/Logger";
49
+ import isPhoneApp from "../../utils/phone-app-communication/is-phone-app";
50
+ import DisconnectConfirmationModal from "../../components/modals/DisconnectConfirmation";
51
+ import Toaster from "../../utils/Toaster";
52
+ var SHOW_LOGS = true;
53
+ var TAG = "ApplicationManager";
54
+ var ApplicationManager = /** @class */ (function () {
55
+ function ApplicationManager() {
56
+ // Observers
57
+ this._observers = {};
58
+ // Connected RICs
59
+ this.connectedRafts = {};
60
+ // Callback to call when a RAFT is selected (Phone App only)
61
+ // We need that to make sure the connection button gets the selected RAFT once the user selects one
62
+ this.ricSelectedCb = null;
63
+ // // RICNotificationsManager
64
+ // private _ricNotificationsManager: RICNotificationsManager = new RICNotificationsManager(
65
+ // this
66
+ // );
67
+ // sound streaming stats
68
+ // public soundStreamingStats = new MartySoundStreamingStats();
69
+ // Updater removers: when marty disconnects
70
+ // these functions will clear the time intervals
71
+ // created for updating the sensors
72
+ // all dbs for session data
73
+ // public sessionDbs = new SessionsDBManager();
74
+ // toaster
75
+ this.toaster = Toaster;
76
+ // connected raft context methods
77
+ this.connectedRaftContextMethods = {
78
+ addConnectedRaft: function (connectedRaft) { },
79
+ removeConnectedRaft: function (connectedRaftId) { },
80
+ setSelectedRaft: function (connectedRaftId) { },
81
+ };
82
+ this.isPhoneApp = isPhoneApp;
83
+ // super();
84
+ // AnalyticsManager.appStartSession();
85
+ }
86
+ ApplicationManager.prototype.createNewCog = function (id) {
87
+ return new Cog(id);
88
+ };
89
+ ApplicationManager.prototype.createNewMarty = function (id) {
90
+ return new Marty(id);
91
+ };
92
+ /**
93
+ * Generic Connect method
94
+ * This method is called from various environments (connection button, blocksjr, blocks etc.)
95
+ * Known issue: connecting to a raft from within a platform won't add the newly connected raft to the connectedRafts hook
96
+ */
97
+ ApplicationManager.prototype.connectGeneric = function (afterRaftConnectedCb) {
98
+ return __awaiter(this, void 0, void 0, function () {
99
+ var e_1, newRaft, e_2;
100
+ var _this = this;
101
+ return __generator(this, function (_a) {
102
+ switch (_a.label) {
103
+ case 0:
104
+ if (!isPhoneApp()) return [3 /*break*/, 5];
105
+ _a.label = 1;
106
+ case 1:
107
+ _a.trys.push([1, 3, , 4]);
108
+ return [4 /*yield*/, window.applicationManager.startDiscovery(function (newRaft) {
109
+ _this.connectedRaftContextMethods.addConnectedRaft({ id: newRaft.id, name: newRaft.getFriendlyName() || "", isSelected: true });
110
+ afterRaftConnectedCb(newRaft);
111
+ })];
112
+ case 2:
113
+ _a.sent();
114
+ return [3 /*break*/, 4];
115
+ case 3:
116
+ e_1 = _a.sent();
117
+ Logger.error(SHOW_LOGS, TAG, "Failed to start discovery: ".concat(e_1));
118
+ return [3 /*break*/, 4];
119
+ case 4: return [3 /*break*/, 8];
120
+ case 5:
121
+ _a.trys.push([5, 7, , 8]);
122
+ return [4 /*yield*/, window.applicationManager.connectToRIC(RaftConnectionMethod.WEB_BLE)];
123
+ case 6:
124
+ newRaft = _a.sent();
125
+ if (newRaft) {
126
+ this.connectedRaftContextMethods.addConnectedRaft({ id: newRaft.id, name: newRaft.getFriendlyName() || "", isSelected: true });
127
+ afterRaftConnectedCb(newRaft);
128
+ }
129
+ return [3 /*break*/, 8];
130
+ case 7:
131
+ e_2 = _a.sent();
132
+ Logger.error(SHOW_LOGS, TAG, "Failed to connect to new robot: ".concat(e_2));
133
+ return [3 /*break*/, 8];
134
+ case 8: return [2 /*return*/];
135
+ }
136
+ });
137
+ });
138
+ };
139
+ /**
140
+ * Disconnect from RAFT generic
141
+ * This method is called from various environments (connection button, blocksjr, blocks etc.)
142
+ */
143
+ ApplicationManager.prototype.disconnectGeneric = function (raft) {
144
+ return __awaiter(this, void 0, void 0, function () {
145
+ var confirmDisconnect, e_3;
146
+ return __generator(this, function (_a) {
147
+ switch (_a.label) {
148
+ case 0:
149
+ _a.trys.push([0, 3, , 4]);
150
+ return [4 /*yield*/, modalState.setModal(createElement(DisconnectConfirmationModal, { connectedRaft: window.applicationManager.connectedRafts[raft.id] }), "Are you sure you want to disconnect from your ".concat(raft.getFriendlyName(), "?"))];
151
+ case 1:
152
+ confirmDisconnect = _a.sent();
153
+ if (!confirmDisconnect) {
154
+ return [2 /*return*/];
155
+ }
156
+ return [4 /*yield*/, window.applicationManager.disconnectFromRaft(raft.id)];
157
+ case 2:
158
+ _a.sent();
159
+ return [3 /*break*/, 4];
160
+ case 3:
161
+ e_3 = _a.sent();
162
+ Logger.error(SHOW_LOGS, TAG, "Failed to disconnect from robot: ".concat(e_3));
163
+ return [3 /*break*/, 4];
164
+ case 4: return [2 /*return*/];
165
+ }
166
+ });
167
+ });
168
+ };
169
+ /**
170
+ * Selects a RAFT in Phone's verification modal
171
+ */
172
+ ApplicationManager.prototype.selectRaft = function (ricToConnectTo, method) {
173
+ var _a, _b;
174
+ return __awaiter(this, void 0, void 0, function () {
175
+ var selectResults, raftId, raftType, raft;
176
+ return __generator(this, function (_c) {
177
+ switch (_c.label) {
178
+ case 0: return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.RAFT_SELECT, { discoveredRIC: ricToConnectTo, method: method })];
179
+ case 1:
180
+ selectResults = _c.sent();
181
+ if (!selectResults.success) return [3 /*break*/, 3];
182
+ raftId = (_a = selectResults.data) === null || _a === void 0 ? void 0 : _a.raftId;
183
+ raftType = (_b = selectResults.data) === null || _b === void 0 ? void 0 : _b.raftType;
184
+ if (!raftId || !raftType) {
185
+ throw new Error("RAFT ID or RAFT Type is missing: ".concat(raftId, " ").concat(raftType));
186
+ }
187
+ raft = void 0;
188
+ switch (raftType) {
189
+ case RaftTypeE.MARTY:
190
+ raft = this.createNewMarty(raftId);
191
+ break;
192
+ case RaftTypeE.COG:
193
+ raft = this.createNewCog(raftId);
194
+ break;
195
+ default:
196
+ throw new Error("Unknown RAFT type");
197
+ }
198
+ this.connectedRafts[raftId] = raft;
199
+ // get missed Connect event
200
+ window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_MISSED_CONN_EVENT, { raftId: raftId });
201
+ // Note: we're verifying the RAFT from the place this functions is called
202
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 200); })];
203
+ case 2:
204
+ // Note: we're verifying the RAFT from the place this functions is called
205
+ _c.sent();
206
+ if (this.ricSelectedCb) {
207
+ this.ricSelectedCb(raft);
208
+ }
209
+ return [2 /*return*/, raft];
210
+ case 3:
211
+ Logger.warn(SHOW_LOGS, TAG, "Failed to select RAFT with id: ".concat(ricToConnectTo._id));
212
+ _c.label = 4;
213
+ case 4: return [2 /*return*/, null];
214
+ }
215
+ });
216
+ });
217
+ };
218
+ ApplicationManager.prototype.connectToRIC = function (method) {
219
+ var _a, _b;
220
+ return __awaiter(this, void 0, void 0, function () {
221
+ var wasConnectedObj, raftId, raftType, raft;
222
+ return __generator(this, function (_c) {
223
+ switch (_c.label) {
224
+ case 0: return [4 /*yield*/, RAFT.connect(method)];
225
+ case 1:
226
+ wasConnectedObj = _c.sent();
227
+ if (!wasConnectedObj.success) return [3 /*break*/, 3];
228
+ raftId = (_a = wasConnectedObj.data) === null || _a === void 0 ? void 0 : _a.raftId;
229
+ raftType = (_b = wasConnectedObj.data) === null || _b === void 0 ? void 0 : _b.raftType;
230
+ if (!raftId || !raftType) {
231
+ throw new Error("RAFT ID or RAFT Type is missing: ".concat(raftId, " ").concat(raftType));
232
+ }
233
+ raft = void 0;
234
+ switch (raftType) {
235
+ case RaftTypeE.MARTY:
236
+ raft = this.createNewMarty(raftId);
237
+ break;
238
+ case RaftTypeE.COG:
239
+ raft = this.createNewCog(raftId);
240
+ break;
241
+ default:
242
+ throw new Error("Unknown RAFT type");
243
+ }
244
+ this.connectedRafts[raftId] = raft;
245
+ // get missed Connect event
246
+ window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_MISSED_CONN_EVENT, { raftId: raftId });
247
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 200); })];
248
+ case 2:
249
+ _c.sent();
250
+ // start verification process
251
+ modalState.setModal(createElement(VerificationModal, { connectedRAFT_: raft }), "Looking for ".concat(raft.type));
252
+ return [2 /*return*/, raft];
253
+ case 3: return [2 /*return*/, null];
254
+ }
255
+ });
256
+ });
257
+ };
258
+ /**
259
+ * Disconnect from RAFT
260
+ */
261
+ ApplicationManager.prototype.disconnectFromRaft = function (raftId) {
262
+ return __awaiter(this, void 0, void 0, function () {
263
+ var raft;
264
+ return __generator(this, function (_a) {
265
+ switch (_a.label) {
266
+ case 0:
267
+ this.connectedRaftContextMethods.removeConnectedRaft(raftId);
268
+ raft = this.connectedRafts[raftId];
269
+ if (!raft) {
270
+ return [2 /*return*/];
271
+ }
272
+ return [4 /*yield*/, raft.disconnect()];
273
+ case 1:
274
+ _a.sent();
275
+ this._removeRIC(raftId, 11000);
276
+ return [2 /*return*/];
277
+ }
278
+ });
279
+ });
280
+ };
281
+ /**
282
+ * Removes raft after a certain time
283
+ * Removes from the rics list after x seconds so that we can still get the last event
284
+ */
285
+ ApplicationManager.prototype._removeRIC = function (raftId, timeout) {
286
+ var _this = this;
287
+ var ricRemovalTimeout = setTimeout(function () {
288
+ delete _this.connectedRafts[raftId];
289
+ clearTimeout(ricRemovalTimeout);
290
+ }, timeout);
291
+ };
292
+ /**
293
+ * Start looking for rics to connect to
294
+ * This is used from the Phone App only
295
+ */
296
+ ApplicationManager.prototype.startDiscovery = function (ricSelectedCb) {
297
+ return __awaiter(this, void 0, void 0, function () {
298
+ var foundRICs, wasDiscoveryStarted;
299
+ return __generator(this, function (_a) {
300
+ switch (_a.label) {
301
+ case 0:
302
+ this.ricSelectedCb = ricSelectedCb;
303
+ foundRICs = [];
304
+ raftFoundSubscriptionHelper().subscribe(function (_a) {
305
+ var discoveredRIC = _a.discoveredRIC;
306
+ // if the discovered RAFT is already in the list, don't add it, just update the rssi
307
+ var foundRICIdx = foundRICs.findIndex(function (ric_) { return ric_._id === discoveredRIC._id; });
308
+ if (foundRICIdx !== -1) {
309
+ foundRICs[foundRICIdx] = discoveredRIC;
310
+ }
311
+ else {
312
+ foundRICs.push(discoveredRIC);
313
+ }
314
+ // foundRICs.sort((a, b) => b._rssi - a._rssi);
315
+ modalState.setModal(createElement(VerificationModalPhoneApp, { foundRICs: foundRICs }), "Looking for RAFT");
316
+ });
317
+ return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.RAFT_START_DISCOVERY)];
318
+ case 1:
319
+ wasDiscoveryStarted = _a.sent();
320
+ if (!wasDiscoveryStarted) {
321
+ return [2 /*return*/, raftFoundSubscriptionHelper().unsubscribe()];
322
+ }
323
+ return [4 /*yield*/, modalState.setModal(createElement(VerificationModalPhoneApp, { foundRICs: [] }), "Looking for RAFT")];
324
+ case 2:
325
+ _a.sent();
326
+ raftFoundSubscriptionHelper().unsubscribe();
327
+ return [2 /*return*/];
328
+ }
329
+ });
330
+ });
331
+ };
332
+ /**
333
+ * Stop verifying raft
334
+ */
335
+ ApplicationManager.prototype.stopVerifyingRaft = function (raftId, isCorrectRIC) {
336
+ var _a;
337
+ return __awaiter(this, void 0, void 0, function () {
338
+ return __generator(this, function (_b) {
339
+ switch (_b.label) {
340
+ case 0: return [4 /*yield*/, ((_a = this.connectedRafts[raftId]) === null || _a === void 0 ? void 0 : _a.stopVerifyingRaft(isCorrectRIC))];
341
+ case 1:
342
+ _b.sent();
343
+ this._removeRIC(raftId, 11000);
344
+ return [2 /*return*/];
345
+ }
346
+ });
347
+ });
348
+ };
349
+ /**
350
+ * Publishing events to observers
351
+ * It could be either events we get from RAFT, or custom events related to the app
352
+ */
353
+ ApplicationManager.prototype.publish = function (eventType, eventEnum, eventName, eventData) {
354
+ if (this._observers.hasOwnProperty(eventType)) {
355
+ for (var _i = 0, _a = this._observers[eventType]; _i < _a.length; _i++) {
356
+ var observer = _a[_i];
357
+ observer.notify(eventType, eventEnum, eventName, eventData);
358
+ }
359
+ }
360
+ };
361
+ // observer
362
+ ApplicationManager.prototype.subscribe = function (observer, topics) {
363
+ for (var _i = 0, topics_1 = topics; _i < topics_1.length; _i++) {
364
+ var topic = topics_1[_i];
365
+ if (!this._observers[topic]) {
366
+ this._observers[topic] = [];
367
+ }
368
+ if (this._observers[topic].indexOf(observer) === -1) {
369
+ this._observers[topic].push(observer);
370
+ }
371
+ }
372
+ };
373
+ ApplicationManager.prototype.unsubscribe = function (observer) {
374
+ for (var topic in this._observers) {
375
+ if (this._observers.hasOwnProperty(topic)) {
376
+ var index = this._observers[topic].indexOf(observer);
377
+ if (index !== -1) {
378
+ this._observers[topic].splice(index, 1);
379
+ }
380
+ }
381
+ }
382
+ };
383
+ ApplicationManager.prototype.receivedRICEvent = function (raftId, eventType, eventEnum, eventName, eventData) {
384
+ var _a;
385
+ if (raftId === "scanner") {
386
+ this.publish(eventType, eventEnum, eventName, eventData);
387
+ }
388
+ else {
389
+ (_a = this.connectedRafts[raftId]) === null || _a === void 0 ? void 0 : _a.receivedRICEvent(eventType, eventEnum, eventName, eventData);
390
+ }
391
+ };
392
+ //======================//
393
+ /* NATIVE COMMANDS ONLY */
394
+ //======================//
395
+ /**
396
+ * Save the file on the device
397
+ */
398
+ ApplicationManager.prototype.saveFileOnDevice = function (fileName, base64) {
399
+ if (!fileName || !base64) {
400
+ return Logger.error(SHOW_LOGS, TAG, "fileName or base64 is missing: fileName: ".concat(fileName, ", base64: ").concat(base64));
401
+ }
402
+ return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.SAVE_FILE_ON_DEVICE, { fileName: fileName, base64: base64 });
403
+ };
404
+ /**
405
+ * Save the file on the device's local storage
406
+ */
407
+ ApplicationManager.prototype.saveFileOnDeviceLocalStorage = function (dirname, fileName, base64) {
408
+ if (!fileName || !base64) {
409
+ return Logger.error(SHOW_LOGS, TAG, "fileName or base64 is missing: fileName: ".concat(fileName, ", base64: ").concat(base64));
410
+ }
411
+ return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.SAVE_FILE_ON_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName, base64: base64 });
412
+ };
413
+ /**
414
+ * Load the file from the device's local storage
415
+ */
416
+ ApplicationManager.prototype.loadFileFromDeviceLocalStorage = function (dirname, fileName) {
417
+ if (!fileName) {
418
+ return Logger.error(SHOW_LOGS, TAG, "fileName is missing: fileName: ".concat(fileName));
419
+ }
420
+ return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.LOAD_FILE_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName });
421
+ };
422
+ /**
423
+ * Delete the file from the device's local storage
424
+ */
425
+ ApplicationManager.prototype.deleteFileFromDeviceLocalStorage = function (dirname, fileName) {
426
+ if (!fileName) {
427
+ return Logger.error(SHOW_LOGS, TAG, "fileName is missing: fileName: ".concat(fileName));
428
+ }
429
+ return window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.DELETE_FILE_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname, fileName: fileName });
430
+ };
431
+ /**
432
+ * List the files from the device's local storage
433
+ */
434
+ ApplicationManager.prototype.listFilesFromDeviceLocalStorage = function (dirname) {
435
+ return __awaiter(this, void 0, void 0, function () {
436
+ return __generator(this, function (_a) {
437
+ switch (_a.label) {
438
+ case 0: return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.LIST_FILES_FROM_DEVICE_LOCAL_STORAGE, { dirname: dirname })];
439
+ case 1: return [2 /*return*/, _a.sent()];
440
+ }
441
+ });
442
+ });
443
+ };
444
+ // Communicator to the wrapper app
445
+ ApplicationManager.wrapperAppCommunicator = new WebAppCommunicator();
446
+ return ApplicationManager;
447
+ }());
448
+ export default ApplicationManager;
@@ -0,0 +1,39 @@
1
+ import RAFT from "../RAFT";
2
+ import RICInterface from "../RAFTInterface";
3
+ import { RaftTypeE } from "../../../types/raft";
4
+ import { CogStateInfo, RICLedLcdColours } from "@robotical/roboticaljs";
5
+ import { RaftConnEvent, RaftPublishEvent, RaftUpdateEvent } from "@robdobsn/raftjs";
6
+ import { RaftInfoEvents } from "../../../types/events/raft-info";
7
+ export declare class Cog extends RAFT implements RICInterface {
8
+ id: string;
9
+ type: RaftTypeE;
10
+ _ledLcdColours: RICLedLcdColours;
11
+ raftStateInfo: CogStateInfo | null;
12
+ constructor(id: string);
13
+ get ledLcdColours(): RICLedLcdColours;
14
+ /**
15
+ * Gets the RSSI of the RAFT
16
+ */
17
+ getRSSI(): number;
18
+ /**
19
+ * Gets the battery strength of the RAFT
20
+ */
21
+ getBatteryStrength(): number;
22
+ /**
23
+ * This methods handles RAFT events coming from the RICConnector of the wrapper
24
+ */
25
+ handleRaftEvent(eventType: string, eventEnum: RaftConnEvent | RaftUpdateEvent | RaftPublishEvent | RaftInfoEvents, eventName: string, eventData: any): void;
26
+ /**
27
+ * Pub Event Handler
28
+ */
29
+ pubEventHandler(eventEnum: RaftPublishEvent, eventName: string, data: any): Promise<void>;
30
+ /**
31
+ * Highlights the COG by flashing the LED and playing a tune
32
+ */
33
+ highlight(): Promise<void>;
34
+ /**
35
+ * Raft Info Event Handler
36
+ */
37
+ raftInfoEventHandler(eventEnum: RaftInfoEvents, eventName: string, data: any): Promise<void>;
38
+ }
39
+ export default Cog;