init: add workspace files

This commit is contained in:
2026-05-26 16:41:20 +08:00
commit f4f2393f72
1041 changed files with 67405 additions and 0 deletions

179
os/base.js Normal file
View File

@@ -0,0 +1,179 @@
/*
定义当对象从文件生成时的基类,
当文件内部调用this.inherit(父类名)后,将真正继承父类的原型和实例属性。
但是文件内部不能修改this.prototype修改将会作用到父类上面。
可以用this.XXX扩展属性和方法
*/
BASE = function () {
}
BASE.prototype.set = function (pars) {
if (!pars) return;
for (var item in pars) {
this[item] = pars[item];
}
}
/*
该方法使用直接赋值方式继承父对象的所有原型方法,
如果子对象对原型修改,将会改变父对象的原型。
所以该方法只能获取父对象的原型不能修改它,
实际上是作为new的另外一种方式通过apply获取实例属性通过__proto__获取父类原型
*/
BASE.prototype.inherits = function (ctor) {
this.__proto__ = ctor.prototype;
ctor.apply(this);
}
/*
create方法由继承自base类的类自己实现当对象被从文件创建时候调用
参数fname=该对象的文件的相对路径,ctor=构造方法
*/
BASE.prototype.create = function (fname, ctor) {
}
BASE.prototype.add_event = function (fname, func, time) {
///在time秒内用新的func替换旧的fname方法
if (!this[fname])
this[fname] = this.fire_event.bind(this, fname);
if (!this._events) this._events = {};
if (!this._events[fname]) this._events[fname] = [];
this._events[fname].push({
func: func,
time: time ? (Date.now() + time) : Number.MAX_SAFE_INTEGER
});
//var old_func = this[fname];
//this[fname] = func;
//if (time) this.call_out(() => this[fname] = old_func, time);
//return old_func;
}
BASE.prototype.remove_event = function (name, func) {
if (!this._events) return;
var evts = this._events[name];
if (!evts) return;
for (var i = 0; i < evts.length; i++) {
if (evts[i].func === func) {
evts.splice(i, 1);
i--;
}
}
if (!evts.length) {
this._events[name] = null;
this[name] = null;
}
}
BASE.prototype.fire_event = function (name) {
if (!this._events) return;
var evts = this._events[name];
if (!evts) return;
var dt = Date.now();
for (var i = 0; i < evts.length; i++) {
if (evts[i].time > dt) {
if (evts[i].func.call(this) == false) return false;
} else {
evts.splice(i, 1);
i--;
}
}
if (!evts.length) {
this._events[name] = null;
this[name] = null;
}
}
/*
生成对象标识前8位是毫秒级时间戳的36进制形式后4位随机码
最起码保证每毫秒生成的标识不会重复
*/
var key = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
BASE.prototype.create_uid = function () {
var str = [];
str.push(Date.now().toString(36));
var length = key.length;
for (var i = 0; i < 4; i++) {
str.push(key[Math.floor(Math.random() * length)]);
}
return str.join("");
}
BASE.prototype.random = function (num) {
return Math.floor(Math.random() * num);
}
BASE.prototype.call_out = function (func, time, arg1, arg2) {
return setTimeout(func.bind(this, arg1, arg2), time);
}
BASE.prototype.call_interval = function (func, time, count, end_func) {
count--;
var index = 0;
if (func(index++) === false || count === 0) {
return end_func && end_func();
}
var handler = 0;
handler = setInterval(function () {
count--;
if (func(index++) === false || count === 0) {
clearInterval(handler);
end_func && end_func();
}
}, time);
return handler;
}
const vm = require('vm');
const fs = require("fs");
//根据文件路径new一个对象
BASE.ITEMS = {};
BASE.CREATE = function (path, fname) {
var ary = BASE.PATH_REG.exec(fname);
if (!ary) {
return console.error("path %s is incorrect:", path + fname);
}
fname = ary[1];
var paras = ary[2];
var fkey = path + fname;
var func = BASE.ITEMS[fkey];
if (func) {
return BASE.NEW(fname, func, paras);
}
const filepath = fkey + ".js";
try {
const script = fs.readFileSync(filepath);
func = vm.compileFunction(script.toString(), [],
{ filename: filepath });
BASE.ITEMS[fkey] = func;
return BASE.NEW(fname, func, paras);
} catch (e) {
console.error("create %s%s error:", filepath, e, e.stack);
}
}
BASE.CLONE = function (fname) {
}
BASE.PATH_REG = /^(\w+(?:\/\w+)*)(#\w+)?$/;
BASE.NEW = function (fname, func, par) {
var obj = new BASE();
func.apply(obj);
obj.path = fname;
obj.create(fname, par);
return obj;
}
BASE.UPDATE = function (path, fname) {
var ary = BASE.PATH_REG.exec(fname);
if (!ary) {
throw "path " + fname + " is incorrect:";
}
fname = ary[1];
var fkey = path + fname;
var data = fs.readFileSync(fkey + ".js");
var func = new Function(data);
BASE.ITEMS[fkey] = func;
var obj = new BASE();
func.apply(obj);
obj.path = fname;
obj.update && obj.update(fname, ary[2]);
}