@alwaysai/device-agent 0.0.2 → 0.0.3
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/lib/application-control/application-control.d.ts +7 -2
- package/lib/application-control/application-control.d.ts.map +1 -1
- package/lib/application-control/application-control.js +41 -4
- package/lib/application-control/application-control.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +10 -0
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -0
- package/lib/cloud-connection/device-agent-cloud-connection.js +46 -0
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +3 -1
- package/lib/constants.js.map +1 -1
- package/lib/index.js +7 -3
- package/lib/index.js.map +1 -1
- package/lib/subcommands/app/app.d.ts +7 -1
- package/lib/subcommands/app/app.d.ts.map +1 -1
- package/lib/subcommands/app/app.js +49 -6
- package/lib/subcommands/app/app.js.map +1 -1
- package/lib/subcommands/app/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +2 -0
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/index.js +2 -2
- package/lib/subcommands/index.js.map +1 -1
- package/lib/subcommands/test-app.d.ts +1 -4
- package/lib/subcommands/test-app.d.ts.map +1 -1
- package/lib/subcommands/test-app.js +25 -29
- package/lib/subcommands/test-app.js.map +1 -1
- package/lib/util/directories.d.ts +5 -0
- package/lib/util/directories.d.ts.map +1 -0
- package/lib/util/directories.js +27 -0
- package/lib/util/directories.js.map +1 -0
- package/lib/util/urls.d.ts +2 -0
- package/lib/util/urls.d.ts.map +1 -0
- package/lib/util/urls.js +25 -0
- package/lib/util/urls.js.map +1 -0
- package/package.json +3 -2
- package/readme.md +16 -5
- package/src/application-control/application-control.ts +45 -5
- package/src/cloud-connection/device-agent-cloud-connection.ts +53 -0
- package/src/constants.ts +4 -1
- package/src/index.ts +7 -3
- package/src/subcommands/app/app.ts +52 -5
- package/src/subcommands/app/index.ts +4 -0
- package/src/subcommands/index.ts +2 -2
- package/src/subcommands/test-app.ts +26 -26
- package/src/util/directories.ts +30 -0
- package/src/util/urls.ts +21 -0
|
@@ -7,10 +7,15 @@ export declare function getInstalledApps(): Promise<AppDetails[]>;
|
|
|
7
7
|
export declare function rollbackApp(props: {
|
|
8
8
|
projectId: string;
|
|
9
9
|
}): Promise<void>;
|
|
10
|
+
export declare function listAppReleases(props: {
|
|
11
|
+
projectId: string;
|
|
12
|
+
}): Promise<import("alwaysai/lib/util/rest-client").ReleaseHistoryArray>;
|
|
13
|
+
export declare function listAppLatestRelease(props: {
|
|
14
|
+
projectId: string;
|
|
15
|
+
}): Promise<string | undefined>;
|
|
10
16
|
export declare function installApp(props: {
|
|
11
17
|
projectId: string;
|
|
12
|
-
|
|
13
|
-
version: string;
|
|
18
|
+
releaseHash: string;
|
|
14
19
|
}): Promise<void>;
|
|
15
20
|
export declare type ServiceState = 'Stopped' | 'Up' | 'Restarting';
|
|
16
21
|
export declare type ServiceStatus = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-control.d.ts","sourceRoot":"","sources":["../../src/application-control/application-control.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"application-control.d.ts","sourceRoot":"","sources":["../../src/application-control/application-control.ts"],"names":[],"mappings":";AAqBA,oBAAY,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAkB9D;AAUD,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAW7D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,wEAIjE;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,+BAOtE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ChB;AAED,oBAAY,YAAY,GAAG,SAAS,GAAG,IAAI,GAAG,YAAY,CAAC;AAC3D,oBAAY,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAClE,oBAAY,SAAS,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAE9E,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CA+CnF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAyBjC;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhB;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9E"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uninstallApp = exports.stopApp = exports.startApp = exports.getAppLogs = exports.getAppStatus = exports.installApp = exports.rollbackApp = exports.getInstalledApps = void 0;
|
|
3
|
+
exports.uninstallApp = exports.stopApp = exports.startApp = exports.getAppLogs = exports.getAppStatus = exports.installApp = exports.listAppLatestRelease = exports.listAppReleases = exports.rollbackApp = exports.getInstalledApps = void 0;
|
|
4
4
|
const docker_compose_1 = require("docker-compose");
|
|
5
5
|
const rimraf = require("rimraf");
|
|
6
6
|
const fs = require("fs");
|
|
7
|
+
const alwaysai_1 = require("alwaysai");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const run_cli_cmd_1 = require("../util/run-cli-cmd");
|
|
7
10
|
const docker_cmd_1 = require("../docker/docker-cmd");
|
|
8
11
|
const js_spawner_1 = require("../util/spawner/js-spawner");
|
|
9
12
|
const copy_dir_1 = require("../util/copy-dir");
|
|
10
13
|
const utils_1 = require("./utils");
|
|
11
14
|
const BACKUP_EXT = '.bak';
|
|
12
15
|
async function getInstalledApps() {
|
|
16
|
+
if (!fs.existsSync(utils_1.APP_ROOT)) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
13
19
|
const projectIds = fs.readdirSync(utils_1.APP_ROOT).filter(file => {
|
|
14
20
|
const isDir = fs.statSync(`${utils_1.APP_ROOT}/${file}`).isDirectory();
|
|
15
21
|
const isBak = `${utils_1.APP_ROOT}/${file}`.includes(BACKUP_EXT);
|
|
@@ -44,11 +50,28 @@ async function rollbackApp(props) {
|
|
|
44
50
|
console.log(`Rolled back app ${projectId} to previous version`);
|
|
45
51
|
}
|
|
46
52
|
exports.rollbackApp = rollbackApp;
|
|
53
|
+
async function listAppReleases(props) {
|
|
54
|
+
const { projectId } = props;
|
|
55
|
+
const releaseHistory = await (0, alwaysai_1.fetchAppReleaseHistory)(projectId);
|
|
56
|
+
return releaseHistory;
|
|
57
|
+
}
|
|
58
|
+
exports.listAppReleases = listAppReleases;
|
|
59
|
+
async function listAppLatestRelease(props) {
|
|
60
|
+
const { projectId } = props;
|
|
61
|
+
const releaseHistory = await (0, alwaysai_1.fetchAppReleaseHistory)(projectId);
|
|
62
|
+
if (releaseHistory.length >= 1) {
|
|
63
|
+
return releaseHistory[0]['releaseHash'];
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
exports.listAppLatestRelease = listAppLatestRelease;
|
|
47
68
|
async function installApp(props) {
|
|
48
|
-
const { projectId,
|
|
69
|
+
const { projectId, releaseHash } = props;
|
|
49
70
|
console.log(`Installing ${projectId}`);
|
|
50
71
|
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
72
|
+
const TEMP_DIR = (0, path_1.join)(utils_1.APP_ROOT, 'temp');
|
|
51
73
|
const spawner = (0, js_spawner_1.JsSpawner)();
|
|
74
|
+
await spawner.mkdirp(TEMP_DIR);
|
|
52
75
|
// TODO Check valid projectId
|
|
53
76
|
// Check if app is installed
|
|
54
77
|
if (await (0, utils_1.isAppInstalled)({ appDir })) {
|
|
@@ -58,11 +81,25 @@ async function installApp(props) {
|
|
|
58
81
|
}
|
|
59
82
|
// Create app directory
|
|
60
83
|
await spawner.mkdirp(appDir);
|
|
84
|
+
// download the application
|
|
85
|
+
await (0, run_cli_cmd_1.runCliCmd)({
|
|
86
|
+
cmd: [
|
|
87
|
+
'release',
|
|
88
|
+
'pull',
|
|
89
|
+
'--yes',
|
|
90
|
+
'--project',
|
|
91
|
+
projectId,
|
|
92
|
+
'--releaseHash',
|
|
93
|
+
releaseHash,
|
|
94
|
+
],
|
|
95
|
+
cwd: TEMP_DIR,
|
|
96
|
+
});
|
|
61
97
|
// Unpack app package and move to install dir
|
|
62
|
-
await spawner.untar(
|
|
98
|
+
await spawner.untar(fs.createReadStream((0, path_1.join)(TEMP_DIR, `${releaseHash}.tgz`)), appDir);
|
|
63
99
|
console.log(`Unpacked application to ${appDir}`);
|
|
64
|
-
await (0, utils_1.setAppVersion)({ appDir, version });
|
|
100
|
+
await (0, utils_1.setAppVersion)({ appDir, version: releaseHash });
|
|
65
101
|
await (0, utils_1.buildApp)({ appDir });
|
|
102
|
+
await spawner.rimraf(TEMP_DIR);
|
|
66
103
|
console.log(`Installed ${projectId} to ${appDir}`);
|
|
67
104
|
}
|
|
68
105
|
exports.installApp = installApp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-control.js","sourceRoot":"","sources":["../../src/application-control/application-control.ts"],"names":[],"mappings":";;;AAAA,mDAAqC;AACrC,iCAAiC;AACjC,yBAAyB;
|
|
1
|
+
{"version":3,"file":"application-control.js","sourceRoot":"","sources":["../../src/application-control/application-control.ts"],"names":[],"mappings":";;;AAAA,mDAAqC;AACrC,iCAAiC;AACjC,yBAAyB;AACzB,uCAAkD;AAClD,+BAA4B;AAE5B,qDAAgD;AAChD,qDAAsD;AACtD,2DAAuD;AACvD,+CAA2C;AAC3C,mCAOiB;AAEjB,MAAM,UAAU,GAAG,MAAM,CAAC;AAInB,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAQ,CAAC,EAAE;QAC5B,OAAO,EAAE,CAAC;KACX;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACxD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,gBAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,gBAAQ,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;QAClC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;KACzC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAlBD,4CAkBC;AAED,KAAK,UAAU,eAAe,CAAC,KAA4B;IACzD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC;IAC9C,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,OAAO,YAAY,EAAE,CAAC,CAAC;AAC/D,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,KAA4B;IAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;KAC1D;IACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,sBAAsB,CAAC,CAAC;AAClE,CAAC;AAXD,kCAWC;AAEM,KAAK,UAAU,eAAe,CAAC,KAA4B;IAChE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,cAAc,GAAG,MAAM,IAAA,iCAAsB,EAAC,SAAS,CAAC,CAAC;IAC/D,OAAO,cAAc,CAAC;AACxB,CAAC;AAJD,0CAIC;AAEM,KAAK,UAAU,oBAAoB,CAAC,KAA4B;IACrE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,cAAc,GAAG,MAAM,IAAA,iCAAsB,EAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE;QAC9B,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;KACzC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAPD,oDAOC;AAEM,KAAK,UAAU,UAAU,CAAC,KAGhC;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,gBAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAA,sBAAS,GAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,6BAA6B;IAC7B,4BAA4B;IAC5B,IAAI,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACrC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KAC9B;IACD,uBAAuB;IACvB,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7B,2BAA2B;IAC3B,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE;YACH,SAAS;YACT,MAAM;YACN,OAAO;YACP,WAAW;YACX,SAAS;YACT,eAAe;YACf,WAAW;SACZ;QACD,GAAG,EAAE,QAAQ;KACd,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAA,WAAI,EAAC,QAAQ,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;IAEjD,MAAM,IAAA,qBAAa,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtD,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3B,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,OAAO,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AA7CD,gCA6CC;AAMM,KAAK,UAAU,YAAY,CAAC,KAA4B;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,MAAM,wBAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;QACzB,MAAM,IAAI,KAAK,CACb,4CAA4C,MAAM,CAAC,GAAG,WAAW,MAAM,CAAC,GAAG,EAAE,CAC9E,CAAC;KACH;IAED,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,IAAA,qBAAa,EAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACrC,0EAA0E;QAC1E,0BAA0B;QAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;KAC/C;SAAM;QACL,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1C,iCAAiC;YACjC,4BAA4B;YAC5B,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI;iBACtB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;iBAC3B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAErB,IAAI,KAAmB,CAAC;YACxB,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAChC,KAAK,GAAG,IAAI,CAAC;aACd;iBAAM,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAC9E,KAAK,GAAG,SAAS,CAAC;aACnB;iBAAM,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;gBAC/C,KAAK,GAAG,YAAY,CAAC;aACtB;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;aAClE;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SAChC;KACF;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AA/CD,oCA+CC;AAEM,KAAK,UAAU,UAAU,CAAC,KAGhC;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IAED,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,MAAM,CAAC,KAAK;YACV,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;gBACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC7B;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IAET,oEAAoE;IACpE,OAAO,MAAM,IAAA,sBAAS,GAAE,CAAC,YAAY,CAAC;QACpC,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;QACpC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;AACL,CAAC;AA5BD,gCA4BC;AAEM,KAAK,UAAU,QAAQ,CAAC,KAG9B;IACC,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,4BAA4B;IAC5B,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IACD,IAAI,gBAAgB,KAAK,SAAS,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAc,EAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KACrB;IAED,gCAAgC;IAChC,YAAY;IACZ,MAAM,KAAK,GAAG,MAAM,wBAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,GAAG,WAAW,KAAK,CAAC,GAAG,EAAE,CACvE,CAAC;KACH;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAzBD,4BAyBC;AAEM,KAAK,UAAU,OAAO,CAAC,KAA4B;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,4BAA4B;IAC5B,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;KACR;IACD,gCAAgC;IAChC,WAAW;IACX,MAAM,MAAM,GAAG,MAAM,wBAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;QACzB,MAAM,IAAI,KAAK,CACb,sCAAsC,MAAM,CAAC,GAAG,WAAW,MAAM,CAAC,GAAG,EAAE,CACxE,CAAC;KACH;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAlBD,0BAkBC;AAEM,KAAK,UAAU,YAAY,CAAC,KAA4B;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,gBAAgB,CAAC,CAAC;QACtD,OAAO;KACR;IACD,IAAI;QACF,MAAM,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;KAC9B;IAAC,WAAM;QACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;KAC3D;IACD,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAhBD,oCAgBC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class DeviceAgentCloudConnection {
|
|
2
|
+
device: any;
|
|
3
|
+
private clientId;
|
|
4
|
+
private host;
|
|
5
|
+
constructor();
|
|
6
|
+
getClientId(): string;
|
|
7
|
+
publishMessage(topic: string, message: string): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function runDeviceAgentCloudInterface(): void;
|
|
10
|
+
//# sourceMappingURL=device-agent-cloud-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-agent-cloud-connection.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"AAQA,qBAAa,0BAA0B;IAC9B,MAAM,MAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,IAAI,CAA2B;;IAehC,WAAW;IAIX,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIrD;AAED,wBAAgB,4BAA4B,SAgB3C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDeviceAgentCloudInterface = exports.DeviceAgentCloudConnection = void 0;
|
|
4
|
+
const awsIot = require('aws-iot-device-sdk');
|
|
5
|
+
const urls_1 = require("../util/urls");
|
|
6
|
+
const directories_1 = require("../util/directories");
|
|
7
|
+
class DeviceAgentCloudConnection {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.device = awsIot.device;
|
|
10
|
+
this.clientId = 'DEVICE_AGENT'; // TODO: use CLI to get either the username or the device ID? how do we determine the device ID in this case?
|
|
11
|
+
this.host = (0, urls_1.getIoTCoreEndpointUrl)();
|
|
12
|
+
this.device = awsIot.device({
|
|
13
|
+
keyPath: (0, directories_1.getPrivateKeyFilePath)(),
|
|
14
|
+
certPath: (0, directories_1.getCertificateFilePath)(),
|
|
15
|
+
caPath: (0, directories_1.getRootCertificateFilePath)(),
|
|
16
|
+
clientId: this.clientId,
|
|
17
|
+
host: this.host,
|
|
18
|
+
});
|
|
19
|
+
// TODO: subscribe to topics here
|
|
20
|
+
this.device.subscribe('command');
|
|
21
|
+
}
|
|
22
|
+
getClientId() {
|
|
23
|
+
return this.clientId;
|
|
24
|
+
}
|
|
25
|
+
publishMessage(topic, message) {
|
|
26
|
+
console.log('publishing message ', message);
|
|
27
|
+
this.device.publish(topic, JSON.stringify({ message }));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DeviceAgentCloudConnection = DeviceAgentCloudConnection;
|
|
31
|
+
function runDeviceAgentCloudInterface() {
|
|
32
|
+
const deviceAgent = new DeviceAgentCloudConnection();
|
|
33
|
+
deviceAgent.device.on('connect', function () {
|
|
34
|
+
deviceAgent.publishMessage('connection', deviceAgent.getClientId());
|
|
35
|
+
console.log('Device Agent has connected to the cloud');
|
|
36
|
+
});
|
|
37
|
+
deviceAgent.device.on('disconnect', function () {
|
|
38
|
+
console.log('Device Agent has been disconnected from the cloud');
|
|
39
|
+
});
|
|
40
|
+
deviceAgent.device.on('message', function (topic, payload) {
|
|
41
|
+
// TODO: parse/determine action based on topic/payload here
|
|
42
|
+
console.log('message', topic, payload.toString());
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
exports.runDeviceAgentCloudInterface = runDeviceAgentCloudInterface;
|
|
46
|
+
//# sourceMappingURL=device-agent-cloud-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-agent-cloud-connection.js","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7C,uCAAqD;AACrD,qDAI6B;AAE7B,MAAa,0BAA0B;IAKrC;QAJO,WAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACtB,aAAQ,GAAG,cAAc,CAAC,CAAC,6GAA6G;QACxI,SAAI,GAAG,IAAA,4BAAqB,GAAE,CAAC;QAGrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,IAAA,mCAAqB,GAAE;YAChC,QAAQ,EAAE,IAAA,oCAAsB,GAAE;YAClC,MAAM,EAAE,IAAA,wCAA0B,GAAE;YACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,cAAc,CAAC,KAAa,EAAE,OAAe;QAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF;AA1BD,gEA0BC;AAED,SAAgB,4BAA4B;IAC1C,MAAM,WAAW,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAErD,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE;QAC/B,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,UAAS,KAAK,EAAE,OAAO;QACtD,2DAA2D;QAC3D,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAhBD,oEAgBC"}
|
package/lib/constants.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ export declare const DOT_ALWAYSAI_DIR: string;
|
|
|
3
3
|
export declare const AAI_DIR: any;
|
|
4
4
|
export declare const DEVICE_TOKEN_FILE_NAME = "alwaysai.credentials.json";
|
|
5
5
|
export declare const DEVICE_CONFIG_FILE_NAME = "alwaysai.config.json";
|
|
6
|
+
export declare const DEV_HOST_TOKEN_DIR: string;
|
|
6
7
|
export declare const DEVICE_TOKEN_DIR_LINUX: string;
|
|
8
|
+
export declare const DEV_HOST_CERT_AND_KEY_DIR: string;
|
|
7
9
|
export declare const DEVICE_CERT_AND_KEY_DIR_LINUX: string;
|
|
8
10
|
export declare const DEVICE_CERTIFICATE_FILE_NAME = "alwaysai.certificate.pem.crt";
|
|
9
11
|
export declare const DEVICE_PRIVATE_KEY_FILE_NAME = "alwaysai.private.pem.key";
|
package/lib/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,4BAA4B,cAAc,CAAC;AACxD,eAAO,MAAM,gBAAgB,QAA+B,CAAC;AAC7D,eAAO,MAAM,OAAO,KAAuC,CAAC;AAE5D,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAE9D,eAAO,MAAM,sBAAsB,QAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,4BAA4B,cAAc,CAAC;AACxD,eAAO,MAAM,gBAAgB,QAA+B,CAAC;AAC7D,eAAO,MAAM,OAAO,KAAuC,CAAC;AAE5D,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAE9D,eAAO,MAAM,kBAAkB,QAAyC,CAAC;AACzE,eAAO,MAAM,sBAAsB,QAAyC,CAAC;AAE7E,eAAO,MAAM,yBAAyB,QAA2C,CAAC;AAClF,eAAO,MAAM,6BAA6B,QAGzC,CAAC;AAEF,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AACrE,eAAO,MAAM,0BAA0B,sBAAsB,CAAC;AAE9D,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,kBAAkB,8DAC8B,CAAC;AAE9D,eAAO,MAAM,gCAAgC,4DACc,CAAC"}
|
package/lib/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PLEASE_REPORT_THIS_ERROR_MESSAGE = exports.JETPACK_IMAGE_LINK = exports.SUPPORTED_JETPACK_VERSION = exports.DEVICE_ROOT_CERT_FILE_NAME = exports.DEVICE_PUBLIC_KEY_FILE_NAME = exports.DEVICE_PRIVATE_KEY_FILE_NAME = exports.DEVICE_CERTIFICATE_FILE_NAME = exports.DEVICE_CERT_AND_KEY_DIR_LINUX = exports.DEVICE_TOKEN_DIR_LINUX = exports.DEVICE_CONFIG_FILE_NAME = exports.DEVICE_TOKEN_FILE_NAME = exports.AAI_DIR = exports.DOT_ALWAYSAI_DIR = exports.ALWAYSAI_CLI_EXECUTABLE_NAME = void 0;
|
|
3
|
+
exports.PLEASE_REPORT_THIS_ERROR_MESSAGE = exports.JETPACK_IMAGE_LINK = exports.SUPPORTED_JETPACK_VERSION = exports.DEVICE_ROOT_CERT_FILE_NAME = exports.DEVICE_PUBLIC_KEY_FILE_NAME = exports.DEVICE_PRIVATE_KEY_FILE_NAME = exports.DEVICE_CERTIFICATE_FILE_NAME = exports.DEVICE_CERT_AND_KEY_DIR_LINUX = exports.DEV_HOST_CERT_AND_KEY_DIR = exports.DEVICE_TOKEN_DIR_LINUX = exports.DEV_HOST_TOKEN_DIR = exports.DEVICE_CONFIG_FILE_NAME = exports.DEVICE_TOKEN_FILE_NAME = exports.AAI_DIR = exports.DOT_ALWAYSAI_DIR = exports.ALWAYSAI_CLI_EXECUTABLE_NAME = void 0;
|
|
4
4
|
const path_1 = require("path");
|
|
5
5
|
const os_1 = require("os");
|
|
6
6
|
const os = require('os');
|
|
@@ -10,7 +10,9 @@ exports.DOT_ALWAYSAI_DIR = (0, path_1.join)((0, os_1.homedir)(), '.alwaysai');
|
|
|
10
10
|
exports.AAI_DIR = path.join(os.homedir(), '.alwaysai');
|
|
11
11
|
exports.DEVICE_TOKEN_FILE_NAME = 'alwaysai.credentials.json';
|
|
12
12
|
exports.DEVICE_CONFIG_FILE_NAME = 'alwaysai.config.json';
|
|
13
|
+
exports.DEV_HOST_TOKEN_DIR = (0, path_1.join)((0, os_1.homedir)(), '.config', 'alwaysai');
|
|
13
14
|
exports.DEVICE_TOKEN_DIR_LINUX = path_1.posix.join('~', '.config', 'alwaysai');
|
|
15
|
+
exports.DEV_HOST_CERT_AND_KEY_DIR = (0, path_1.join)(exports.DEV_HOST_TOKEN_DIR, 'certificates');
|
|
14
16
|
exports.DEVICE_CERT_AND_KEY_DIR_LINUX = path_1.posix.join(exports.DEVICE_TOKEN_DIR_LINUX, 'certificates');
|
|
15
17
|
exports.DEVICE_CERTIFICATE_FILE_NAME = 'alwaysai.certificate.pem.crt';
|
|
16
18
|
exports.DEVICE_PRIVATE_KEY_FILE_NAME = 'alwaysai.private.pem.key';
|
package/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,+BAAmC;AACnC,2BAA6B;AAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhB,QAAA,4BAA4B,GAAG,WAAW,CAAC;AAC3C,QAAA,gBAAgB,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,WAAW,CAAC,CAAC;AAChD,QAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAE/C,QAAA,sBAAsB,GAAG,2BAA2B,CAAC;AACrD,QAAA,uBAAuB,GAAG,sBAAsB,CAAC;AAEjD,QAAA,kBAAkB,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC5D,QAAA,sBAAsB,GAAG,YAAK,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAEhE,QAAA,yBAAyB,GAAG,IAAA,WAAI,EAAC,0BAAkB,EAAE,cAAc,CAAC,CAAC;AACrE,QAAA,6BAA6B,GAAG,YAAK,CAAC,IAAI,CACrD,8BAAsB,EACtB,cAAc,CACf,CAAC;AAEW,QAAA,4BAA4B,GAAG,8BAA8B,CAAC;AAC9D,QAAA,4BAA4B,GAAG,0BAA0B,CAAC;AAC1D,QAAA,2BAA2B,GAAG,yBAAyB,CAAC;AACxD,QAAA,0BAA0B,GAAG,mBAAmB,CAAC;AAEjD,QAAA,yBAAyB,GAAG,GAAG,CAAC;AAChC,QAAA,kBAAkB,GAC7B,2DAA2D,CAAC;AAEjD,QAAA,gCAAgC,GAC3C,yDAAyD,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -7,13 +7,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
const alwayscli_1 = require("@alwaysai/alwayscli");
|
|
8
8
|
const root_1 = require("./root");
|
|
9
9
|
const web_interface_1 = require("./web/web-interface");
|
|
10
|
+
const device_agent_cloud_connection_1 = require("./cloud-connection/device-agent-cloud-connection");
|
|
10
11
|
if (module === require.main) {
|
|
11
12
|
console.log('Starting alwaysAI Device Agent');
|
|
12
|
-
if (process.env.ALWAYSAI_DEVICE_AGENT_MODE === '
|
|
13
|
-
(0,
|
|
13
|
+
if (process.env.ALWAYSAI_DEVICE_AGENT_MODE === 'cloud') {
|
|
14
|
+
(0, device_agent_cloud_connection_1.runDeviceAgentCloudInterface)();
|
|
14
15
|
}
|
|
15
|
-
else {
|
|
16
|
+
else if (process.env.ALWAYSAI_DEVICE_AGENT_MODE === 'web') {
|
|
16
17
|
(0, web_interface_1.runWebInterface)();
|
|
17
18
|
}
|
|
19
|
+
else {
|
|
20
|
+
(0, alwayscli_1.runCliAndExit)(root_1.root, {});
|
|
21
|
+
}
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;;AAE/E,mDAAoD;AACpD,iCAA8B;AAC9B,uDAAsD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;;AAE/E,mDAAoD;AACpD,iCAA8B;AAC9B,uDAAsD;AACtD,oGAAgG;AAEhG,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,OAAO,EAAE;QACtD,IAAA,4DAA4B,GAAE,CAAC;KAChC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,KAAK,EAAE;QAC3D,IAAA,+BAAe,GAAE,CAAC;KACnB;SAAM;QACL,IAAA,yBAAa,EAAC,WAAI,EAAE,EAAE,CAAC,CAAC;KACzB;CACF"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
export declare const listAppsCliLeaf: import("@alwaysai/alwayscli/lib/types").CliLeaf<import("@alwaysai/alwayscli").CliInput<undefined, false>, {}, import("@alwaysai/alwayscli").CliInput<undefined, false>>;
|
|
2
|
+
export declare const listAppReleasesCliLeaf: import("@alwaysai/alwayscli/lib/types").CliLeaf<import("@alwaysai/alwayscli").CliInput<undefined, false>, {
|
|
3
|
+
project: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
4
|
+
}, import("@alwaysai/alwayscli").CliInput<undefined, false>>;
|
|
5
|
+
export declare const listAppLatestReleaseCliLeaf: import("@alwaysai/alwayscli/lib/types").CliLeaf<import("@alwaysai/alwayscli").CliInput<undefined, false>, {
|
|
6
|
+
project: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
7
|
+
}, import("@alwaysai/alwayscli").CliInput<undefined, false>>;
|
|
2
8
|
export declare const installAppCliLeaf: import("@alwaysai/alwayscli/lib/types").CliLeaf<import("@alwaysai/alwayscli").CliInput<undefined, false>, {
|
|
3
9
|
project: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
4
|
-
|
|
10
|
+
releaseHash: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
5
11
|
}, import("@alwaysai/alwayscli").CliInput<undefined, false>>;
|
|
6
12
|
export declare const getAppStatusCliLeaf: import("@alwaysai/alwayscli/lib/types").CliLeaf<import("@alwaysai/alwayscli").CliInput<undefined, false>, {
|
|
7
13
|
project: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/app.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,eAAe,yKAQ1B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;4DAgBjC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;4DAmBtC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;4DAyB5B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;4DAgB9B,CAAC;AAEH,eAAO,MAAM,eAAe;;;4DAkB1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;4DAmB5B,CAAC;AAEH,eAAO,MAAM,cAAc;;4DAezB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;4DAe9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;4DAe7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;4DAqB1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;4DAqB7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;4DAe9B,CAAC"}
|
|
@@ -7,7 +7,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
|
7
7
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
8
8
|
};
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.updateModelsCliLeaf = exports.removeModelCliLeaf = exports.addModelCliLeaf = exports.rollbackAppCliLeaf = exports.uninstallAppCliLeaf = exports.stopAppCliLeaf = exports.getAppLogsCliLeaf = exports.startAppCliLeaf = exports.getAppStatusCliLeaf = exports.installAppCliLeaf = exports.listAppsCliLeaf = void 0;
|
|
10
|
+
exports.updateModelsCliLeaf = exports.removeModelCliLeaf = exports.addModelCliLeaf = exports.rollbackAppCliLeaf = exports.uninstallAppCliLeaf = exports.stopAppCliLeaf = exports.getAppLogsCliLeaf = exports.startAppCliLeaf = exports.getAppStatusCliLeaf = exports.installAppCliLeaf = exports.listAppLatestReleaseCliLeaf = exports.listAppReleasesCliLeaf = exports.listAppsCliLeaf = void 0;
|
|
11
11
|
const alwayscli_1 = require("@alwaysai/alwayscli");
|
|
12
12
|
const application_control_1 = require("../../application-control/application-control");
|
|
13
13
|
const models_1 = require("../../application-control/models");
|
|
@@ -20,6 +20,43 @@ exports.listAppsCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
20
20
|
console.table(apps);
|
|
21
21
|
},
|
|
22
22
|
});
|
|
23
|
+
exports.listAppReleasesCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
24
|
+
name: 'list-releases',
|
|
25
|
+
description: 'List all releases for a given app',
|
|
26
|
+
namedInputs: {
|
|
27
|
+
project: (0, alwayscli_1.CliStringInput)({
|
|
28
|
+
description: 'Project Id',
|
|
29
|
+
}),
|
|
30
|
+
},
|
|
31
|
+
async action(_, opts) {
|
|
32
|
+
const { project } = opts;
|
|
33
|
+
if (project === undefined) {
|
|
34
|
+
throw new alwayscli_1.CliTerseError('--project is required');
|
|
35
|
+
}
|
|
36
|
+
const releaseHistory = await (0, application_control_1.listAppReleases)({ projectId: project });
|
|
37
|
+
console.log(releaseHistory);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
exports.listAppLatestReleaseCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
41
|
+
name: 'list-latest-release',
|
|
42
|
+
description: 'List the latest release hash for a given app',
|
|
43
|
+
namedInputs: {
|
|
44
|
+
project: (0, alwayscli_1.CliStringInput)({
|
|
45
|
+
description: 'Project Id',
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
async action(_, opts) {
|
|
49
|
+
const { project } = opts;
|
|
50
|
+
if (project === undefined) {
|
|
51
|
+
throw new alwayscli_1.CliTerseError('--project is required');
|
|
52
|
+
}
|
|
53
|
+
const latestReleaseHash = await (0, application_control_1.listAppLatestRelease)({ projectId: project });
|
|
54
|
+
if (latestReleaseHash === undefined) {
|
|
55
|
+
throw new alwayscli_1.CliTerseError('This application has not been published yet');
|
|
56
|
+
}
|
|
57
|
+
console.log(latestReleaseHash);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
23
60
|
exports.installAppCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
24
61
|
name: 'install',
|
|
25
62
|
description: 'Install an alwaysAI app from a project',
|
|
@@ -27,17 +64,23 @@ exports.installAppCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
27
64
|
project: (0, alwayscli_1.CliStringInput)({
|
|
28
65
|
description: 'Project Id',
|
|
29
66
|
}),
|
|
30
|
-
|
|
31
|
-
description: '
|
|
67
|
+
releaseHash: (0, alwayscli_1.CliStringInput)({
|
|
68
|
+
description: 'Release Hash',
|
|
32
69
|
}),
|
|
33
70
|
},
|
|
34
71
|
async action(_, opts) {
|
|
35
|
-
const
|
|
72
|
+
const project = opts.project;
|
|
73
|
+
let releaseHash = opts.releaseHash;
|
|
36
74
|
if (project === undefined) {
|
|
37
75
|
throw new alwayscli_1.CliTerseError('--project is required');
|
|
38
76
|
}
|
|
39
|
-
|
|
40
|
-
|
|
77
|
+
if (releaseHash === undefined) {
|
|
78
|
+
releaseHash = await (0, application_control_1.listAppLatestRelease)({ projectId: project });
|
|
79
|
+
}
|
|
80
|
+
if (releaseHash === undefined) {
|
|
81
|
+
throw new alwayscli_1.CliTerseError('This application has not been published yet');
|
|
82
|
+
}
|
|
83
|
+
await (0, application_control_1.installApp)({ projectId: project, releaseHash });
|
|
41
84
|
},
|
|
42
85
|
});
|
|
43
86
|
exports.getAppStatusCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/subcommands/app/app.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,mDAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/subcommands/app/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/index.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,YAAY,mDAkBvB,CAAC"}
|
|
@@ -8,6 +8,8 @@ exports.appCliBranch = (0, alwayscli_1.CliBranch)({
|
|
|
8
8
|
description: 'Manage alwaysAI applications',
|
|
9
9
|
subcommands: [
|
|
10
10
|
app_1.listAppsCliLeaf,
|
|
11
|
+
app_1.listAppReleasesCliLeaf,
|
|
12
|
+
app_1.listAppLatestReleaseCliLeaf,
|
|
11
13
|
app_1.installAppCliLeaf,
|
|
12
14
|
app_1.getAppStatusCliLeaf,
|
|
13
15
|
app_1.startAppCliLeaf,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/subcommands/app/index.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAChD,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/subcommands/app/index.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAChD,+BAce;AAEF,QAAA,YAAY,GAAG,IAAA,qBAAS,EAAC;IACpC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE;QACX,qBAAe;QACf,4BAAsB;QACtB,iCAA2B;QAC3B,uBAAiB;QACjB,yBAAmB;QACnB,qBAAe;QACf,uBAAiB;QACjB,oBAAc;QACd,yBAAmB;QACnB,wBAAkB;QAClB,qBAAe;QACf,wBAAkB;QAClB,yBAAmB;KACpB;CACF,CAAC,CAAC"}
|
package/lib/subcommands/index.js
CHANGED
|
@@ -4,11 +4,11 @@ exports.subcommands = void 0;
|
|
|
4
4
|
const index_1 = require("./app/index");
|
|
5
5
|
const device_control_1 = require("./device-control");
|
|
6
6
|
const login_1 = require("./login");
|
|
7
|
-
|
|
7
|
+
// import { installTestAppCliLeaf } from './test-app';
|
|
8
8
|
exports.subcommands = [
|
|
9
9
|
login_1.loginCliLeaf,
|
|
10
10
|
index_1.appCliBranch,
|
|
11
11
|
device_control_1.getDeviceInfoCliLeaf,
|
|
12
|
-
|
|
12
|
+
// installTestAppCliLeaf,
|
|
13
13
|
];
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subcommands/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAC3C,qDAAwD;AACxD,mCAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subcommands/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAC3C,qDAAwD;AACxD,mCAAuC;AACvC,sDAAsD;AAEzC,QAAA,WAAW,GAAG;IACzB,oBAAY;IACZ,oBAAY;IACZ,qCAAoB;IACpB,yBAAyB;CAC1B,CAAC"}
|
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
project: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
3
|
-
version: import("@alwaysai/alwayscli").CliInput<string | undefined, false>;
|
|
4
|
-
}, import("@alwaysai/alwayscli").CliInput<undefined, false>>;
|
|
1
|
+
export {};
|
|
5
2
|
//# sourceMappingURL=test-app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-app.d.ts","sourceRoot":"","sources":["../../src/subcommands/test-app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-app.d.ts","sourceRoot":"","sources":["../../src/subcommands/test-app.ts"],"names":[],"mappings":""}
|
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.installTestAppCliLeaf = void 0;
|
|
4
|
-
const alwayscli_1 = require("@alwaysai/alwayscli");
|
|
5
3
|
const path = require('path');
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
});
|
|
4
|
+
// export const installTestAppCliLeaf = CliLeaf({
|
|
5
|
+
// name: 'install-test-app',
|
|
6
|
+
// description: 'Install a test application',
|
|
7
|
+
// namedInputs: {
|
|
8
|
+
// project: CliStringInput({
|
|
9
|
+
// description: 'Project Id',
|
|
10
|
+
// }),
|
|
11
|
+
// version: CliStringInput({
|
|
12
|
+
// description: 'Version',
|
|
13
|
+
// }),
|
|
14
|
+
// },
|
|
15
|
+
// async action(_, opts) {
|
|
16
|
+
// const { project, version } = opts;
|
|
17
|
+
// const postfix = Math.random()
|
|
18
|
+
// .toString()
|
|
19
|
+
// .slice(2, 14);
|
|
20
|
+
// const projectId = project ? project : `16ad11bb-8c3a-4a15-923e-${postfix}`;
|
|
21
|
+
// const releaseVersion = version ? version : 'f43e816b30aa612f103fe73314f9716a436ce4f5';
|
|
22
|
+
// // Package test app
|
|
23
|
+
// const appDir = path.join('test', 'test-app');
|
|
24
|
+
// const spawner = JsSpawner({ path: appDir });
|
|
25
|
+
// const appPkg = await spawner.tar(...(await spawner.readdir()));
|
|
26
|
+
// await installApp({ projectId, appPkg, version: releaseVersion });
|
|
27
|
+
// },
|
|
28
|
+
// });
|
|
33
29
|
//# sourceMappingURL=test-app.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-app.js","sourceRoot":"","sources":["../../src/subcommands/test-app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-app.js","sourceRoot":"","sources":["../../src/subcommands/test-app.ts"],"names":[],"mappings":";;AACA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAI7B,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,mBAAmB;AACnB,gCAAgC;AAChC,mCAAmC;AACnC,UAAU;AACV,gCAAgC;AAChC,gCAAgC;AAChC,UAAU;AACV,OAAO;AACP,4BAA4B;AAC5B,yCAAyC;AACzC,oCAAoC;AACpC,oBAAoB;AACpB,uBAAuB;AACvB,kFAAkF;AAClF,6FAA6F;AAC7F,0BAA0B;AAC1B,oDAAoD;AACpD,mDAAmD;AACnD,sEAAsE;AACtE,wEAAwE;AACxE,OAAO;AACP,MAAM"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getCertAndKeyDir(): string;
|
|
2
|
+
export declare function getPrivateKeyFilePath(): string;
|
|
3
|
+
export declare function getCertificateFilePath(): string;
|
|
4
|
+
export declare function getRootCertificateFilePath(): string;
|
|
5
|
+
//# sourceMappingURL=directories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directories.d.ts","sourceRoot":"","sources":["../../src/util/directories.ts"],"names":[],"mappings":"AAYA,wBAAgB,gBAAgB,WAK/B;AAED,wBAAgB,qBAAqB,WAEpC;AAED,wBAAgB,sBAAsB,WAErC;AAED,wBAAgB,0BAA0B,WAEzC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRootCertificateFilePath = exports.getCertificateFilePath = exports.getPrivateKeyFilePath = exports.getCertAndKeyDir = void 0;
|
|
4
|
+
const os = require('os');
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const certAndKeyDir = getCertAndKeyDir();
|
|
8
|
+
function getCertAndKeyDir() {
|
|
9
|
+
if (os.type() === 'Darwin' || os.type() === 'Windows_NT') {
|
|
10
|
+
return constants_1.DEV_HOST_CERT_AND_KEY_DIR;
|
|
11
|
+
}
|
|
12
|
+
return constants_1.DEVICE_CERT_AND_KEY_DIR_LINUX;
|
|
13
|
+
}
|
|
14
|
+
exports.getCertAndKeyDir = getCertAndKeyDir;
|
|
15
|
+
function getPrivateKeyFilePath() {
|
|
16
|
+
return (0, path_1.join)(certAndKeyDir, constants_1.DEVICE_PRIVATE_KEY_FILE_NAME);
|
|
17
|
+
}
|
|
18
|
+
exports.getPrivateKeyFilePath = getPrivateKeyFilePath;
|
|
19
|
+
function getCertificateFilePath() {
|
|
20
|
+
return (0, path_1.join)(certAndKeyDir, constants_1.DEVICE_CERTIFICATE_FILE_NAME);
|
|
21
|
+
}
|
|
22
|
+
exports.getCertificateFilePath = getCertificateFilePath;
|
|
23
|
+
function getRootCertificateFilePath() {
|
|
24
|
+
return (0, path_1.join)(certAndKeyDir, constants_1.DEVICE_ROOT_CERT_FILE_NAME);
|
|
25
|
+
}
|
|
26
|
+
exports.getRootCertificateFilePath = getRootCertificateFilePath;
|
|
27
|
+
//# sourceMappingURL=directories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directories.js","sourceRoot":"","sources":["../../src/util/directories.ts"],"names":[],"mappings":";;;AAAA,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,+BAA4B;AAC5B,4CAMsB;AAEtB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAEzC,SAAgB,gBAAgB;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,YAAY,EAAE;QACxD,OAAO,qCAAyB,CAAC;KAClC;IACD,OAAO,yCAA6B,CAAC;AACvC,CAAC;AALD,4CAKC;AAED,SAAgB,qBAAqB;IACnC,OAAO,IAAA,WAAI,EAAC,aAAa,EAAE,wCAA4B,CAAC,CAAC;AAC3D,CAAC;AAFD,sDAEC;AAED,SAAgB,sBAAsB;IACpC,OAAO,IAAA,WAAI,EAAC,aAAa,EAAE,wCAA4B,CAAC,CAAC;AAC3D,CAAC;AAFD,wDAEC;AAED,SAAgB,0BAA0B;IACxC,OAAO,IAAA,WAAI,EAAC,aAAa,EAAE,sCAA0B,CAAC,CAAC;AACzD,CAAC;AAFD,gEAEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/util/urls.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,WAiBpC"}
|
package/lib/util/urls.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getIoTCoreEndpointUrl = void 0;
|
|
4
|
+
const alwaysai_1 = require("alwaysai");
|
|
5
|
+
const alwayscli_1 = require("@alwaysai/alwayscli");
|
|
6
|
+
function getIoTCoreEndpointUrl() {
|
|
7
|
+
let iotCoreEndpointUrl = '';
|
|
8
|
+
switch ((0, alwaysai_1.getSystemId)()) {
|
|
9
|
+
case 'local':
|
|
10
|
+
case 'development':
|
|
11
|
+
iotCoreEndpointUrl = 'a170opbva29ts8-ats.iot.us-west-2.amazonaws.com';
|
|
12
|
+
break;
|
|
13
|
+
case 'qa':
|
|
14
|
+
iotCoreEndpointUrl = 'a3bff3qyyopgws-ats.iot.us-west-2.amazonaws.com';
|
|
15
|
+
break;
|
|
16
|
+
case 'production':
|
|
17
|
+
iotCoreEndpointUrl = 'a3tzi5g7sq5zsj-ats.iot.us-west-2.amazonaws.com';
|
|
18
|
+
break;
|
|
19
|
+
default:
|
|
20
|
+
throw new alwayscli_1.CliTerseError(`Remote deployment not supported on ${(0, alwaysai_1.getSystemId)()}!`);
|
|
21
|
+
}
|
|
22
|
+
return iotCoreEndpointUrl;
|
|
23
|
+
}
|
|
24
|
+
exports.getIoTCoreEndpointUrl = getIoTCoreEndpointUrl;
|
|
25
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/util/urls.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,mDAAoD;AAEpD,SAAgB,qBAAqB;IACnC,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,QAAQ,IAAA,sBAAW,GAAE,EAAE;QACrB,KAAK,OAAO,CAAC;QACb,KAAK,aAAa;YAChB,kBAAkB,GAAG,gDAAgD,CAAC;YACtE,MAAM;QACR,KAAK,IAAI;YACP,kBAAkB,GAAG,gDAAgD,CAAC;YACtE,MAAM;QACR,KAAK,YAAY;YACf,kBAAkB,GAAG,gDAAgD,CAAC;YACtE,MAAM;QACR;YACE,MAAM,IAAI,yBAAa,CAAC,sCAAsC,IAAA,sBAAW,GAAE,GAAG,CAAC,CAAC;KACnF;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAjBD,sDAiBC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysai/device-agent",
|
|
3
3
|
"description": "The alwaysAI Device Agent",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.3",
|
|
5
5
|
"main": "lib/exports.js",
|
|
6
6
|
"types": "lib/exports.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
"@types/rimraf": "3.0.2",
|
|
34
34
|
"@types/signal-exit": "3.0.1",
|
|
35
35
|
"@types/tar": "6.1.1",
|
|
36
|
-
"
|
|
36
|
+
"aws-iot-device-sdk": "2.2.12",
|
|
37
|
+
"alwaysai": "1.5.1",
|
|
37
38
|
"docker-compose": "0.23.17",
|
|
38
39
|
"express": "4.17.3",
|
|
39
40
|
"fp-ts": "2.11.5",
|
package/readme.md
CHANGED
|
@@ -16,14 +16,19 @@ $ npm run build
|
|
|
16
16
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
19
|
-
There are
|
|
19
|
+
There are three modes of operation: CLI, which is great for testing new features, the device-hosted web dashboard, and the IoT Core cloud connection.
|
|
20
20
|
|
|
21
|
-
To enable the
|
|
21
|
+
To enable the cloud IoT Core connection, set the following environment variable:
|
|
22
22
|
```
|
|
23
|
-
export ALWAYSAI_DEVICE_AGENT_MODE="
|
|
23
|
+
export ALWAYSAI_DEVICE_AGENT_MODE="cloud"
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
To enable the device-hosted web dashboard, set the following environment variable:
|
|
27
|
+
```
|
|
28
|
+
export ALWAYSAI_DEVICE_AGENT_MODE="web"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Any other value will run the CLI.
|
|
27
32
|
|
|
28
33
|
On Mac you need to override the OS to remove some usage restrictions:
|
|
29
34
|
```
|
|
@@ -101,4 +106,10 @@ You can start the web dashboard by running:
|
|
|
101
106
|
node lib
|
|
102
107
|
```
|
|
103
108
|
|
|
104
|
-
And clicking the link that comes up.
|
|
109
|
+
And clicking the link that comes up.
|
|
110
|
+
|
|
111
|
+
If you are developing new functionality for the cli in tandem with the device agent, you can run
|
|
112
|
+
```
|
|
113
|
+
npm i --save /path/to/your/cli/repo
|
|
114
|
+
```
|
|
115
|
+
Remember to not commit the package.json, or revert it when you are done developing a feature
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import compose from 'docker-compose';
|
|
2
2
|
import * as rimraf from 'rimraf';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
|
+
import { fetchAppReleaseHistory } from 'alwaysai';
|
|
5
|
+
import { join } from 'path';
|
|
4
6
|
|
|
7
|
+
import { runCliCmd } from '../util/run-cli-cmd';
|
|
5
8
|
import { runDockerLogin } from '../docker/docker-cmd';
|
|
6
9
|
import { JsSpawner } from '../util/spawner/js-spawner';
|
|
7
10
|
import { copyDir } from '../util/copy-dir';
|
|
@@ -19,6 +22,10 @@ const BACKUP_EXT = '.bak';
|
|
|
19
22
|
export type AppDetails = { projectId: string; version: string };
|
|
20
23
|
|
|
21
24
|
export async function getInstalledApps(): Promise<AppDetails[]> {
|
|
25
|
+
if (!fs.existsSync(APP_ROOT)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
|
|
22
29
|
const projectIds = fs.readdirSync(APP_ROOT).filter(file => {
|
|
23
30
|
const isDir = fs.statSync(`${APP_ROOT}/${file}`).isDirectory();
|
|
24
31
|
const isBak = `${APP_ROOT}/${file}`.includes(BACKUP_EXT);
|
|
@@ -55,15 +62,31 @@ export async function rollbackApp(props: { projectId: string }) {
|
|
|
55
62
|
console.log(`Rolled back app ${projectId} to previous version`);
|
|
56
63
|
}
|
|
57
64
|
|
|
65
|
+
export async function listAppReleases(props: { projectId: string }) {
|
|
66
|
+
const { projectId } = props;
|
|
67
|
+
const releaseHistory = await fetchAppReleaseHistory(projectId);
|
|
68
|
+
return releaseHistory;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function listAppLatestRelease(props: { projectId: string }) {
|
|
72
|
+
const { projectId } = props;
|
|
73
|
+
const releaseHistory = await fetchAppReleaseHistory(projectId);
|
|
74
|
+
if (releaseHistory.length >= 1) {
|
|
75
|
+
return releaseHistory[0]['releaseHash'];
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
58
80
|
export async function installApp(props: {
|
|
59
81
|
projectId: string;
|
|
60
|
-
|
|
61
|
-
version: string;
|
|
82
|
+
releaseHash: string;
|
|
62
83
|
}): Promise<void> {
|
|
63
|
-
const { projectId,
|
|
84
|
+
const { projectId, releaseHash } = props;
|
|
64
85
|
console.log(`Installing ${projectId}`);
|
|
65
86
|
const appDir = getAppDir(projectId);
|
|
87
|
+
const TEMP_DIR = join(APP_ROOT, 'temp');
|
|
66
88
|
const spawner = JsSpawner();
|
|
89
|
+
await spawner.mkdirp(TEMP_DIR);
|
|
67
90
|
// TODO Check valid projectId
|
|
68
91
|
// Check if app is installed
|
|
69
92
|
if (await isAppInstalled({ appDir })) {
|
|
@@ -74,14 +97,30 @@ export async function installApp(props: {
|
|
|
74
97
|
// Create app directory
|
|
75
98
|
await spawner.mkdirp(appDir);
|
|
76
99
|
|
|
100
|
+
// download the application
|
|
101
|
+
await runCliCmd({
|
|
102
|
+
cmd: [
|
|
103
|
+
'release',
|
|
104
|
+
'pull',
|
|
105
|
+
'--yes',
|
|
106
|
+
'--project',
|
|
107
|
+
projectId,
|
|
108
|
+
'--releaseHash',
|
|
109
|
+
releaseHash,
|
|
110
|
+
],
|
|
111
|
+
cwd: TEMP_DIR,
|
|
112
|
+
});
|
|
113
|
+
|
|
77
114
|
// Unpack app package and move to install dir
|
|
78
|
-
await spawner.untar(
|
|
115
|
+
await spawner.untar(fs.createReadStream(join(TEMP_DIR, `${releaseHash}.tgz`)), appDir);
|
|
79
116
|
console.log(`Unpacked application to ${appDir}`);
|
|
80
117
|
|
|
81
|
-
await setAppVersion({ appDir, version });
|
|
118
|
+
await setAppVersion({ appDir, version: releaseHash });
|
|
82
119
|
|
|
83
120
|
await buildApp({ appDir });
|
|
84
121
|
|
|
122
|
+
await spawner.rimraf(TEMP_DIR);
|
|
123
|
+
|
|
85
124
|
console.log(`Installed ${projectId} to ${appDir}`);
|
|
86
125
|
}
|
|
87
126
|
|
|
@@ -99,6 +138,7 @@ export async function getAppStatus(props: { projectId: string }): Promise<AppSta
|
|
|
99
138
|
|
|
100
139
|
// Check if app is running
|
|
101
140
|
const output = await compose.ps({ cwd: appDir });
|
|
141
|
+
|
|
102
142
|
if (output.exitCode !== 0) {
|
|
103
143
|
throw new Error(
|
|
104
144
|
`Failed to get application status! stdout=${output.out} stderr=${output.err}`,
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const awsIot = require('aws-iot-device-sdk');
|
|
2
|
+
import { getIoTCoreEndpointUrl } from '../util/urls';
|
|
3
|
+
import {
|
|
4
|
+
getPrivateKeyFilePath,
|
|
5
|
+
getCertificateFilePath,
|
|
6
|
+
getRootCertificateFilePath,
|
|
7
|
+
} from '../util/directories';
|
|
8
|
+
|
|
9
|
+
export class DeviceAgentCloudConnection {
|
|
10
|
+
public device = awsIot.device;
|
|
11
|
+
private clientId = 'DEVICE_AGENT'; // TODO: use CLI to get either the username or the device ID? how do we determine the device ID in this case?
|
|
12
|
+
private host = getIoTCoreEndpointUrl();
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
this.device = awsIot.device({
|
|
16
|
+
keyPath: getPrivateKeyFilePath(),
|
|
17
|
+
certPath: getCertificateFilePath(),
|
|
18
|
+
caPath: getRootCertificateFilePath(),
|
|
19
|
+
clientId: this.clientId,
|
|
20
|
+
host: this.host,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// TODO: subscribe to topics here
|
|
24
|
+
this.device.subscribe('command');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public getClientId() {
|
|
28
|
+
return this.clientId;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public publishMessage(topic: string, message: string) {
|
|
32
|
+
console.log('publishing message ', message);
|
|
33
|
+
this.device.publish(topic, JSON.stringify({ message }));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function runDeviceAgentCloudInterface() {
|
|
38
|
+
const deviceAgent = new DeviceAgentCloudConnection();
|
|
39
|
+
|
|
40
|
+
deviceAgent.device.on('connect', function() {
|
|
41
|
+
deviceAgent.publishMessage('connection', deviceAgent.getClientId());
|
|
42
|
+
console.log('Device Agent has connected to the cloud');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
deviceAgent.device.on('disconnect', function() {
|
|
46
|
+
console.log('Device Agent has been disconnected from the cloud');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
deviceAgent.device.on('message', function(topic, payload) {
|
|
50
|
+
// TODO: parse/determine action based on topic/payload here
|
|
51
|
+
console.log('message', topic, payload.toString());
|
|
52
|
+
});
|
|
53
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { join, posix } from 'path';
|
|
2
2
|
import { homedir } from 'os';
|
|
3
3
|
const os = require('os');
|
|
4
4
|
const path = require('path');
|
|
@@ -10,7 +10,10 @@ export const AAI_DIR = path.join(os.homedir(), '.alwaysai');
|
|
|
10
10
|
export const DEVICE_TOKEN_FILE_NAME = 'alwaysai.credentials.json';
|
|
11
11
|
export const DEVICE_CONFIG_FILE_NAME = 'alwaysai.config.json';
|
|
12
12
|
|
|
13
|
+
export const DEV_HOST_TOKEN_DIR = join(homedir(), '.config', 'alwaysai');
|
|
13
14
|
export const DEVICE_TOKEN_DIR_LINUX = posix.join('~', '.config', 'alwaysai');
|
|
15
|
+
|
|
16
|
+
export const DEV_HOST_CERT_AND_KEY_DIR = join(DEV_HOST_TOKEN_DIR, 'certificates');
|
|
14
17
|
export const DEVICE_CERT_AND_KEY_DIR_LINUX = posix.join(
|
|
15
18
|
DEVICE_TOKEN_DIR_LINUX,
|
|
16
19
|
'certificates',
|
package/src/index.ts
CHANGED
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
import { runCliAndExit } from '@alwaysai/alwayscli';
|
|
8
8
|
import { root } from './root';
|
|
9
9
|
import { runWebInterface } from './web/web-interface';
|
|
10
|
+
import { runDeviceAgentCloudInterface } from './cloud-connection/device-agent-cloud-connection';
|
|
10
11
|
|
|
11
12
|
if (module === require.main) {
|
|
12
13
|
console.log('Starting alwaysAI Device Agent');
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
|
|
15
|
+
if (process.env.ALWAYSAI_DEVICE_AGENT_MODE === 'cloud') {
|
|
16
|
+
runDeviceAgentCloudInterface();
|
|
17
|
+
} else if (process.env.ALWAYSAI_DEVICE_AGENT_MODE === 'web') {
|
|
16
18
|
runWebInterface();
|
|
19
|
+
} else {
|
|
20
|
+
runCliAndExit(root, {});
|
|
17
21
|
}
|
|
18
22
|
}
|
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
startApp,
|
|
9
9
|
stopApp,
|
|
10
10
|
uninstallApp,
|
|
11
|
+
listAppReleases,
|
|
12
|
+
listAppLatestRelease,
|
|
11
13
|
} from '../../application-control/application-control';
|
|
12
14
|
import { addModel, removeModel, updateModels } from '../../application-control/models';
|
|
13
15
|
|
|
@@ -21,6 +23,45 @@ export const listAppsCliLeaf = CliLeaf({
|
|
|
21
23
|
},
|
|
22
24
|
});
|
|
23
25
|
|
|
26
|
+
export const listAppReleasesCliLeaf = CliLeaf({
|
|
27
|
+
name: 'list-releases',
|
|
28
|
+
description: 'List all releases for a given app',
|
|
29
|
+
namedInputs: {
|
|
30
|
+
project: CliStringInput({
|
|
31
|
+
description: 'Project Id',
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
async action(_, opts) {
|
|
35
|
+
const { project } = opts;
|
|
36
|
+
if (project === undefined) {
|
|
37
|
+
throw new CliTerseError('--project is required');
|
|
38
|
+
}
|
|
39
|
+
const releaseHistory = await listAppReleases({ projectId: project });
|
|
40
|
+
console.log(releaseHistory);
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const listAppLatestReleaseCliLeaf = CliLeaf({
|
|
45
|
+
name: 'list-latest-release',
|
|
46
|
+
description: 'List the latest release hash for a given app',
|
|
47
|
+
namedInputs: {
|
|
48
|
+
project: CliStringInput({
|
|
49
|
+
description: 'Project Id',
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
async action(_, opts) {
|
|
53
|
+
const { project } = opts;
|
|
54
|
+
if (project === undefined) {
|
|
55
|
+
throw new CliTerseError('--project is required');
|
|
56
|
+
}
|
|
57
|
+
const latestReleaseHash = await listAppLatestRelease({ projectId: project });
|
|
58
|
+
if (latestReleaseHash === undefined) {
|
|
59
|
+
throw new CliTerseError('This application has not been published yet');
|
|
60
|
+
}
|
|
61
|
+
console.log(latestReleaseHash);
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
|
|
24
65
|
export const installAppCliLeaf = CliLeaf({
|
|
25
66
|
name: 'install',
|
|
26
67
|
description: 'Install an alwaysAI app from a project',
|
|
@@ -28,17 +69,23 @@ export const installAppCliLeaf = CliLeaf({
|
|
|
28
69
|
project: CliStringInput({
|
|
29
70
|
description: 'Project Id',
|
|
30
71
|
}),
|
|
31
|
-
|
|
32
|
-
description: '
|
|
72
|
+
releaseHash: CliStringInput({
|
|
73
|
+
description: 'Release Hash',
|
|
33
74
|
}),
|
|
34
75
|
},
|
|
35
76
|
async action(_, opts) {
|
|
36
|
-
const
|
|
77
|
+
const project = opts.project;
|
|
78
|
+
let releaseHash = opts.releaseHash;
|
|
37
79
|
if (project === undefined) {
|
|
38
80
|
throw new CliTerseError('--project is required');
|
|
39
81
|
}
|
|
40
|
-
|
|
41
|
-
|
|
82
|
+
if (releaseHash === undefined) {
|
|
83
|
+
releaseHash = await listAppLatestRelease({ projectId: project });
|
|
84
|
+
}
|
|
85
|
+
if (releaseHash === undefined) {
|
|
86
|
+
throw new CliTerseError('This application has not been published yet');
|
|
87
|
+
}
|
|
88
|
+
await installApp({ projectId: project, releaseHash });
|
|
42
89
|
},
|
|
43
90
|
});
|
|
44
91
|
|
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
removeModelCliLeaf,
|
|
12
12
|
updateModelsCliLeaf,
|
|
13
13
|
getAppLogsCliLeaf,
|
|
14
|
+
listAppReleasesCliLeaf,
|
|
15
|
+
listAppLatestReleaseCliLeaf,
|
|
14
16
|
} from './app';
|
|
15
17
|
|
|
16
18
|
export const appCliBranch = CliBranch({
|
|
@@ -18,6 +20,8 @@ export const appCliBranch = CliBranch({
|
|
|
18
20
|
description: 'Manage alwaysAI applications',
|
|
19
21
|
subcommands: [
|
|
20
22
|
listAppsCliLeaf,
|
|
23
|
+
listAppReleasesCliLeaf,
|
|
24
|
+
listAppLatestReleaseCliLeaf,
|
|
21
25
|
installAppCliLeaf,
|
|
22
26
|
getAppStatusCliLeaf,
|
|
23
27
|
startAppCliLeaf,
|
package/src/subcommands/index.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { appCliBranch } from './app/index';
|
|
2
2
|
import { getDeviceInfoCliLeaf } from './device-control';
|
|
3
3
|
import { loginCliLeaf } from './login';
|
|
4
|
-
import { installTestAppCliLeaf } from './test-app';
|
|
4
|
+
// import { installTestAppCliLeaf } from './test-app';
|
|
5
5
|
|
|
6
6
|
export const subcommands = [
|
|
7
7
|
loginCliLeaf,
|
|
8
8
|
appCliBranch,
|
|
9
9
|
getDeviceInfoCliLeaf,
|
|
10
|
-
installTestAppCliLeaf,
|
|
10
|
+
// installTestAppCliLeaf,
|
|
11
11
|
];
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { CliLeaf, CliStringInput } from '@alwaysai/alwayscli';
|
|
1
|
+
import { CliLeaf, CliStringInput, CliTerseError } from '@alwaysai/alwayscli';
|
|
2
2
|
const path = require('path');
|
|
3
3
|
import { installApp } from '../application-control/application-control';
|
|
4
4
|
import { JsSpawner } from '../util/spawner/js-spawner';
|
|
5
5
|
|
|
6
|
-
export const installTestAppCliLeaf = CliLeaf({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
6
|
+
// export const installTestAppCliLeaf = CliLeaf({
|
|
7
|
+
// name: 'install-test-app',
|
|
8
|
+
// description: 'Install a test application',
|
|
9
|
+
// namedInputs: {
|
|
10
|
+
// project: CliStringInput({
|
|
11
|
+
// description: 'Project Id',
|
|
12
|
+
// }),
|
|
13
|
+
// version: CliStringInput({
|
|
14
|
+
// description: 'Version',
|
|
15
|
+
// }),
|
|
16
|
+
// },
|
|
17
|
+
// async action(_, opts) {
|
|
18
|
+
// const { project, version } = opts;
|
|
19
|
+
// const postfix = Math.random()
|
|
20
|
+
// .toString()
|
|
21
|
+
// .slice(2, 14);
|
|
22
|
+
// const projectId = project ? project : `16ad11bb-8c3a-4a15-923e-${postfix}`;
|
|
23
|
+
// const releaseVersion = version ? version : 'f43e816b30aa612f103fe73314f9716a436ce4f5';
|
|
24
|
+
// // Package test app
|
|
25
|
+
// const appDir = path.join('test', 'test-app');
|
|
26
|
+
// const spawner = JsSpawner({ path: appDir });
|
|
27
|
+
// const appPkg = await spawner.tar(...(await spawner.readdir()));
|
|
28
|
+
// await installApp({ projectId, appPkg, version: releaseVersion });
|
|
29
|
+
// },
|
|
30
|
+
// });
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const os = require('os');
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import {
|
|
4
|
+
DEVICE_CERT_AND_KEY_DIR_LINUX,
|
|
5
|
+
DEV_HOST_CERT_AND_KEY_DIR,
|
|
6
|
+
DEVICE_CERTIFICATE_FILE_NAME,
|
|
7
|
+
DEVICE_PRIVATE_KEY_FILE_NAME,
|
|
8
|
+
DEVICE_ROOT_CERT_FILE_NAME,
|
|
9
|
+
} from '../constants';
|
|
10
|
+
|
|
11
|
+
const certAndKeyDir = getCertAndKeyDir();
|
|
12
|
+
|
|
13
|
+
export function getCertAndKeyDir() {
|
|
14
|
+
if (os.type() === 'Darwin' || os.type() === 'Windows_NT') {
|
|
15
|
+
return DEV_HOST_CERT_AND_KEY_DIR;
|
|
16
|
+
}
|
|
17
|
+
return DEVICE_CERT_AND_KEY_DIR_LINUX;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getPrivateKeyFilePath() {
|
|
21
|
+
return join(certAndKeyDir, DEVICE_PRIVATE_KEY_FILE_NAME);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function getCertificateFilePath() {
|
|
25
|
+
return join(certAndKeyDir, DEVICE_CERTIFICATE_FILE_NAME);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function getRootCertificateFilePath() {
|
|
29
|
+
return join(certAndKeyDir, DEVICE_ROOT_CERT_FILE_NAME);
|
|
30
|
+
}
|
package/src/util/urls.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getSystemId } from 'alwaysai';
|
|
2
|
+
import { CliTerseError } from '@alwaysai/alwayscli';
|
|
3
|
+
|
|
4
|
+
export function getIoTCoreEndpointUrl() {
|
|
5
|
+
let iotCoreEndpointUrl = '';
|
|
6
|
+
switch (getSystemId()) {
|
|
7
|
+
case 'local':
|
|
8
|
+
case 'development':
|
|
9
|
+
iotCoreEndpointUrl = 'a170opbva29ts8-ats.iot.us-west-2.amazonaws.com';
|
|
10
|
+
break;
|
|
11
|
+
case 'qa':
|
|
12
|
+
iotCoreEndpointUrl = 'a3bff3qyyopgws-ats.iot.us-west-2.amazonaws.com';
|
|
13
|
+
break;
|
|
14
|
+
case 'production':
|
|
15
|
+
iotCoreEndpointUrl = 'a3tzi5g7sq5zsj-ats.iot.us-west-2.amazonaws.com';
|
|
16
|
+
break;
|
|
17
|
+
default:
|
|
18
|
+
throw new CliTerseError(`Remote deployment not supported on ${getSystemId()}!`);
|
|
19
|
+
}
|
|
20
|
+
return iotCoreEndpointUrl;
|
|
21
|
+
}
|