@twilio-labs/serverless-api
Version:
API-wrapper for the Twilio Serverless API
137 lines (136 loc) • 5.2 kB
JavaScript
/** @module @twilio-labs/serverless-api/dist/api */
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uploadAsset = exports.createAssetVersion = exports.getOrCreateAssetResources = exports.listAssetResources = exports.createAssetResource = void 0;
const debug_1 = __importDefault(require("debug"));
const form_data_1 = __importDefault(require("form-data"));
const content_type_1 = require("../utils/content-type");
const error_1 = require("../utils/error");
const api_client_1 = require("./utils/api-client");
const pagination_1 = require("./utils/pagination");
const log = (0, debug_1.default)('twilio-serverless-api:assets');
/**
* Calls the API to create a new Asset Resource
*
* @param {string} name friendly name of the resource
* @param {string} serviceSid service to register asset under
* @param {TwilioServerlessApiClient} client API client
* @returns {Promise<AssetApiResource>}
*/
async function createAssetResource(name, serviceSid, client) {
try {
const resp = await client.request('post', `Services/${serviceSid}/Assets`, {
form: {
FriendlyName: name,
},
});
return resp.body;
}
catch (err) {
log('%O', new error_1.ClientApiError(err));
throw new Error(`Failed to create "${name}" asset`);
}
}
exports.createAssetResource = createAssetResource;
/**
* Calls the API to retrieve a list of all assets
*
* @param {string} serviceSid service to look for assets
* @param {TwilioServerlessApiClient} client API client
* @returns {Promise<AssetApiResource[]>}
*/
async function listAssetResources(serviceSid, client) {
try {
return (0, pagination_1.getPaginatedResource)(client, `Services/${serviceSid}/Assets`);
}
catch (err) {
log('%O', new error_1.ClientApiError(err));
throw err;
}
}
exports.listAssetResources = listAssetResources;
/**
* Given a list of resources it will first check which assets already exists
* and create the remaining ones.
*
* @param {FileInfo[]} assets
* @param {string} serviceSid
* @param {TwilioServerlessApiClient} client
* @returns {Promise<AssetResource[]>}
*/
async function getOrCreateAssetResources(assets, serviceSid, client) {
const output = [];
const existingAssets = await listAssetResources(serviceSid, client);
const assetsToCreate = [];
assets.forEach(asset => {
const existingAsset = existingAssets.find(x => asset.name === x.friendly_name);
if (!existingAsset) {
assetsToCreate.push(asset);
}
else {
output.push({
...asset,
sid: existingAsset.sid,
});
}
});
const createdAssets = await Promise.all(assetsToCreate.map(async (asset) => {
const newAsset = await createAssetResource(asset.name, serviceSid, client);
return {
...asset,
sid: newAsset.sid,
};
}));
return [...output, ...createdAssets];
}
exports.getOrCreateAssetResources = getOrCreateAssetResources;
/**
* Given an asset it will create a new version instance for it
*
* @param {AssetResource} asset the one to create a new version for
* @param {string} serviceSid the service to create the asset version for
* @param {TwilioServerlessApiClient} client API client
* @returns {Promise<VersionResource>}
*/
async function createAssetVersion(asset, serviceSid, client, clientConfig) {
try {
const contentType = await (0, content_type_1.getContentType)(asset.content, asset.filePath || asset.name);
log('Uploading asset via form data with content-type "%s"', contentType);
const contentOpts = {
filename: asset.name,
contentType: contentType,
};
const form = new form_data_1.default();
form.append('Path', asset.path);
form.append('Visibility', asset.access);
form.append('Content', asset.content, contentOpts);
const resp = await client.request('post', `Services/${serviceSid}/Assets/${asset.sid}/Versions`, {
responseType: 'text',
prefixUrl: (0, api_client_1.getApiUrl)(clientConfig, 'serverless-upload'),
body: form,
});
return JSON.parse(resp.body);
}
catch (err) {
log('%O', new error_1.ClientApiError(err));
throw new Error(`Failed to upload Asset ${asset && (asset.name || asset.filePath)}`);
}
}
exports.createAssetVersion = createAssetVersion;
/**
* Uploads a given asset by creating a new version and uploading the content there
*
* @export
* @param {AssetResource} asset The asset to upload
* @param {string} serviceSid The service to upload it to
* @param {TwilioServerlessApiClient} client The API client
* @returns {Promise<Sid>}
*/
async function uploadAsset(asset, serviceSid, client, clientConfig) {
const version = await createAssetVersion(asset, serviceSid, client, clientConfig);
return version.sid;
}
exports.uploadAsset = uploadAsset;
;