documents/dev/snippets/aws/S3 config store.md
S3 config store
This uses lz-node to turn a JSON string into compressed text and store on S3. The client application is responsible for fetching the file, decoding, and parsing.
sync.js at root of project
const http = require('https');
const fs = require('fs');
const LZ = require('./service/lambda/lz-node');
const { exec } = require("child_process");
const config = { foo: 'bar' };
const FILE_URL = 'https://dq74kqy2n3v5k.cloudfront.net/lib/sp/c.txt';
const S3_PATH = 's3://gerenuk-static/lib/sp/c.txt';
function decodeFromURL() {
http.get(FILE_URL, (res) => {
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
console.log('Testing Get Data From URL', LZ.decompressFromUTF16(rawData));
});
});
}
function encodeAndUpload() {
let txt = LZ.compressToUTF16(JSON.stringify(config));
fs.writeFile('c.txt', txt, (err)=> {
if (err) return console.log(err);
console.log('done writing', txt);
fs.readFile('c.txt', 'utf8', (err, txt)=> {
console.log('decoding test', LZ.decompressFromUTF16(txt));
});
exec('aws s3 cp ./c.txt ' + S3_PATH, (error, stdout, stderr) => {
if (error) return console.log(`error: ${error.message}`);
console.log('copied to s3');
decodeFromURL();
});
});
}
if(process.argv.length > 2) {
decodeFromURL();
} else {
encodeAndUpload();
}
In client app (utils.js)
import LZ from './LZ';
const fetchConfig = (fn)=> {
fetch('https://dq74kqy2n3v5k.cloudfront.net/lib/sp/c.txt')
.then((response)=> {
if (!response.ok) throw new Error("HTTP error, status = " + response.status);
return response.text();
}).then((txt)=> {
const config = JSON.parse(LZ.decompressFromUTF16(txt));
if(typeof fn === 'function') fn(config);
});
};