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.
Files changed (83) hide show
  1. package/bundle.js +1 -1
  2. package/dist/adapters-base/storageAdapter.js +1 -1
  3. package/dist/adapters-base/userAdapter.js +1 -1
  4. package/dist/crdt/counterCrdt.d.ts +2 -2
  5. package/dist/crdt/listCrdt.d.ts +2 -2
  6. package/dist/crdt/mapCrdt.d.ts +2 -2
  7. package/dist/messageHandlers/handlePut.js +101 -12
  8. package/dist/messageHandlers/handlePut.js.map +1 -1
  9. package/dist/toolDbAnonSignIn.js +1 -1
  10. package/dist/toolDbCheckSignupConflicts.d.ts +7 -0
  11. package/dist/toolDbCheckSignupConflicts.js +123 -0
  12. package/dist/toolDbCheckSignupConflicts.js.map +1 -0
  13. package/dist/toolDbKeysSignIn.js +1 -1
  14. package/dist/toolDbSignIn.js +1 -1
  15. package/dist/toolDbSignUp.d.ts +10 -0
  16. package/dist/toolDbSignUp.js +83 -54
  17. package/dist/toolDbSignUp.js.map +1 -1
  18. package/dist/toolDbVerificationWrapper.js +1 -1
  19. package/dist/tooldb.d.ts +18 -0
  20. package/dist/tooldb.js +120 -32
  21. package/dist/tooldb.js.map +1 -1
  22. package/dist/types/message.d.ts +2 -2
  23. package/dist/types/tooldb.d.ts +7 -7
  24. package/dist/utils/verifyMessage.js +1 -1
  25. package/package.json +3 -3
  26. package/lib/adapters-base/networkAdapter.ts +0 -218
  27. package/lib/adapters-base/storageAdapter.ts +0 -57
  28. package/lib/adapters-base/userAdapter.ts +0 -49
  29. package/lib/crdt/baseCrdt.ts +0 -21
  30. package/lib/crdt/counterCrdt.ts +0 -112
  31. package/lib/crdt/listCrdt.ts +0 -190
  32. package/lib/crdt/mapCrdt.ts +0 -121
  33. package/lib/index.ts +0 -49
  34. package/lib/logger.ts +0 -30
  35. package/lib/messageHandlers/handleCrdtGet.ts +0 -34
  36. package/lib/messageHandlers/handleCrdtPut.ts +0 -133
  37. package/lib/messageHandlers/handleFunction.ts +0 -59
  38. package/lib/messageHandlers/handleGet.ts +0 -34
  39. package/lib/messageHandlers/handlePing.ts +0 -40
  40. package/lib/messageHandlers/handlePong.ts +0 -37
  41. package/lib/messageHandlers/handlePut.ts +0 -59
  42. package/lib/messageHandlers/handleQuery.ts +0 -30
  43. package/lib/messageHandlers/handleSubscribe.ts +0 -46
  44. package/lib/server.ts +0 -7
  45. package/lib/shared.ts +0 -5
  46. package/lib/toolDbAnonSignIn.ts +0 -5
  47. package/lib/toolDbClientOnMessage.ts +0 -79
  48. package/lib/toolDbCrdtGet.ts +0 -83
  49. package/lib/toolDbCrdtPut.ts +0 -78
  50. package/lib/toolDbFunction.ts +0 -49
  51. package/lib/toolDbGet.ts +0 -81
  52. package/lib/toolDbKeysSignIn.ts +0 -13
  53. package/lib/toolDbPut.ts +0 -84
  54. package/lib/toolDbQueryKeys.ts +0 -71
  55. package/lib/toolDbSignIn.ts +0 -37
  56. package/lib/toolDbSignUp.ts +0 -72
  57. package/lib/toolDbSubscribe.ts +0 -54
  58. package/lib/toolDbVerificationWrapper.ts +0 -55
  59. package/lib/tooldb.ts +0 -343
  60. package/lib/types/message.ts +0 -154
  61. package/lib/types/tooldb.ts +0 -140
  62. package/lib/utils/catchReturn.ts +0 -4
  63. package/lib/utils/encoding/arrayBufferToHex.ts +0 -18
  64. package/lib/utils/encoding/arrayBufferToString.ts +0 -4
  65. package/lib/utils/encoding/base64ToUint8.ts +0 -13
  66. package/lib/utils/encoding/fromBase64.ts +0 -4
  67. package/lib/utils/encoding/hexToArrayBuffer.ts +0 -13
  68. package/lib/utils/encoding/hexToString.ts +0 -8
  69. package/lib/utils/encoding/hexToUint8.ts +0 -5
  70. package/lib/utils/encoding/stringToArrayBuffer.ts +0 -4
  71. package/lib/utils/encoding/toBase64.ts +0 -4
  72. package/lib/utils/encoding/uint8ToBase64.ts +0 -11
  73. package/lib/utils/generateGroupKey.ts +0 -11
  74. package/lib/utils/getPeerSignature.ts +0 -12
  75. package/lib/utils/getTimestamp.ts +0 -3
  76. package/lib/utils/proofOfWork.ts +0 -31
  77. package/lib/utils/randomAnimal.ts +0 -77
  78. package/lib/utils/sha1.ts +0 -7
  79. package/lib/utils/sha256.ts +0 -7
  80. package/lib/utils/textRandom.ts +0 -11
  81. package/lib/utils/uniq.ts +0 -3
  82. package/lib/utils/verifyMessage.ts +0 -88
  83. 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 declare type CounterOperations = "ADD" | "SUB";
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 declare type CounterChanges = AddCounterChange | SubCounterChange;
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[];
@@ -1,5 +1,5 @@
1
1
  import { BaseCrdt } from "..";
