Small bugfix
This commit is contained in:
6
dist/CameraRunner.js
vendored
6
dist/CameraRunner.js
vendored
@@ -42,6 +42,8 @@ var Utils_1 = require("./Utils");
|
||||
var PREFIX = "[CameraRunner]";
|
||||
var CameraRunner = /** @class */ (function () {
|
||||
function CameraRunner(Main) {
|
||||
this.errorTriggerStartupDelay = 10000;
|
||||
this.bootTime = Date.now();
|
||||
this.state = 'DISCONNECTED';
|
||||
this.processStatus = {
|
||||
state: 'STOPPED',
|
||||
@@ -92,6 +94,9 @@ var CameraRunner = /** @class */ (function () {
|
||||
this.error = error;
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
if (error != null &&
|
||||
Date.now() - this.bootTime > this.errorTriggerStartupDelay)
|
||||
this._Main.Twilio.sendError('CameraRunner', error);
|
||||
if (state == 'FAILED' || state == 'DISCONNECTED')
|
||||
console.warn(PREFIX, message !== null && message !== void 0 ? message : error);
|
||||
else
|
||||
@@ -175,6 +180,7 @@ var CameraRunner = /** @class */ (function () {
|
||||
reconnectionDelay: 2000,
|
||||
});
|
||||
this.socket.on('connect', function () {
|
||||
_this._Main.Twilio.resetError('CameraRunner');
|
||||
_this.setInfo('Connected', null, 'CONNECTED');
|
||||
_this.startPollClock();
|
||||
});
|
||||
|
||||
2
dist/CameraRunner.js.map
vendored
2
dist/CameraRunner.js.map
vendored
File diff suppressed because one or more lines are too long
7
dist/Configuration/DefaultConfiguration.js
vendored
7
dist/Configuration/DefaultConfiguration.js
vendored
@@ -25,6 +25,13 @@ exports.DefaultConfiguration = {
|
||||
},
|
||||
pollInterval: 5000,
|
||||
},
|
||||
twilio: {
|
||||
accountSid: '',
|
||||
authToken: '',
|
||||
fromNumber: '',
|
||||
toNumbers: [],
|
||||
aggregateTimeout: 15000,
|
||||
},
|
||||
support: {
|
||||
telephone: '+31613392837',
|
||||
},
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"DefaultConfiguration.js","sourceRoot":"","sources":["../../src/Configuration/DefaultConfiguration.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAW;IAC3C,SAAS,EAAE;QACV,IAAI,EAAE,IAAI;KACV;IACD,KAAK,EAAE;QACN,UAAU,EAAE;YACX,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;SAClB;QAED,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;KAC9B;IACD,YAAY,EAAE;QACb,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,YAAY,EAAE,IAAI;KAClB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,cAAc;KACzB;CACD,CAAC"}
|
||||
{"version":3,"file":"DefaultConfiguration.js","sourceRoot":"","sources":["../../src/Configuration/DefaultConfiguration.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAW;IAC3C,SAAS,EAAE;QACV,IAAI,EAAE,IAAI;KACV;IACD,KAAK,EAAE;QACN,UAAU,EAAE;YACX,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;SAClB;QAED,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;KAC9B;IACD,YAAY,EAAE;QACb,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,YAAY,EAAE,IAAI;KAClB;IACD,MAAM,EAAE;QACP,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,KAAK;KACvB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,cAAc;KACzB;CACD,CAAC"}
|
||||
9
dist/Main.js
vendored
9
dist/Main.js
vendored
@@ -44,11 +44,13 @@ var ConfigurationManager_1 = require("./Configuration/ConfigurationManager");
|
||||
var CameraRunner_1 = require("./CameraRunner");
|
||||
var UnityRunner_1 = require("./Unity/UnityRunner");
|
||||
var UnityWebSocket_1 = require("./Unity/UnityWebSocket");
|
||||
var Twilio_1 = require("./Twilio");
|
||||
var Main = /** @class */ (function () {
|
||||
function Main() {
|
||||
this.dataPath = (0, path_1.join)((0, os_1.homedir)(), 'MorphixProductions', 'NTSHControl');
|
||||
this.ConfigurationManager = new ConfigurationManager_1.ConfigurationManager(this);
|
||||
this.WebServer = new WebServer_1.WebServer(this);
|
||||
this.Twilio = new Twilio_1.TwilioHandler(this);
|
||||
this.CameraRunner = new CameraRunner_1.CameraRunner(this);
|
||||
this.UnityRunner = new UnityRunner_1.UnityRunner(this);
|
||||
this.UnityWebSocket = new UnityWebSocket_1.UnityWebSocket(this);
|
||||
@@ -65,8 +67,11 @@ var Main = /** @class */ (function () {
|
||||
return [4 /*yield*/, this.WebServer.listen()];
|
||||
case 2:
|
||||
_b.sent();
|
||||
return [4 /*yield*/, this.CameraRunner.connect()];
|
||||
return [4 /*yield*/, this.Twilio.load()];
|
||||
case 3:
|
||||
_b.sent();
|
||||
return [4 /*yield*/, this.CameraRunner.connect()];
|
||||
case 4:
|
||||
_b.sent();
|
||||
setTimeout(function () {
|
||||
_this.UnityRunner.start();
|
||||
@@ -93,10 +98,12 @@ var Main = /** @class */ (function () {
|
||||
_this.CameraRunner.sendCommand(doReboot ? 'reboot' : 'restart', function (response) {
|
||||
if (!response.succeed) {
|
||||
console.error('Failed to reboot CameraRunner:', response.message);
|
||||
_this.Twilio.sendError('CameraRunner', "Failed to reboot CameraRunner: ".concat(response.message));
|
||||
resolve(false);
|
||||
}
|
||||
else {
|
||||
console.log('CameraRunner rebooted successfully.');
|
||||
_this.Twilio.sendError('CameraRunner', null);
|
||||
resolve(true);
|
||||
}
|
||||
});
|
||||
|
||||
2
dist/Main.js.map
vendored
2
dist/Main.js.map
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6BAA4B;AAC5B,mDAAkD;AAClD,yBAA6B;AAC7B,6EAG8C;AAC9C,+CAA8C;AAC9C,mDAAkD;AAClD,yDAAwD;AAExD;IAAA;QACC,aAAQ,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;QAEhE,yBAAoB,GAAG,IAAI,2CAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,cAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,CAAC;QAEhC,iBAAY,GAAG,IAAI,2BAAY,CAAC,IAAI,CAAC,CAAC;QACtC,gBAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QACpC,mBAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,CAAC;IA6C3C,CAAC;IAzCM,oBAAK,GAAX;;;;;;4BACC,qBAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAA;;wBAAtC,SAAsC,CAAC;wBACvC,qBAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAA;;wBAA7B,SAA6B,CAAC;wBAE9B,qBAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAA;;wBAAjC,SAAiC,CAAC;wBAElC,UAAU,CAAC;4BACV,KAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;wBAC1B,CAAC,EAAE,MAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,mCAAI,CAAC,CAAC,CAAC;;;;;KACnD;IAEK,sBAAO,GAAb;;;;;;;wBACC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;wBACvC,qBAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAA;;wBAA7B,SAA6B,CAAC;wBAExB,QAAQ,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;wBACvD,OAAO,CAAC,GAAG,CAAC,UAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,qBAAkB,CAAC,CAAC;wBACxD,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO;gCACzC,KAAI,CAAC,YAAY,CAAC,WAAW,CAC5B,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC/B,UAAC,QAAgD;oCAChD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wCACvB,OAAO,CAAC,KAAK,CACZ,gCAAgC,EAChC,QAAQ,CAAC,OAAO,CAChB,CAAC;wCACF,OAAO,CAAC,KAAK,CAAC,CAAC;oCAChB,CAAC;yCAAM,CAAC;wCACP,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;wCACnD,OAAO,CAAC,IAAI,CAAC,CAAC;oCACf,CAAC;gCACF,CAAC,CACD,CAAC;4BACH,CAAC,CAAC,EAAA;;wBAhBI,OAAO,GAAG,SAgBd;wBACF,IAAI,CAAC,OAAO;4BAAE,sBAAO;wBAErB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;wBACvC,qBAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAA;;wBAA9B,SAA8B,CAAC;wBAE/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;;;;;KACjC;IACF,WAAC;AAAD,CAAC,AArDD,IAqDC;AArDY,oBAAI"}
|
||||
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":"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"}
|
||||
116
dist/Twilio.js
vendored
Normal file
116
dist/Twilio.js
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
||||
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
||||
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;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.TwilioHandler = void 0;
|
||||
var PREFIX = '[Twilio]';
|
||||
var TwilioHandler = /** @class */ (function () {
|
||||
function TwilioHandler(Main) {
|
||||
this.lastErrors = new Map();
|
||||
this.errorLog = [];
|
||||
this._Main = Main;
|
||||
}
|
||||
TwilioHandler.prototype.load = function () {
|
||||
this.client = require('twilio')(this._Main.Config.twilio.accountSid, this._Main.Config.twilio.authToken);
|
||||
};
|
||||
TwilioHandler.prototype.resetError = function (category) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
return __generator(this, function (_a) {
|
||||
if (!this.lastErrors.has(category))
|
||||
return [2 /*return*/];
|
||||
this.lastErrors.delete(category);
|
||||
return [2 /*return*/];
|
||||
});
|
||||
});
|
||||
};
|
||||
TwilioHandler.prototype.sendError = function (category, error) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _this = this;
|
||||
return __generator(this, function (_a) {
|
||||
if (this.lastErrors.get(category) === error)
|
||||
return [2 /*return*/];
|
||||
this.lastErrors.set(category, error);
|
||||
if (error == null)
|
||||
return [2 /*return*/];
|
||||
this.errorLog.push("".concat(category, ": ").concat(error));
|
||||
clearTimeout(this.errorTimeout);
|
||||
this.errorTimeout = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
|
||||
var errorMessage, promises;
|
||||
var _this = this;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0:
|
||||
errorMessage = this.errorLog
|
||||
.map(function (error) { return "- ".concat(error); })
|
||||
.join('\n');
|
||||
this.errorLog = [];
|
||||
console.log(PREFIX, "Sending to Twilio:\n", errorMessage);
|
||||
promises = this._Main.Config.twilio.toNumbers.map(function (toNumber) { return _this.sendMessage(toNumber, errorMessage); });
|
||||
return [4 /*yield*/, Promise.all(promises)];
|
||||
case 1:
|
||||
_a.sent();
|
||||
return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
}); }, 15000);
|
||||
return [2 /*return*/];
|
||||
});
|
||||
});
|
||||
};
|
||||
TwilioHandler.prototype.sendMessage = function (to, message) {
|
||||
var _this = this;
|
||||
return new Promise(function (resolve) {
|
||||
_this.client.messages
|
||||
.create({
|
||||
body: message,
|
||||
from: "".concat(_this._Main.Config.twilio.fromNumber),
|
||||
to: to,
|
||||
})
|
||||
.then(function (message) {
|
||||
console.log("Twilio message sent with SID: ".concat(message.sid));
|
||||
resolve(true);
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.error('Error sending Twilio message:', error);
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
};
|
||||
return TwilioHandler;
|
||||
}());
|
||||
exports.TwilioHandler = TwilioHandler;
|
||||
//# sourceMappingURL=Twilio.js.map
|
||||
1
dist/Twilio.js.map
vendored
Normal file
1
dist/Twilio.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"Twilio.js","sourceRoot":"","sources":["../src/Twilio.ts"],"names":[],"mappings":"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"}
|
||||
4
dist/Unity/UnityRunner.js
vendored
4
dist/Unity/UnityRunner.js
vendored
@@ -54,6 +54,7 @@ var LOG_OUTPUT = !process.argv.includes('--no-output-log');
|
||||
var UnityRunner = /** @class */ (function () {
|
||||
function UnityRunner(Main) {
|
||||
this.message = 'Awaiting startup delay...';
|
||||
this.bootTime = Date.now();
|
||||
this.startTime = null;
|
||||
this.output = { current: [], last: [] };
|
||||
this.restartTriggered = false;
|
||||
@@ -98,6 +99,8 @@ var UnityRunner = /** @class */ (function () {
|
||||
this.error = error;
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
if (error != null)
|
||||
this._Main.Twilio.sendError('UnityRunner', error);
|
||||
this.output.current.push("[".concat(new Date().toLocaleTimeString('nl-NL'), "] [System] [").concat(state, "] ").concat(message !== null && message !== void 0 ? message : error));
|
||||
if (state == 'PROBLEM' || state == 'STOPPED')
|
||||
console.warn(PREFIX, message !== null && message !== void 0 ? message : error);
|
||||
@@ -300,6 +303,7 @@ var UnityRunner = /** @class */ (function () {
|
||||
((_b = _this.process) === null || _b === void 0 ? void 0 : _b.exitCode) != null ||
|
||||
_this.restartTriggered)
|
||||
return;
|
||||
_this._Main.Twilio.resetError('UnityRunner');
|
||||
_this.setInfo('Running', '', 'RUNNING');
|
||||
_this._Main.UnityWebSocket.connect();
|
||||
}, 5000);
|
||||
|
||||
2
dist/Unity/UnityRunner.js.map
vendored
2
dist/Unity/UnityRunner.js.map
vendored
File diff suppressed because one or more lines are too long
19
dist/Unity/UnityWebSocket.js
vendored
19
dist/Unity/UnityWebSocket.js
vendored
@@ -1,4 +1,15 @@
|
||||
"use strict";
|
||||
var __assign = (this && this.__assign) || function () {
|
||||
__assign = Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
return __assign.apply(this, arguments);
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
@@ -44,6 +55,7 @@ var UnityWebSocket = /** @class */ (function () {
|
||||
function UnityWebSocket(Main) {
|
||||
this.state = 'DISCONNECTED';
|
||||
this.message = 'Waiting for process...';
|
||||
this.errorTriggerStartupDelay = 1000;
|
||||
this.parameters = {
|
||||
timelineWatching: false,
|
||||
timelineStanding: false,
|
||||
@@ -125,6 +137,8 @@ var UnityWebSocket = /** @class */ (function () {
|
||||
this.error = error;
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
if (error != null)
|
||||
this._Main.Twilio.sendError('UnityWebSocket', error);
|
||||
if (state == 'FAILED' || state == 'DISCONNECTED')
|
||||
console.warn(PREFIX, message !== null && message !== void 0 ? message : error);
|
||||
else
|
||||
@@ -158,7 +172,9 @@ var UnityWebSocket = /** @class */ (function () {
|
||||
this.parameters.outOfService =
|
||||
(_a = message.heartbeat.showOutOfService) !== null && _a !== void 0 ? _a : false;
|
||||
this.parameters.sensors = message.heartbeat.dataSensors;
|
||||
this.parameters.sliders = message.heartbeat.dataSliders;
|
||||
this.parameters.sliders = message.heartbeat.dataSliders.map(function (slider) {
|
||||
return __assign(__assign({}, slider), { decimalPlaces: slider.min == 0 && slider.max == 1 ? 2 : null });
|
||||
});
|
||||
this.broadcastState();
|
||||
break;
|
||||
case 'response_camera_frame':
|
||||
@@ -238,6 +254,7 @@ var UnityWebSocket = /** @class */ (function () {
|
||||
});
|
||||
this.socket.on('open', function () {
|
||||
_this.startFetchClocks();
|
||||
_this._Main.Twilio.resetError('UnityWebSocket');
|
||||
_this.setInfo('Connected', null, 'CONNECTED');
|
||||
});
|
||||
this.socket.on('close', function () {
|
||||
|
||||
2
dist/Unity/UnityWebSocket.js.map
vendored
2
dist/Unity/UnityWebSocket.js.map
vendored
File diff suppressed because one or more lines are too long
308
package-lock.json
generated
308
package-lock.json
generated
@@ -17,6 +17,7 @@
|
||||
"fs-extra": "^11.3.2",
|
||||
"socket.io": "^4.8.1",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"twilio": "^5.10.3",
|
||||
"ws": "^8.18.3"
|
||||
}
|
||||
},
|
||||
@@ -181,6 +182,35 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/agent-base": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
||||
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"debug": "4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.12.2",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
|
||||
"integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.4",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/base64id": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
|
||||
@@ -210,6 +240,12 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer-equal-constant-time": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/bytes": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
||||
@@ -248,6 +284,18 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/content-disposition": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
|
||||
@@ -300,6 +348,12 @@
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/dayjs": {
|
||||
"version": "1.11.18",
|
||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
|
||||
"integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.4.3",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
||||
@@ -317,6 +371,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
@@ -340,6 +403,15 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/ecdsa-sig-formatter": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
||||
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
@@ -546,6 +618,21 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-set-tostringtag": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
|
||||
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.6",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
@@ -620,6 +707,63 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.11",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
|
||||
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"debug": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/form-data/node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/form-data/node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/forwarded": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
||||
@@ -728,6 +872,21 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-tostringtag": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-symbols": "^1.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
@@ -765,6 +924,19 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/https-proxy-agent": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
|
||||
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"agent-base": "6",
|
||||
"debug": "4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/iconv-lite": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||
@@ -810,6 +982,91 @@
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jsonwebtoken": {
|
||||
"version": "9.0.2",
|
||||
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
|
||||
"integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jws": "^3.2.2",
|
||||
"lodash.includes": "^4.3.0",
|
||||
"lodash.isboolean": "^3.0.3",
|
||||
"lodash.isinteger": "^4.0.4",
|
||||
"lodash.isnumber": "^3.0.3",
|
||||
"lodash.isplainobject": "^4.0.6",
|
||||
"lodash.isstring": "^4.0.1",
|
||||
"lodash.once": "^4.0.0",
|
||||
"ms": "^2.1.1",
|
||||
"semver": "^7.5.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12",
|
||||
"npm": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/jwa": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
|
||||
"integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"buffer-equal-constant-time": "^1.0.1",
|
||||
"ecdsa-sig-formatter": "1.0.11",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/jws": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
|
||||
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jwa": "^1.4.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/lodash.includes": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
|
||||
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isboolean": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
|
||||
"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isinteger": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
|
||||
"integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isnumber": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
|
||||
"integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isplainobject": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isstring": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
||||
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.once": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
@@ -950,6 +1207,12 @@
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/qs": {
|
||||
"version": "6.14.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
|
||||
@@ -1047,6 +1310,24 @@
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/scmp": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz",
|
||||
"integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.3",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
|
||||
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/send": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
|
||||
@@ -1368,6 +1649,24 @@
|
||||
"node": ">=0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/twilio": {
|
||||
"version": "5.10.3",
|
||||
"resolved": "https://registry.npmjs.org/twilio/-/twilio-5.10.3.tgz",
|
||||
"integrity": "sha512-msve3uADprpG+LRlthOxBUJWZDczGe+mdzotG7Wluaf8nn8fSIK0n2fX3INR26Xedeea/azmAdLK0c2rJhIHpQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "^1.12.0",
|
||||
"dayjs": "^1.11.9",
|
||||
"https-proxy-agent": "^5.0.0",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"qs": "^6.9.4",
|
||||
"scmp": "^2.1.0",
|
||||
"xmlbuilder": "^13.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/type-is": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
|
||||
@@ -1442,6 +1741,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/xmlbuilder": {
|
||||
"version": "13.0.2",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
|
||||
"integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/xmlhttprequest-ssl": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"fs-extra": "^11.3.2",
|
||||
"socket.io": "^4.8.1",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"twilio": "^5.10.3",
|
||||
"ws": "^8.18.3"
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,9 @@ export class CameraRunner {
|
||||
|
||||
socket: Socket;
|
||||
|
||||
errorTriggerStartupDelay = 10000;
|
||||
bootTime = Date.now();
|
||||
|
||||
state: ServiceState = 'DISCONNECTED';
|
||||
message?: string;
|
||||
error?: string;
|
||||
@@ -76,6 +79,12 @@ export class CameraRunner {
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
|
||||
if (
|
||||
error != null &&
|
||||
Date.now() - this.bootTime > this.errorTriggerStartupDelay
|
||||
)
|
||||
this._Main.Twilio.sendError('CameraRunner', error);
|
||||
|
||||
if (state == 'FAILED' || state == 'DISCONNECTED')
|
||||
console.warn(PREFIX, message ?? error);
|
||||
else console.log(PREFIX, message ?? error);
|
||||
@@ -147,6 +156,7 @@ export class CameraRunner {
|
||||
});
|
||||
|
||||
this.socket.on('connect', () => {
|
||||
this._Main.Twilio.resetError('CameraRunner');
|
||||
this.setInfo('Connected', null, 'CONNECTED');
|
||||
this.startPollClock();
|
||||
});
|
||||
|
||||
@@ -102,6 +102,7 @@ export interface Config {
|
||||
webServer: ConfigWebServer;
|
||||
unity: ConfigUnity;
|
||||
cameraRunner: ConfigCameraRunner;
|
||||
twilio: ConfigTwilio;
|
||||
support: ConfigSupport;
|
||||
}
|
||||
|
||||
@@ -134,6 +135,14 @@ export interface ConfigCameraRunner {
|
||||
pollInterval: number;
|
||||
}
|
||||
|
||||
export interface ConfigTwilio {
|
||||
accountSid: string;
|
||||
authToken: string;
|
||||
fromNumber: string;
|
||||
toNumbers: string[];
|
||||
aggregateTimeout: number;
|
||||
}
|
||||
|
||||
export interface ConfigSupport {
|
||||
telephone: string;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,13 @@ export const DefaultConfiguration: Config = {
|
||||
|
||||
pollInterval: 5000,
|
||||
},
|
||||
twilio: {
|
||||
accountSid: '',
|
||||
authToken: '',
|
||||
fromNumber: '',
|
||||
toNumbers: [],
|
||||
aggregateTimeout: 15000,
|
||||
},
|
||||
support: {
|
||||
telephone: '+31613392837',
|
||||
},
|
||||
|
||||
@@ -8,12 +8,14 @@ import {
|
||||
import { CameraRunner } from './CameraRunner';
|
||||
import { UnityRunner } from './Unity/UnityRunner';
|
||||
import { UnityWebSocket } from './Unity/UnityWebSocket';
|
||||
import { TwilioHandler } from './Twilio';
|
||||
|
||||
export class Main {
|
||||
dataPath = join(homedir(), 'MorphixProductions', 'NTSHControl');
|
||||
|
||||
ConfigurationManager = new ConfigurationManager(this);
|
||||
WebServer = new WebServer(this);
|
||||
Twilio = new TwilioHandler(this);
|
||||
|
||||
CameraRunner = new CameraRunner(this);
|
||||
UnityRunner = new UnityRunner(this);
|
||||
@@ -24,6 +26,7 @@ export class Main {
|
||||
async start() {
|
||||
await this.ConfigurationManager.load();
|
||||
await this.WebServer.listen();
|
||||
await this.Twilio.load();
|
||||
|
||||
await this.CameraRunner.connect();
|
||||
|
||||
@@ -47,9 +50,14 @@ export class Main {
|
||||
'Failed to reboot CameraRunner:',
|
||||
response.message
|
||||
);
|
||||
this.Twilio.sendError(
|
||||
'CameraRunner',
|
||||
`Failed to reboot CameraRunner: ${response.message}`
|
||||
);
|
||||
resolve(false);
|
||||
} else {
|
||||
console.log('CameraRunner rebooted successfully.');
|
||||
this.Twilio.sendError('CameraRunner', null);
|
||||
resolve(true);
|
||||
}
|
||||
}
|
||||
|
||||
71
src/Twilio.ts
Normal file
71
src/Twilio.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { Main } from './Main';
|
||||
|
||||
const PREFIX = '[Twilio]';
|
||||
export class TwilioHandler {
|
||||
private _Main: Main;
|
||||
|
||||
client;
|
||||
|
||||
constructor(Main: Main) {
|
||||
this._Main = Main;
|
||||
}
|
||||
|
||||
load() {
|
||||
this.client = require('twilio')(
|
||||
this._Main.Config.twilio.accountSid,
|
||||
this._Main.Config.twilio.authToken
|
||||
);
|
||||
}
|
||||
|
||||
async resetError(category: TwilioCategories) {
|
||||
if (!this.lastErrors.has(category)) return;
|
||||
this.lastErrors.delete(category);
|
||||
}
|
||||
|
||||
private lastErrors: Map<TwilioCategories, string> = new Map();
|
||||
private errorLog: string[] = [];
|
||||
private errorTimeout: NodeJS.Timeout;
|
||||
async sendError(category: TwilioCategories, error: string) {
|
||||
if (this.lastErrors.get(category) === error) return;
|
||||
|
||||
this.lastErrors.set(category, error);
|
||||
if (error == null) return;
|
||||
|
||||
this.errorLog.push(`${category}: ${error}`);
|
||||
clearTimeout(this.errorTimeout);
|
||||
this.errorTimeout = setTimeout(async () => {
|
||||
const errorMessage = this.errorLog
|
||||
.map((error) => `- ${error}`)
|
||||
.join('\n');
|
||||
this.errorLog = [];
|
||||
|
||||
console.log(PREFIX, `Sending to Twilio:\n`, errorMessage);
|
||||
|
||||
const promises = this._Main.Config.twilio.toNumbers.map(
|
||||
(toNumber) => this.sendMessage(toNumber, errorMessage)
|
||||
);
|
||||
await Promise.all(promises);
|
||||
}, 15000);
|
||||
}
|
||||
|
||||
sendMessage(to: string, message: string) {
|
||||
return new Promise<boolean>((resolve) => {
|
||||
this.client.messages
|
||||
.create({
|
||||
body: message,
|
||||
from: `${this._Main.Config.twilio.fromNumber}`,
|
||||
to: to,
|
||||
})
|
||||
.then((message: any) => {
|
||||
console.log(`Twilio message sent with SID: ${message.sid}`);
|
||||
resolve(true);
|
||||
})
|
||||
.catch((error: any) => {
|
||||
console.error('Error sending Twilio message:', error);
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
type TwilioCategories = 'CameraRunner' | 'UnityRunner' | 'UnityWebSocket';
|
||||
@@ -14,6 +14,8 @@ export class UnityRunner {
|
||||
message?: string = 'Awaiting startup delay...';
|
||||
error?: string;
|
||||
|
||||
bootTime = Date.now();
|
||||
|
||||
startTime: number = null;
|
||||
output: { current: string[]; last: string[] } = { current: [], last: [] };
|
||||
|
||||
@@ -71,6 +73,8 @@ export class UnityRunner {
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
|
||||
if (error != null) this._Main.Twilio.sendError('UnityRunner', error);
|
||||
|
||||
this.output.current.push(
|
||||
`[${new Date().toLocaleTimeString('nl-NL')}] [System] [${state}] ${
|
||||
message ?? error
|
||||
@@ -280,6 +284,7 @@ export class UnityRunner {
|
||||
)
|
||||
return;
|
||||
|
||||
this._Main.Twilio.resetError('UnityRunner');
|
||||
this.setInfo('Running', '', 'RUNNING');
|
||||
this._Main.UnityWebSocket.connect();
|
||||
}, 5000);
|
||||
|
||||
@@ -10,6 +10,8 @@ export class UnityWebSocket {
|
||||
message?: string = 'Waiting for process...';
|
||||
error?: string;
|
||||
|
||||
errorTriggerStartupDelay = 1000;
|
||||
|
||||
parameters: UnityParameters = {
|
||||
timelineWatching: false,
|
||||
timelineStanding: false,
|
||||
@@ -113,6 +115,8 @@ export class UnityWebSocket {
|
||||
this.state = state;
|
||||
this.broadcastState();
|
||||
|
||||
if (error != null) this._Main.Twilio.sendError('UnityWebSocket', error);
|
||||
|
||||
if (state == 'FAILED' || state == 'DISCONNECTED')
|
||||
console.warn(PREFIX, message ?? error);
|
||||
else console.log(PREFIX, message ?? error);
|
||||
@@ -146,7 +150,15 @@ export class UnityWebSocket {
|
||||
this.parameters.outOfService =
|
||||
message.heartbeat.showOutOfService ?? false;
|
||||
this.parameters.sensors = message.heartbeat.dataSensors;
|
||||
this.parameters.sliders = message.heartbeat.dataSliders;
|
||||
this.parameters.sliders = message.heartbeat.dataSliders.map(
|
||||
(slider) => {
|
||||
return {
|
||||
...slider,
|
||||
decimalPlaces:
|
||||
slider.min == 0 && slider.max == 1 ? 2 : null,
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
this.broadcastState();
|
||||
break;
|
||||
@@ -226,6 +238,8 @@ export class UnityWebSocket {
|
||||
this.socket.on('open', () => {
|
||||
this.startFetchClocks();
|
||||
|
||||
this._Main.Twilio.resetError('UnityWebSocket');
|
||||
|
||||
this.setInfo('Connected', null, 'CONNECTED');
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user