@nordicsemiconductor/asset-tracker-cloud-aws
Version:
A reference implementation of a serverless backend for an IoT product developed using AWS CDK in TypeScript.
333 lines (332 loc) • 15.3 kB
JavaScript
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _async_to_generator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _ts_generator(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1) throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"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(_)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
};
}
}
import { flash } from '@nordicsemiconductor/device-helpers';
import { Octokit } from '@octokit/rest';
import chalk from 'chalk';
import fs from 'fs';
import https from 'https';
import { randomUUID } from 'node:crypto';
import os from 'os';
import path from 'path';
import { extractRepoAndOwner } from '../../cdk/helper/extract-repo-and-owner.js';
export var defaultFirmwareRepository = 'https://github.com/NordicSemiconductor/asset-tracker-cloud-firmware-aws';
var netrclocation = path.resolve(os.homedir(), '.netrc');
var getLatestFirmware = function() {
var _ref = _async_to_generator(function(param) {
var variant, dk, firmwareRepository, ghToken, debug, _extractRepoAndOwner, owner, repo, octokit, latestRelease, assets, hexfile, downloadTarget;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
variant = param.variant, dk = param.dk, firmwareRepository = param.firmwareRepository, ghToken = param.ghToken, debug = param.debug;
_extractRepoAndOwner = extractRepoAndOwner(firmwareRepository), owner = _extractRepoAndOwner.owner, repo = _extractRepoAndOwner.repo;
octokit = new Octokit({
auth: ghToken
});
return [
4,
octokit.repos.listReleases({
owner: owner,
repo: repo,
per_page: 1
})
];
case 1:
latestRelease = _state.sent().data[0];
debug === null || debug === void 0 ? void 0 : debug("Latest release: ".concat(latestRelease === null || latestRelease === void 0 ? void 0 : latestRelease.name));
return [
4,
octokit.repos.listReleaseAssets({
owner: owner,
repo: repo,
release_id: latestRelease === null || latestRelease === void 0 ? void 0 : latestRelease.id
})
];
case 2:
assets = _state.sent().data;
hexfile = assets.find(function(param) {
var name = param.name;
if (!name.includes('.hex')) return false;
if (name.includes('-signed')) return false;
if (!name.includes(dk ? 'nRF9160DK' : 'Thingy91')) return false;
switch(variant){
case 'memfault':
return name.includes('debugWithMemfault');
case 'nodebug':
return name.includes('nodebug');
default:
return name.includes('debug') && !name.includes('nodebug') && !name.includes('debugWithMemfault');
}
});
if (hexfile === undefined) throw new Error("Failed to detect latest release.");
downloadTarget = path.join(os.tmpdir(), "".concat(randomUUID(), ".hex"));
console.log(chalk.magenta("Downloading"), chalk.blue(hexfile.name));
return [
4,
new Promise(function(resolve) {
var file = fs.createWriteStream(downloadTarget);
https.get(hexfile.browser_download_url, function(response) {
https.get(response.headers.location, function(response) {
response.pipe(file).on('close', resolve);
});
});
})
];
case 3:
_state.sent();
return [
2,
downloadTarget
];
}
});
});
return function getLatestFirmware(_) {
return _ref.apply(this, arguments);
};
}();
export var flashFirmwareCommand = function() {
return {
command: 'flash-firmware',
options: [
{
flags: '--dk',
description: "Flash a 9160 DK"
},
{
flags: '--variant <variant>',
description: "Flash firmware variant (debug|nodebug|memfault), defaults to debug"
},
{
flags: '-f, --firmware <firmware>',
description: "Flash application from this file"
},
{
flags: '--gh-token <ghToken>',
description: "GitHub token"
},
{
flags: '-r, --firmware-repository <firmwareRepository>',
description: "Firmware repository to pull the release from."
},
{
flags: '--debug',
description: "Log debug messages"
}
],
action: function() {
var _ref = _async_to_generator(function(param) {
var dk, variant, firmware, ghToken, firmwareRepository, debug, _fs_readFileSync_split_find, hexfile, _tmp;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
dk = param.dk, variant = param.variant, firmware = param.firmware, ghToken = param.ghToken, firmwareRepository = param.firmwareRepository, debug = param.debug;
if (firmwareRepository !== undefined && firmware !== undefined // Both provided
) {
throw new Error("Must provide either -f <firmware> or --repo <firmware repository URL>");
}
if (firmware === undefined) {
if (ghToken === undefined) {
try {
;
ghToken = (_fs_readFileSync_split_find = fs.readFileSync(netrclocation, 'utf-8').split(os.EOL).find(function(s) {
return s.includes('machine api.github.com');
})) === null || _fs_readFileSync_split_find === void 0 ? void 0 : _fs_readFileSync_split_find.split(' ')[5];
} catch (e) {
console.error('');
console.error('', chalk.red('⚠️'), chalk.red("Failed to read GitHub token from ".concat(chalk.blue(netrclocation), ".")));
console.error('');
console.error('', chalk.gray('ℹ️'), chalk.gray("We use your GitHub token to query the release page of"));
console.error(' ', chalk.gray(firmwareRepository !== null && firmwareRepository !== void 0 ? firmwareRepository : defaultFirmwareRepository));
console.error('');
console.error(' ', chalk.yellowBright('Please provide a valid GitHub token in .netrc.'));
console.error('');
console.error(' ', chalk.yellowBright("Add a line like this to ".concat(chalk.blue(netrclocation), ":")));
console.error('');
console.error(' ', chalk.white('machine api.github.com login <your GitHub username> password <your personal access token>'));
console.error('');
console.error(' ', chalk.yellow.dim('Learn more about .netrc: https://everything.curl.dev/usingcurl/netrc'));
console.error('');
console.error(' ', chalk.yellowBright("Alternatively pass it as an argument:"));
console.error('');
console.error(' ', chalk.greenBright("./cli.sh flash-firmare --gh-token"), chalk.blueBright('"your personal access token"'));
console.error('');
console.error(' ', chalk.yellowBright("You can also download the latest release for your board manually from"));
console.error(' ', chalk.yellow("".concat(firmwareRepository !== null && firmwareRepository !== void 0 ? firmwareRepository : defaultFirmwareRepository, "/releases")));
console.error(' ', chalk.yellowBright("and provide the location to the hexfile as an argument:"));
console.error('');
console.error(' ', chalk.greenBright("./cli.sh flash-firmare --firmware"), chalk.blueBright("/path/to/firmware.hex"));
process.exit(1);
}
}
}
if (!(firmware !== null && firmware !== void 0)) return [
3,
1
];
_tmp = firmware;
return [
3,
3
];
case 1:
return [
4,
getLatestFirmware({
dk: dk,
variant: variant !== undefined ? variant : undefined,
ghToken: ghToken,
firmwareRepository: firmwareRepository !== null && firmwareRepository !== void 0 ? firmwareRepository : defaultFirmwareRepository,
debug: debug === true ? console.debug : undefined
})
];
case 2:
_tmp = _state.sent();
_state.label = 3;
case 3:
hexfile = _tmp;
return [
4,
flash({
hexfile: hexfile,
warn: console.error,
debug: debug === true ? console.debug : undefined
})
];
case 4:
_state.sent();
console.log(chalk.green("Done"));
return [
2
];
}
});
});
return function(_) {
return _ref.apply(this, arguments);
};
}(),
help: 'Flash (latest) firmware release to a device using JLink'
};
};