tool-db 2.6.2 → 2.6.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/bundle.js +1 -1
- package/dist/adapters-base/storageAdapter.js +1 -1
- package/dist/adapters-base/userAdapter.js +1 -1
- package/dist/crdt/counterCrdt.d.ts +2 -2
- package/dist/crdt/listCrdt.d.ts +2 -2
- package/dist/crdt/mapCrdt.d.ts +2 -2
- package/dist/messageHandlers/handlePut.js +101 -12
- package/dist/messageHandlers/handlePut.js.map +1 -1
- package/dist/toolDbAnonSignIn.js +1 -1
- package/dist/toolDbCheckSignupConflicts.d.ts +7 -0
- package/dist/toolDbCheckSignupConflicts.js +123 -0
- package/dist/toolDbCheckSignupConflicts.js.map +1 -0
- package/dist/toolDbKeysSignIn.js +1 -1
- package/dist/toolDbSignIn.js +1 -1
- package/dist/toolDbSignUp.d.ts +10 -0
- package/dist/toolDbSignUp.js +83 -54
- package/dist/toolDbSignUp.js.map +1 -1
- package/dist/toolDbVerificationWrapper.js +1 -1
- package/dist/tooldb.d.ts +18 -0
- package/dist/tooldb.js +120 -32
- package/dist/tooldb.js.map +1 -1
- package/dist/types/message.d.ts +2 -2
- package/dist/types/tooldb.d.ts +7 -7
- package/dist/utils/verifyMessage.js +1 -1
- package/package.json +3 -3
- package/lib/adapters-base/networkAdapter.ts +0 -218
- package/lib/adapters-base/storageAdapter.ts +0 -57
- package/lib/adapters-base/userAdapter.ts +0 -49
- package/lib/crdt/baseCrdt.ts +0 -21
- package/lib/crdt/counterCrdt.ts +0 -112
- package/lib/crdt/listCrdt.ts +0 -190
- package/lib/crdt/mapCrdt.ts +0 -121
- package/lib/index.ts +0 -49
- package/lib/logger.ts +0 -30
- package/lib/messageHandlers/handleCrdtGet.ts +0 -34
- package/lib/messageHandlers/handleCrdtPut.ts +0 -133
- package/lib/messageHandlers/handleFunction.ts +0 -59
- package/lib/messageHandlers/handleGet.ts +0 -34
- package/lib/messageHandlers/handlePing.ts +0 -40
- package/lib/messageHandlers/handlePong.ts +0 -37
- package/lib/messageHandlers/handlePut.ts +0 -59
- package/lib/messageHandlers/handleQuery.ts +0 -30
- package/lib/messageHandlers/handleSubscribe.ts +0 -46
- package/lib/server.ts +0 -7
- package/lib/shared.ts +0 -5
- package/lib/toolDbAnonSignIn.ts +0 -5
- package/lib/toolDbClientOnMessage.ts +0 -79
- package/lib/toolDbCrdtGet.ts +0 -83
- package/lib/toolDbCrdtPut.ts +0 -78
- package/lib/toolDbFunction.ts +0 -49
- package/lib/toolDbGet.ts +0 -81
- package/lib/toolDbKeysSignIn.ts +0 -13
- package/lib/toolDbPut.ts +0 -84
- package/lib/toolDbQueryKeys.ts +0 -71
- package/lib/toolDbSignIn.ts +0 -37
- package/lib/toolDbSignUp.ts +0 -72
- package/lib/toolDbSubscribe.ts +0 -54
- package/lib/toolDbVerificationWrapper.ts +0 -55
- package/lib/tooldb.ts +0 -343
- package/lib/types/message.ts +0 -154
- package/lib/types/tooldb.ts +0 -140
- package/lib/utils/catchReturn.ts +0 -4
- package/lib/utils/encoding/arrayBufferToHex.ts +0 -18
- package/lib/utils/encoding/arrayBufferToString.ts +0 -4
- package/lib/utils/encoding/base64ToUint8.ts +0 -13
- package/lib/utils/encoding/fromBase64.ts +0 -4
- package/lib/utils/encoding/hexToArrayBuffer.ts +0 -13
- package/lib/utils/encoding/hexToString.ts +0 -8
- package/lib/utils/encoding/hexToUint8.ts +0 -5
- package/lib/utils/encoding/stringToArrayBuffer.ts +0 -4
- package/lib/utils/encoding/toBase64.ts +0 -4
- package/lib/utils/encoding/uint8ToBase64.ts +0 -11
- package/lib/utils/generateGroupKey.ts +0 -11
- package/lib/utils/getPeerSignature.ts +0 -12
- package/lib/utils/getTimestamp.ts +0 -3
- package/lib/utils/proofOfWork.ts +0 -31
- package/lib/utils/randomAnimal.ts +0 -77
- package/lib/utils/sha1.ts +0 -7
- package/lib/utils/sha256.ts +0 -7
- package/lib/utils/textRandom.ts +0 -11
- package/lib/utils/uniq.ts +0 -3
- package/lib/utils/verifyMessage.ts +0 -88
- package/lib/utils/verifyPeer.ts +0 -15
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCrdt } from "..";
|
|
2
|
-
export
|
|
2
|
+
export type CounterOperations = "ADD" | "SUB";
|
|
3
3
|
export interface ChangeCounterBase {
|
|
4
4
|
t: CounterOperations;
|
|
5
5
|
v: number;
|
|
@@ -12,7 +12,7 @@ export interface AddCounterChange extends ChangeCounterBase {
|
|
|
12
12
|
export interface SubCounterChange extends ChangeCounterBase {
|
|
13
13
|
t: "SUB";
|
|
14
14
|
}
|
|
15
|
-
export
|
|
15
|
+
export type CounterChanges = AddCounterChange | SubCounterChange;
|
|
16
16
|
export declare class CounterCrdt<T> extends BaseCrdt<number, CounterChanges, number> {
|
|
17
17
|
type: string;
|
|
18
18
|
_changes: CounterChanges[];
|
package/dist/crdt/listCrdt.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCrdt } from "..";
|
|
2
|
-
export
|
|
2
|
+
export type ListOperations = "INS" | "DEL";
|
|
3
3
|
export interface ChangeListBase<T> {
|
|
4
4
|
t: ListOperations;
|
|
5
5
|
i: string;
|
|
@@ -14,7 +14,7 @@ export interface DelListChange<T> extends ChangeListBase<T> {
|
|
|
14
14
|
t: "DEL";
|
|
15
15
|
v: string;
|
|
16
16
|
}
|
|
17
|
-
export
|
|
17
|
+
export type ListChanges<T> = InsListChange<T> | DelListChange<T>;
|
|
18
18
|
interface ListTempCursor<T> {
|
|
19
19
|
value: T;
|
|
20
20
|
index: string;
|
package/dist/crdt/mapCrdt.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCrdt } from "..";
|
|
2
|
-
export
|
|
2
|
+
export type MapOperations = "SET" | "DEL";
|
|
3
3
|
export interface ChangeMapBase<T> {
|
|
4
4
|
t: MapOperations;
|
|
5
5
|
a: string;
|
|
@@ -13,7 +13,7 @@ export interface SetMapChange<T> extends ChangeMapBase<T> {
|
|
|
13
13
|
export interface DelMapChange<T> extends ChangeMapBase<T> {
|
|
14
14
|
t: "DEL";
|
|
15
15
|
}
|
|
16
|
-
export
|
|
16
|
+
export type MapChanges<T> = SetMapChange<T> | DelMapChange<T>;
|
|
17
17
|
export declare class MapCrdt<T> extends BaseCrdt<T, MapChanges<T>, Record<string, T>> {
|
|
18
18
|
type: string;
|
|
19
19
|
private _changes;
|
|
@@ -39,32 +39,121 @@ function handlePut(message, remotePeerId) {
|
|
|
39
39
|
_this.store
|
|
40
40
|
.get(finalMessage_1.data.k)
|
|
41
41
|
.then(function (oldData) {
|
|
42
|
+
var _a, _b;
|
|
42
43
|
var parsedOldData = JSON.parse(oldData);
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
var key = finalMessage_1.data.k;
|
|
45
|
+
// Check for username conflicts (same key, different address)
|
|
46
|
+
var isUsernameKey = key.startsWith("==");
|
|
47
|
+
if (isUsernameKey && parsedOldData.a !== finalMessage_1.data.a) {
|
|
48
|
+
// Username conflict detected! Compare timestamps
|
|
49
|
+
if (parsedOldData.t < finalMessage_1.data.t) {
|
|
50
|
+
// Local data is older, it wins - keep local data
|
|
51
|
+
_this.logger("Username conflict detected: local signup is older, rejecting incoming data for ".concat(key));
|
|
52
|
+
_this.emit("username-conflict-resolved", {
|
|
53
|
+
username: key,
|
|
54
|
+
winner: "local",
|
|
55
|
+
localTimestamp: parsedOldData.t,
|
|
56
|
+
remoteTimestamp: finalMessage_1.data.t,
|
|
57
|
+
localAddress: parsedOldData.a,
|
|
58
|
+
remoteAddress: finalMessage_1.data.a,
|
|
59
|
+
});
|
|
60
|
+
_this.triggerKeyListener(key, parsedOldData);
|
|
61
|
+
}
|
|
62
|
+
else if (parsedOldData.t > finalMessage_1.data.t) {
|
|
63
|
+
// Incoming data is older, it wins - replace local data
|
|
64
|
+
_this.logger("Username conflict detected: remote signup is older, accepting incoming data for ".concat(key));
|
|
65
|
+
// Check if the losing address is the current user's address
|
|
66
|
+
var currentUserAddress = (_a = _this.userAccount) === null || _a === void 0 ? void 0 : _a.getAddress();
|
|
67
|
+
if (currentUserAddress && currentUserAddress === parsedOldData.a) {
|
|
68
|
+
// The current user lost the username conflict!
|
|
69
|
+
_this.emit("current-user-lost-username", {
|
|
70
|
+
username: key.replace("==", ""),
|
|
71
|
+
timestamp: parsedOldData.t,
|
|
72
|
+
winnerTimestamp: finalMessage_1.data.t,
|
|
73
|
+
winnerAddress: finalMessage_1.data.a,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
_this.emit("username-conflict-resolved", {
|
|
77
|
+
username: key,
|
|
78
|
+
winner: "remote",
|
|
79
|
+
localTimestamp: parsedOldData.t,
|
|
80
|
+
remoteTimestamp: finalMessage_1.data.t,
|
|
81
|
+
localAddress: parsedOldData.a,
|
|
82
|
+
remoteAddress: finalMessage_1.data.a,
|
|
83
|
+
});
|
|
84
|
+
_this.triggerKeyListener(key, finalMessage_1.data);
|
|
85
|
+
_this.store
|
|
86
|
+
.put(key, JSON.stringify(finalMessage_1.data))
|
|
87
|
+
.catch(function () {
|
|
88
|
+
// do nothing
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Same timestamp - use address comparison as tiebreaker (alphabetically first wins)
|
|
93
|
+
if (parsedOldData.a < finalMessage_1.data.a) {
|
|
94
|
+
// Local address wins (alphabetically first)
|
|
95
|
+
_this.logger("Username conflict with same timestamp: local address wins for ".concat(key));
|
|
96
|
+
_this.emit("username-conflict-resolved", {
|
|
97
|
+
username: key,
|
|
98
|
+
winner: "local",
|
|
99
|
+
localTimestamp: parsedOldData.t,
|
|
100
|
+
remoteTimestamp: finalMessage_1.data.t,
|
|
101
|
+
localAddress: parsedOldData.a,
|
|
102
|
+
remoteAddress: finalMessage_1.data.a,
|
|
103
|
+
});
|
|
104
|
+
_this.triggerKeyListener(key, parsedOldData);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Remote address wins
|
|
108
|
+
_this.logger("Username conflict with same timestamp: remote address wins for ".concat(key));
|
|
109
|
+
// Check if current user lost
|
|
110
|
+
var currentUserAddress = (_b = _this.userAccount) === null || _b === void 0 ? void 0 : _b.getAddress();
|
|
111
|
+
if (currentUserAddress && currentUserAddress === parsedOldData.a) {
|
|
112
|
+
_this.emit("current-user-lost-username", {
|
|
113
|
+
username: key.replace("==", ""),
|
|
114
|
+
timestamp: parsedOldData.t,
|
|
115
|
+
winnerTimestamp: finalMessage_1.data.t,
|
|
116
|
+
winnerAddress: finalMessage_1.data.a,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
_this.emit("username-conflict-resolved", {
|
|
120
|
+
username: key,
|
|
121
|
+
winner: "remote",
|
|
122
|
+
localTimestamp: parsedOldData.t,
|
|
123
|
+
remoteTimestamp: finalMessage_1.data.t,
|
|
124
|
+
localAddress: parsedOldData.a,
|
|
125
|
+
remoteAddress: finalMessage_1.data.a,
|
|
126
|
+
});
|
|
127
|
+
_this.triggerKeyListener(key, finalMessage_1.data);
|
|
128
|
+
_this.store
|
|
129
|
+
.put(key, JSON.stringify(finalMessage_1.data))
|
|
130
|
+
.catch(function () {
|
|
131
|
+
// do nothing
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else if (parsedOldData.t < finalMessage_1.data.t) {
|
|
137
|
+
// Normal update: incoming data is newer
|
|
45
138
|
_this.triggerKeyListener(key, finalMessage_1.data);
|
|
46
139
|
_this.store
|
|
47
|
-
.put(
|
|
48
|
-
.catch(function (
|
|
140
|
+
.put(key, JSON.stringify(finalMessage_1.data))
|
|
141
|
+
.catch(function () {
|
|
49
142
|
// do nothing
|
|
50
143
|
});
|
|
51
144
|
}
|
|
52
145
|
else {
|
|
53
|
-
|
|
146
|
+
// Normal update: local data is newer or same
|
|
54
147
|
_this.triggerKeyListener(key, parsedOldData);
|
|
55
148
|
}
|
|
56
|
-
// } else {
|
|
57
|
-
// this.logger(
|
|
58
|
-
// `${message.k} has old data, but its newer. old ${parsedOldData.t} < new ${message.t}`
|
|
59
|
-
// );
|
|
60
|
-
// }
|
|
61
149
|
})
|
|
62
|
-
.catch(function (
|
|
150
|
+
.catch(function () {
|
|
151
|
+
// No existing data - just store the incoming data
|
|
63
152
|
var key = message.data.k;
|
|
64
153
|
_this.triggerKeyListener(key, message.data);
|
|
65
154
|
_this.store
|
|
66
155
|
.put(message.data.k, JSON.stringify(message.data))
|
|
67
|
-
.catch(function (
|
|
156
|
+
.catch(function () {
|
|
68
157
|
//
|
|
69
158
|
});
|
|
70
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePut.js","sourceRoot":"","sources":["../../lib/messageHandlers/handlePut.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAAsD;AAEtD,2FAAqE;AAErE,SAAwB,SAAS,CAE/B,OAAmB,EACnB,YAAoB;IAHtB,
|
|
1
|
+
{"version":3,"file":"handlePut.js","sourceRoot":"","sources":["../../lib/messageHandlers/handlePut.ts"],"names":[],"mappings":"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"}
|
package/dist/toolDbAnonSignIn.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ToolDb, VerificationData } from ".";
|
|
2
|
+
/**
|
|
3
|
+
* Helper to check for signup conflicts with peers.
|
|
4
|
+
* This runs asynchronously after local signup completes and doesn't block the signup process.
|
|
5
|
+
* Uses timestamps to determine which signup wins in case of conflicts.
|
|
6
|
+
*/
|
|
7
|
+
export default function toolDbCheckSignupConflicts(this: ToolDb, userRoot: string, localSignup: VerificationData<any>, to?: string[]): Promise<void>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var _1 = require(".");
|
|
40
|
+
/**
|
|
41
|
+
* Helper to check for signup conflicts with peers.
|
|
42
|
+
* This runs asynchronously after local signup completes and doesn't block the signup process.
|
|
43
|
+
* Uses timestamps to determine which signup wins in case of conflicts.
|
|
44
|
+
*/
|
|
45
|
+
function toolDbCheckSignupConflicts(userRoot, localSignup, to) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
47
|
+
var msgId;
|
|
48
|
+
var _this = this;
|
|
49
|
+
return __generator(this, function (_a) {
|
|
50
|
+
switch (_a.label) {
|
|
51
|
+
case 0:
|
|
52
|
+
// Wait a bit for network responses to come in
|
|
53
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 500); })];
|
|
54
|
+
case 1:
|
|
55
|
+
// Wait a bit for network responses to come in
|
|
56
|
+
_a.sent();
|
|
57
|
+
// Check if we're connected to any peers
|
|
58
|
+
if (!this.isConnected) {
|
|
59
|
+
this.logger("No peers connected, skipping conflict check");
|
|
60
|
+
return [2 /*return*/];
|
|
61
|
+
}
|
|
62
|
+
msgId = (0, _1.textRandom)(10);
|
|
63
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
64
|
+
var timeout = setTimeout(function () {
|
|
65
|
+
_this.removeIdListener(msgId);
|
|
66
|
+
// No response means no conflict found
|
|
67
|
+
resolve();
|
|
68
|
+
}, 2000);
|
|
69
|
+
_this.addIdListener(msgId, function (msg) {
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
_this.removeIdListener(msgId);
|
|
72
|
+
if (msg.type === "put" && msg.data) {
|
|
73
|
+
var peerData = msg.data;
|
|
74
|
+
// Check if there's a conflict (same key, different address)
|
|
75
|
+
if (peerData.a !== localSignup.a) {
|
|
76
|
+
// Conflict detected! Compare timestamps
|
|
77
|
+
if (peerData.t < localSignup.t) {
|
|
78
|
+
// Peer's signup is older, they win
|
|
79
|
+
reject(new Error("Username conflict: peer registered first at ".concat(new Date(peerData.t).toISOString())));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
else if (peerData.t > localSignup.t) {
|
|
83
|
+
// Our signup is older, we win
|
|
84
|
+
_this.logger("Our signup is older, keeping our version");
|
|
85
|
+
resolve();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Same timestamp - use address comparison as tiebreaker
|
|
90
|
+
if (localSignup.a < peerData.a) {
|
|
91
|
+
// Our address is alphabetically first, we win
|
|
92
|
+
_this.logger("Same timestamp, our address wins alphabetically");
|
|
93
|
+
resolve();
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Their address wins
|
|
97
|
+
reject(new Error("Username conflict: peer's address wins tiebreaker"));
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Same address, no conflict
|
|
103
|
+
resolve();
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// No data returned means no conflict
|
|
107
|
+
resolve();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// Send get request to check for existing registrations
|
|
111
|
+
_this.network.sendToAll({
|
|
112
|
+
type: "get",
|
|
113
|
+
to: to || [],
|
|
114
|
+
key: userRoot,
|
|
115
|
+
id: msgId,
|
|
116
|
+
});
|
|
117
|
+
})];
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
exports.default = toolDbCheckSignupConflicts;
|
|
123
|
+
//# sourceMappingURL=toolDbCheckSignupConflicts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolDbCheckSignupConflicts.js","sourceRoot":"","sources":["../lib/toolDbCheckSignupConflicts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sBAAyD;AAEzD;;;;GAIG;AACH,SAA8B,0BAA0B,CAEtD,QAAgB,EAChB,WAAkC,EAClC,EAAa;;;;;;;gBAEb,8CAA8C;gBAC9C,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EAAxB,CAAwB,CAAC,EAAA;;oBADxD,8CAA8C;oBAC9C,SAAwD,CAAC;oBAEzD,wCAAwC;oBACxC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;wBACrB,IAAI,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC;wBAC3D,sBAAO;qBACR;oBAEK,KAAK,GAAG,IAAA,aAAU,EAAC,EAAE,CAAC,CAAC;oBAE7B,sBAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;4BACjC,IAAM,OAAO,GAAG,UAAU,CAAC;gCACzB,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gCAC7B,sCAAsC;gCACtC,OAAO,EAAE,CAAC;4BACZ,CAAC,EAAE,IAAI,CAAC,CAAC;4BAET,KAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAC,GAAG;gCAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;gCACtB,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gCAE7B,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE;oCAClC,IAAM,QAAQ,GAAG,GAAG,CAAC,IAA6B,CAAC;oCAEnD,4DAA4D;oCAC5D,IAAI,QAAQ,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,EAAE;wCAChC,wCAAwC;wCACxC,IAAI,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE;4CAC9B,mCAAmC;4CACnC,MAAM,CACJ,IAAI,KAAK,CACP,sDAA+C,IAAI,IAAI,CACrD,QAAQ,CAAC,CAAC,CACX,CAAC,WAAW,EAAE,CAAE,CAClB,CACF,CAAC;4CACF,OAAO;yCACR;6CAAM,IAAI,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE;4CACrC,8BAA8B;4CAC9B,KAAI,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC;4CACxD,OAAO,EAAE,CAAC;4CACV,OAAO;yCACR;6CAAM;4CACL,wDAAwD;4CACxD,IAAI,WAAW,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE;gDAC9B,8CAA8C;gDAC9C,KAAI,CAAC,MAAM,CACT,iDAAiD,CAClD,CAAC;gDACF,OAAO,EAAE,CAAC;6CACX;iDAAM;gDACL,qBAAqB;gDACrB,MAAM,CACJ,IAAI,KAAK,CACP,mDAAmD,CACpD,CACF,CAAC;6CACH;4CACD,OAAO;yCACR;qCACF;oCACD,4BAA4B;oCAC5B,OAAO,EAAE,CAAC;iCACX;qCAAM;oCACL,qCAAqC;oCACrC,OAAO,EAAE,CAAC;iCACX;4BACH,CAAC,CAAC,CAAC;4BAEH,uDAAuD;4BACvD,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC;gCACrB,IAAI,EAAE,KAAK;gCACX,EAAE,EAAE,EAAE,IAAI,EAAE;gCACZ,GAAG,EAAE,QAAQ;gCACb,EAAE,EAAE,KAAK;6BACV,CAAC,CAAC;wBACL,CAAC,CAAC,EAAC;;;;CACJ;AApFD,6CAoFC"}
|
package/dist/toolDbKeysSignIn.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
package/dist/toolDbSignIn.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
package/dist/toolDbSignUp.d.ts
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
import { ToolDb, PutMessage } from ".";
|
|
2
|
+
/**
|
|
3
|
+
* Local-first signup that doesn't depend on peer availability.
|
|
4
|
+
* Checks local storage immediately, then asynchronously checks peers for conflicts.
|
|
5
|
+
* Uses timestamps to resolve conflicts when duplicate usernames are detected.
|
|
6
|
+
*
|
|
7
|
+
* @param user Username to register
|
|
8
|
+
* @param password Password to encrypt the account
|
|
9
|
+
* @param to Optional array of peer IDs to send to
|
|
10
|
+
* @returns Promise that resolves with the PutMessage on success
|
|
11
|
+
*/
|
|
2
12
|
export default function toolDbSignUp(this: ToolDb, user: string, password: string, to?: string[]): Promise<PutMessage<any>>;
|
package/dist/toolDbSignUp.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
|
@@ -37,63 +37,92 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
var _1 = require(".");
|
|
40
|
+
/**
|
|
41
|
+
* Local-first signup that doesn't depend on peer availability.
|
|
42
|
+
* Checks local storage immediately, then asynchronously checks peers for conflicts.
|
|
43
|
+
* Uses timestamps to resolve conflicts when duplicate usernames are detected.
|
|
44
|
+
*
|
|
45
|
+
* @param user Username to register
|
|
46
|
+
* @param password Password to encrypt the account
|
|
47
|
+
* @param to Optional array of peer IDs to send to
|
|
48
|
+
* @returns Promise that resolves with the PutMessage on success
|
|
49
|
+
*/
|
|
40
50
|
function toolDbSignUp(user, password, to) {
|
|
41
51
|
return __awaiter(this, void 0, void 0, function () {
|
|
42
|
-
var userRoot;
|
|
52
|
+
var userRoot, localData, stored, _e_1, account, userData, timestamp, userDataString, _a, hash, nonce, signature, signupMessage, finalMsg;
|
|
43
53
|
var _this = this;
|
|
44
|
-
return __generator(this, function (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
54
|
+
return __generator(this, function (_b) {
|
|
55
|
+
switch (_b.label) {
|
|
56
|
+
case 0:
|
|
57
|
+
userRoot = "==".concat(user);
|
|
58
|
+
localData = null;
|
|
59
|
+
_b.label = 1;
|
|
60
|
+
case 1:
|
|
61
|
+
_b.trys.push([1, 3, , 4]);
|
|
62
|
+
return [4 /*yield*/, this.store.get(userRoot)];
|
|
63
|
+
case 2:
|
|
64
|
+
stored = _b.sent();
|
|
65
|
+
localData = JSON.parse(stored);
|
|
66
|
+
return [3 /*break*/, 4];
|
|
67
|
+
case 3:
|
|
68
|
+
_e_1 = _b.sent();
|
|
69
|
+
// No local data found, which is expected for new signup
|
|
70
|
+
localData = null;
|
|
71
|
+
return [3 /*break*/, 4];
|
|
72
|
+
case 4:
|
|
73
|
+
// Step 2: If user exists locally, reject immediately
|
|
74
|
+
if (localData !== null) {
|
|
75
|
+
throw new Error("User already exists locally!");
|
|
76
|
+
}
|
|
77
|
+
account = new this.options.userAdapter(this);
|
|
78
|
+
return [4 /*yield*/, account.encryptAccount((0, _1.sha256)(password))];
|
|
79
|
+
case 5:
|
|
80
|
+
userData = _b.sent();
|
|
81
|
+
timestamp = new Date().getTime();
|
|
82
|
+
userDataString = "".concat(JSON.stringify(userData)).concat(account.getAddress()).concat(timestamp);
|
|
83
|
+
return [4 /*yield*/, (0, _1.proofOfWork)(userDataString, this.options.pow)];
|
|
84
|
+
case 6:
|
|
85
|
+
_a = _b.sent(), hash = _a.hash, nonce = _a.nonce;
|
|
86
|
+
return [4 /*yield*/, account.signData(hash)];
|
|
87
|
+
case 7:
|
|
88
|
+
signature = _b.sent();
|
|
89
|
+
signupMessage = {
|
|
90
|
+
k: userRoot,
|
|
91
|
+
a: account.getAddress() || "",
|
|
92
|
+
n: nonce,
|
|
93
|
+
t: timestamp,
|
|
94
|
+
h: hash,
|
|
95
|
+
s: signature,
|
|
96
|
+
v: userData,
|
|
97
|
+
c: null,
|
|
98
|
+
};
|
|
99
|
+
this.logger("SIGNUP PUT", userRoot, signupMessage);
|
|
100
|
+
finalMsg = {
|
|
101
|
+
type: "put",
|
|
102
|
+
id: (0, _1.textRandom)(10),
|
|
103
|
+
to: to || [],
|
|
104
|
+
data: signupMessage,
|
|
105
|
+
};
|
|
106
|
+
// Step 4: Store locally first (local-first approach)
|
|
107
|
+
return [4 /*yield*/, this.store.put(userRoot, JSON.stringify(signupMessage))];
|
|
108
|
+
case 8:
|
|
109
|
+
// Step 4: Store locally first (local-first approach)
|
|
110
|
+
_b.sent();
|
|
111
|
+
// Step 5: Broadcast to network (non-blocking)
|
|
112
|
+
this.network.sendToAll(finalMsg);
|
|
113
|
+
// Step 6: Asynchronously check peers for conflicts (don't block signup)
|
|
114
|
+
// This runs in the background and emits events if conflicts are found
|
|
115
|
+
this._checkSignupConflicts(userRoot, signupMessage, to).catch(function (err) {
|
|
116
|
+
_this.logger("Signup conflict check warning:", err.message);
|
|
117
|
+
// Emit event for conflict detection - UI can react to this
|
|
118
|
+
_this.emit("signup-conflict-detected", {
|
|
119
|
+
username: user,
|
|
120
|
+
localTimestamp: timestamp,
|
|
121
|
+
error: err.message,
|
|
122
|
+
});
|
|
95
123
|
});
|
|
96
|
-
|
|
124
|
+
return [2 /*return*/, finalMsg];
|
|
125
|
+
}
|
|
97
126
|
});
|
|
98
127
|
});
|
|
99
128
|
}
|
package/dist/toolDbSignUp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolDbSignUp.js","sourceRoot":"","sources":["../lib/toolDbSignUp.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sBAOW;AAEX,SAA8B,YAAY,CAExC,IAAY,EACZ,QAAgB,EAChB,EAAa
|
|
1
|
+
{"version":3,"file":"toolDbSignUp.js","sourceRoot":"","sources":["../lib/toolDbSignUp.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sBAOW;AAEX;;;;;;;;;GASG;AACH,SAA8B,YAAY,CAExC,IAAY,EACZ,QAAgB,EAChB,EAAa;;;;;;;oBAEP,QAAQ,GAAG,YAAK,IAAI,CAAE,CAAC;oBAGzB,SAAS,GAAiC,IAAI,CAAC;;;;oBAElC,qBAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAA;;oBAAvC,MAAM,GAAG,SAA8B;oBAC7C,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;;;oBAE/B,wDAAwD;oBACxD,SAAS,GAAG,IAAI,CAAC;;;oBAGnB,qDAAqD;oBACrD,IAAI,SAAS,KAAK,IAAI,EAAE;wBACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBAIK,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAElC,qBAAM,OAAO,CAAC,cAAc,CAAC,IAAA,SAAM,EAAC,QAAQ,CAAC,CAAC,EAAA;;oBAAzD,QAAQ,GAAG,SAA8C;oBACzD,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACjC,cAAc,GAAG,UAAG,IAAI,CAAC,SAAS,CACtC,QAAQ,CACT,SAAG,OAAO,CAAC,UAAU,EAAE,SAAG,SAAS,CAAE,CAAC;oBAGf,qBAAM,IAAA,cAAW,EAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAA;;oBAArE,KAAkB,SAAmD,EAAnE,IAAI,UAAA,EAAE,KAAK,WAAA;oBACD,qBAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAA;;oBAAxC,SAAS,GAAG,SAA4B;oBAExC,aAAa,GAAqB;wBACtC,CAAC,EAAE,QAAQ;wBACX,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE;wBAC7B,CAAC,EAAE,KAAK;wBACR,CAAC,EAAE,SAAS;wBACZ,CAAC,EAAE,IAAI;wBACP,CAAC,EAAE,SAAS;wBACZ,CAAC,EAAE,QAAQ;wBACX,CAAC,EAAE,IAAI;qBACR,CAAC;oBAEF,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;oBAE7C,QAAQ,GAAG;wBACf,IAAI,EAAE,KAAK;wBACX,EAAE,EAAE,IAAA,aAAU,EAAC,EAAE,CAAC;wBAClB,EAAE,EAAE,EAAE,IAAI,EAAE;wBACZ,IAAI,EAAE,aAAa;qBACN,CAAC;oBAEhB,qDAAqD;oBACrD,qBAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAA;;oBAD7D,qDAAqD;oBACrD,SAA6D,CAAC;oBAE9D,8CAA8C;oBAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAEjC,wEAAwE;oBACxE,sEAAsE;oBACtE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAC,GAAG;wBAChE,KAAI,CAAC,MAAM,CAAC,gCAAgC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC3D,2DAA2D;wBAC3D,KAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;4BACpC,QAAQ,EAAE,IAAI;4BACd,cAAc,EAAE,SAAS;4BACzB,KAAK,EAAE,GAAG,CAAC,OAAO;yBACnB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBAEH,sBAAO,QAAQ,EAAC;;;;CACjB;AA5ED,+BA4EC"}
|
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|