0.1.5 • Published 7 years ago

jlass v0.1.5

Weekly downloads
5
License
GPL-3.0
Repository
github
Last release
7 years ago

jLAss

My Personal Javascript Core Lib

Author: LostAbaddon

Version: 0.1.5

NodeJS Version: >= 10.0.0

Includes

  • Module Manager for b/n
  • Extends for Class, Object, Function, Promise, Date and Time, Symbol
  • Log Utils
  • System Monitor Utils
  • FileSystem Utils
  • Datastore and Cache
  • Math(TBD)
  • Threads
  • Sync and Async Events
  • CommandLine Tools
  • Other Utils

Extends

We can use "global" in both browser and node (b/n)

UpCase for class, LowCase for instance Obj.Y for function, Obj:Y for property

Global

  • promisify
  • oncilize Make function and promise run only once. call fn.refresh() to allow it be run again.
  • pumplize Make function delay for a while and use the last called arguments (stack mode) or all the called arguments (pump mode). Default mode is stack mode.
  • setImmediate Fire callback when the next loop just begins.
  • nextTick Fire callback when current loop just ends.
  • wait Promisify version for setTimeout
  • waitLoop Promisify version for setImmediate
  • waitTick Promisify version for nextTick
  • waitQueue Promisify version for queueMicrotask which is a V8 version of nextTick and always run after nextTick.
  • Clock Event-Timestamp Manager
  • loadall load all js / json files under a given folder, and the second argument can decide load the sub folders or not, which default value is true.
  • Version Version class for parsing version strings.
  • getLoadPath Parse filepath to a loadable path. If start with ./ then the root path is jLass path; if start with ~/ then the root path will be process.cwd().
  • setLoadRoot Change the default root path for ~/

Promisify

  • global.promisify Convert a function to a Promise object. The last argument of the function is "next" which is the resolve function of Promise.
  • global.promisify.withTimeout Convert a function to a Promise object with timeout. The returned Promise object has a function timeout which can set timeout or callback or both. Timeout <= 0 means never timeout.
promisify(fn(..., res)).timeout([timeout], [callback]);
  • global.promisify.serial Do the tasks one by one, and the result of previous one will be passed to the next one. Alias: promisify.s Two usages:
    • promisify.serial(fn1, fn2, ..., fnx, data, callback)
    • promisify.serial([fn1, fn2, ..., fnx], data, callbak)
  • global.promisify.parallel Do the tasks simulately, and the results will be arranged in an array, and passed to the callback. Alias: promisify.p Two usages:

    • promisify.parallel(fn1, fn2, ..., fnx, data, callback)
    • promisify.parallel([fn1, fn2, ..., fnx], data, callbak)
  • global.promisify.any Do the tasks simulately, and only returns the first finished one. Alias: promisify.a Two usages:

    • promisify.any(fn1, fn2, ..., fnx, data, callback)
    • promisify.any([fn1, fn2, ..., fnx], data, callbak)

Object

  • object.copy
  • object.extent
  • object.isSubClassOf

Function

  • Function.is
  • AsyncFunction Class of async functions
  • AsyncFunction.is

Array

  • array.copy
  • array.randomize
  • array.remove
  • array.translate
  • array.has
  • array.query
  • array:first
  • array:last
  • Array.is
  • Array.generate
  • Array.random
  • uint8Array.copy

String

  • string.prepadding
  • String.random
  • String.blank
  • String.is

Symbol

  • Symbol.setSymbols
  • Symbol.is

Math

  • Math.pick For Array, pick one random element inside it. For Number, pick a boolean value whether a random number less than the given value;
  • Math.range Pick a random number in a range.

Events TBD

Some utils for event-related functions.

  • FiniteStateMachine
  • EventManager for both sync and async callbacks
  • Broadcast
  • Event Pipe with and without Barrier
  • Channel
  • Tunnel: Thread-crossing Channel

CommandLine

CLI utils, includes cl parse and interface.

CommandLine Parser

Demo:

