@indra.ai/deva 1.6.54 → 1.6.55
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/index.js +147 -43
- package/lib/index.js +20 -130
- package/package.json +1 -1
- package/tests/client.json +4 -1
- package/tests/index.js +32 -3
package/index.js
CHANGED
|
@@ -42,11 +42,8 @@ class Deva {
|
|
|
42
42
|
this._systems = false; // inherited Systems features.
|
|
43
43
|
this._networks = false; // inherited Systems features.
|
|
44
44
|
this.events = opts.events || new EventEmitter({}); // Event Bus
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
this.lib = _lib; // used for loading library functions
|
|
48
|
-
|
|
49
|
-
this.utils = opts.utils || {}; // parse function
|
|
45
|
+
this.lib = new lib({pkg}); // used for loading library functions
|
|
46
|
+
this.utils = opts.utils || {}; // parse functions inside the deva
|
|
50
47
|
this.devas = opts.devas || {}; // Devas which are loaded
|
|
51
48
|
this.vars = opts.vars || {}; // Variables object
|
|
52
49
|
this.listeners = opts.listeners || {}; // local Listeners
|
|
@@ -187,7 +184,7 @@ class Deva {
|
|
|
187
184
|
***************/
|
|
188
185
|
_methodNotFound(packet) {
|
|
189
186
|
if (!this._active) return this._messages.offline; // check the active status
|
|
190
|
-
const id = this.
|
|
187
|
+
const id = this.uid();
|
|
191
188
|
const agent = this.agent() || false;
|
|
192
189
|
const client = this.client() || false;
|
|
193
190
|
const {meta, params} = packet.q;
|
|
@@ -279,7 +276,7 @@ class Deva {
|
|
|
279
276
|
client presented data.
|
|
280
277
|
***************/
|
|
281
278
|
Feature(feature, resolve, reject) {
|
|
282
|
-
const _id = this.
|
|
279
|
+
const _id = this.uid();
|
|
283
280
|
this.feature(feature, _id.uid);
|
|
284
281
|
this.zone(feature, _id.uid);
|
|
285
282
|
const _cl = this.client(); // set local copy of client data
|
|
@@ -655,11 +652,11 @@ class Deva {
|
|
|
655
652
|
describe:
|
|
656
653
|
***************/
|
|
657
654
|
question(TEXT=false, DATA=false) {
|
|
658
|
-
const id = this.
|
|
655
|
+
const id = this.uid(); // generate a unique id for transport.
|
|
659
656
|
// check the active status
|
|
660
657
|
if (!this._active) return Promise.resolve(this._messages.offline);
|
|
661
|
-
this.zone('question', id);
|
|
662
|
-
this.action('question', id);
|
|
658
|
+
this.zone('question', id.uid);
|
|
659
|
+
this.action('question', id.uid);
|
|
663
660
|
const t_split = TEXT.split(' '); // split the text on spaces to get words.
|
|
664
661
|
const data = DATA; // set the DATA to data
|
|
665
662
|
|
|
@@ -685,7 +682,7 @@ class Deva {
|
|
|
685
682
|
return new Promise((resolve, reject) => {
|
|
686
683
|
// resolve with the no text message if the client says nothing.
|
|
687
684
|
if (!TEXT) return resolve(this._messages.notext, resolve);
|
|
688
|
-
this.state('try', `question:${id}`);
|
|
685
|
+
this.state('try', `question:${id.uid}`);
|
|
689
686
|
try { // try to answer the question
|
|
690
687
|
if (isAsk) { // determine if hte question isAsk
|
|
691
688
|
// if:isAsk split the agent key and remove first command character
|
|
@@ -694,19 +691,19 @@ class Deva {
|
|
|
694
691
|
params = t_split[1] ? t_split[1].split(':') : false;
|
|
695
692
|
method = params[0]; // the method to check is then params index 0
|
|
696
693
|
text = t_split.slice(2).join(' ').trim(); // rejoin the text with space
|
|
697
|
-
this.state('ask', `${key}:${method}:${id}`);
|
|
694
|
+
this.state('ask', `${key}:${method}:${id.uid}`);
|
|
698
695
|
}
|
|
699
696
|
else if (isCmd) { // determine if the question is a command
|
|
700
697
|
//if:isCmd use text split index 1 as the parameter block
|
|
701
698
|
params = t_split[0] ? t_split[0].split(':') : false;
|
|
702
699
|
method = t_split[0].split(':')[0].substring(1); // if:isCmd use the 0 index as the command
|
|
703
700
|
text = t_split.slice(1).join(' ').trim(); // if:isCmd rejoin the string on the space after removing first index
|
|
704
|
-
this.state('cmd', `${method}:${id}`); // set the state to cmd.
|
|
701
|
+
this.state('cmd', `${method}:${id.uid}`); // set the state to cmd.
|
|
705
702
|
}
|
|
706
703
|
|
|
707
|
-
this.state('set', `question:${method}:${id}`)
|
|
704
|
+
this.state('set', `question:${method}:${id.uid}`)
|
|
708
705
|
packet.q = { // build packet.q container
|
|
709
|
-
id: this.
|
|
706
|
+
id: this.uid(), // set the transport id for the question.
|
|
710
707
|
agent: this.agent(), // set the agent
|
|
711
708
|
client: this.client(), // set the client
|
|
712
709
|
meta: { // build the meta container
|
|
@@ -720,7 +717,7 @@ class Deva {
|
|
|
720
717
|
}
|
|
721
718
|
|
|
722
719
|
// hash the question
|
|
723
|
-
packet.q.md5 = this.lib.hash(packet.q);
|
|
720
|
+
packet.q.md5 = this.lib.hash(packet.q, 'md5');
|
|
724
721
|
packet.q.sha256 = this.lib.hash(packet.q, 'sha256');
|
|
725
722
|
packet.q.sha512 = this.lib.hash(packet.q, 'sha512');
|
|
726
723
|
|
|
@@ -741,7 +738,7 @@ class Deva {
|
|
|
741
738
|
}
|
|
742
739
|
}
|
|
743
740
|
catch(e) {
|
|
744
|
-
this.state('catch',
|
|
741
|
+
this.state('catch', `${id.uid}`);
|
|
745
742
|
return this.err(e); // if a overall error happens this witll call this.err
|
|
746
743
|
}
|
|
747
744
|
});
|
|
@@ -758,9 +755,9 @@ class Deva {
|
|
|
758
755
|
from the agent from the pre-determined method.
|
|
759
756
|
***************/
|
|
760
757
|
answer(packet, resolve, reject) {
|
|
761
|
-
const id = this.
|
|
758
|
+
const id = this.uid();
|
|
762
759
|
if (!this._active) return Promise.resolve(this._messages.offline);
|
|
763
|
-
this.zone('answer', id); // set zone to answer
|
|
760
|
+
this.zone('answer', id.uid); // set zone to answer
|
|
764
761
|
const agent = this.agent();
|
|
765
762
|
const client = this.client();
|
|
766
763
|
// check if method exists and is of type function
|
|
@@ -848,7 +845,7 @@ class Deva {
|
|
|
848
845
|
|
|
849
846
|
this.state('set', `ask:${method}:packet_answer:${packet.id.uid}`);
|
|
850
847
|
const packet_answer = {
|
|
851
|
-
id: this.
|
|
848
|
+
id: this.uid(),
|
|
852
849
|
agent,
|
|
853
850
|
client,
|
|
854
851
|
meta: {
|
|
@@ -929,7 +926,7 @@ class Deva {
|
|
|
929
926
|
const agent = this.agent();
|
|
930
927
|
|
|
931
928
|
const data = {
|
|
932
|
-
id: this.
|
|
929
|
+
id: this.uid(),
|
|
933
930
|
key: 'init',
|
|
934
931
|
value: agent.key,
|
|
935
932
|
agent,
|
|
@@ -1029,7 +1026,7 @@ class Deva {
|
|
|
1029
1026
|
if (!this._active) return resolve(this._messages.offline);
|
|
1030
1027
|
|
|
1031
1028
|
this.action('start', data.id.uid);
|
|
1032
|
-
const id = this.
|
|
1029
|
+
const id = this.uid();
|
|
1033
1030
|
|
|
1034
1031
|
delete data.md5;
|
|
1035
1032
|
delete data.sha256;
|
|
@@ -1140,9 +1137,6 @@ class Deva {
|
|
|
1140
1137
|
data.sha256 = this.lib.hash(data, 'sha256');
|
|
1141
1138
|
data.sha512 = this.lib.hash(data, 'sha512');
|
|
1142
1139
|
|
|
1143
|
-
this.lib.setClient(this.client());
|
|
1144
|
-
this.lib.setAgent(this.agent());
|
|
1145
|
-
|
|
1146
1140
|
this.state('ready', data.id.uid);
|
|
1147
1141
|
this.talk(config.events.ready, data);
|
|
1148
1142
|
return hasOnReady ? this.onReady(data, resolve) : resolve(data);
|
|
@@ -1222,7 +1216,7 @@ class Deva {
|
|
|
1222
1216
|
this.stop()
|
|
1223
1217
|
***************/
|
|
1224
1218
|
stop() {
|
|
1225
|
-
const id = this.
|
|
1219
|
+
const id = this.uid();
|
|
1226
1220
|
this.zone('stop', id);
|
|
1227
1221
|
if (!this._active) return Promise.resolve(this._messages.offline);
|
|
1228
1222
|
|
|
@@ -1260,7 +1254,7 @@ class Deva {
|
|
|
1260
1254
|
function.
|
|
1261
1255
|
***************/
|
|
1262
1256
|
exit() {
|
|
1263
|
-
const id = this.
|
|
1257
|
+
const id = this.uid();
|
|
1264
1258
|
this.zone('exit', id);
|
|
1265
1259
|
if (!this._active) return Promise.resolve(this._messages.offline);
|
|
1266
1260
|
|
|
@@ -1321,7 +1315,7 @@ class Deva {
|
|
|
1321
1315
|
const lookup = this._states[value]; // set the local states lookup
|
|
1322
1316
|
const text = extra ? `${lookup} ${extra}` : lookup; // set text from lookup with extra
|
|
1323
1317
|
const data = { // build the data object
|
|
1324
|
-
id: this.
|
|
1318
|
+
id: this.uid(), // set the data id
|
|
1325
1319
|
agent: this.agent(), // set the agent
|
|
1326
1320
|
client: this.client(), // set the client
|
|
1327
1321
|
key: 'state', // set the key to state
|
|
@@ -1347,7 +1341,7 @@ class Deva {
|
|
|
1347
1341
|
describe: returns the avaiable staets values.
|
|
1348
1342
|
***************/
|
|
1349
1343
|
states() {
|
|
1350
|
-
const id = this.
|
|
1344
|
+
const id = this.uid();
|
|
1351
1345
|
this.action('states', id);
|
|
1352
1346
|
const data = {
|
|
1353
1347
|
id,
|
|
@@ -1371,7 +1365,7 @@ class Deva {
|
|
|
1371
1365
|
describe
|
|
1372
1366
|
***************/
|
|
1373
1367
|
zone(value=false, extra=false) {
|
|
1374
|
-
const id = this.
|
|
1368
|
+
const id = this.uid();
|
|
1375
1369
|
if (!value || !this._zones[value] || value === this._zone) return;
|
|
1376
1370
|
|
|
1377
1371
|
try {
|
|
@@ -1407,7 +1401,7 @@ class Deva {
|
|
|
1407
1401
|
describe: returns a listing of zones currently in the system.
|
|
1408
1402
|
***************/
|
|
1409
1403
|
zones() {
|
|
1410
|
-
const id = this.
|
|
1404
|
+
const id = this.uid();
|
|
1411
1405
|
this.action('zones', id.uid);
|
|
1412
1406
|
this.state('return', `zones:${id.uid}`);
|
|
1413
1407
|
|
|
@@ -1435,7 +1429,7 @@ class Deva {
|
|
|
1435
1429
|
describe
|
|
1436
1430
|
***************/
|
|
1437
1431
|
action(value=false, extra=false) {
|
|
1438
|
-
const id = this.
|
|
1432
|
+
const id = this.uid();
|
|
1439
1433
|
try {
|
|
1440
1434
|
if (!value || !this._actions[value] || value === this._action) return;
|
|
1441
1435
|
this._action = value; // set the local action variable
|
|
@@ -1474,7 +1468,7 @@ class Deva {
|
|
|
1474
1468
|
describe: Returns a list of available actions in the system.
|
|
1475
1469
|
***************/
|
|
1476
1470
|
actions() {
|
|
1477
|
-
const id = this.
|
|
1471
|
+
const id = this.uid();
|
|
1478
1472
|
this.action('actions', id.uid);
|
|
1479
1473
|
const data = {
|
|
1480
1474
|
id, // set the id with a uuid
|
|
@@ -1501,7 +1495,7 @@ class Deva {
|
|
|
1501
1495
|
describe
|
|
1502
1496
|
***************/
|
|
1503
1497
|
feature(value=false, extra=false) {
|
|
1504
|
-
const id = this.
|
|
1498
|
+
const id = this.uid();
|
|
1505
1499
|
try {
|
|
1506
1500
|
if (!value || !this._features[value]) return; // check feature value
|
|
1507
1501
|
|
|
@@ -1536,7 +1530,7 @@ class Deva {
|
|
|
1536
1530
|
***************/
|
|
1537
1531
|
features() {
|
|
1538
1532
|
if (!this._active) return this._messages.offline; // check the active status
|
|
1539
|
-
const id = this.
|
|
1533
|
+
const id = this.uid();
|
|
1540
1534
|
this.action('features', id.uid);
|
|
1541
1535
|
const data = {
|
|
1542
1536
|
id, // set the object id
|
|
@@ -1564,7 +1558,7 @@ class Deva {
|
|
|
1564
1558
|
***************/
|
|
1565
1559
|
context(value=false, extra=false) {
|
|
1566
1560
|
if (!this._active) return this._messages.offline; // check the active status
|
|
1567
|
-
const id = this.
|
|
1561
|
+
const id = this.uid();
|
|
1568
1562
|
try {
|
|
1569
1563
|
if (!value) return;
|
|
1570
1564
|
this._context = value;
|
|
@@ -1595,7 +1589,7 @@ class Deva {
|
|
|
1595
1589
|
|
|
1596
1590
|
contexts() {
|
|
1597
1591
|
if (!this._active) return this._messages.offline; // check the active status
|
|
1598
|
-
const id = this.
|
|
1592
|
+
const id = this.uid();
|
|
1599
1593
|
this.action('contexts', id);
|
|
1600
1594
|
if (!this._active) return this._messages.offline; // check the active status
|
|
1601
1595
|
const data = {
|
|
@@ -1937,7 +1931,7 @@ class Deva {
|
|
|
1937
1931
|
***************/
|
|
1938
1932
|
prompt(text) {
|
|
1939
1933
|
if (!this._active) return this._messages.offline;
|
|
1940
|
-
const id = this.
|
|
1934
|
+
const id = this.uid();
|
|
1941
1935
|
// Talk a global prompt event for the client
|
|
1942
1936
|
const agent = this.agent();
|
|
1943
1937
|
const client = this.client();
|
|
@@ -1966,7 +1960,7 @@ class Deva {
|
|
|
1966
1960
|
***************/
|
|
1967
1961
|
core() {
|
|
1968
1962
|
if (!this._active) return this._messages.offline;
|
|
1969
|
-
const id = this.
|
|
1963
|
+
const id = this.uid();
|
|
1970
1964
|
this.action('core', id);
|
|
1971
1965
|
|
|
1972
1966
|
// check the active status
|
|
@@ -1989,7 +1983,7 @@ class Deva {
|
|
|
1989
1983
|
***************/
|
|
1990
1984
|
info() {
|
|
1991
1985
|
if (!this._active) return this._messages.offline;
|
|
1992
|
-
const id = this.
|
|
1986
|
+
const id = this.uid();
|
|
1993
1987
|
this.action('info', id);
|
|
1994
1988
|
|
|
1995
1989
|
const data = this.lib.copy(this._info);
|
|
@@ -2017,7 +2011,7 @@ class Deva {
|
|
|
2017
2011
|
***************/
|
|
2018
2012
|
status() {
|
|
2019
2013
|
if (!this._active) return this._messages.offline;
|
|
2020
|
-
const id = this.
|
|
2014
|
+
const id = this.uid();
|
|
2021
2015
|
this.action('status', id);
|
|
2022
2016
|
// check the active status
|
|
2023
2017
|
|
|
@@ -2041,7 +2035,7 @@ class Deva {
|
|
|
2041
2035
|
help(msg, help_dir) {
|
|
2042
2036
|
return new Promise((resolve, reject) => {
|
|
2043
2037
|
let helpDoc = false;
|
|
2044
|
-
const id = this.
|
|
2038
|
+
const id = this.uid();
|
|
2045
2039
|
this.zone('help', id);
|
|
2046
2040
|
if (!this._active) return resolve(this._messages.offline);
|
|
2047
2041
|
|
|
@@ -2100,7 +2094,7 @@ class Deva {
|
|
|
2100
2094
|
usage: this.err(err, data, reject);
|
|
2101
2095
|
***************/
|
|
2102
2096
|
err(err,packet,reject=false) {
|
|
2103
|
-
const id = this.
|
|
2097
|
+
const id = this.uid();
|
|
2104
2098
|
this.zone('error', id.uid);
|
|
2105
2099
|
this.feature('error', id.uid);
|
|
2106
2100
|
|
|
@@ -2135,6 +2129,116 @@ class Deva {
|
|
|
2135
2129
|
this.context('error', id.uid);
|
|
2136
2130
|
if (hasOnError) return this.onError(err, packet, reject);
|
|
2137
2131
|
else return reject ? reject(err) : Promise.reject(err);
|
|
2132
|
+
}
|
|
2133
|
+
|
|
2134
|
+
/**************
|
|
2135
|
+
func: uid
|
|
2136
|
+
params:
|
|
2137
|
+
- guid: This is a true false flag for generating a guid.
|
|
2138
|
+
describe:
|
|
2139
|
+
The uid function can create two types of id for you.
|
|
2140
|
+
1. random GUID - this is good for when you need a uinique record id returned
|
|
2141
|
+
2. transport uid - The transport id is a number generated to provide a
|
|
2142
|
+
secure numerical number used for transporting records
|
|
2143
|
+
across networks without collision or needing to store system uuid.
|
|
2144
|
+
3. the uid is then returned with a created, md5, sha256, and sha512 hash of the value
|
|
2145
|
+
copyright: 2025 Quinn A Michaels. All rights reserved.
|
|
2146
|
+
***************/
|
|
2147
|
+
uid(guid=false) {
|
|
2148
|
+
const time = Date.now(); // set time to local constant
|
|
2149
|
+
const date = this.lib.formatDate(time, 'long', true); // set date to local constant
|
|
2150
|
+
|
|
2151
|
+
const pkg_hash = this.lib.hash(pkg, 'sha256');
|
|
2152
|
+
const client_hash = this.client().sha256 || false;
|
|
2153
|
+
const agent_hash = this.agent().sha256 || false;
|
|
2154
|
+
const machine_hash = this.lib.machine();
|
|
2155
|
+
|
|
2156
|
+
const data = {
|
|
2157
|
+
uid: false,
|
|
2158
|
+
time,
|
|
2159
|
+
date,
|
|
2160
|
+
client: client_hash,
|
|
2161
|
+
agent: agent_hash,
|
|
2162
|
+
pkg: pkg_hash,
|
|
2163
|
+
machine: machine_hash,
|
|
2164
|
+
warning: config.messages.uid_warning,
|
|
2165
|
+
}
|
|
2166
|
+
if (guid) {
|
|
2167
|
+
const uid = randomUUID(); // set uid into local constant.
|
|
2168
|
+
data.uid = uid; // set base data object.
|
|
2169
|
+
}
|
|
2170
|
+
else {
|
|
2171
|
+
const min = Math.floor(time - (time / Math.PI)); // generate min time from Math.PI divisor.
|
|
2172
|
+
const max = Math.ceil(time + (time * Math.PI)); // generate max time form Math.PI multiplier.
|
|
2173
|
+
const begin_random = Math.floor(Math.random() * (max - min) + min); // generate random number between min and max.
|
|
2174
|
+
const {end_min, end_max} = config.uid; // set end min and max in to constant
|
|
2175
|
+
const end_random = Math.ceil(Math.random() * (end_max - end_min) + end_min); // generate the 5 digit end salt on the number for added randomness.
|
|
2176
|
+
|
|
2177
|
+
const uid = `${begin_random}${end_random}`; // set uid to local constant
|
|
2178
|
+
data.uid = uid; // set base data object.
|
|
2179
|
+
}
|
|
2180
|
+
data.md5 = this.lib.hash(data, 'md5'); // md5 the uid and created.
|
|
2181
|
+
data.sha256 = this.lib.hash(data, 'sha256'); // sha256 the uid, created, md5
|
|
2182
|
+
data.sha512 = this.lib.hash(data, 'sha512'); // sha512 the uid, created, md5, sha256.
|
|
2183
|
+
return data; // return the complete uid data.
|
|
2138
2184
|
}
|
|
2185
|
+
|
|
2186
|
+
sign(packet) {
|
|
2187
|
+
const time = Date.now();
|
|
2188
|
+
const client = this.client();
|
|
2189
|
+
const agent = this.agent();
|
|
2190
|
+
const {q, id} = packet;
|
|
2191
|
+
const transport = id.uid; // set the transport id from the packet id.
|
|
2192
|
+
|
|
2193
|
+
const {meta, text} = q;
|
|
2194
|
+
const {key, method, params} = meta;
|
|
2195
|
+
const opts = this.lib.copy(params); // copy the params and set as opts.
|
|
2196
|
+
|
|
2197
|
+
const {invalid_agent,invalid_client} = config.messages;
|
|
2198
|
+
|
|
2199
|
+
const agent_hash = agent.sha256 === packet.q.agent.sha256 ? agent.sha256 : invalid_agent;
|
|
2200
|
+
const client_hash = client.sha256 === packet.q.client.sha256 ? client.sha256 : invalid_client;
|
|
2201
|
+
|
|
2202
|
+
const created = this.lib.formatDate(time, 'long', true); // Formatted created date.
|
|
2203
|
+
|
|
2204
|
+
const container = `OM:O:${key.toUpperCase()}:${transport}`; // set container string.
|
|
2205
|
+
const {write} = client.profile; // set write string.
|
|
2206
|
+
|
|
2207
|
+
const token = this.lib.hash(`${key} client:${client.profile.id} fullname:${client.profile.fullname} transport:${transport}`, 'sha256');
|
|
2208
|
+
|
|
2209
|
+
// build the main data packet.
|
|
2210
|
+
const data = {
|
|
2211
|
+
id,
|
|
2212
|
+
text,
|
|
2213
|
+
time,
|
|
2214
|
+
container,
|
|
2215
|
+
write,
|
|
2216
|
+
cient: {
|
|
2217
|
+
key: client.key,
|
|
2218
|
+
name: client.profile.name,
|
|
2219
|
+
fullname: client.profile.fullname,
|
|
2220
|
+
emojis: client.profile.emojis,
|
|
2221
|
+
company: client.profile.company,
|
|
2222
|
+
expires: client.expires ? time + client.expires : 'none',
|
|
2223
|
+
caseid: client.profile.caseid || 'none',
|
|
2224
|
+
token,
|
|
2225
|
+
sha256: client.sha256,
|
|
2226
|
+
},
|
|
2227
|
+
agent: {
|
|
2228
|
+
key: agent.key,
|
|
2229
|
+
name: agent.profile.name,
|
|
2230
|
+
sha256: agent.sha256,
|
|
2231
|
+
},
|
|
2232
|
+
created,
|
|
2233
|
+
warning: client.warning || agent.warning || 'none',
|
|
2234
|
+
copyright: client.profile.copyright || agent.profile.copyright,
|
|
2235
|
+
};
|
|
2236
|
+
data.md5 = this.lib.hash(data, 'md5'); // hash data packet into md5 and inert into data.
|
|
2237
|
+
data.sha256 = this.lib.hash(data, 'sha256'); // hash data into sha 256 then set in data.
|
|
2238
|
+
data.sha512 = this.lib.hash(data, 'sha512'); // hash data into sha 512 then set in data.
|
|
2239
|
+
console.log('sign data', data);
|
|
2240
|
+
return data;
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2139
2243
|
}
|
|
2140
2244
|
export default Deva;
|
package/lib/index.js
CHANGED
|
@@ -18,23 +18,15 @@ class Node {
|
|
|
18
18
|
class LIB {
|
|
19
19
|
constructor(opts) {
|
|
20
20
|
this.pkg = opts.pkg || {};
|
|
21
|
-
this.agent = false;
|
|
22
|
-
this.client = false;
|
|
23
21
|
this.lang = opts.lang || 'en';
|
|
24
|
-
this.locale = opts.locale || 'US';
|
|
22
|
+
this.locale = opts.locale || 'en-US';
|
|
25
23
|
this.currency = opts.currency || 'USD';
|
|
26
24
|
this.os = os;
|
|
27
25
|
this.fs = fs;
|
|
28
26
|
this.path = path;
|
|
29
27
|
this.exec = exec;
|
|
30
28
|
this.spawn = spawn;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
setClient(client) {
|
|
34
|
-
this.client = client;
|
|
35
|
-
}
|
|
36
|
-
setAgent(agent) {
|
|
37
|
-
this.agent = agent;
|
|
29
|
+
this.randomUUID = randomUUID;
|
|
38
30
|
}
|
|
39
31
|
|
|
40
32
|
help(msg, help_dir) {
|
|
@@ -53,127 +45,7 @@ class LIB {
|
|
|
53
45
|
}
|
|
54
46
|
|
|
55
47
|
|
|
56
|
-
/**************
|
|
57
|
-
func: uid
|
|
58
|
-
params:
|
|
59
|
-
- guid: This is a true false flag for generating a guid.
|
|
60
|
-
describe:
|
|
61
|
-
The uid function can create two types of id for you.
|
|
62
|
-
1. random GUID - this is good for when you need a uinique record id returned
|
|
63
|
-
2. transport uid - The transport id is a number generated to provide a
|
|
64
|
-
secure numerical number used for transporting records
|
|
65
|
-
across networks without collision or needing to store system uuid.
|
|
66
|
-
3. the uid is then returned with a created, md5, sha256, and sha512 hash of the value
|
|
67
|
-
copyright: 2025 Quinn A Michaels. All rights reserved.
|
|
68
|
-
***************/
|
|
69
|
-
uid(guid=false) {
|
|
70
|
-
const time = Date.now(); // set time to local constant
|
|
71
|
-
const date = this.formatDate(time, 'long', true); // set date to local constant
|
|
72
|
-
const machine = {
|
|
73
|
-
arch: os.arch(),
|
|
74
|
-
hostname: os.hostname(),
|
|
75
|
-
network: os.networkInterfaces(),
|
|
76
|
-
platform: os.platform(),
|
|
77
|
-
release: os.release(),
|
|
78
|
-
type: os.type(),
|
|
79
|
-
user: os.userInfo(),
|
|
80
|
-
version: os.version(),
|
|
81
|
-
uptime: os.uptime(),
|
|
82
|
-
cpus: os.cpus(),
|
|
83
|
-
};
|
|
84
48
|
|
|
85
|
-
const machine_hash = this.hash(machine, 'sha256');
|
|
86
|
-
const pkg_hash = this.hash(this.pkg, 'sha256');
|
|
87
|
-
|
|
88
|
-
const data = {
|
|
89
|
-
uid: false,
|
|
90
|
-
time,
|
|
91
|
-
date,
|
|
92
|
-
client: this.client,
|
|
93
|
-
agent: this.agent,
|
|
94
|
-
pkg: pkg_hash,
|
|
95
|
-
machine: machine_hash,
|
|
96
|
-
warning: this.pkg.config.messages.uid_warning,
|
|
97
|
-
}
|
|
98
|
-
if (guid) {
|
|
99
|
-
const uid = randomUUID(); // set uid into local constant.
|
|
100
|
-
data.uid = uid; // set base data object.
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
const min = Math.floor(time - (time / Math.PI)); // generate min time from Math.PI divisor.
|
|
104
|
-
const max = Math.ceil(time + (time * Math.PI)); // generate max time form Math.PI multiplier.
|
|
105
|
-
const begin_random = Math.floor(Math.random() * (max - min) + min); // generate random number between min and max.
|
|
106
|
-
const {end_min, end_max} = this.pkg.config.uid; // set end min and max in to constant
|
|
107
|
-
const end_random = Math.ceil(Math.random() * (end_max - end_min) + end_min); // generate the 5 digit end salt on the number for added randomness.
|
|
108
|
-
|
|
109
|
-
const uid = `${begin_random}${end_random}`; // set uid to local constant
|
|
110
|
-
data.uid = uid; // set base data object.
|
|
111
|
-
}
|
|
112
|
-
data.md5 = this.hash(data, 'md5'); // md5 the uid and created.
|
|
113
|
-
data.sha256 = this.hash(data, 'sha256'); // sha256 the uid, created, md5
|
|
114
|
-
data.sha512 = this.hash(data, 'sha512'); // sha512 the uid, created, md5, sha256.
|
|
115
|
-
return data; // return the complete uid data.
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
sign(packet, concerns) {
|
|
119
|
-
const time = Date.now();
|
|
120
|
-
const {q, id} = packet;
|
|
121
|
-
|
|
122
|
-
const {meta, agent, client, text} = q;
|
|
123
|
-
const {invalid_agent,invalid_client} = this.pkg.config.messages;
|
|
124
|
-
const agent_hash = this.agent.sha256 === agent.sha256 ? this.agent.sha256 : invalid_agent;
|
|
125
|
-
const client_hash = this.client === client.sha256 ? this.client : invalid_client;
|
|
126
|
-
|
|
127
|
-
const {key, method, params} = meta;
|
|
128
|
-
const opts = this.copy(params); // copy the params and set as opts.
|
|
129
|
-
|
|
130
|
-
const transport = id.uid; // set the transport id from the packet id.
|
|
131
|
-
const created = this.formatDate(time, 'long', true); // Formatted created date.
|
|
132
|
-
|
|
133
|
-
const expr = client.expires || agent.expires || false;
|
|
134
|
-
const expires = expr ? time + expr : expr; // signature expires in milliseconds
|
|
135
|
-
const command = opts.shift(); // extract the command first array item out of opts.
|
|
136
|
-
const container = `OM:O:${key.toUpperCase()}:${transport}`; // set container string.
|
|
137
|
-
const {write} = client.profile; // set write string.
|
|
138
|
-
const packet_hash = this.hash(packet, 'sha256');
|
|
139
|
-
const laws_hash = this.hash(agent.laws || client.laws, 'sha256');
|
|
140
|
-
const token = this.hash(`${key} client:${client.profile.id} fullname:${client.profile.fullname} transport:${transport}`, 'sha256');
|
|
141
|
-
|
|
142
|
-
// build the main data packet.
|
|
143
|
-
const data = {
|
|
144
|
-
id,
|
|
145
|
-
key,
|
|
146
|
-
method,
|
|
147
|
-
transport,
|
|
148
|
-
time,
|
|
149
|
-
expires,
|
|
150
|
-
container,
|
|
151
|
-
write,
|
|
152
|
-
text,
|
|
153
|
-
caseid: client.profile.caseid || false,
|
|
154
|
-
opts: opts.length? `.${opts.join('.')}` : '',
|
|
155
|
-
name: client.profile.name,
|
|
156
|
-
fullname: client.profile.fullname,
|
|
157
|
-
emojis: client.profile.emojis,
|
|
158
|
-
company: client.profile.company,
|
|
159
|
-
client: client_hash,
|
|
160
|
-
agent: agent_hash,
|
|
161
|
-
packet: packet_hash,
|
|
162
|
-
laws: laws_hash,
|
|
163
|
-
warning: client.warning || agent.warning || 'none',
|
|
164
|
-
token,
|
|
165
|
-
concerns,
|
|
166
|
-
meta,
|
|
167
|
-
params,
|
|
168
|
-
command,
|
|
169
|
-
created,
|
|
170
|
-
copyright: client.profile.copyright || agent.profile.copyright,
|
|
171
|
-
};
|
|
172
|
-
data.md5 = this.hash(data, 'md5'); // hash data packet into md5 and inert into data.
|
|
173
|
-
data.sha256 = this.hash(data, 'sha256'); // hash data into sha 256 then set in data.
|
|
174
|
-
data.sha512 = this.hash(data, 'sha512'); // hash data into sha 512 then set in data.
|
|
175
|
-
return data;
|
|
176
|
-
}
|
|
177
49
|
|
|
178
50
|
/**************
|
|
179
51
|
func: hash
|
|
@@ -368,5 +240,23 @@ class LIB {
|
|
|
368
240
|
}
|
|
369
241
|
});
|
|
370
242
|
}
|
|
243
|
+
|
|
244
|
+
// machine returns the sha256 machine fingerprint
|
|
245
|
+
machine() {
|
|
246
|
+
const machine = {
|
|
247
|
+
arch: os.arch(),
|
|
248
|
+
hostname: os.hostname(),
|
|
249
|
+
network: os.networkInterfaces(),
|
|
250
|
+
platform: os.platform(),
|
|
251
|
+
release: os.release(),
|
|
252
|
+
type: os.type(),
|
|
253
|
+
user: os.userInfo(),
|
|
254
|
+
version: os.version(),
|
|
255
|
+
uptime: os.uptime(),
|
|
256
|
+
cpus: os.cpus(),
|
|
257
|
+
};
|
|
258
|
+
const machine_hash = this.hash(machine, 'sha256');
|
|
259
|
+
return machine_hash;
|
|
260
|
+
}
|
|
371
261
|
};
|
|
372
262
|
export default LIB
|
package/package.json
CHANGED
package/tests/client.json
CHANGED
|
@@ -24,7 +24,9 @@
|
|
|
24
24
|
},
|
|
25
25
|
"profile": {
|
|
26
26
|
"name": "Test User",
|
|
27
|
+
"fullname": "Test User Client Profile",
|
|
27
28
|
"eamil": "test@example.com",
|
|
29
|
+
"company": "Inside The Net, Inc.",
|
|
28
30
|
"describe": "The Test User",
|
|
29
31
|
"emoji": "/public/devas/test/avatar.png",
|
|
30
32
|
"avatar": "/public/devas/test/avatar.png",
|
|
@@ -32,7 +34,8 @@
|
|
|
32
34
|
"gender": "splendid",
|
|
33
35
|
"lang": "en",
|
|
34
36
|
"locale": "en-US",
|
|
35
|
-
"currency": "USD"
|
|
37
|
+
"currency": "USD",
|
|
38
|
+
"copyright": "©2025 Quinn A Michaels; All rights reserved."
|
|
36
39
|
},
|
|
37
40
|
"features": {
|
|
38
41
|
"license": {
|
package/tests/index.js
CHANGED
|
@@ -109,14 +109,42 @@ const DevaTest = new Deva({
|
|
|
109
109
|
const text = this._state
|
|
110
110
|
const core = this.core();
|
|
111
111
|
const info = this.info();
|
|
112
|
+
const uid = this.uid();
|
|
113
|
+
|
|
114
|
+
const sign_packet = {
|
|
115
|
+
id: this.uid(),
|
|
116
|
+
created: Date.now(),
|
|
117
|
+
q: {
|
|
118
|
+
id: this.uid(),
|
|
119
|
+
client: this.client(),
|
|
120
|
+
agent: this.agent(),
|
|
121
|
+
meta: {
|
|
122
|
+
key: 'test',
|
|
123
|
+
method: 'sign',
|
|
124
|
+
params: ['/sign', 'test'],
|
|
125
|
+
},
|
|
126
|
+
text: `Test text`,
|
|
127
|
+
data: false,
|
|
128
|
+
md5: packet.md5,
|
|
129
|
+
sha256: packet.sha256,
|
|
130
|
+
sha512: packet.sha512,
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const sign = this.sign(sign_packet);
|
|
112
134
|
const data = [
|
|
113
135
|
'🧪 TEST RESULTS',
|
|
136
|
+
`::BEGIN:UID:${info.id.uid}`,
|
|
137
|
+
JSON.stringify(uid,null,2),
|
|
138
|
+
`::END:UID:${info.id.uid}`,
|
|
114
139
|
`::BEGIN:CORE:${core.id.uid}`,
|
|
115
140
|
JSON.stringify(core,null,2),
|
|
116
141
|
`::END:CORE:${core.id.uid}`,
|
|
117
142
|
`::BEGIN:INFO:${info.id.uid}`,
|
|
118
143
|
JSON.stringify(info,null,2),
|
|
119
|
-
`::END:INFO:${info.id.uid}`,
|
|
144
|
+
`::END:INFO:${info.id.uid}`,
|
|
145
|
+
`::BEGIN:SIGN:${info.id.uid}`,
|
|
146
|
+
JSON.stringify(sign,null,2),
|
|
147
|
+
`::END:SIGN:${info.id.uid}`,
|
|
120
148
|
];
|
|
121
149
|
return {
|
|
122
150
|
text: data.join('\n'),
|
|
@@ -127,8 +155,9 @@ const DevaTest = new Deva({
|
|
|
127
155
|
methods: {
|
|
128
156
|
test(packet) {
|
|
129
157
|
this.context('test');
|
|
130
|
-
|
|
131
|
-
|
|
158
|
+
const test = this.func.test(packet)
|
|
159
|
+
return test;
|
|
160
|
+
},
|
|
132
161
|
},
|
|
133
162
|
onStart(data, resolve) {
|
|
134
163
|
this.context('start', data.id.uid);
|