mm_os 5.0.1 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. package/README.md +20 -10
  2. package/index.js +12 -13
  3. package/lib/config.js +104 -0
  4. package/lib/os.js +603 -284
  5. package/package.json +77 -58
package/README.md CHANGED
@@ -1,13 +1,12 @@
1
1
  # mm_os
2
2
 
3
- 这是 OS 系统模块,超级美眉服务端的核心框架。负责初始化日志、注册管理、加载输入 / 输出适配器、缓存与数据库、应用加载器,并驱动应用与插件的完整生命周期。
3
+ 这是 OS 系统模块,超级美眉服务端的核心框架。负责初始化日志、注册管理、加载输入适配器、缓存与数据库、应用加载器,并驱动应用与插件的完整生命周期。
4
4
 
5
5
  ## 功能特点
6
6
 
7
7
  - `OS` 类:初始化日志、管理、适配器、存储与应用加载器
8
8
  - 输入适配器:web / mqtt / socket / websocket
9
- - 输出适配器:redis / mongodb / mysql / sqlite / jsondb / file
10
- - 工具:lang / tpl / ret
9
+ - 存储:`cache`(redis / mongodb 等)与 `sql`(mysql / sqlite / jsondb 等),由 `mm_cache` / `mm_sql` 统一装配
11
10
  - 管理:service / handle / event / api / param / dao / templete / pendant / timer / statics
12
11
  - `Loader` 类:扫描应用目录,加载应用与插件的配置、生命周期和资源清单
13
12
  - `osAdmin(scope, config)` 按作用域缓存系统实例,相同 `scope` 返回同一实例
