shogun-core 4.2.1 → 4.2.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.
- package/dist/browser/shogun-core.js +214 -91
- package/dist/browser/shogun-core.js.map +1 -1
- package/dist/gundb/db.js +214 -91
- package/package.json +1 -1
|
@@ -134142,7 +134142,16 @@ class DataBase {
|
|
|
134142
134142
|
*/
|
|
134143
134143
|
async put(path, data) {
|
|
134144
134144
|
const node = this.navigateToPath(this.node, path);
|
|
134145
|
-
return
|
|
134145
|
+
return new Promise((resolve, reject) => {
|
|
134146
|
+
node.put(data, (ack) => {
|
|
134147
|
+
if (ack && ack.err) {
|
|
134148
|
+
reject(new Error(ack.err));
|
|
134149
|
+
}
|
|
134150
|
+
else {
|
|
134151
|
+
resolve(ack);
|
|
134152
|
+
}
|
|
134153
|
+
});
|
|
134154
|
+
});
|
|
134146
134155
|
}
|
|
134147
134156
|
/**
|
|
134148
134157
|
* Sets data at the specified path
|
|
@@ -134152,7 +134161,16 @@ class DataBase {
|
|
|
134152
134161
|
*/
|
|
134153
134162
|
async set(path, data) {
|
|
134154
134163
|
const node = this.navigateToPath(this.node, path);
|
|
134155
|
-
return
|
|
134164
|
+
return new Promise((resolve, reject) => {
|
|
134165
|
+
node.set(data, (ack) => {
|
|
134166
|
+
if (ack && ack.err) {
|
|
134167
|
+
reject(new Error(ack.err));
|
|
134168
|
+
}
|
|
134169
|
+
else {
|
|
134170
|
+
resolve(ack);
|
|
134171
|
+
}
|
|
134172
|
+
});
|
|
134173
|
+
});
|
|
134156
134174
|
}
|
|
134157
134175
|
/**
|
|
134158
134176
|
* Removes data at the specified path
|
|
@@ -134161,7 +134179,16 @@ class DataBase {
|
|
|
134161
134179
|
*/
|
|
134162
134180
|
async remove(path) {
|
|
134163
134181
|
const node = this.navigateToPath(this.node, path);
|
|
134164
|
-
return
|
|
134182
|
+
return new Promise((resolve, reject) => {
|
|
134183
|
+
node.put(null, (ack) => {
|
|
134184
|
+
if (ack && ack.err) {
|
|
134185
|
+
reject(new Error(ack.err));
|
|
134186
|
+
}
|
|
134187
|
+
else {
|
|
134188
|
+
resolve(ack);
|
|
134189
|
+
}
|
|
134190
|
+
});
|
|
134191
|
+
});
|
|
134165
134192
|
}
|
|
134166
134193
|
/**
|
|
134167
134194
|
* Checks if a user is currently logged in
|
|
@@ -134692,7 +134719,11 @@ class DataBase {
|
|
|
134692
134719
|
if (normalizedUsername.length === 0) {
|
|
134693
134720
|
throw new Error("Username cannot be empty");
|
|
134694
134721
|
}
|
|
134695
|
-
const existingUser = await
|
|
134722
|
+
const existingUser = await new Promise((resolve) => {
|
|
134723
|
+
this.gun.get(userPub).once((data) => {
|
|
134724
|
+
resolve(data);
|
|
134725
|
+
});
|
|
134726
|
+
});
|
|
134696
134727
|
const isNewUser = !existingUser || !existingUser.alias;
|
|
134697
134728
|
// const isNewUser = true;
|
|
134698
134729
|
// Get user's encryption public key (epub) for comprehensive tracking
|
|
@@ -134785,14 +134816,17 @@ class DataBase {
|
|
|
134785
134816
|
const aliasNode = this.gun.get(`~@${username}`);
|
|
134786
134817
|
// For Gun.js alias validation to pass, the data must be exactly equal to the key
|
|
134787
134818
|
// The key is `~@${username}`, so we store that as the data
|
|
134788
|
-
|
|
134789
|
-
|
|
134790
|
-
|
|
134791
|
-
|
|
134792
|
-
|
|
134793
|
-
|
|
134794
|
-
|
|
134795
|
-
|
|
134819
|
+
return new Promise((resolve) => {
|
|
134820
|
+
aliasNode.put(`~@${username}`, (ack) => {
|
|
134821
|
+
if (ack && ack.err) {
|
|
134822
|
+
console.error(`Error creating alias index: ${ack.err}`);
|
|
134823
|
+
resolve(false);
|
|
134824
|
+
}
|
|
134825
|
+
else {
|
|
134826
|
+
resolve(true);
|
|
134827
|
+
}
|
|
134828
|
+
});
|
|
134829
|
+
});
|
|
134796
134830
|
}
|
|
134797
134831
|
catch (error) {
|
|
134798
134832
|
console.error(`Error creating alias index: ${error}`);
|
|
@@ -134804,18 +134838,20 @@ class DataBase {
|
|
|
134804
134838
|
*/
|
|
134805
134839
|
async createUsernameMapping(username, userPub) {
|
|
134806
134840
|
try {
|
|
134807
|
-
|
|
134808
|
-
.
|
|
134809
|
-
|
|
134810
|
-
|
|
134811
|
-
|
|
134812
|
-
|
|
134813
|
-
|
|
134814
|
-
|
|
134815
|
-
|
|
134816
|
-
|
|
134817
|
-
|
|
134818
|
-
|
|
134841
|
+
return new Promise((resolve) => {
|
|
134842
|
+
this.node
|
|
134843
|
+
.get("usernames")
|
|
134844
|
+
.get(username)
|
|
134845
|
+
.put(userPub, (ack) => {
|
|
134846
|
+
if (ack && ack.err) {
|
|
134847
|
+
console.error(`Error creating username mapping: ${ack.err}`);
|
|
134848
|
+
resolve(false);
|
|
134849
|
+
}
|
|
134850
|
+
else {
|
|
134851
|
+
resolve(true);
|
|
134852
|
+
}
|
|
134853
|
+
});
|
|
134854
|
+
});
|
|
134819
134855
|
}
|
|
134820
134856
|
catch (error) {
|
|
134821
134857
|
console.error(`Error creating username mapping: ${error}`);
|
|
@@ -134834,18 +134870,20 @@ class DataBase {
|
|
|
134834
134870
|
registeredAt: Date.now().toString(),
|
|
134835
134871
|
lastSeen: Date.now().toString(),
|
|
134836
134872
|
};
|
|
134837
|
-
|
|
134838
|
-
.
|
|
134839
|
-
|
|
134840
|
-
|
|
134841
|
-
|
|
134842
|
-
|
|
134843
|
-
|
|
134844
|
-
|
|
134845
|
-
|
|
134846
|
-
|
|
134847
|
-
|
|
134848
|
-
|
|
134873
|
+
return new Promise((resolve) => {
|
|
134874
|
+
this.node
|
|
134875
|
+
.get("users")
|
|
134876
|
+
.get(userPub)
|
|
134877
|
+
.put(userData, (ack) => {
|
|
134878
|
+
if (ack && ack.err) {
|
|
134879
|
+
console.error(`Error creating user registry: ${ack.err}`);
|
|
134880
|
+
resolve(false);
|
|
134881
|
+
}
|
|
134882
|
+
else {
|
|
134883
|
+
resolve(true);
|
|
134884
|
+
}
|
|
134885
|
+
});
|
|
134886
|
+
});
|
|
134849
134887
|
}
|
|
134850
134888
|
catch (error) {
|
|
134851
134889
|
console.error(`Error creating user registry: ${error}`);
|
|
@@ -134857,18 +134895,20 @@ class DataBase {
|
|
|
134857
134895
|
*/
|
|
134858
134896
|
async createReverseLookup(username, userPub) {
|
|
134859
134897
|
try {
|
|
134860
|
-
|
|
134861
|
-
.
|
|
134862
|
-
|
|
134863
|
-
|
|
134864
|
-
|
|
134865
|
-
|
|
134866
|
-
|
|
134867
|
-
|
|
134868
|
-
|
|
134869
|
-
|
|
134870
|
-
|
|
134871
|
-
|
|
134898
|
+
return new Promise((resolve) => {
|
|
134899
|
+
this.node
|
|
134900
|
+
.get("userAliases")
|
|
134901
|
+
.get(userPub)
|
|
134902
|
+
.put(username, (ack) => {
|
|
134903
|
+
if (ack && ack.err) {
|
|
134904
|
+
console.error(`Error creating reverse lookup: ${ack.err}`);
|
|
134905
|
+
resolve(false);
|
|
134906
|
+
}
|
|
134907
|
+
else {
|
|
134908
|
+
resolve(true);
|
|
134909
|
+
}
|
|
134910
|
+
});
|
|
134911
|
+
});
|
|
134872
134912
|
}
|
|
134873
134913
|
catch (error) {
|
|
134874
134914
|
console.error(`Error creating reverse lookup: ${error}`);
|
|
@@ -134880,14 +134920,20 @@ class DataBase {
|
|
|
134880
134920
|
*/
|
|
134881
134921
|
async createEpubIndex(epub, userPub) {
|
|
134882
134922
|
try {
|
|
134883
|
-
|
|
134884
|
-
|
|
134885
|
-
|
|
134886
|
-
|
|
134887
|
-
|
|
134888
|
-
|
|
134889
|
-
|
|
134890
|
-
|
|
134923
|
+
return new Promise((resolve) => {
|
|
134924
|
+
this.node
|
|
134925
|
+
.get("epubKeys")
|
|
134926
|
+
.get(epub)
|
|
134927
|
+
.put(userPub, (ack) => {
|
|
134928
|
+
if (ack && ack.err) {
|
|
134929
|
+
console.error(`Error creating epub index: ${ack.err}`);
|
|
134930
|
+
resolve(false);
|
|
134931
|
+
}
|
|
134932
|
+
else {
|
|
134933
|
+
resolve(true);
|
|
134934
|
+
}
|
|
134935
|
+
});
|
|
134936
|
+
});
|
|
134891
134937
|
}
|
|
134892
134938
|
catch (error) {
|
|
134893
134939
|
console.error(`Error creating epub index: ${error}`);
|
|
@@ -134905,14 +134951,17 @@ class DataBase {
|
|
|
134905
134951
|
registeredAt: Date.now(),
|
|
134906
134952
|
lastSeen: Date.now(),
|
|
134907
134953
|
};
|
|
134908
|
-
|
|
134909
|
-
|
|
134910
|
-
|
|
134911
|
-
|
|
134912
|
-
|
|
134913
|
-
|
|
134914
|
-
|
|
134915
|
-
|
|
134954
|
+
return new Promise((resolve) => {
|
|
134955
|
+
this.gun.get(userPub).put(userMetadata, (ack) => {
|
|
134956
|
+
if (ack && ack.err) {
|
|
134957
|
+
console.error(`Error creating user metadata: ${ack.err}`);
|
|
134958
|
+
resolve(false);
|
|
134959
|
+
}
|
|
134960
|
+
else {
|
|
134961
|
+
resolve(true);
|
|
134962
|
+
}
|
|
134963
|
+
});
|
|
134964
|
+
});
|
|
134916
134965
|
}
|
|
134917
134966
|
catch (error) {
|
|
134918
134967
|
console.error(`Error creating user metadata: ${error}`);
|
|
@@ -134932,9 +134981,14 @@ class DataBase {
|
|
|
134932
134981
|
}
|
|
134933
134982
|
// Method 1: Try GunDB standard alias lookup (~@alias)
|
|
134934
134983
|
try {
|
|
134935
|
-
const aliasData =
|
|
134936
|
-
|
|
134937
|
-
|
|
134984
|
+
const aliasData = this.gun.get(`~@${normalizedAlias}`);
|
|
134985
|
+
const aliasDataObj = await new Promise((resolve) => {
|
|
134986
|
+
aliasData.once((data) => {
|
|
134987
|
+
resolve(data);
|
|
134988
|
+
});
|
|
134989
|
+
});
|
|
134990
|
+
if (aliasDataObj && aliasDataObj["~pubKeyOfUser"]) {
|
|
134991
|
+
const userPub = aliasDataObj["~pubKeyOfUser"]["#"] || aliasDataObj["~pubKeyOfUser"];
|
|
134938
134992
|
if (userPub) {
|
|
134939
134993
|
const userData = await this.getUserDataByPub(userPub);
|
|
134940
134994
|
if (userData) {
|
|
@@ -134948,10 +135002,14 @@ class DataBase {
|
|
|
134948
135002
|
}
|
|
134949
135003
|
// Method 2: Try username mapping (usernames/alias -> userPub)
|
|
134950
135004
|
try {
|
|
134951
|
-
const userPub = await
|
|
134952
|
-
.
|
|
134953
|
-
|
|
134954
|
-
|
|
135005
|
+
const userPub = await new Promise((resolve) => {
|
|
135006
|
+
this.node
|
|
135007
|
+
.get("usernames")
|
|
135008
|
+
.get(normalizedAlias)
|
|
135009
|
+
.once((data) => {
|
|
135010
|
+
resolve(data);
|
|
135011
|
+
});
|
|
135012
|
+
});
|
|
134955
135013
|
if (userPub) {
|
|
134956
135014
|
const userData = await this.getUserDataByPub(userPub);
|
|
134957
135015
|
if (userData) {
|
|
@@ -134981,7 +135039,14 @@ class DataBase {
|
|
|
134981
135039
|
}
|
|
134982
135040
|
// Method 1: Try user registry (users/userPub -> user data)
|
|
134983
135041
|
try {
|
|
134984
|
-
const userData = await
|
|
135042
|
+
const userData = await new Promise((resolve) => {
|
|
135043
|
+
this.node
|
|
135044
|
+
.get("users")
|
|
135045
|
+
.get(userPub)
|
|
135046
|
+
.once((data) => {
|
|
135047
|
+
resolve(data);
|
|
135048
|
+
});
|
|
135049
|
+
});
|
|
134985
135050
|
if (userData && userData.username) {
|
|
134986
135051
|
return {
|
|
134987
135052
|
userPub: userData.userPub || userPub,
|
|
@@ -134997,7 +135062,11 @@ class DataBase {
|
|
|
134997
135062
|
}
|
|
134998
135063
|
// Method 2: Try user's own node
|
|
134999
135064
|
try {
|
|
135000
|
-
const userNodeData = await
|
|
135065
|
+
const userNodeData = await new Promise((resolve) => {
|
|
135066
|
+
this.gun.get(userPub).once((data) => {
|
|
135067
|
+
resolve(data);
|
|
135068
|
+
});
|
|
135069
|
+
});
|
|
135001
135070
|
if (userNodeData && userNodeData.username) {
|
|
135002
135071
|
return {
|
|
135003
135072
|
userPub: userPub,
|
|
@@ -135028,7 +135097,14 @@ class DataBase {
|
|
|
135028
135097
|
if (!epub || typeof epub !== "string") {
|
|
135029
135098
|
return null;
|
|
135030
135099
|
}
|
|
135031
|
-
const userPub = await
|
|
135100
|
+
const userPub = await new Promise((resolve) => {
|
|
135101
|
+
this.node
|
|
135102
|
+
.get("epubKeys")
|
|
135103
|
+
.get(epub)
|
|
135104
|
+
.once((data) => {
|
|
135105
|
+
resolve(data);
|
|
135106
|
+
});
|
|
135107
|
+
});
|
|
135032
135108
|
return userPub || null;
|
|
135033
135109
|
}
|
|
135034
135110
|
catch (error) {
|
|
@@ -135046,7 +135122,14 @@ class DataBase {
|
|
|
135046
135122
|
if (!userPub || typeof userPub !== "string") {
|
|
135047
135123
|
return null;
|
|
135048
135124
|
}
|
|
135049
|
-
const alias = await
|
|
135125
|
+
const alias = await new Promise((resolve) => {
|
|
135126
|
+
this.node
|
|
135127
|
+
.get("userAliases")
|
|
135128
|
+
.get(userPub)
|
|
135129
|
+
.once((data) => {
|
|
135130
|
+
resolve(data);
|
|
135131
|
+
});
|
|
135132
|
+
});
|
|
135050
135133
|
return alias || null;
|
|
135051
135134
|
}
|
|
135052
135135
|
catch (error) {
|
|
@@ -135085,19 +135168,39 @@ class DataBase {
|
|
|
135085
135168
|
const timestamp = Date.now();
|
|
135086
135169
|
// Update in user registry
|
|
135087
135170
|
try {
|
|
135088
|
-
await
|
|
135089
|
-
.
|
|
135090
|
-
|
|
135091
|
-
|
|
135092
|
-
|
|
135093
|
-
|
|
135171
|
+
await new Promise((resolve, reject) => {
|
|
135172
|
+
this.node
|
|
135173
|
+
.get("users")
|
|
135174
|
+
.get(userPub)
|
|
135175
|
+
.get("lastSeen")
|
|
135176
|
+
.put(timestamp, (ack) => {
|
|
135177
|
+
if (ack && ack.err) {
|
|
135178
|
+
reject(new Error(ack.err));
|
|
135179
|
+
}
|
|
135180
|
+
else {
|
|
135181
|
+
resolve();
|
|
135182
|
+
}
|
|
135183
|
+
});
|
|
135184
|
+
});
|
|
135094
135185
|
}
|
|
135095
135186
|
catch (error) {
|
|
135096
135187
|
console.error(`Failed to update lastSeen in user registry:`, error);
|
|
135097
135188
|
}
|
|
135098
135189
|
// Update in user's own node
|
|
135099
135190
|
try {
|
|
135100
|
-
await
|
|
135191
|
+
await new Promise((resolve, reject) => {
|
|
135192
|
+
this.gun
|
|
135193
|
+
.get(userPub)
|
|
135194
|
+
.get("lastSeen")
|
|
135195
|
+
.put(timestamp, (ack) => {
|
|
135196
|
+
if (ack && ack.err) {
|
|
135197
|
+
reject(new Error(ack.err));
|
|
135198
|
+
}
|
|
135199
|
+
else {
|
|
135200
|
+
resolve();
|
|
135201
|
+
}
|
|
135202
|
+
});
|
|
135203
|
+
});
|
|
135101
135204
|
}
|
|
135102
135205
|
catch (error) {
|
|
135103
135206
|
console.error(`Failed to update lastSeen in user node:`, error);
|
|
@@ -135348,10 +135451,19 @@ class DataBase {
|
|
|
135348
135451
|
questions: JSON.stringify(securityQuestions),
|
|
135349
135452
|
hint: encryptedHint,
|
|
135350
135453
|
};
|
|
135351
|
-
const ack = await
|
|
135352
|
-
.
|
|
135353
|
-
|
|
135354
|
-
|
|
135454
|
+
const ack = await new Promise((resolve, reject) => {
|
|
135455
|
+
this.node
|
|
135456
|
+
.get(userPub)
|
|
135457
|
+
.get("security")
|
|
135458
|
+
.put(securityPayload, (ack) => {
|
|
135459
|
+
if (ack && ack.err) {
|
|
135460
|
+
reject(new Error(ack.err));
|
|
135461
|
+
}
|
|
135462
|
+
else {
|
|
135463
|
+
resolve(ack);
|
|
135464
|
+
}
|
|
135465
|
+
});
|
|
135466
|
+
});
|
|
135355
135467
|
if (ack.err) {
|
|
135356
135468
|
console.error("Error saving security data to public graph:", ack.err);
|
|
135357
135469
|
throw new Error(ack.err);
|
|
@@ -135374,15 +135486,26 @@ class DataBase {
|
|
|
135374
135486
|
try {
|
|
135375
135487
|
// Find the user's data using direct lookup
|
|
135376
135488
|
const normalizedUsername = username.trim().toLowerCase();
|
|
135377
|
-
const userPub =
|
|
135378
|
-
|
|
135489
|
+
const userPub = await new Promise((resolve) => {
|
|
135490
|
+
this.node
|
|
135491
|
+
.get("usernames")
|
|
135492
|
+
.get(normalizedUsername)
|
|
135493
|
+
.once((data) => {
|
|
135494
|
+
resolve(data);
|
|
135495
|
+
});
|
|
135496
|
+
});
|
|
135379
135497
|
if (!userPub) {
|
|
135380
135498
|
return { success: false, error: "User not found" };
|
|
135381
135499
|
}
|
|
135382
135500
|
// Access the user's security data directly from their public key node
|
|
135383
|
-
const securityData = await
|
|
135384
|
-
.
|
|
135385
|
-
|
|
135501
|
+
const securityData = await new Promise((resolve) => {
|
|
135502
|
+
this.node
|
|
135503
|
+
.get(userPub)
|
|
135504
|
+
.get("security")
|
|
135505
|
+
.once((data) => {
|
|
135506
|
+
resolve(data);
|
|
135507
|
+
});
|
|
135508
|
+
});
|
|
135386
135509
|
if (!securityData || !securityData.hint) {
|
|
135387
135510
|
return {
|
|
135388
135511
|
success: false,
|