@peerbit/react 1.1.10 → 1.1.11
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockstorage.d.ts","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"AAqBA,qBAAa,SAAS;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAEhB,EACX,QAAiB,EACjB,OAA0B,EAC1B,OAA0B,EAC1B,OAAc,EACd,YAA+B,GAC/B;;;;;;KAAK;IAUN,IAAI,CACH,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,OAAO,EAC1B,OAAO,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE,GACzC,OAAO,CAAC;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"lockstorage.d.ts","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"AAqBA,qBAAa,SAAS;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAEhB,EACX,QAAiB,EACjB,OAA0B,EAC1B,OAA0B,EAC1B,OAAc,EACd,YAA+B,GAC/B;;;;;;KAAK;IAUN,IAAI,CACH,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,OAAO,EAC1B,OAAO,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE,GACzC,OAAO,CAAC;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IA4JF,QAAQ,CAAC,GAAG,EAAE,MAAM;IAMpB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM9C,OAAO,CAAC,GAAG,EAAE,MAAM;IAcnB;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,OAAO;IAiD3D;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAmBxC"}
|
package/dist/src/lockstorage.js
CHANGED
|
@@ -41,7 +41,43 @@ export class FastMutex {
|
|
|
41
41
|
let restartCount = 0;
|
|
42
42
|
let contentionCount = 0;
|
|
43
43
|
let locksLost = 0;
|
|
44
|
+
let settled = false;
|
|
45
|
+
const pendingRetries = new Set();
|
|
46
|
+
const clearPendingRetries = () => {
|
|
47
|
+
for (const timer of pendingRetries) {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
pendingRetries.clear();
|
|
51
|
+
};
|
|
52
|
+
const resolveOnce = (value) => {
|
|
53
|
+
if (settled)
|
|
54
|
+
return;
|
|
55
|
+
settled = true;
|
|
56
|
+
clearPendingRetries();
|
|
57
|
+
resolve(value);
|
|
58
|
+
};
|
|
59
|
+
const rejectOnce = (error) => {
|
|
60
|
+
if (settled)
|
|
61
|
+
return;
|
|
62
|
+
settled = true;
|
|
63
|
+
clearPendingRetries();
|
|
64
|
+
reject(error);
|
|
65
|
+
};
|
|
66
|
+
const scheduleRetry = (fn, ms) => {
|
|
67
|
+
if (settled)
|
|
68
|
+
return;
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
pendingRetries.delete(timer);
|
|
71
|
+
if (!settled) {
|
|
72
|
+
fn();
|
|
73
|
+
}
|
|
74
|
+
}, ms);
|
|
75
|
+
pendingRetries.add(timer);
|
|
76
|
+
};
|
|
44
77
|
const acquireLock = (key) => {
|
|
78
|
+
if (settled) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
45
81
|
// If the option is set and the same client already holds both keys,
|
|
46
82
|
// update the expiry and resolve immediately.
|
|
47
83
|
if (options?.replaceIfSameClient) {
|
|
@@ -52,7 +88,7 @@ export class FastMutex {
|
|
|
52
88
|
this.setItem(x, this.clientId, keepLocked);
|
|
53
89
|
this.setItem(y, this.clientId, keepLocked);
|
|
54
90
|
debug('FastMutex client "%s" replaced its own lock on "%s".', this.clientId, key);
|
|
55
|
-
return
|
|
91
|
+
return resolveOnce({
|
|
56
92
|
restartCount,
|
|
57
93
|
contentionCount,
|
|
58
94
|
locksLost,
|
|
@@ -61,12 +97,12 @@ export class FastMutex {
|
|
|
61
97
|
}
|
|
62
98
|
// Check for overall retries/timeouts.
|
|
63
99
|
if (restartCount > 1000 || contentionCount > 1000 || locksLost > 1000) {
|
|
64
|
-
return
|
|
100
|
+
return rejectOnce("Failed to resolve lock");
|
|
65
101
|
}
|
|
66
102
|
const elapsedTime = Date.now() - acquireStart;
|
|
67
103
|
if (elapsedTime >= this.timeout) {
|
|
68
104
|
debug('Lock on "%s" could not be acquired within %sms by FastMutex client "%s"', key, this.timeout, this.clientId);
|
|
69
|
-
return
|
|
105
|
+
return rejectOnce(new Error(`Lock could not be acquired within ${this.timeout}ms`));
|
|
70
106
|
}
|
|
71
107
|
// First, set key X.
|
|
72
108
|
this.setItem(x, this.clientId, keepLocked);
|
|
@@ -75,7 +111,7 @@ export class FastMutex {
|
|
|
75
111
|
if (lsY) {
|
|
76
112
|
debug("Lock exists on Y (%s), restarting...", lsY);
|
|
77
113
|
restartCount++;
|
|
78
|
-
|
|
114
|
+
scheduleRetry(() => acquireLock(key), 10);
|
|
79
115
|
return;
|
|
80
116
|
}
|
|
81
117
|
// Request the inner lock by setting Y.
|
|
@@ -85,11 +121,11 @@ export class FastMutex {
|
|
|
85
121
|
if (lsX !== this.clientId) {
|
|
86
122
|
contentionCount++;
|
|
87
123
|
debug('Lock contention detected. X="%s"', lsX);
|
|
88
|
-
|
|
124
|
+
scheduleRetry(() => {
|
|
89
125
|
lsY = this.getItem(y);
|
|
90
126
|
if (lsY === this.clientId) {
|
|
91
127
|
debug('FastMutex client "%s" won the lock contention on "%s"', this.clientId, key);
|
|
92
|
-
|
|
128
|
+
resolveOnce({
|
|
93
129
|
restartCount,
|
|
94
130
|
contentionCount,
|
|
95
131
|
locksLost,
|
|
@@ -99,14 +135,14 @@ export class FastMutex {
|
|
|
99
135
|
restartCount++;
|
|
100
136
|
locksLost++;
|
|
101
137
|
debug('FastMutex client "%s" lost the lock contention on "%s" to another process (%s). Restarting...', this.clientId, key, lsY);
|
|
102
|
-
|
|
138
|
+
scheduleRetry(() => acquireLock(key), 10);
|
|
103
139
|
}
|
|
104
140
|
}, 50);
|
|
105
141
|
return;
|
|
106
142
|
}
|
|
107
143
|
// No contention: lock is acquired.
|
|
108
144
|
debug('FastMutex client "%s" acquired a lock on "%s" with no contention', this.clientId, key);
|
|
109
|
-
|
|
145
|
+
resolveOnce({ restartCount, contentionCount, locksLost });
|
|
110
146
|
};
|
|
111
147
|
acquireLock(key);
|
|
112
148
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;EAeE;AACF,OAAO,OAAO,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEnC,MAAM,OAAO,SAAS;IACrB,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,YAAY,CAAM;IAClB,SAAS,CAAmB;IAE5B,YAAY,EACX,QAAQ,GAAG,IAAI,EAAE,EACjB,OAAO,GAAG,gBAAgB,EAC1B,OAAO,GAAG,gBAAgB,EAC1B,OAAO,GAAG,IAAI,EACd,YAAY,GAAG,SAAgB,MAC5B,EAAE;QACL,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAE3B,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;IACzD,CAAC;IAED,IAAI,CACH,GAAW,EACX,UAA0B,EAC1B,OAA2C;QAM3C,KAAK,CACJ,kEAAkE,EAClE,GAAG,EACH,IAAI,CAAC,QAAQ,CACb,CAAC;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QAC7B,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,SAAS,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerbit/react",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.11",
|
|
4
4
|
"description": "React bindings for Peerbit clients",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -54,13 +54,13 @@
|
|
|
54
54
|
"detectincognitojs": "^1.6.1",
|
|
55
55
|
"libsodium-wrappers": "0.7.15",
|
|
56
56
|
"uuid": "^10.0.0",
|
|
57
|
-
"@peerbit/indexer-interface": "3.0.3",
|
|
58
|
-
"@peerbit/canonical-client": "1.1.21",
|
|
59
|
-
"@peerbit/program": "6.0.18",
|
|
60
57
|
"@peerbit/crypto": "3.1.1",
|
|
58
|
+
"@peerbit/canonical-client": "1.1.22",
|
|
61
59
|
"@peerbit/logger": "2.0.1",
|
|
62
|
-
"@peerbit/program
|
|
63
|
-
"peerbit": "
|
|
60
|
+
"@peerbit/program": "6.0.19",
|
|
61
|
+
"@peerbit/indexer-interface": "3.0.3",
|
|
62
|
+
"@peerbit/program-react": "0.4.22",
|
|
63
|
+
"peerbit": "5.2.8"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@testing-library/dom": "^10.4.0",
|
package/src/lockstorage.ts
CHANGED
|
@@ -64,8 +64,49 @@ export class FastMutex {
|
|
|
64
64
|
let restartCount = 0;
|
|
65
65
|
let contentionCount = 0;
|
|
66
66
|
let locksLost = 0;
|
|
67
|
+
let settled = false;
|
|
68
|
+
const pendingRetries = new Set<ReturnType<typeof setTimeout>>();
|
|
69
|
+
|
|
70
|
+
const clearPendingRetries = () => {
|
|
71
|
+
for (const timer of pendingRetries) {
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
}
|
|
74
|
+
pendingRetries.clear();
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const resolveOnce = (value: {
|
|
78
|
+
restartCount: number;
|
|
79
|
+
contentionCount: number;
|
|
80
|
+
locksLost: number;
|
|
81
|
+
}) => {
|
|
82
|
+
if (settled) return;
|
|
83
|
+
settled = true;
|
|
84
|
+
clearPendingRetries();
|
|
85
|
+
resolve(value);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const rejectOnce = (error: unknown) => {
|
|
89
|
+
if (settled) return;
|
|
90
|
+
settled = true;
|
|
91
|
+
clearPendingRetries();
|
|
92
|
+
reject(error);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const scheduleRetry = (fn: () => void, ms: number) => {
|
|
96
|
+
if (settled) return;
|
|
97
|
+
const timer = setTimeout(() => {
|
|
98
|
+
pendingRetries.delete(timer);
|
|
99
|
+
if (!settled) {
|
|
100
|
+
fn();
|
|
101
|
+
}
|
|
102
|
+
}, ms);
|
|
103
|
+
pendingRetries.add(timer);
|
|
104
|
+
};
|
|
67
105
|
|
|
68
106
|
const acquireLock = (key: string) => {
|
|
107
|
+
if (settled) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
69
110
|
// If the option is set and the same client already holds both keys,
|
|
70
111
|
// update the expiry and resolve immediately.
|
|
71
112
|
if (options?.replaceIfSameClient) {
|
|
@@ -80,7 +121,7 @@ export class FastMutex {
|
|
|
80
121
|
this.clientId,
|
|
81
122
|
key,
|
|
82
123
|
);
|
|
83
|
-
return
|
|
124
|
+
return resolveOnce({
|
|
84
125
|
restartCount,
|
|
85
126
|
contentionCount,
|
|
86
127
|
locksLost,
|
|
@@ -90,7 +131,7 @@ export class FastMutex {
|
|
|
90
131
|
|
|
91
132
|
// Check for overall retries/timeouts.
|
|
92
133
|
if (restartCount > 1000 || contentionCount > 1000 || locksLost > 1000) {
|
|
93
|
-
return
|
|
134
|
+
return rejectOnce("Failed to resolve lock");
|
|
94
135
|
}
|
|
95
136
|
const elapsedTime = Date.now() - acquireStart;
|
|
96
137
|
if (elapsedTime >= this.timeout) {
|
|
@@ -100,7 +141,7 @@ export class FastMutex {
|
|
|
100
141
|
this.timeout,
|
|
101
142
|
this.clientId,
|
|
102
143
|
);
|
|
103
|
-
return
|
|
144
|
+
return rejectOnce(
|
|
104
145
|
new Error(`Lock could not be acquired within ${this.timeout}ms`),
|
|
105
146
|
);
|
|
106
147
|
}
|
|
@@ -113,7 +154,7 @@ export class FastMutex {
|
|
|
113
154
|
if (lsY) {
|
|
114
155
|
debug("Lock exists on Y (%s), restarting...", lsY);
|
|
115
156
|
restartCount++;
|
|
116
|
-
|
|
157
|
+
scheduleRetry(() => acquireLock(key), 10);
|
|
117
158
|
return;
|
|
118
159
|
}
|
|
119
160
|
|
|
@@ -125,7 +166,7 @@ export class FastMutex {
|
|
|
125
166
|
if (lsX !== this.clientId) {
|
|
126
167
|
contentionCount++;
|
|
127
168
|
debug('Lock contention detected. X="%s"', lsX);
|
|
128
|
-
|
|
169
|
+
scheduleRetry(() => {
|
|
129
170
|
lsY = this.getItem(y);
|
|
130
171
|
if (lsY === this.clientId) {
|
|
131
172
|
debug(
|
|
@@ -133,7 +174,7 @@ export class FastMutex {
|
|
|
133
174
|
this.clientId,
|
|
134
175
|
key,
|
|
135
176
|
);
|
|
136
|
-
|
|
177
|
+
resolveOnce({
|
|
137
178
|
restartCount,
|
|
138
179
|
contentionCount,
|
|
139
180
|
locksLost,
|
|
@@ -147,7 +188,7 @@ export class FastMutex {
|
|
|
147
188
|
key,
|
|
148
189
|
lsY,
|
|
149
190
|
);
|
|
150
|
-
|
|
191
|
+
scheduleRetry(() => acquireLock(key), 10);
|
|
151
192
|
}
|
|
152
193
|
}, 50);
|
|
153
194
|
return;
|
|
@@ -159,7 +200,7 @@ export class FastMutex {
|
|
|
159
200
|
this.clientId,
|
|
160
201
|
key,
|
|
161
202
|
);
|
|
162
|
-
|
|
203
|
+
resolveOnce({ restartCount, contentionCount, locksLost });
|
|
163
204
|
};
|
|
164
205
|
|
|
165
206
|
acquireLock(key);
|