@@ -44,12 +43,17 @@ const os = osAdmin('os', {
44
43
  - `scope`:作用域名称,缺省为 `'os'`
45
44
  - `config`:系统配置
46
45
  - `in_adapters`:输入适配器列表,默认 `['web', 'mqtt', 'socket', 'websocket']`
47
- - `out_adapters`:输出适配器列表,默认 `['redis', 'mongodb', 'mysql', 'sqlite', 'jsondb', 'file']`
48
- - `tools`:工具列表,默认 `['lang', 'tpl', 'ret', 'service', 'handle']`
49
- - `admins`:管理列表,默认 `['event', 'api', 'param', 'sql', 'templete', 'pendant', 'timer', 'statics']`
50
- - `cache` / `db`:缓存与数据库配置
46
+ - `admins`:管理列表,默认 `['event', 'api', 'param', 'dao', 'service', 'template', 'pendant', 'timer', 'static']`
47
+ - `daos`:数据域列表,默认 `['os', 'user', 'org', 'project', 'client', 'app']`,业务用 `daoAdmin('user')` 等取用
48
+ - `dao_<域>`:给单个数据域指定数据源,如 `dao_org = { sql: { way: 'sqlite', sqlite: { dir: './db/', database: 'org_{org_id}' } } }`;未配置的域复用主库
49
+ - 配置里含 `{org_id}` 时该域按机构分库:只登记模板,用 `daoAdmin('org', { org_id })` 取到该机构独立的库(`org_{org_id}.db`);接口侧从 query 参数 `org_id` 解析(页面路由 `/ai/{org_id}/` 兜底)
50
+ - 固定域(如 `user`)直接 `daoAdmin('user')`,一域一库
51
+ - `cache` / `sql`:缓存与数据库配置(含 `redis` / `mongodb` / `mysql` / `sqlite` / `jsondb` 子项)
51
52
  - `web` / `mqtt` / `socket` / `websocket`:各入站适配器端口配置
52
53
 
54
+ > `out_adapters` 与 `tools` 已废弃:存储统一走 `cache` / `sql`,语言与模板由各模块自行初始化。
55
+ > 若仍显式传入这两个配置,启动时会打印一条 `warn` 提示并忽略。
56
+
53
57
  ### `OS`
54
58
 
55
59
  | 方法 | 说明 |
@@ -59,15 +63,21 @@ const os = osAdmin('os', {
59
63
  | `log(type, msg, ...args)` | 输出日志 |
60
64
  | `reg(name, admin)` | 注册管理对象 |
61
65
  | `require(mod_name)` | 加载模块 |
62
- | `initAdapter()` | 初始化输入 / 输出适配器并初始化事件总线 |
63
- | `initTools()` | 初始化工具 |
66
+ | `initAdapter()` | 初始化输入适配器(输出适配器已废弃,存储由 `initpStorage()` 负责) |
64
67
  | `initAdmins()` | 初始化管理 |
68
+ | `initDaos()` | 初始化数据域(os/user/org/project/client/app),注册为 `dao:<域>` |
69
+ | `_initModules(list, label, collect)` | 按清单加载模块:绑定服务器 → 取管理器 → 初始化 → 注册 |
65
70
  | `initpStorage()` | 初始化缓存与数据库 |
66
71
  | `initLoader()` | 初始化应用加载器 |
72
+ | `_bindMqttHostServices()` | 向 `mm_mqtt` 管理器注入宿主服务(`get_db` 数据库、`event_bus` 事件总线) |
67
73
  | `initEventBus()` | 初始化事件总线 |
68
74
  | `start()` | 启动全部适配器、缓存、数据库与应用 |
69
75
 
70
- OS 实例属性:`admins`、`in_adapters`、`out_adapters`、`cache`、`sql`、`logger`、`loader`、`eventer`。
76
+ > `mm_mqtt` 的设备状态入库与事件派发采用宿主注入:未注入 `get_db` 时会跳过入库并打印
77
+ > `未配置 get_db,跳过设备状态入库`。`initLoader()` 与 `start()` 会自动把系统 `sql` 实例与
78
+ > `eventer` 注入到所有 MQTT 管理器,无需在应用内重复配置。
79
+
80
+ OS 实例属性:`container`、`config`、`in_adapters`、`cache`、`sql`、`logger`、`loader`、`eventer`、`app`。
71
81
 
72
82
  ### `Loader`
73
83
 
package/index.js CHANGED
@@ -5,22 +5,21 @@ const Admin = require('mm_corejs').Admin;
5
5
  let admin = new Admin();
6
6
  admin.setClass(OS);
7
7
 
8
- /**
9
- * 获取系统实例
10
- * @param {string} scope 作用域
11
- * @param {Object} config 配置参数
12
- * @returns {OS} 系统实例
13
- */
14
- function osAdmin(scope, config) {
15
- if (!scope) {
16
- scope = 'os';
17
- }
18
- return admin.get(scope, config);
19
- }
20
8
 
21
9
  module.exports = {
22
10
  OS,
23
11
  Loader,
24
12
  admin,
25
- osAdmin
13
+ /**
14
+ * 获取系统实例
15
+ * @param {string} scope 作用域
16
+ * @param {Object} config 配置参数
17
+ * @returns {OS} 系统实例
18
+ */
19
+ osAdmin(scope, config) {
20
+ if (!scope) {
21
+ scope = 'os';
22
+ }
23
+ return admin.get(scope, config);
24
+ }
26
25
  };
package/lib/config.js ADDED
@@ -0,0 +1,104 @@
1
+ /**
2
+ * OS 默认配置
3
+ * 系统类只负责加载,配置数据在此集中声明,由 lib/os.js 的 static config 装载;
4
+ * 宿主实例化 OS 时传入的 config 会与之深合并覆盖。
5
+ */
6
+
7
+ /**
8
+ * 系统默认配置对象
9
+ * @type {object}
10
+ */
11
+ const os_config = {
12
+ name: 'os',
13
+ // 路径根:所有相对路径配置(jsondb/sqlite/tpl/log/loader)都相对此目录解析,
14
+ // 为空时取 process.cwd();宿主可用它把运行期路径与启动目录解耦
15
+ root: process.env.MM_ROOT || '',
16
+ // 装配清单默认最小化(D-17 阶段 2):内核只保证 web 入口 + 事件/API 两个基础管理器。
17
+ // mqtt/socket/websocket 适配器与 param/dao/service/template/pendant/timer/static 等管理器
18
+ // 由宿主显式声明(见 example/demo.js);可选角色可加 required: false,缺失时降级跳过;
19
+ // 清单模块支持按通道 cwd 解析,缺失时错误信息给出 os.moduleInstall 安装指引
20
+ in_adapters: [{
21
+ name: 'web',
22
+ module: 'mm_web_server'
23
+ }],
24
+ // 管理模块
25
+ admins: [{
26
+ name: 'event',
27
+ module: 'mm_event'
28
+ }, {
29
+ name: 'api',
30
+ module: 'mm_api'
31
+ }],
32
+ // 数据域:默认只建内核自身的 os 域。业务域(user/org/project/client/app 等)
33
+ // 是业务概念,不由内核预设——宿主按需声明 config.daos = ['os','user',...],
34
+ // 每个域可独立配置数据源(config.dao_<域> = { sql: {...} }),未配置时复用主库
35
+ daos: ['os'],
36
+ cache: {
37
+ type: 'redis'
38
+ },
39
+ sql: {
40
+ type: 'mysql'
41
+ },
42
+ web: {
43
+ port: 8000
44
+ },
45
+ mqtt: {
46
+ port: 1883
47
+ },
48
+ socket: {
49
+ port: 9000
50
+ },
51
+ websocket: {
52
+ port: 9001
53
+ },
54
+ jsondb: {
55
+ dir: './data'
56
+ },
57
+ // 存储凭据一律从环境变量读取(MM_* 前缀),默认值为空:
58
+ // 库内不携带任何真实口令;未提供凭据时相关存储无法连接,启动阶段会显式报错(fail-fast)
59
+ mysql: {
60
+ host: process.env.MM_MYSQL_HOST || '127.0.0.1',
61
+ port: Number(process.env.MM_MYSQL_PORT) || 3306,
62
+ user: process.env.MM_MYSQL_USER || 'root',
63
+ password: process.env.MM_MYSQL_PASSWORD || '',
64
+ database: process.env.MM_MYSQL_DATABASE || 'mm'
65
+ },
66
+ redis: {
67
+ host: process.env.MM_REDIS_HOST || '127.0.0.1',
68
+ password: process.env.MM_REDIS_PASSWORD || '',
69
+ port: Number(process.env.MM_REDIS_PORT) || 6379,
70
+ db: Number(process.env.MM_REDIS_DB) || 0
71
+ },
72
+ mongodb: {
73
+ host: process.env.MM_MONGO_HOST || '127.0.0.1',
74
+ port: Number(process.env.MM_MONGO_PORT) || 27017,
75
+ user: process.env.MM_MONGO_USER || 'root',
76
+ password: process.env.MM_MONGO_PASSWORD || '',
77
+ database: process.env.MM_MONGO_DATABASE || 'mm'
78
+ },
79
+ sqlite: {
80
+ dir: process.env.MM_SQLITE_DIR || './db',
81
+ database: process.env.MM_SQLITE_DATABASE || 'mm'
82
+ },
83
+ ret: {
84
+ type: 'json-rpc'
85
+ },
86
+ lang: {
87
+ type: 'zh_cn'
88
+ },
89
+ tpl: {
90
+ dir: './static/template',
91
+ ext: '.html'
92
+ },
93
+ loader: {
94
+ // 应用目录必填:内核不再回退到包内 example/app(生产会静默加载示例应用)。
95
+ // 由宿主显式指定相对 root 的路径;传 false 表示本实例不加载应用
96
+ dir: ''
97
+ },
98
+ // 模块通道:基于 mm_module 的动态安装/卸载/热更新(见 os.moduleInstall 等)。
99
+ // false 显式关闭;未安装 mm_module 时自动降级停用;
100
+ // 对象形式透传 ModuleManager 配置(cwd 默认取 root,可注入 runner/registry/prefix)
101
+ modules: {}
102
+ };
103
+
104
+ module.exports = os_config;