asaihost-nodejs 0.0.1
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.
- package/README.md +518 -0
- package/dist/InterventionLog-25EHE4QR.cjs +30 -0
- package/dist/InterventionLog-25EHE4QR.cjs.map +1 -0
- package/dist/InterventionLog-R6CCPU2B.es.js +30 -0
- package/dist/InterventionLog-R6CCPU2B.es.js.map +1 -0
- package/dist/LogStore-ECXX34WC.es.js +54 -0
- package/dist/LogStore-ECXX34WC.es.js.map +1 -0
- package/dist/LogStore-M2AUBNGO.cjs +54 -0
- package/dist/LogStore-M2AUBNGO.cjs.map +1 -0
- package/dist/asaihost-nodejs.cjs +6761 -0
- package/dist/asaihost-nodejs.cjs.map +1 -0
- package/dist/asaihost-nodejs.d.cts +406 -0
- package/dist/asaihost-nodejs.d.ts +406 -0
- package/dist/asaihost-nodejs.es.js +6761 -0
- package/dist/asaihost-nodejs.es.js.map +1 -0
- package/dist/chunk-4WJDC4M4.es.js +311 -0
- package/dist/chunk-4WJDC4M4.es.js.map +1 -0
- package/dist/chunk-6U2I5EON.es.js +12 -0
- package/dist/chunk-6U2I5EON.es.js.map +1 -0
- package/dist/chunk-DROOHKB3.es.js +87 -0
- package/dist/chunk-DROOHKB3.es.js.map +1 -0
- package/dist/chunk-E7V3EBDB.es.js +435 -0
- package/dist/chunk-E7V3EBDB.es.js.map +1 -0
- package/dist/chunk-EOGZPRML.es.js +740 -0
- package/dist/chunk-EOGZPRML.es.js.map +1 -0
- package/dist/chunk-G4WVDUBH.cjs +463 -0
- package/dist/chunk-G4WVDUBH.cjs.map +1 -0
- package/dist/chunk-HHPGUJ75.cjs +162 -0
- package/dist/chunk-HHPGUJ75.cjs.map +1 -0
- package/dist/chunk-KOFCBB3N.cjs +87 -0
- package/dist/chunk-KOFCBB3N.cjs.map +1 -0
- package/dist/chunk-KUZQ36IJ.es.js +162 -0
- package/dist/chunk-KUZQ36IJ.es.js.map +1 -0
- package/dist/chunk-LOMSUPPU.es.js +1202 -0
- package/dist/chunk-LOMSUPPU.es.js.map +1 -0
- package/dist/chunk-MCMADJQR.es.js +463 -0
- package/dist/chunk-MCMADJQR.es.js.map +1 -0
- package/dist/chunk-NLBFIRDB.cjs +105 -0
- package/dist/chunk-NLBFIRDB.cjs.map +1 -0
- package/dist/chunk-O6LVLSNB.cjs +40 -0
- package/dist/chunk-O6LVLSNB.cjs.map +1 -0
- package/dist/chunk-QWVR2HNT.cjs +435 -0
- package/dist/chunk-QWVR2HNT.cjs.map +1 -0
- package/dist/chunk-SMVZ3ZDJ.cjs +12 -0
- package/dist/chunk-SMVZ3ZDJ.cjs.map +1 -0
- package/dist/chunk-UTKVJE7N.es.js +40 -0
- package/dist/chunk-UTKVJE7N.es.js.map +1 -0
- package/dist/chunk-VLMM735Q.cjs +1202 -0
- package/dist/chunk-VLMM735Q.cjs.map +1 -0
- package/dist/chunk-W7DVKGX5.cjs +311 -0
- package/dist/chunk-W7DVKGX5.cjs.map +1 -0
- package/dist/chunk-X7VHW2TD.cjs +740 -0
- package/dist/chunk-X7VHW2TD.cjs.map +1 -0
- package/dist/chunk-XBIN4C2V.es.js +105 -0
- package/dist/chunk-XBIN4C2V.es.js.map +1 -0
- package/dist/intervention-hooks-FI4EHOL5.es.js +21 -0
- package/dist/intervention-hooks-FI4EHOL5.es.js.map +1 -0
- package/dist/intervention-hooks-LE6X4C6N.cjs +21 -0
- package/dist/intervention-hooks-LE6X4C6N.cjs.map +1 -0
- package/dist/log-alert-GLCULMQP.es.js +51 -0
- package/dist/log-alert-GLCULMQP.es.js.map +1 -0
- package/dist/log-alert-LAJ6VSAG.cjs +51 -0
- package/dist/log-alert-LAJ6VSAG.cjs.map +1 -0
- package/dist/log-formats-FKFMQKNO.cjs +31 -0
- package/dist/log-formats-FKFMQKNO.cjs.map +1 -0
- package/dist/log-formats-I5E32H5F.es.js +31 -0
- package/dist/log-formats-I5E32H5F.es.js.map +1 -0
- package/dist/password-63OY27RX.es.js +20 -0
- package/dist/password-63OY27RX.es.js.map +1 -0
- package/dist/password-NZ5EGDWG.cjs +20 -0
- package/dist/password-NZ5EGDWG.cjs.map +1 -0
- package/dist/user-store-J7LWEXSW.es.js +12 -0
- package/dist/user-store-J7LWEXSW.es.js.map +1 -0
- package/dist/user-store-SX4N6PQ4.cjs +12 -0
- package/dist/user-store-SX4N6PQ4.cjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkSMVZ3ZDJcjs = require('./chunk-SMVZ3ZDJ.cjs');
|
|
4
|
+
|
|
5
|
+
// src/sysserver/db/data-store.ts
|
|
6
|
+
var CACHE_KEY = "_dataStoreRegistry";
|
|
7
|
+
function cacheMap($asai) {
|
|
8
|
+
if (!$asai[CACHE_KEY]) $asai[CACHE_KEY] = /* @__PURE__ */ new Map();
|
|
9
|
+
return $asai[CACHE_KEY];
|
|
10
|
+
}
|
|
11
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, cacheMap, "cacheMap");
|
|
12
|
+
function specCacheKey(spec) {
|
|
13
|
+
const opt = { ...spec.opt };
|
|
14
|
+
delete opt.$asai;
|
|
15
|
+
return `${spec.domain}:${spec.type}:${JSON.stringify(opt)}`;
|
|
16
|
+
}
|
|
17
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, specCacheKey, "specCacheKey");
|
|
18
|
+
function resolveStoreConfig($asai, domain) {
|
|
19
|
+
const host = _optionalChain([$asai, 'optionalAccess', _ => _.hostconfig]) || {};
|
|
20
|
+
const stores = host.dataStores || {};
|
|
21
|
+
if (stores[domain] && typeof stores[domain] === "object") {
|
|
22
|
+
const s = stores[domain];
|
|
23
|
+
return {
|
|
24
|
+
type: s.type || "file",
|
|
25
|
+
opt: s.opt || {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (domain === "user" && host.userStore) {
|
|
29
|
+
const u = host.userStore;
|
|
30
|
+
return { type: u.type || "file", opt: u.opt || {} };
|
|
31
|
+
}
|
|
32
|
+
if (domain === "log" && _optionalChain([host, 'access', _2 => _2.logger, 'optionalAccess', _3 => _3.store])) {
|
|
33
|
+
const s = host.logger.store;
|
|
34
|
+
return { type: s.type || "sqlite", opt: { database: s.database, create: s.create, dir: s.dir, ext: s.ext } };
|
|
35
|
+
}
|
|
36
|
+
if (domain === "default" || domain === "app") {
|
|
37
|
+
return {
|
|
38
|
+
type: "sqlite",
|
|
39
|
+
opt: { database: "./webdata/webdb/sqlite/asaisqlite.db", create: 1 }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return { type: "file", opt: {} };
|
|
43
|
+
}
|
|
44
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, resolveStoreConfig, "resolveStoreConfig");
|
|
45
|
+
function normalizeStoreOpt(domain, type, opt) {
|
|
46
|
+
const o = { ...opt };
|
|
47
|
+
if (type === "file") {
|
|
48
|
+
if (domain === "user") {
|
|
49
|
+
if (!o.dir) o.dir = "webdata/webdb/users/";
|
|
50
|
+
if (!o.ext) o.ext = ".json";
|
|
51
|
+
} else if (domain === "log") {
|
|
52
|
+
if (!o.dir) o.dir = "webdata/webdb/log/store/";
|
|
53
|
+
if (!o.ext) o.ext = ".json";
|
|
54
|
+
}
|
|
55
|
+
if (o.create == null) o.create = 1;
|
|
56
|
+
} else if (type === "sqlite") {
|
|
57
|
+
if (domain === "user" && !o.database) o.database = "./webdata/webdb/users/users.db";
|
|
58
|
+
if (domain === "log" && !o.database) o.database = "./webdata/webdb/log/asai-logs.db";
|
|
59
|
+
if ((domain === "default" || domain === "app") && !o.database) o.database = "./webdata/webdb/sqlite/asaisqlite.db";
|
|
60
|
+
if (o.create == null) o.create = 1;
|
|
61
|
+
} else if (type === "mysql") {
|
|
62
|
+
if (!o.host) o.host = "127.0.0.1";
|
|
63
|
+
if (!o.user) o.user = "root";
|
|
64
|
+
if (!o.password) o.password = "";
|
|
65
|
+
if (!o.database) o.database = domain === "log" ? "asai_logs" : "asai";
|
|
66
|
+
if (o.create == null) o.create = 1;
|
|
67
|
+
}
|
|
68
|
+
return o;
|
|
69
|
+
}
|
|
70
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, normalizeStoreOpt, "normalizeStoreOpt");
|
|
71
|
+
function getDataServer($asai, domain) {
|
|
72
|
+
const resolved = resolveStoreConfig($asai, domain);
|
|
73
|
+
const opt = normalizeStoreOpt(domain, resolved.type, resolved.opt);
|
|
74
|
+
const spec = { domain, type: resolved.type, opt };
|
|
75
|
+
return getDataServerBySpec($asai, spec);
|
|
76
|
+
}
|
|
77
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getDataServer, "getDataServer");
|
|
78
|
+
function getDataServerBySpec($asai, spec) {
|
|
79
|
+
const opt = normalizeStoreOpt(spec.domain, spec.type, { ...spec.opt, $asai });
|
|
80
|
+
const full = { ...spec, opt };
|
|
81
|
+
const key = specCacheKey(full);
|
|
82
|
+
const cache = cacheMap($asai);
|
|
83
|
+
if (cache.has(key)) return cache.get(key);
|
|
84
|
+
const factory = $asai.dataserver;
|
|
85
|
+
const instance = factory(full.type, full.opt);
|
|
86
|
+
cache.set(key, instance);
|
|
87
|
+
return instance;
|
|
88
|
+
}
|
|
89
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getDataServerBySpec, "getDataServerBySpec");
|
|
90
|
+
function getDataServerForAsDb($asai, cfg) {
|
|
91
|
+
const type = _optionalChain([cfg, 'optionalAccess', _4 => _4.type]) || "sqlite";
|
|
92
|
+
const opt = _optionalChain([cfg, 'optionalAccess', _5 => _5.opt]) || {};
|
|
93
|
+
const domain = _optionalChain([cfg, 'optionalAccess', _6 => _6.storeKey]) || `asdb:${type}:${opt.database || opt.dir || "default"}`;
|
|
94
|
+
return getDataServerBySpec($asai, { domain, type, opt });
|
|
95
|
+
}
|
|
96
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getDataServerForAsDb, "getDataServerForAsDb");
|
|
97
|
+
function qStr(val, dbType) {
|
|
98
|
+
if (val == null || val === "") return "''";
|
|
99
|
+
const s = String(val).replace(/'/g, "''");
|
|
100
|
+
return dbType === "file" ? s : `'${s}'`;
|
|
101
|
+
}
|
|
102
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, qStr, "qStr");
|
|
103
|
+
function qNum(val) {
|
|
104
|
+
return String(Number(_nullishCoalesce(val, () => ( 0))));
|
|
105
|
+
}
|
|
106
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, qNum, "qNum");
|
|
107
|
+
function asRows(result) {
|
|
108
|
+
if (!result) return [];
|
|
109
|
+
if (Array.isArray(result)) return result;
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, asRows, "asRows");
|
|
113
|
+
async function readJsonBlob(db, filename) {
|
|
114
|
+
const res = await db.sqlDb({
|
|
115
|
+
type: "select",
|
|
116
|
+
table: "",
|
|
117
|
+
where: [["name", "=", filename]],
|
|
118
|
+
field: ["name", "content"]
|
|
119
|
+
});
|
|
120
|
+
const rows = asRows(res);
|
|
121
|
+
if (!rows.length) return [];
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(String(rows[0].content || "[]"));
|
|
124
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
125
|
+
} catch (e) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, readJsonBlob, "readJsonBlob");
|
|
130
|
+
async function writeJsonBlob(db, filename, data) {
|
|
131
|
+
const content = JSON.stringify(data, null, 2);
|
|
132
|
+
const probe = await db.sqlDb({
|
|
133
|
+
type: "select",
|
|
134
|
+
table: "",
|
|
135
|
+
where: [["name", "=", filename]],
|
|
136
|
+
field: ["name", "content"]
|
|
137
|
+
});
|
|
138
|
+
if (!asRows(probe).length) {
|
|
139
|
+
await db.sqlDb({ type: "insert", table: "", value: [[filename, content]] });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await db.sqlDb({
|
|
143
|
+
type: "update",
|
|
144
|
+
table: "",
|
|
145
|
+
where: [["name", "=", filename]],
|
|
146
|
+
set: [["name", content]]
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, writeJsonBlob, "writeJsonBlob");
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
exports.resolveStoreConfig = resolveStoreConfig; exports.normalizeStoreOpt = normalizeStoreOpt; exports.getDataServer = getDataServer; exports.getDataServerForAsDb = getDataServerForAsDb; exports.qStr = qStr; exports.qNum = qNum; exports.asRows = asRows; exports.readJsonBlob = readJsonBlob; exports.writeJsonBlob = writeJsonBlob;
|
|
162
|
+
//# sourceMappingURL=chunk-HHPGUJ75.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-HHPGUJ75.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;AACA,IAAI,UAAU,EAAE,oBAAoB;AACpC,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,kBAAkB,IAAI,GAAG,CAAC,CAAC;AACrE,EAAE,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB;AACA,sCAAM,QAAS,EAAE,UAAU,CAAC;AAC5B,SAAS,YAAY,CAAC,IAAI,EAAE;AAC5B,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;AAC7B,EAAE,OAAO,GAAG,CAAC,KAAK;AAClB,EAAE,OAAO,CAAC,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-HHPGUJ75.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkX7VHW2TDcjs = require('./chunk-X7VHW2TD.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunkSMVZ3ZDJcjs = require('./chunk-SMVZ3ZDJ.cjs');
|
|
11
|
+
|
|
12
|
+
// src/sysserver/api/login/service/password.ts
|
|
13
|
+
var _crypto = require('crypto');
|
|
14
|
+
|
|
15
|
+
// src/infra/secure-compare.ts
|
|
16
|
+
|
|
17
|
+
function secureCompare(a, b) {
|
|
18
|
+
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
19
|
+
const bufA = Buffer.from(a);
|
|
20
|
+
const bufB = Buffer.from(b);
|
|
21
|
+
if (bufA.length !== bufB.length) {
|
|
22
|
+
if (bufA.length > 0) _crypto.timingSafeEqual.call(void 0, bufA, bufA);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return _crypto.timingSafeEqual.call(void 0, bufA, bufB);
|
|
26
|
+
}
|
|
27
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, secureCompare, "secureCompare");
|
|
28
|
+
|
|
29
|
+
// src/sysserver/api/login/service/password.ts
|
|
30
|
+
var SCRYPT_OPTS = { N: 16384, r: 8, p: 1, maxmem: 64 * 1024 * 1024 };
|
|
31
|
+
function hashPassword(password) {
|
|
32
|
+
const passSalt = _crypto.randomBytes.call(void 0, 16).toString("hex");
|
|
33
|
+
const passHash = _crypto.scryptSync.call(void 0, password, passSalt, 64, SCRYPT_OPTS).toString("hex");
|
|
34
|
+
return { passHash, passSalt };
|
|
35
|
+
}
|
|
36
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, hashPassword, "hashPassword");
|
|
37
|
+
function verifyPassword(password, passHash, passSalt) {
|
|
38
|
+
try {
|
|
39
|
+
const derived = _crypto.scryptSync.call(void 0, password, passSalt, 64, SCRYPT_OPTS);
|
|
40
|
+
const expected = Buffer.from(passHash, "hex");
|
|
41
|
+
if (derived.length !== expected.length) return false;
|
|
42
|
+
return _crypto.timingSafeEqual.call(void 0, derived, expected);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, verifyPassword, "verifyPassword");
|
|
48
|
+
function validatePasswordPolicy(password, minLen = 8, policy) {
|
|
49
|
+
const p = policy || { minLength: minLen, requireLower: true, requireDigit: true, requireUpper: false, requireSpecial: false, maxAgeDays: 0, historyCount: 0 };
|
|
50
|
+
return _chunkX7VHW2TDcjs.validatePasswordWithPolicy.call(void 0, password, p);
|
|
51
|
+
}
|
|
52
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, validatePasswordPolicy, "validatePasswordPolicy");
|
|
53
|
+
function validatePasswordChange(password, $asai, passHistory) {
|
|
54
|
+
const policy = _chunkX7VHW2TDcjs.getPasswordPolicy.call(void 0, $asai);
|
|
55
|
+
const err = _chunkX7VHW2TDcjs.validatePasswordWithPolicy.call(void 0, password, policy);
|
|
56
|
+
if (err) return err;
|
|
57
|
+
if (policy.historyCount > 0) {
|
|
58
|
+
const history = _chunkX7VHW2TDcjs.parsePassHistory.call(void 0, passHistory);
|
|
59
|
+
if (_chunkX7VHW2TDcjs.isPasswordInHistory.call(void 0, password, history)) return "PASSWORD_REUSED";
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, validatePasswordChange, "validatePasswordChange");
|
|
64
|
+
function nextPassHistory(password, passHistory, historyCount) {
|
|
65
|
+
if (!historyCount || historyCount <= 0) return "[]";
|
|
66
|
+
const history = _chunkX7VHW2TDcjs.parsePassHistory.call(void 0, passHistory);
|
|
67
|
+
history.unshift(_chunkX7VHW2TDcjs.hashPasswordForHistory.call(void 0, password));
|
|
68
|
+
return JSON.stringify(history.slice(0, historyCount));
|
|
69
|
+
}
|
|
70
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, nextPassHistory, "nextPassHistory");
|
|
71
|
+
function verifyHostPassword($asai, password) {
|
|
72
|
+
const expected = _optionalChain([$asai, 'optionalAccess', _ => _.hostconfig, 'optionalAccess', _2 => _2.password]);
|
|
73
|
+
if (!expected) return false;
|
|
74
|
+
return secureCompare(password, expected);
|
|
75
|
+
}
|
|
76
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, verifyHostPassword, "verifyHostPassword");
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
exports.secureCompare = secureCompare; exports.hashPassword = hashPassword; exports.verifyPassword = verifyPassword; exports.validatePasswordPolicy = validatePasswordPolicy; exports.validatePasswordChange = validatePasswordChange; exports.nextPassHistory = nextPassHistory; exports.verifyHostPassword = verifyHostPassword;
|
|
87
|
+
//# sourceMappingURL=chunk-KOFCBB3N.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-KOFCBB3N.cjs"],"names":[],"mappings":"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","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-KOFCBB3N.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-6U2I5EON.es.js";
|
|
4
|
+
|
|
5
|
+
// src/sysserver/db/data-store.ts
|
|
6
|
+
var CACHE_KEY = "_dataStoreRegistry";
|
|
7
|
+
function cacheMap($asai) {
|
|
8
|
+
if (!$asai[CACHE_KEY]) $asai[CACHE_KEY] = /* @__PURE__ */ new Map();
|
|
9
|
+
return $asai[CACHE_KEY];
|
|
10
|
+
}
|
|
11
|
+
__name(cacheMap, "cacheMap");
|
|
12
|
+
function specCacheKey(spec) {
|
|
13
|
+
const opt = { ...spec.opt };
|
|
14
|
+
delete opt.$asai;
|
|
15
|
+
return `${spec.domain}:${spec.type}:${JSON.stringify(opt)}`;
|
|
16
|
+
}
|
|
17
|
+
__name(specCacheKey, "specCacheKey");
|
|
18
|
+
function resolveStoreConfig($asai, domain) {
|
|
19
|
+
const host = $asai?.hostconfig || {};
|
|
20
|
+
const stores = host.dataStores || {};
|
|
21
|
+
if (stores[domain] && typeof stores[domain] === "object") {
|
|
22
|
+
const s = stores[domain];
|
|
23
|
+
return {
|
|
24
|
+
type: s.type || "file",
|
|
25
|
+
opt: s.opt || {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (domain === "user" && host.userStore) {
|
|
29
|
+
const u = host.userStore;
|
|
30
|
+
return { type: u.type || "file", opt: u.opt || {} };
|
|
31
|
+
}
|
|
32
|
+
if (domain === "log" && host.logger?.store) {
|
|
33
|
+
const s = host.logger.store;
|
|
34
|
+
return { type: s.type || "sqlite", opt: { database: s.database, create: s.create, dir: s.dir, ext: s.ext } };
|
|
35
|
+
}
|
|
36
|
+
if (domain === "default" || domain === "app") {
|
|
37
|
+
return {
|
|
38
|
+
type: "sqlite",
|
|
39
|
+
opt: { database: "./webdata/webdb/sqlite/asaisqlite.db", create: 1 }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return { type: "file", opt: {} };
|
|
43
|
+
}
|
|
44
|
+
__name(resolveStoreConfig, "resolveStoreConfig");
|
|
45
|
+
function normalizeStoreOpt(domain, type, opt) {
|
|
46
|
+
const o = { ...opt };
|
|
47
|
+
if (type === "file") {
|
|
48
|
+
if (domain === "user") {
|
|
49
|
+
if (!o.dir) o.dir = "webdata/webdb/users/";
|
|
50
|
+
if (!o.ext) o.ext = ".json";
|
|
51
|
+
} else if (domain === "log") {
|
|
52
|
+
if (!o.dir) o.dir = "webdata/webdb/log/store/";
|
|
53
|
+
if (!o.ext) o.ext = ".json";
|
|
54
|
+
}
|
|
55
|
+
if (o.create == null) o.create = 1;
|
|
56
|
+
} else if (type === "sqlite") {
|
|
57
|
+
if (domain === "user" && !o.database) o.database = "./webdata/webdb/users/users.db";
|
|
58
|
+
if (domain === "log" && !o.database) o.database = "./webdata/webdb/log/asai-logs.db";
|
|
59
|
+
if ((domain === "default" || domain === "app") && !o.database) o.database = "./webdata/webdb/sqlite/asaisqlite.db";
|
|
60
|
+
if (o.create == null) o.create = 1;
|
|
61
|
+
} else if (type === "mysql") {
|
|
62
|
+
if (!o.host) o.host = "127.0.0.1";
|
|
63
|
+
if (!o.user) o.user = "root";
|
|
64
|
+
if (!o.password) o.password = "";
|
|
65
|
+
if (!o.database) o.database = domain === "log" ? "asai_logs" : "asai";
|
|
66
|
+
if (o.create == null) o.create = 1;
|
|
67
|
+
}
|
|
68
|
+
return o;
|
|
69
|
+
}
|
|
70
|
+
__name(normalizeStoreOpt, "normalizeStoreOpt");
|
|
71
|
+
function getDataServer($asai, domain) {
|
|
72
|
+
const resolved = resolveStoreConfig($asai, domain);
|
|
73
|
+
const opt = normalizeStoreOpt(domain, resolved.type, resolved.opt);
|
|
74
|
+
const spec = { domain, type: resolved.type, opt };
|
|
75
|
+
return getDataServerBySpec($asai, spec);
|
|
76
|
+
}
|
|
77
|
+
__name(getDataServer, "getDataServer");
|
|
78
|
+
function getDataServerBySpec($asai, spec) {
|
|
79
|
+
const opt = normalizeStoreOpt(spec.domain, spec.type, { ...spec.opt, $asai });
|
|
80
|
+
const full = { ...spec, opt };
|
|
81
|
+
const key = specCacheKey(full);
|
|
82
|
+
const cache = cacheMap($asai);
|
|
83
|
+
if (cache.has(key)) return cache.get(key);
|
|
84
|
+
const factory = $asai.dataserver;
|
|
85
|
+
const instance = factory(full.type, full.opt);
|
|
86
|
+
cache.set(key, instance);
|
|
87
|
+
return instance;
|
|
88
|
+
}
|
|
89
|
+
__name(getDataServerBySpec, "getDataServerBySpec");
|
|
90
|
+
function getDataServerForAsDb($asai, cfg) {
|
|
91
|
+
const type = cfg?.type || "sqlite";
|
|
92
|
+
const opt = cfg?.opt || {};
|
|
93
|
+
const domain = cfg?.storeKey || `asdb:${type}:${opt.database || opt.dir || "default"}`;
|
|
94
|
+
return getDataServerBySpec($asai, { domain, type, opt });
|
|
95
|
+
}
|
|
96
|
+
__name(getDataServerForAsDb, "getDataServerForAsDb");
|
|
97
|
+
function qStr(val, dbType) {
|
|
98
|
+
if (val == null || val === "") return "''";
|
|
99
|
+
const s = String(val).replace(/'/g, "''");
|
|
100
|
+
return dbType === "file" ? s : `'${s}'`;
|
|
101
|
+
}
|
|
102
|
+
__name(qStr, "qStr");
|
|
103
|
+
function qNum(val) {
|
|
104
|
+
return String(Number(val ?? 0));
|
|
105
|
+
}
|
|
106
|
+
__name(qNum, "qNum");
|
|
107
|
+
function asRows(result) {
|
|
108
|
+
if (!result) return [];
|
|
109
|
+
if (Array.isArray(result)) return result;
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
__name(asRows, "asRows");
|
|
113
|
+
async function readJsonBlob(db, filename) {
|
|
114
|
+
const res = await db.sqlDb({
|
|
115
|
+
type: "select",
|
|
116
|
+
table: "",
|
|
117
|
+
where: [["name", "=", filename]],
|
|
118
|
+
field: ["name", "content"]
|
|
119
|
+
});
|
|
120
|
+
const rows = asRows(res);
|
|
121
|
+
if (!rows.length) return [];
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(String(rows[0].content || "[]"));
|
|
124
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
125
|
+
} catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
__name(readJsonBlob, "readJsonBlob");
|
|
130
|
+
async function writeJsonBlob(db, filename, data) {
|
|
131
|
+
const content = JSON.stringify(data, null, 2);
|
|
132
|
+
const probe = await db.sqlDb({
|
|
133
|
+
type: "select",
|
|
134
|
+
table: "",
|
|
135
|
+
where: [["name", "=", filename]],
|
|
136
|
+
field: ["name", "content"]
|
|
137
|
+
});
|
|
138
|
+
if (!asRows(probe).length) {
|
|
139
|
+
await db.sqlDb({ type: "insert", table: "", value: [[filename, content]] });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await db.sqlDb({
|
|
143
|
+
type: "update",
|
|
144
|
+
table: "",
|
|
145
|
+
where: [["name", "=", filename]],
|
|
146
|
+
set: [["name", content]]
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
__name(writeJsonBlob, "writeJsonBlob");
|
|
150
|
+
|
|
151
|
+
export {
|
|
152
|
+
resolveStoreConfig,
|
|
153
|
+
normalizeStoreOpt,
|
|
154
|
+
getDataServer,
|
|
155
|
+
getDataServerForAsDb,
|
|
156
|
+
qStr,
|
|
157
|
+
qNum,
|
|
158
|
+
asRows,
|
|
159
|
+
readJsonBlob,
|
|
160
|
+
writeJsonBlob
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-KUZQ36IJ.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sysserver/db/data-store.ts"],"sourcesContent":["/**\r\n * 统一数据存储注册表 — file / sqlite / mysql 自由切换,全库数据读写经此入口\r\n */\r\nimport type { DbType } from '../db';\r\nimport type { DbInstance } from './src/common';\r\nimport type Idb from './src/type';\r\n\r\nexport type StoreDomain = 'user' | 'log' | (string & {});\r\n\r\nexport interface StoreSpec {\r\n\tdomain: StoreDomain;\r\n\ttype: DbType;\r\n\topt: Record<string, unknown>;\r\n}\r\n\r\nexport interface ResolvedStoreConfig {\r\n\ttype: DbType;\r\n\topt: Record<string, unknown>;\r\n}\r\n\r\nconst CACHE_KEY = '_dataStoreRegistry';\r\n\r\nfunction cacheMap($asai: any): Map<string, DbInstance> {\r\n\tif (!$asai[CACHE_KEY]) $asai[CACHE_KEY] = new Map<string, DbInstance>();\r\n\treturn $asai[CACHE_KEY];\r\n}\r\n\r\nfunction specCacheKey(spec: StoreSpec): string {\r\n\tconst opt = { ...spec.opt };\r\n\tdelete opt.$asai;\r\n\treturn `${spec.domain}:${spec.type}:${JSON.stringify(opt)}`;\r\n}\r\n\r\n/** 从 asaihost 解析域配置(dataStores 优先,兼容 userStore / logger.store) */\r\nexport function resolveStoreConfig($asai: any, domain: StoreDomain): ResolvedStoreConfig {\r\n\tconst host = $asai?.hostconfig || {};\r\n\tconst stores = host.dataStores || {};\r\n\r\n\tif (stores[domain] && typeof stores[domain] === 'object') {\r\n\t\tconst s = stores[domain] as Record<string, unknown>;\r\n\t\treturn {\r\n\t\t\ttype: (s.type as DbType) || 'file',\r\n\t\t\topt: (s.opt as Record<string, unknown>) || {},\r\n\t\t};\r\n\t}\r\n\r\n\tif (domain === 'user' && host.userStore) {\r\n\t\tconst u = host.userStore;\r\n\t\treturn { type: (u.type as DbType) || 'file', opt: u.opt || {} };\r\n\t}\r\n\r\n\tif (domain === 'log' && host.logger?.store) {\r\n\t\tconst s = host.logger.store;\r\n\t\treturn { type: (s.type as DbType) || 'sqlite', opt: { database: s.database, create: s.create, dir: s.dir, ext: s.ext } };\r\n\t}\r\n\r\n\tif (domain === 'default' || domain === 'app') {\r\n\t\treturn {\r\n\t\t\ttype: 'sqlite',\r\n\t\t\topt: { database: './webdata/webdb/sqlite/asaisqlite.db', create: 1 },\r\n\t\t};\r\n\t}\r\n\r\n\treturn { type: 'file', opt: {} };\r\n}\r\n\r\n/** 归一化各驱动的 opt 默认值 */\r\nexport function normalizeStoreOpt(domain: StoreDomain, type: DbType, opt: Record<string, unknown>): Record<string, unknown> {\r\n\tconst o = { ...opt };\r\n\tif (type === 'file') {\r\n\t\tif (domain === 'user') {\r\n\t\t\tif (!o.dir) o.dir = 'webdata/webdb/users/';\r\n\t\t\tif (!o.ext) o.ext = '.json';\r\n\t\t} else if (domain === 'log') {\r\n\t\t\tif (!o.dir) o.dir = 'webdata/webdb/log/store/';\r\n\t\t\tif (!o.ext) o.ext = '.json';\r\n\t\t}\r\n\t\tif (o.create == null) o.create = 1;\r\n\t} else if (type === 'sqlite') {\r\n\t\tif (domain === 'user' && !o.database) o.database = './webdata/webdb/users/users.db';\r\n\t\tif (domain === 'log' && !o.database) o.database = './webdata/webdb/log/asai-logs.db';\r\n\t\tif ((domain === 'default' || domain === 'app') && !o.database) o.database = './webdata/webdb/sqlite/asaisqlite.db';\r\n\t\tif (o.create == null) o.create = 1;\r\n\t} else if (type === 'mysql') {\r\n\t\tif (!o.host) o.host = '127.0.0.1';\r\n\t\tif (!o.user) o.user = 'root';\r\n\t\tif (!o.password) o.password = '';\r\n\t\tif (!o.database) o.database = domain === 'log' ? 'asai_logs' : 'asai';\r\n\t\tif (o.create == null) o.create = 1;\r\n\t}\r\n\treturn o;\r\n}\r\n\r\n/**\r\n * 获取(并缓存)数据服务实例 — 全库统一入口\r\n * @param domain 预置域 user|log,或 AsDb 自定义域(建议含 database/dir 唯一标识)\r\n */\r\nexport function getDataServer($asai: any, domain: StoreDomain): DbInstance {\r\n\tconst resolved = resolveStoreConfig($asai, domain);\r\n\tconst opt = normalizeStoreOpt(domain, resolved.type, resolved.opt);\r\n\tconst spec: StoreSpec = { domain, type: resolved.type, opt };\r\n\treturn getDataServerBySpec($asai, spec);\r\n}\r\n\r\n/** 按显式 spec 获取实例(AsDb / 业务插件用) */\r\nexport function getDataServerBySpec($asai: any, spec: StoreSpec): DbInstance {\r\n\tconst opt = normalizeStoreOpt(spec.domain, spec.type, { ...spec.opt, $asai });\r\n\tconst full: StoreSpec = { ...spec, opt };\r\n\tconst key = specCacheKey(full);\r\n\tconst cache = cacheMap($asai);\r\n\tif (cache.has(key)) return cache.get(key)!;\r\n\r\n\tconst factory = $asai.dataserver as (t: string, o: Record<string, unknown>) => DbInstance;\r\n\tconst instance = factory(full.type, full.opt);\r\n\tcache.set(key, instance);\r\n\treturn instance;\r\n}\r\n\r\n/** AsDb 路由:按 cfg 生成稳定域键并复用连接 */\r\nexport function getDataServerForAsDb($asai: any, cfg: { type?: string; opt?: Record<string, unknown>; storeKey?: string }): DbInstance {\r\n\tconst type = (cfg?.type || 'sqlite') as DbType;\r\n\tconst opt = cfg?.opt || {};\r\n\tconst domain =\r\n\t\tcfg?.storeKey ||\r\n\t\t`asdb:${type}:${opt.database || opt.dir || 'default'}`;\r\n\treturn getDataServerBySpec($asai, { domain, type, opt });\r\n}\r\n\r\nexport function invalidateDataStore($asai: any, domain?: StoreDomain): void {\r\n\tconst cache = cacheMap($asai);\r\n\tif (!domain) {\r\n\t\tcache.clear();\r\n\t\treturn;\r\n\t}\r\n\tfor (const key of [...cache.keys()]) {\r\n\t\tif (key.startsWith(`${domain}:`)) cache.delete(key);\r\n\t}\r\n}\r\n\r\nexport function isStoreSqlBackend($asai: any, domain: StoreDomain): boolean {\r\n\tconst { type } = resolveStoreConfig($asai, domain);\r\n\treturn type === 'sqlite' || type === 'mysql';\r\n}\r\n\r\nexport function isStoreFileBackend($asai: any, domain: StoreDomain): boolean {\r\n\treturn resolveStoreConfig($asai, domain).type === 'file';\r\n}\r\n\r\n/** 共享 SQL 字面量转义(file 驱动不加引号) */\r\nexport function qStr(val: string | undefined | null, dbType: DbType): string {\r\n\tif (val == null || val === '') return \"''\";\r\n\tconst s = String(val).replace(/'/g, \"''\");\r\n\treturn dbType === 'file' ? s : `'${s}'`;\r\n}\r\n\r\nexport function qNum(val: number | undefined | null): string {\r\n\treturn String(Number(val ?? 0));\r\n}\r\n\r\nexport function asRows(result: unknown): Record<string, unknown>[] {\r\n\tif (!result) return [];\r\n\tif (Array.isArray(result)) return result as Record<string, unknown>[];\r\n\treturn [];\r\n}\r\n\r\nexport async function readJsonBlob(\r\n\tdb: { sqlDb(sql: Idb): Promise<unknown> },\r\n\tfilename: string,\r\n): Promise<Record<string, unknown>[]> {\r\n\tconst res = await db.sqlDb({\r\n\t\ttype: 'select',\r\n\t\ttable: '',\r\n\t\twhere: [['name', '=', filename]],\r\n\t\tfield: ['name', 'content'],\r\n\t});\r\n\tconst rows = asRows(res);\r\n\tif (!rows.length) return [];\r\n\ttry {\r\n\t\tconst parsed = JSON.parse(String(rows[0].content || '[]'));\r\n\t\treturn Array.isArray(parsed) ? parsed : [];\r\n\t} catch {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\nexport async function writeJsonBlob(\r\n\tdb: { sqlDb(sql: Idb): Promise<unknown> },\r\n\tfilename: string,\r\n\tdata: Record<string, unknown>[],\r\n): Promise<void> {\r\n\tconst content = JSON.stringify(data, null, 2);\r\n\tconst probe = await db.sqlDb({\r\n\t\ttype: 'select',\r\n\t\ttable: '',\r\n\t\twhere: [['name', '=', filename]],\r\n\t\tfield: ['name', 'content'],\r\n\t});\r\n\tif (!asRows(probe).length) {\r\n\t\tawait db.sqlDb({ type: 'insert', table: '', value: [[filename, content]] });\r\n\t\treturn;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'update',\r\n\t\ttable: '',\r\n\t\twhere: [['name', '=', filename]],\r\n\t\tset: [['name', content]],\r\n\t});\r\n}\r\n"],"mappings":"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","names":[]}
|