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);
    });
};