23maverick23
3/18/2016 - 3:59 PM

NSOA: Base64 Library Script + Example

NSOA: Base64 Library Script + Example

/**
 * Copyright NetSuite, Inc. 2016 All rights reserved.
 * The following code is a demo prototype. Due to time constraints of a demo,
 * the code may contain bugs, may not accurately reflect user requirements
 * and may not be the best approach. Actual implementation should not reuse
 * this code without due verification.
 *
 * Append note updates to project message board.
 *
 * Version    Date            Author           Remarks
 * 1.00       07 Mar 2016     Ryan Morrissey
 *
 */

function prjAppendNotesOnSave(type) {
    try {
        var Base64  = require('Base64'),
            unixStr = new Date().getTime(),
            newRec  = NSOA.form.getNewRecord(),
            user    = NSOA.wsapi.whoami(),
            newNote = newRec.notes,
            newMsg  = utilityAddTimestamp(newNote, user);

        if (type == 'edit') {
            var oldRec = NSOA.form.getNewRecord(),
                oldMsg = oldRec.message;

            newMsg = newMsg + oldMsg;
        }

        var prjObj     = new NSOA.record.oaProject();
        prjObj.id      = newRec.id;
        prjObj.message = newMsg;
        prjObj.notes   = '';

        var attObj         = new NSOA.record.oaAttachment();
        attObj.file_name   = newRec.name + '_' + unixStr + '.txt';
        attObj.owner_type  = 'Project';
        attObj.name        = 'Project Notes Archive';
        attObj.ownerid     = newRec.id;
        attObj.base64_data = Base64.encode(newMsg);
        attObj.is_a_folder = 0;

        var project = NSOA.wsapi.modify([], [prjObj]);
        var archive = NSOA.wsapi.add([attObj]);

        NSOA.meta.log('info', 'Attachment: ' + JSON.stringify(archive));
    } catch(e) {
        NSOA.meta.log('error', 'Try/catch error: ' + e);
    }
}


function utilityAddTimestamp(note, user) {
    if (!note || note.length < 1) {
        return '';
    }
    else {
        var d = new Date(),
            u = user,
            n = '<hr>Added: ' + d.toString() +
                '<br>' + note + '<br>[User: ' +
                u.addr_first + '.' +
                u.addr_last + ']<br><br>';
        return n;
    }
}
function base64_decode(data) {
    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        dec = '',
        tmp_arr = [];

    if (!data) {
        return data;
    }

    data += '';

    do { // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));

        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

        o1 = bits >> 16 & 0xff;
        o2 = bits >> 8 & 0xff;
        o3 = bits & 0xff;

        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);

    dec = tmp_arr.join('');

    return dec.replace(/\0+$/, '');
}

function base64_encode(data) {
    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        enc = '',
        tmp_arr = [];

    if (!data) {
        return data;
    }

    do { // pack three octets into four hexets
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);

        bits = o1 << 16 | o2 << 8 | o3;

        h1 = bits >> 18 & 0x3f;
        h2 = bits >> 12 & 0x3f;
        h3 = bits >> 6 & 0x3f;
        h4 = bits & 0x3f;

        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);

    enc = tmp_arr.join('');

    var r = data.length % 3;

    return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
}

exports.decode = base64_decode;
exports.encode = base64_encode;