var cmdLauncher = clp({
	title: SyncerTitle + ' v' + SyncerVersion,
	mode: 'process'
})
.describe('多文件夹自动同步者。\n' + setStyle('当前版本:', 'bold') + 'v' + SyncerVersion)
.addOption('--config -c <config> >> 配置文档地址')
.addOption('--socket -skt >> 启用Socket后台模式' + setStyle('【待开发】', ['green', 'bold']))
.on('command', params => {
	...
	rtmLauncher.launch();
})
.on('done', async params => {
	...
})
;

var rtmLauncher = clp({
	title: SyncerTitle + ' v' + SyncerVersion,
	mode: 'cli',
	hint: {
		welcome: setStyle('欢迎来到同步空间~', 'yellow underline bold'),
		byebye: setStyle('世界,终结了。。。', 'magenta bold')
	},
	historyStorage: {
		limit: 100
	}
})
.describe('多文件夹自动同步者。\n' + setStyle('当前版本:', 'bold') + 'v' + SyncerVersion)
.add('list|lt >> 显示当前分组同步信息')
.addOption('--group -g <group> >> 指定group标签后可查看指定分组下的源情况')
.addOption('--files -f <path> >> 查看指定路径下的文件列表')
.addOption('--all -a >> 显示所有文件与文件夹,不打开则只显示有变化的文件与文件夹')
.on('command', (param, command) => {
	...
})
.on('done', async params => {
	...
})
.on('quit', (param, command) => {
	...
})
.on('exit', (param, command) => {
	...
})
.on('list', (param, all, command) => {
	...
})
;

cmdLauncher.launch();

Threads

  • Utils.Threads Simple Thread Manager, return a thread-worker wrapper. Worker will load a list of js core lib.
  • Utils.Threads.create(filelist, init_data) Create a thread and load filelist, start with init_data
  • Utils.Threads.evaluate(fun, data) Create a thread and run the given function with given data.
  • Worker Wrapped ThreadWorker.
    • worker.send(msg) to send message to thread;
    • worker.load(files) to load files;
    • worker.request(msg, data) to call thread worker with message { event, data }, return a promise object;
    • worker.evaluate(fun, data) to call thread worker to run the given function with given data;
    • worker.suicide() to kill the thread worker;
    • count is the running task count;
  • ThreadWorker.Stat Status of worker: IDLE, BUSY, DEAD
  • ThreadWorker A worker with basic core libs.
    • Use register(tag, fn) to response the request from main thread; register the "init" event to response the init_data which passed from main thread.
    • Use send(msg) to send message to main thread;
    • Use request(event, data) to call main thread with message { event, data};
    • Use suicide to tell main thread to kill current thread worker
  • ThreadPool A thread pool which can choise thread automatically.
  • ThreadPool.create(size, files, data) Create a batch of threads with init files and data.
  • ThreadPool.load(files) Make all threads load files.
  • ThreadPool.request(event, data, cb) Choose a free thread or a thread with least tasks to run the given event;
  • ThreadPool.requestAll(event, data, cb) Make all thread to do the job.
  • ThreadPool.evaluate(fun, data, cb) Choose a free thread or a thread with least tasks to do the evaluation;
  • ThreadPool.refresh(files) Kill the free threads and reload it, with the files set in create or the given files;
  • ThreadPool.refreshAll(files) Kill the free threads, and when the busy threads finish all their jobs then suicide, and reload all the threads with the files set in create or the given files;
  • ThreadPool.killAll() Kill all the threads and release the pool.

Datastore and Cache

  • LRUCache & LRUCache.withDatastore Latest Recently Use Cache
  • UFCache & UFCache.withDatastore Usage Frequency Cache

Utils

  • ModuleManager use "global._" to load and set namespace.
  • Utils.getHealth CPU and Memory usage utils.
  • logger Generate a colored logger.

FS Utils

  • FS.mkfolder Create nonexist folder automatically.
  • FS.filterPath Filter the filss and folders and others.
  • FS.createFolders Create list of folders.
  • FS.createEmptyFiles
  • FS.deleteFiles Delete list of files.
  • FS.deleteFolders Delete list of folders.
  • FS.watchFolderAndFile
  • Utils.preparePath Check path and create necessary folders.
  • Utils.preparePathSync Sync version of Utils.preparePath.