@platformos/pos-cli
Version:
Manage your platformOS application
65 lines (59 loc) • 2.23 kB
JavaScript
import packAssets from './assets/packAssets.js';
import { manifestGenerate } from './assets/manifest.js';
import logger from './logger.js';
import { uploadFile } from './s3UploadFile.js';
import { presignUrl } from './presignUrl.js';
import files from './files.js';
import ServerError from './ServerError.js';
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
const waitForUnpack = async fileUrl => {
logger.Debug('Waiting for assets to be propagated to CDN');
let fileExists = false;
let counter = 0;
do {
logger.Debug(`Waiting for: ${fileUrl} to be deleted.`);
counter += 1;
if (fileExists) await sleep(1000);
try {
const response = await fetch(fileUrl, { method: 'HEAD' });
fileExists = response.ok;
} catch (error) {
fileExists = false;
await logger.Error(error);
}
} while (fileExists && counter < 90);
};
const deployAssets = async (gateway, { releaseId } = {}) => {
logger.Debug('Generating and uploading new assets manifest...');
const assetsArchiveName = './tmp/assets.zip';
const instance = await gateway.getInstance();
const now = Math.floor(new Date());
const remoteAssetsArchiveName = `instances/${instance.id}/assets/${now}.assets_deploy.zip`;
logger.Debug(remoteAssetsArchiveName);
try {
await packAssets(assetsArchiveName);
const data = await presignUrl(remoteAssetsArchiveName, assetsArchiveName);
logger.Debug(data);
logger.Debug(assetsArchiveName);
await uploadFile(assetsArchiveName, data.uploadUrl);
logger.Debug('Assets uploaded to S3.');
await waitForUnpack(data.accessUrl);
const manifest = await manifestGenerate();
logger.Debug(manifest);
files.writeJSON('tmp/assets_manifest.json', manifest);
const response = await gateway.sendManifest(manifest, releaseId);
logger.Debug('Uploading assets');
return response;
} catch (e) {
logger.Debug(e);
logger.Debug(e.message);
logger.Debug(e.stack);
if (ServerError.isNetworkError(e)) {
await logger.Error('Deploy assets failed.');
await ServerError.handler(e);
} else {
await logger.Error(`Deploy assets failed: ${e.message || e}`);
}
}
};
export { deployAssets };