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;