2
- export declare type ListOperations = "INS" | "DEL";
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 declare type ListChanges<T> = InsListChange<T> | DelListChange<T>;
17
+ export type ListChanges<T> = InsListChange<T> | DelListChange<T>;
18
18
  interface ListTempCursor<T> {
19
19
  value: T;
20
20
  index: string;
@@ -1,5 +1,5 @@
1
1
  import { BaseCrdt } from "..";
2
- export declare type MapOperations = "SET" | "DEL";
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 declare type MapChanges<T> = SetMapChange<T> | DelMapChange<T>;
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
- if (parsedOldData.t < finalMessage_1.data.t) {
44
- var key = finalMessage_1.data.k;
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(finalMessage_1.data.k, JSON.stringify(finalMessage_1.data))
48
- .catch(function (e) {
140
+ .put(key, JSON.stringify(finalMessage_1.data))
141
+ .catch(function () {
49
142
  // do nothing
50
143
  });
51
144
  }
52
145
  else {
53
- var key = finalMessage_1.data.k;
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 (e) {
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 (e) {
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,iBAsDC;IAjDC,mCAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAC,KAAK;QAC5D,kEAAkE;QAClE,IAAI,KAAK,KAAK,gBAAY,CAAC,QAAQ,EAAE;YACnC,KAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1B,KAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,KAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/B,6BAA6B;YAC7B,IAAM,cAAY,yBACb,OAAO,KACV,EAAE,kCAAM,OAAO,CAAC,EAAE,UAAE,YAAY,YACjC,CAAC;YAEF,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAY,EAAE,IAAI,CAAC,CAAC;YAE3C,KAAI,CAAC,KAAK;iBACP,GAAG,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC,CAAC;iBACxB,IAAI,CAAC,UAAC,OAAO;gBACZ,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,aAAa,CAAC,CAAC,GAAG,cAAY,CAAC,IAAI,CAAC,CAAC,EAAE;oBACzC,IAAM,GAAG,GAAG,cAAY,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChC,KAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,cAAY,CAAC,IAAI,CAAC,CAAC;oBAChD,KAAI,CAAC,KAAK;yBACP,GAAG,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;yBAC3D,KAAK,CAAC,UAAC,CAAC;wBACP,aAAa;oBACf,CAAC,CAAC,CAAC;iBACN;qBAAM;oBACL,IAAM,GAAG,GAAG,cAAY,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChC,KAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBAC7C;gBACD,WAAW;gBACX,iBAAiB;gBACjB,4FAA4F;gBAC5F,OAAO;gBACP,IAAI;YACN,CAAC,CAAC;iBACD,KAAK,CAAC,UAAC,CAAC;gBACP,IAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3B,KAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAI,CAAC,KAAK;qBACP,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;qBACjD,KAAK,CAAC,UAAC,CAAC;oBACP,EAAE;gBACJ,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;SACN;aAAM;YACL,KAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;SACrD;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAtDD,4BAsDC"}
1
+ {"version":3,"file":"handlePut.js","sourceRoot":"","sources":["../../lib/messageHandlers/handlePut.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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,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>>;
@@ -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 (_a) {
45
- userRoot = "==".concat(user);
46
- return [2 /*return*/, new Promise(function (resolve, reject) {
47
- _this.getData(userRoot, false, 3000, to)
48
- .then(function (data) {
49
- if (data === null) {
50
- var account_1 = new _this.options.userAdapter(_this);
51
- account_1.encryptAccount((0, _1.sha256)(password)).then(function (userData) {
52
- var timestamp = new Date().getTime();
53
- var userDataString = "".concat(JSON.stringify(userData)).concat(account_1.getAddress()).concat(timestamp);
54
- (0, _1.proofOfWork)(userDataString, _this.options.pow)
55
- .then(function (_a) {
56
- var hash = _a.hash, nonce = _a.nonce;
57
- account_1.signData(hash).then(function (signature) {
58
- var signupMessage = {
59
- k: userRoot,
60
- a: account_1.getAddress() || "",
61
- n: nonce,
62
- t: timestamp,
63
- h: hash,
64
- s: signature,
65
- v: userData,
66
- c: null,
67
- };
68
- _this.logger("SIGNUP PUT", userRoot, signupMessage);
69
- var finalMsg = {
70
- type: "put",
71
- id: (0, _1.textRandom)(10),
72
- to: to || [],
73
- data: signupMessage,
74
- };
75
- _this.network.sendToAll(finalMsg);
76
- _this.store
77
- .put(userRoot, JSON.stringify(signupMessage))
78
- .catch(function (e) {
79
- // do nothing
80
- })
81
- .finally(function () {
82
- resolve(finalMsg);
83
- });
84
- });
85
- })
86
- .catch(reject);
87
- });
88
- }
89
- else {
90
- reject(new Error("User already exists!"));
91
- }
92
- })
93
- .catch(function () {
94
- reject(new Error("Could not fetch user"));
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
  }
@@ -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;;;;;YAEP,QAAQ,GAAG,YAAK,IAAI,CAAE,CAAC;YAC7B,sBAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;oBACjC,KAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;yBACpC,IAAI,CAAC,UAAC,IAAI;wBACT,IAAI,IAAI,KAAK,IAAI,EAAE;4BACjB,IAAM,SAAO,GAAG,IAAI,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAI,CAAC,CAAC;4BACnD,SAAO,CAAC,cAAc,CAAC,IAAA,SAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ;gCACrD,IAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;gCACvC,IAAM,cAAc,GAAG,UAAG,IAAI,CAAC,SAAS,CACtC,QAAQ,CACT,SAAG,SAAO,CAAC,UAAU,EAAE,SAAG,SAAS,CAAE,CAAC;gCAEvC,IAAA,cAAW,EAAC,cAAc,EAAE,KAAI,CAAC,OAAO,CAAC,GAAG,CAAC;qCAC1C,IAAI,CAAC,UAAC,EAAe;wCAAb,IAAI,UAAA,EAAE,KAAK,WAAA;oCAClB,SAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAC,SAAS;wCACpC,IAAM,aAAa,GAAqB;4CACtC,CAAC,EAAE,QAAQ;4CACX,CAAC,EAAE,SAAO,CAAC,UAAU,EAAE,IAAI,EAAE;4CAC7B,CAAC,EAAE,KAAK;4CACR,CAAC,EAAE,SAAS;4CACZ,CAAC,EAAE,IAAI;4CACP,CAAC,EAAE,SAAS;4CACZ,CAAC,EAAE,QAAQ;4CACX,CAAC,EAAE,IAAI;yCACR,CAAC;wCAEF,KAAI,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;wCAEnD,IAAM,QAAQ,GAAG;4CACf,IAAI,EAAE,KAAK;4CACX,EAAE,EAAE,IAAA,aAAU,EAAC,EAAE,CAAC;4CAClB,EAAE,EAAE,EAAE,IAAI,EAAE;4CACZ,IAAI,EAAE,aAAa;yCACN,CAAC;wCAEhB,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;wCACjC,KAAI,CAAC,KAAK;6CACP,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;6CAC5C,KAAK,CAAC,UAAC,CAAC;4CACP,aAAa;wCACf,CAAC,CAAC;6CACD,OAAO,CAAC;4CACP,OAAO,CAAC,QAAQ,CAAC,CAAC;wCACpB,CAAC,CAAC,CAAC;oCACP,CAAC,CAAC,CAAC;gCACL,CAAC,CAAC;qCACD,KAAK,CAAC,MAAM,CAAC,CAAC;4BACnB,CAAC,CAAC,CAAC;yBACJ;6BAAM;4BACL,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;yBAC3C;oBACH,CAAC,CAAC;yBACD,KAAK,CAAC;wBACL,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAC5C,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,EAAC;;;CACJ;AA9DD,+BA8DC"}
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]) {