Update JS syntax #3

Merged
raucao merged 1 commits from chore/modern_js into master 2021-09-05 13:57:09 +00:00

345
index.js
View File

@ -1,5 +1,18 @@
var ChatMessages = function (privateClient, publicClient) { function pad (num) {
num = String(num);
if (num.length === 1) { num = "0" + num; }
return num;
};
function parseDate (date) {
return {
year: date.getUTCFullYear(),
month: pad( date.getUTCMonth() + 1 ),
day: pad( date.getUTCDate() )
};
};
const ChatMessages = function (privateClient, publicClient) {
/** /**
* Schema: chat-messages/daily * Schema: chat-messages/daily
* *
@ -139,7 +152,7 @@
* Example for IRC: * Example for IRC:
* *
* (start code) * (start code)
* var archive = new chatMessages.DailyArchive({ * const archive = new chatMessages.DailyArchive({
* server: { * server: {
* type: 'irc', * type: 'irc',
* name: 'freenode', * name: 'freenode',
@ -154,7 +167,7 @@
* Example for XMPP: * Example for XMPP:
* *
* (start code) * (start code)
* var archive = new chatMessages.DailyArchive({ * const archive = new chatMessages.DailyArchive({
* server: { * server: {
* type: 'xmpp', * type: 'xmpp',
* name: '5apps', * name: '5apps',
@ -166,125 +179,125 @@
* }); * });
* (end code) * (end code)
*/ */
var DailyArchive = function DailyArchive(options) { class DailyArchive {
// constructor (options) {
// Defaults //
// // Defaults
options.isPublic = options.isPublic || false; //
options.isPublic = options.isPublic || false;
// //
// Validate options // Validate options
// //
if (typeof options !== "object") { if (typeof options !== "object") {
throw "options must be an object"; throw "options must be an object";
} }
if (typeof options.server !== "object" || if (typeof options.server !== "object" ||
typeof options.server.type !== "string" || typeof options.server.type !== "string" ||
typeof options.server.name !== "string") { typeof options.server.name !== "string") {
throw "server must be an object containing at least server \"type\" and \"name\""; throw "server must be an object containing at least server \"type\" and \"name\"";
} }
if (typeof options.channelName !== "string") { if (typeof options.channelName !== "string") {
throw "channelName must be a string"; throw "channelName must be a string";
} }
if (!(options.date instanceof Date)) { if (!(options.date instanceof Date)) {
throw "date must be a date object"; throw "date must be a date object";
} }
if (typeof options.isPublic !== "boolean") { if (typeof options.isPublic !== "boolean") {
throw "isPublic must be a boolean value"; throw "isPublic must be a boolean value";
}
/**
* Property: server
*
* Contains information about the chat server/network
*
* Properties:
* type - Type of server/protocol (e.g. "irc", "xmpp", "campfire", "slack")
* name - Shortname/id/alias of network/server (e.g. "freenode", "mycompanyname")
* ircURI - (optional) IRC URI of network (e.g. "irc://irc.freenode.net/")
* xmppMUC - (optional) XMPP MUC service host (e.g. "conference.jabber.org")
*/
this.server = options.server;
/**
* Property: channelName
*
* Name of the IRC channel (e.g. "#kosmos")
*/
this.channelName = options.channelName;
/**
* Property: date
*
* Date of the archive's content
*/
this.date = options.date;
/**
* Property: isPublic
*
* `true` for public archives, `false` for private ones
*/
this.isPublic = options.isPublic;
/**
* Property: parsedDate
*
* Object containing padded year, month and day of date
*/
this.parsedDate = parseDate(this.date);
/**
* Property: dateId
*
* Date string in the form of YYYY/MM/DD
*/
this.dateId = this.parsedDate.year+'/'+this.parsedDate.month+'/'+this.parsedDate.day;
/**
* Property: path
*
* Document path of the archive file
*/
switch (this.server.type) {
case 'irc':
if (this.channelName.match(/^#/)) {
// normal chatroom
const channelName = this.channelName.replace(/^#/,'');
this.path = `${this.server.name}/channels/${channelName}/${this.dateId}`;
} else {
// user direct message
this.path = `${this.server.name}/users/${this.channelName}/${this.dateId}`;
}
break;
default:
this.path = `${this.server.name}/${this.channelName}/${this.dateId}`;
break;
}
/**
* Property: client
*
* Public or private BaseClient, depending on isPublic
*/
this.client = this.isPublic ? publicClient : privateClient;
/**
* Property: previous
*
* Date of previous log file as YYYY/MM/DD
*/
this.previous = options.previous;
/**
* Property: next
*
* Date of next log file as YYYY/MM/DD
*/
this.next = options.next;
} }
/**
* Property: server
*
* Contains information about the chat server/network
*
* Properties:
* type - Type of server/protocol (e.g. "irc", "xmpp", "campfire", "slack")
* name - Shortname/id/alias of network/server (e.g. "freenode", "mycompanyname")
* ircURI - (optional) IRC URI of network (e.g. "irc://irc.freenode.net/")
* xmppMUC - (optional) XMPP MUC service host (e.g. "conference.jabber.org")
*/
this.server = options.server;
/**
* Property: channelName
*
* Name of the IRC channel (e.g. "#kosmos")
*/
this.channelName = options.channelName;
/**
* Property: date
*
* Date of the archive's content
*/
this.date = options.date;
/**
* Property: isPublic
*
* `true` for public archives, `false` for private ones
*/
this.isPublic = options.isPublic;
/**
* Property: parsedDate
*
* Object containing padded year, month and day of date
*/
this.parsedDate = parseDate(this.date);
/**
* Property: dateId
*
* Date string in the form of YYYY/MM/DD
*/
this.dateId = this.parsedDate.year+'/'+this.parsedDate.month+'/'+this.parsedDate.day;
/**
* Property: path
*
* Document path of the archive file
*/
switch (this.server.type) {
case 'irc':
if (this.channelName.match(/^#/)) {
// normal chatroom
var channelName = this.channelName.replace(/^#/,'');
this.path = `${this.server.name}/channels/${channelName}/${this.dateId}`;
} else {
// user direct message
this.path = `${this.server.name}/users/${this.channelName}/${this.dateId}`;
}
break;
default:
this.path = `${this.server.name}/${this.channelName}/${this.dateId}`;
break;
}
/**
* Property: client
*
* Public or private BaseClient, depending on isPublic
*/
this.client = this.isPublic ? publicClient : privateClient;
/**
* Property: previous
*
* Date of previous log file as YYYY/MM/DD
*/
this.previous = options.previous;
/**
* Property: next
*
* Date of next log file as YYYY/MM/DD
*/
this.next = options.next;
};
DailyArchive.prototype = {
/* /*
* Method: addMessage * Method: addMessage
* *
@ -294,7 +307,7 @@
* text - The message itself * text - The message itself
* type - Type of message (one of text, join, leave, action) * type - Type of message (one of text, join, leave, action)
*/ */
addMessage: function addMessage(message) { addMessage (message) {
if (this.isPublic && !this.channelName.match(/^#/)) { if (this.isPublic && !this.channelName.match(/^#/)) {
return Promise.resolve(false); return Promise.resolve(false);
} }
@ -308,7 +321,7 @@
return this._createDocument(message); return this._createDocument(message);
} }
}); });
}, }
/* /*
* Method: addMessages * Method: addMessages
@ -321,7 +334,7 @@
* overwrite - If true, creates a new archive file and overwrites the * overwrite - If true, creates a new archive file and overwrites the
* old one. Defaults to false. * old one. Defaults to false.
*/ */
addMessages: function addMessage(messages, overwrite) { addMessages (messages, overwrite) {
if (this.isPublic && !this.channelName.match(/^#/)) { if (this.isPublic && !this.channelName.match(/^#/)) {
return Promise.resolve(false); return Promise.resolve(false);
} }
@ -343,23 +356,23 @@
} }
}); });
} }
}, }
/* /*
* Method: remove * Method: remove
* *
* Deletes the entire archive document from storage * Deletes the entire archive document from storage
*/ */
remove: function() { remove () {
return this.client.remove(this.path); return this.client.remove(this.path);
}, }
/* /*
* Method: _updateDocument * Method: _updateDocument
* *
* Updates and writes an existing archive document * Updates and writes an existing archive document
*/ */
_updateDocument: function(archive, messages) { _updateDocument (archive, messages) {
console.debug('[chat-messages] Updating archive document', archive); console.debug('[chat-messages] Updating archive document', archive);
if (Array.isArray(messages)) { if (Array.isArray(messages)) {
@ -371,16 +384,16 @@
} }
return this._sync(archive); return this._sync(archive);
}, }
/* /*
* Method: _createDocument * Method: _createDocument
* *
* Creates and writes a new archive document * Creates and writes a new archive document
*/ */
_createDocument: function(messages) { _createDocument (messages) {
console.debug('[chat-messages] Creating new archive document'); console.debug('[chat-messages] Creating new archive document');
let archive = this._buildArchiveObject(); const archive = this._buildArchiveObject();
if (Array.isArray(messages)) { if (Array.isArray(messages)) {
messages.forEach((message) => { messages.forEach((message) => {
@ -405,17 +418,17 @@
return this._sync(archive); return this._sync(archive);
}); });
} }
}, }
/* /*
* Method: _buildArchiveObject * Method: _buildArchiveObject
* *
* Builds the object to be stored in remote storage * Builds the object to be stored in remote storage
*/ */
_buildArchiveObject: function() { _buildArchiveObject () {
let roomName = this.channelName.replace(/#/,''); const roomName = this.channelName.replace(/#/,'');
let archive = { const archive = {
"@id": "chat-messages/"+this.server.name+"/channels/"+roomName+"/", "@id": "chat-messages/"+this.server.name+"/channels/"+roomName+"/",
"@type": "ChatChannel", "@type": "ChatChannel",
"name": this.channelName, "name": this.channelName,
@ -440,18 +453,18 @@
} }
return archive; return archive;
}, }
/* /*
* Method: _updatePreviousArchive * Method: _updatePreviousArchive
* *
* Finds the previous archive document and updates its today.next value * Finds the previous archive document and updates its today.next value
*/ */
_updatePreviousArchive: function() { _updatePreviousArchive () {
return this._findPreviousArchive().then((archive) => { return this._findPreviousArchive().then((archive) => {
if (typeof archive === 'object' && archive.today) { if (typeof archive === 'object' && archive.today) {
archive.today.next = this.dateId; archive.today.next = this.dateId;
let path = this.path.substring(0, this.path.length-this.dateId.length)+archive.today['@id']; const path = this.path.substring(0, this.path.length-this.dateId.length)+archive.today['@id'];
return this.client.storeObject('daily-archive', path, archive).then(() => { return this.client.storeObject('daily-archive', path, archive).then(() => {
console.debug('[chat-messages] Previous archive written to remote storage', path, archive); console.debug('[chat-messages] Previous archive written to remote storage', path, archive);
@ -462,60 +475,60 @@
return false; return false;
} }
}); });
}, }
/* /*
* Method: _findPreviousArchive * Method: _findPreviousArchive
* *
* Returns the previous archive document * Returns the previous archive document
*/ */
_findPreviousArchive: function() { _findPreviousArchive () {
const monthPath = this.path.substring(0, this.path.length-2); const monthPath = this.path.substring(0, this.path.length-2);
const yearPath = this.path.substring(0, this.path.length-5); const yearPath = this.path.substring(0, this.path.length-5);
const basePath = this.path.substring(0, this.path.length-10); const basePath = this.path.substring(0, this.path.length-10);
return this.client.getListing(monthPath).then((listing) => { return this.client.getListing(monthPath).then((listing) => {
let days = Object.keys(listing).map((i) => parseInt(i)).map((i) => { const days = Object.keys(listing).map((i) => parseInt(i)).map((i) => {
return (i < parseInt(this.parsedDate.day)) ? i : null; return (i < parseInt(this.parsedDate.day)) ? i : null;
}).filter(function(i){ return i != null; }); }).filter(function(i){ return i != null; });
if (days.length > 0) { if (days.length > 0) {
let day = pad(Math.max(...days).toString()); const day = pad(Math.max(...days).toString());
return this.client.getObject(monthPath+day); return this.client.getObject(monthPath+day);
} }
// Find last day in previous month // Find last day in previous month
return this.client.getListing(yearPath).then((listing) => { return this.client.getListing(yearPath).then((listing) => {
let months = Object.keys(listing).map((i) => parseInt(i.substr(0,2))).map((i) => { const months = Object.keys(listing).map((i) => parseInt(i.substr(0,2))).map((i) => {
return (i < parseInt(this.parsedDate.month)) ? i : null; return (i < parseInt(this.parsedDate.month)) ? i : null;
}).filter(function(i){ return i != null; }); }).filter(function(i){ return i != null; });
if (months.length > 0) { if (months.length > 0) {
let month = pad(Math.max(...months).toString()); const month = pad(Math.max(...months).toString());
return this.client.getListing(yearPath+month+'/').then((listing) => { return this.client.getListing(yearPath+month+'/').then((listing) => {
let days = Object.keys(listing).map((i) => parseInt(i)); const days = Object.keys(listing).map((i) => parseInt(i));
let day = pad(Math.max(...days).toString()); const day = pad(Math.max(...days).toString());
return this.client.getObject(yearPath+month+'/'+day); return this.client.getObject(yearPath+month+'/'+day);
}); });
} else { } else {
// Find last month and day in previous year // Find last month and day in previous year
return this.client.getListing(basePath).then((listing) => { return this.client.getListing(basePath).then((listing) => {
let years = Object.keys(listing).map((i) => parseInt(i.substr(0,4))).map((i) => { const years = Object.keys(listing).map((i) => parseInt(i.substr(0,4))).map((i) => {
return (i < parseInt(this.parsedDate.year)) ? i : null; return (i < parseInt(this.parsedDate.year)) ? i : null;
}).filter(function(i){ return i != null; }); }).filter(function(i){ return i != null; });
if (years.length > 0) { if (years.length > 0) {
let year = Math.max(...years).toString(); const year = Math.max(...years).toString();
return this.client.getListing(basePath+year+'/').then((listing) => { return this.client.getListing(basePath+year+'/').then((listing) => {
let months = Object.keys(listing).map((i) => parseInt(i.substr(0,2))); const months = Object.keys(listing).map((i) => parseInt(i.substr(0,2)));
let month = pad(Math.max(...months).toString()); const month = pad(Math.max(...months).toString());
return this.client.getListing(basePath+year+'/'+month+'/').then((listing) => { return this.client.getListing(basePath+year+'/'+month+'/').then((listing) => {
let days = Object.keys(listing).map((i) => parseInt(i)); const days = Object.keys(listing).map((i) => parseInt(i));
let day = pad(Math.max(...days).toString()); const day = pad(Math.max(...days).toString());
return this.client.getObject(basePath+year+'/'+month+'/'+day); return this.client.getObject(basePath+year+'/'+month+'/'+day);
}); });
}); });
@ -526,14 +539,14 @@
} }
}); });
}); });
}, }
/* /*
* Method: _sync * Method: _sync
* *
* Write archive document * Write archive document
*/ */
_sync: function(obj) { _sync (obj) {
console.debug('[chat-messages] Writing archive object', obj); console.debug('[chat-messages] Writing archive object', obj);
return this.client.storeObject('daily-archive', this.path, obj).then(function(){ return this.client.storeObject('daily-archive', this.path, obj).then(function(){
@ -546,29 +559,13 @@
} }
}; };
var pad = function(num) { return {
num = String(num); exports: {
if (num.length === 1) { num = "0" + num; } DailyArchive,
return num; privateClient,
publicClient
}
}; };
var parseDate = function(date) {
return {
year: date.getUTCFullYear(),
month: pad( date.getUTCMonth() + 1 ),
day: pad( date.getUTCDate() )
};
};
var exports = {
DailyArchive: DailyArchive,
privateClient: privateClient,
publicClient: publicClient
};
// Return public functions
return { exports: exports };
}; };
export default { name: 'chat-messages', builder: ChatMessages }; export default { name: 'chat-messages', builder: ChatMessages };