copious-transitions
Version:
Framework for working with frameworks
215 lines (174 loc) • 10.1 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: custom_storage/default_persistent_db.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: custom_storage/default_persistent_db.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>
const fs = require('fs')
const AppLifeCycle = require("../lib/general_lifecyle")
const DB_STASH_INTERVAL = 10000
/**
* A standin class for persistence from the database point of view.
*
* Useful for debugging.
*
* Writes data to a file in the directory of execution by default.
*
*
* @memberof DefaultDB
*/
class FileMapper extends AppLifeCycle {
constructor() {
super()
this.storage_map = {}
this.dirty = false
this.root_path = process.cwd()
this.db_file = `${this.root_path}/userdata.db`
}
/**
* on shutdown, this method will be called in order to flush out the local tables (in this case JS Objects) to the file system./
*/
app_shutdown() {
fs.writeFileSync(this.db_file,JSON.stringify(this.storage_map))
}
/**
* Sets the path of the DB file, where data will be stored between runs.
* Setsup up an interval benchmark writing of the file to the directory.
*
* @param {object} conf
*/
initialize(conf) {
this.id_maker = (typeof conf.id_maker === 'function') ? conf.id_maker : (() => { return this.#make_random_id() })
this.db_file = this.root_path + '/' + (conf.db_file ? conf.db_file : 'userdata.db')
try {
this.storage_map = JSON.parse(fs.readFileSync(this.db_file,'ascii').toString())
} catch(e) {
if ( e.code !== "ENOENT" ) {
console.dir(e)
process.exit(1)
}
}
let extant_interval = setInterval(() => {
if ( this.dirty ) {
fs.writeFile(this.db_file,JSON.stringify(this.storage_map),() => { this.dirty = false })
}
},DB_STASH_INTERVAL)
this.add_interval(extant_interval) // app lifecycle
}
/**
* The object data is passed for inclusion into the DB.
* If the object does not have an `_id` field, the method attempts to create one.
* A call to create will not overwrite an existing object (user update).
*
* @param {object} obj
* @param {Function} cb - the callback will receive null if there is no error, otherwise, it will be passed an Error object.
*/
create(obj,cb) {
if ( obj._id && this.storage_map[obj._id] ) {
if ( cb ) cb(new Error("already exists"),null)
}
if ( !obj._id ) {
obj._id = this.id_maker()
}
this.storage_map[obj._id] = obj
if ( cb ) cb(null)
}
/**
* Overwrites the data of the object in the DB.
* The object must be in the DB, or this call will provide an error to the callback (if the callback is used)
*
* @param {object} obj
* @param {Function} cb
*/
update(obj,cb) {
if ( !(obj._id) || !(this.storage_map[obj._id]) ) {
if ( cb ) cb(new Error("does not exists"),null)
}
this.storage_map[obj._id] = obj
this.dirty = true
if ( cb ) cb(null)
}
/**
* Given the object is in the map, deletes it.
*
* If the callback is provided, it will call it with an error if it is not found.
* The callback will be called with null if the object can be deleted.
*
* @param {string} id
* @param {Function} cb
*/
delete(id,cb) {
if ( !(this.storage_map[id]) ) {
if ( cb ) cb(new Error("does not exists"),null)
}
delete this.storage_map[id]
this.dirty = true
if ( cb ) cb(null)
}
/**
* Returns an object stored in the local application storage map.
*
* @param {string} id
* @param {Function} cb
* @returns {boolean|object} if ther eis no callback, returns the object found otherwise true and the object is passed to the callback
*/
findOne(id,cb) {
let obj = this.storage_map[id]
if ( !( obj ) ) {
if ( cb ) cb(new Error("does not exists"),null)
return(false)
}
if ( cb ) cb(null,obj)
else return(obj)
return(true)
}
/**
*
* @returns {Array} - a list of all the `_id`s in the database and loaded into memory.
*/
all_keys() {
return(Object.keys(this.storage_map))
}
/**
* Returns either a number that is defined by a global generator for an ID
* or it will return a quasi random token that can be good for testing.
* It is best for an application to provide a method for generating IDs via the configuration.
*
* @returns {Number} a number to use as an id
*/
#make_random_id() {
if ( global_appwide_token === undefined ) {
return (Date.now() ^ (Math.random()*19777))
} else {
return global_appwide_token()
}
}
}
module.exports = new FileMapper()</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="Contractual.html">Contractual</a></li><li><a href="CopiousTransitions.html">CopiousTransitions</a></li><li><a href="DefaultDB.html">DefaultDB</a></li><li><a href="base.html">base</a></li><li><a href="field_validators.html">field_validators</a></li></ul><h3>Classes</h3><ul><li><a href="Contractual.LocalTObjectCache.html">LocalTObjectCache</a></li><li><a href="Contractual.MimeHandling.html">MimeHandling</a></li><li><a href="Contractual.TransitionHandling.html">TransitionHandling</a></li><li><a href="Contractual.UserHandling.html">UserHandling</a></li><li><a href="CopiousTransitions.CopiousTransitions.html">CopiousTransitions</a></li><li><a href="DefaultDB.CustomizationMethodsByApplication.html">CustomizationMethodsByApplication</a></li><li><a href="DefaultDB.FauxInMemStore.html">FauxInMemStore</a></li><li><a href="DefaultDB.FileMapper.html">FileMapper</a></li><li><a href="DefaultDB.FilesAndRelays.html">FilesAndRelays</a></li><li><a href="DefaultDB.FilesAndRelays_base.html">FilesAndRelays_base</a></li><li><a href="DefaultDB.LocalStaticDB.html">LocalStaticDB</a></li><li><a href="DefaultDB.LocalStorageLifeCycle.html">LocalStorageLifeCycle</a></li><li><a href="DefaultDB.LocalStorageSerialization.html">LocalStorageSerialization</a></li><li><a href="DefaultDB.PageableMemStoreElement.html">PageableMemStoreElement</a></li><li><a href="DefaultDB.PersistenceContracts.html">PersistenceContracts</a></li><li><a href="DefaultDB.RemoteMessaging.html">RemoteMessaging</a></li><li><a href="DefaultDB.StaticDBDefault.html">StaticDBDefault</a></li><li><a href="GeneralUserDBWrapperImpl.html">GeneralUserDBWrapperImpl</a></li><li><a href="SessionTokenManager.html">SessionTokenManager</a></li><li><a href="base.DBClass.html">DBClass</a></li><li><a href="base.EndpointManager.html">EndpointManager</a></li><li><a href="base.GeneralAppLifeCycle.html">GeneralAppLifeCycle</a></li><li><a href="base.GeneralAuth.html">GeneralAuth</a></li><li><a href="base.GeneralBusiness.html">GeneralBusiness</a></li><li><a href="base.GeneralDynamic.html">GeneralDynamic</a></li><li><a href="base.GeneralMiddleWare.html">GeneralMiddleWare</a></li><li><a href="base.GeneralStatic.html">GeneralStatic</a></li><li><a href="base.GeneralTransitionEngImpl.html">GeneralTransitionEngImpl</a></li><li><a href="base.SessionManager.html">SessionManager</a></li><li><a href="base.SessionManager_Lite.html">SessionManager_Lite</a></li><li><a href="base.TaggedTransition.html">TaggedTransition</a></li><li><a href="base.TokenTables.html">TokenTables</a></li><li><a href="base.UserMessageEndpoint.html">UserMessageEndpoint</a></li><li><a href="base.WebSocketManager.html">WebSocketManager</a></li><li><a href="field_validators.DataLookupField.html">DataLookupField</a></li><li><a href="field_validators.EmailField.html">EmailField</a></li><li><a href="field_validators.EmailVerifyField.html">EmailVerifyField</a></li><li><a href="field_validators.FieldTest.html">FieldTest</a></li><li><a href="field_validators.FieldValidatorTools.html">FieldValidatorTools</a></li><li><a href="field_validators.ForeignAuth.html">ForeignAuth</a></li><li><a href="field_validators.GeneralValidator.html">GeneralValidator</a></li><li><a href="field_validators.LengthyAlphabetField.html">LengthyAlphabetField</a></li><li><a href="field_validators.LengthyDigitalField.html">LengthyDigitalField</a></li><li><a href="field_validators.LengthyField.html">LengthyField</a></li><li><a href="field_validators.LengthyStringField.html">LengthyStringField</a></li><li><a href="field_validators.PasswordField.html">PasswordField</a></li><li><a href="field_validators.PasswordVerifyField.html">PasswordVerifyField</a></li><li><a href="field_validators.TypeCheckField.html">TypeCheckField</a></li></ul><h3>Global</h3><ul><li><a href="global.html#generate_password_block">generate_password_block</a></li><li><a href="global.html#load_configuration">load_configuration</a></li><li><a href="global.html#load_parameters">load_parameters</a></li><li><a href="global.html#module_top">module_top</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Tue Oct 31 2023 17:32:59 GMT-0700 (Pacific Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>