@peerbit/program 5.4.3 → 5.4.4
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/src/handler.d.ts +1 -0
- package/dist/src/handler.d.ts.map +1 -1
- package/dist/src/handler.js +52 -26
- package/dist/src/handler.js.map +1 -1
- package/package.json +5 -5
- package/src/handler.ts +57 -28
package/dist/src/handler.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,MAAM,oCAAsC,CAAC;AAE1D,KAAK,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAChC,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEpD,MAAM,MAAM,QAAQ,CAAC,IAAI,IAAI;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAC7C,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAC3C,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AACvE,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAA;CAAE,CAAC;AACjD,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AACF,MAAM,WAAW,QAAQ;IACxB,IAAI,CACH,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5D,GACC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,MAAM,MAAM,OAAO,GAAG;IAAE,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI;IAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,IAAI,IAAI,SAAS,GACvC,WAAW,GACX,OAAO,CAAC,IAAI,CAAC,GACb,QAAQ,GACR,OAAO,GAAG;IACT,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;CACzC,GAAG,QAAQ,CAAC;AAEd,MAAM,MAAM,4BAA4B,CAAC,IAAI,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,IAAI,EAG5E,GAAG,QAAQ,CAAC,IAAI,CAAC,GACjB,UAAU,CAAC,CAAC,CAAC,GACb,YAAY,CAAC;AAEd,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,SASzE,CAAC;AAEF,qBAAa,OAAO,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,CAAC;IAM5C,QAAQ,CAAC,UAAU,EAAE;QACpB,MAAM,EAAE;YAAE,QAAQ,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;QACpE,IAAI,EAAE,CACL,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAC1B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;QACvC,QAAQ,EAAE,QAAQ,CAAC;KACnB;IAdF,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,gBAAgB,CAA0B;gBAGxC,UAAU,EAAE;QACpB,MAAM,EAAE;YAAE,QAAQ,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;QACpE,IAAI,EAAE,CACL,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAC1B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;QACvC,QAAQ,EAAE,QAAQ,CAAC;KACnB;IAOI,IAAI;IAyBV,OAAO,CAAC,cAAc;YAMR,oBAAoB;IAmB5B,IAAI,CAAC,CAAC,SAAS,CAAC,EACrB,cAAc,EAAE,CAAC,GAAG,OAAO,GAAG,MAAM,EACpC,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC1B,OAAO,CAAC,CAAC,CAAC;CAyLb"}
|
package/dist/src/handler.js
CHANGED
|
@@ -15,9 +15,11 @@ export class Handler {
|
|
|
15
15
|
properties;
|
|
16
16
|
items;
|
|
17
17
|
_openQueue;
|
|
18
|
+
_openingPromises;
|
|
18
19
|
constructor(properties) {
|
|
19
20
|
this.properties = properties;
|
|
20
21
|
this._openQueue = new Map();
|
|
22
|
+
this._openingPromises = new Map();
|
|
21
23
|
this.items = new Map();
|
|
22
24
|
}
|
|
23
25
|
async stop() {
|
|
@@ -26,6 +28,12 @@ export class Handler {
|
|
|
26
28
|
return x.onIdle();
|
|
27
29
|
}));
|
|
28
30
|
this._openQueue.clear();
|
|
31
|
+
// Wait for any in-progress opens to complete before closing
|
|
32
|
+
// This prevents race conditions where a program is being opened while we close
|
|
33
|
+
if (this._openingPromises.size > 0) {
|
|
34
|
+
await Promise.allSettled([...this._openingPromises.values()]);
|
|
35
|
+
}
|
|
36
|
+
this._openingPromises.clear();
|
|
29
37
|
// Close all open databases
|
|
30
38
|
await Promise.all([...this.items.values()].map((program) => program.close()));
|
|
31
39
|
// Remove all databases from the state
|
|
@@ -149,37 +157,55 @@ export class Handler {
|
|
|
149
157
|
await program.afterOpen();
|
|
150
158
|
return program;
|
|
151
159
|
};
|
|
152
|
-
//
|
|
153
|
-
|
|
160
|
+
// Helper to resolve address from storeOrAddress
|
|
161
|
+
const resolveAddress = async () => {
|
|
162
|
+
if (typeof storeOrAddress === "string") {
|
|
163
|
+
return storeOrAddress;
|
|
164
|
+
}
|
|
165
|
+
if (!storeOrAddress.closed) {
|
|
166
|
+
return storeOrAddress.address;
|
|
167
|
+
}
|
|
168
|
+
return storeOrAddress.save(this.properties.client.services.blocks, {
|
|
169
|
+
skipOnAddress: true,
|
|
170
|
+
condition: (addr) => !this.items.has(addr.toString()),
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
const address = await resolveAddress();
|
|
174
|
+
// For parent opens, check if already opened or in-progress and return early
|
|
175
|
+
// This prevents race conditions while avoiding deadlocks
|
|
154
176
|
if (options?.parent) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
address = await storeOrAddress.save(this.properties.client.services.blocks, {
|
|
164
|
-
skipOnAddress: true,
|
|
165
|
-
condition: (address) => {
|
|
166
|
-
return !this.items.has(address.toString());
|
|
167
|
-
},
|
|
168
|
-
});
|
|
177
|
+
// Check if there's an open in progress FIRST - wait for it
|
|
178
|
+
// This must be checked before items because beforeOpen() adds to items
|
|
179
|
+
// before open() completes
|
|
180
|
+
const existingPromise = this._openingPromises.get(address);
|
|
181
|
+
if (existingPromise) {
|
|
182
|
+
const result = await existingPromise;
|
|
183
|
+
addParent(result, options.parent);
|
|
184
|
+
return result;
|
|
169
185
|
}
|
|
170
|
-
|
|
171
|
-
|
|
186
|
+
// Check if already fully opened
|
|
187
|
+
const existing = this.items.get(address);
|
|
188
|
+
if (existing) {
|
|
189
|
+
addParent(existing, options.parent);
|
|
190
|
+
return existing;
|
|
172
191
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
192
|
+
// Track this open and bypass queue (parent already holds queue)
|
|
193
|
+
const openPromise = fn();
|
|
194
|
+
this._openingPromises.set(address, openPromise);
|
|
195
|
+
try {
|
|
196
|
+
return await openPromise;
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
this._openingPromises.delete(address);
|
|
179
200
|
}
|
|
180
|
-
return queue.add(fn); // TODO p-queue seem to return void type ;
|
|
181
201
|
}
|
|
182
|
-
|
|
202
|
+
// Non-parent opens use queue for serialization
|
|
203
|
+
let queue = this._openQueue.get(address);
|
|
204
|
+
if (!queue) {
|
|
205
|
+
queue = new PQueue({ concurrency: 1 });
|
|
206
|
+
this._openQueue.set(address, queue);
|
|
207
|
+
}
|
|
208
|
+
return queue.add(fn);
|
|
183
209
|
}
|
|
184
210
|
}
|
|
185
211
|
//# sourceMappingURL=handler.js.map
|
package/dist/src/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,MAAM,MAAM,SAAS,CAAC;AAG7B,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,CAAC,CAAC;AA6D1D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAsB,EAAE,MAAwB,EAAE,EAAE;IAC7E,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACvE,OAAO,CAAC,iIAAiI;IAC1I,CAAC;IAED,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,EAAE,CAAC;QACZ,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerbit/program",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.4",
|
|
4
4
|
"description": "Program interface",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -57,18 +57,18 @@
|
|
|
57
57
|
"@multiformats/multiaddr": "^13.0.1",
|
|
58
58
|
"multiformats": "^13.4.1",
|
|
59
59
|
"p-queue": "^8.0.1",
|
|
60
|
-
"@peerbit/crypto": "2.4.0",
|
|
61
60
|
"@peerbit/keychain": "1.2.2",
|
|
62
61
|
"@peerbit/blocks-interface": "1.5.0",
|
|
62
|
+
"@peerbit/crypto": "2.4.0",
|
|
63
63
|
"@peerbit/pubsub-interface": "4.1.0",
|
|
64
|
+
"@peerbit/any-store-interface": "1.1.0",
|
|
64
65
|
"@peerbit/libp2p-test-utils": "2.2.0",
|
|
65
66
|
"@peerbit/indexer-interface": "2.1.0",
|
|
66
|
-
"@peerbit/stream-interface": "5.3.0",
|
|
67
67
|
"@peerbit/time": "2.3.0",
|
|
68
|
+
"@peerbit/stream-interface": "5.3.0",
|
|
68
69
|
"@peerbit/logger": "2.0.0",
|
|
69
|
-
"@peerbit/blocks": "3.1.3",
|
|
70
70
|
"@peerbit/pubsub": "4.1.1",
|
|
71
|
-
"@peerbit/
|
|
71
|
+
"@peerbit/blocks": "3.1.3"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"clean": "aegir clean",
|
package/src/handler.ts
CHANGED
|
@@ -79,6 +79,7 @@ export const addParent = (child: Manageable<any>, parent?: Manageable<any>) => {
|
|
|
79
79
|
export class Handler<T extends Manageable<any>> {
|
|
80
80
|
items: Map<string, T>;
|
|
81
81
|
private _openQueue: Map<string, PQueue>;
|
|
82
|
+
private _openingPromises: Map<string, Promise<T>>;
|
|
82
83
|
|
|
83
84
|
constructor(
|
|
84
85
|
readonly properties: {
|
|
@@ -93,6 +94,7 @@ export class Handler<T extends Manageable<any>> {
|
|
|
93
94
|
},
|
|
94
95
|
) {
|
|
95
96
|
this._openQueue = new Map();
|
|
97
|
+
this._openingPromises = new Map();
|
|
96
98
|
this.items = new Map();
|
|
97
99
|
}
|
|
98
100
|
|
|
@@ -105,6 +107,13 @@ export class Handler<T extends Manageable<any>> {
|
|
|
105
107
|
);
|
|
106
108
|
this._openQueue.clear();
|
|
107
109
|
|
|
110
|
+
// Wait for any in-progress opens to complete before closing
|
|
111
|
+
// This prevents race conditions where a program is being opened while we close
|
|
112
|
+
if (this._openingPromises.size > 0) {
|
|
113
|
+
await Promise.allSettled([...this._openingPromises.values()]);
|
|
114
|
+
}
|
|
115
|
+
this._openingPromises.clear();
|
|
116
|
+
|
|
108
117
|
// Close all open databases
|
|
109
118
|
await Promise.all(
|
|
110
119
|
[...this.items.values()].map((program) => program.close()),
|
|
@@ -273,38 +282,58 @@ export class Handler<T extends Manageable<any>> {
|
|
|
273
282
|
return program as S;
|
|
274
283
|
};
|
|
275
284
|
|
|
276
|
-
//
|
|
277
|
-
|
|
285
|
+
// Helper to resolve address from storeOrAddress
|
|
286
|
+
const resolveAddress = async (): Promise<string> => {
|
|
287
|
+
if (typeof storeOrAddress === "string") {
|
|
288
|
+
return storeOrAddress;
|
|
289
|
+
}
|
|
290
|
+
if (!storeOrAddress.closed) {
|
|
291
|
+
return storeOrAddress.address;
|
|
292
|
+
}
|
|
293
|
+
return storeOrAddress.save(this.properties.client.services.blocks, {
|
|
294
|
+
skipOnAddress: true,
|
|
295
|
+
condition: (addr) => !this.items.has(addr.toString()),
|
|
296
|
+
});
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const address = await resolveAddress();
|
|
300
|
+
|
|
301
|
+
// For parent opens, check if already opened or in-progress and return early
|
|
302
|
+
// This prevents race conditions while avoiding deadlocks
|
|
278
303
|
if (options?.parent) {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
this.properties.client.services.blocks,
|
|
288
|
-
{
|
|
289
|
-
skipOnAddress: true,
|
|
290
|
-
condition: (address) => {
|
|
291
|
-
return !this.items.has(address.toString());
|
|
292
|
-
},
|
|
293
|
-
},
|
|
294
|
-
);
|
|
295
|
-
} else {
|
|
296
|
-
address = storeOrAddress.address;
|
|
304
|
+
// Check if there's an open in progress FIRST - wait for it
|
|
305
|
+
// This must be checked before items because beforeOpen() adds to items
|
|
306
|
+
// before open() completes
|
|
307
|
+
const existingPromise = this._openingPromises.get(address);
|
|
308
|
+
if (existingPromise) {
|
|
309
|
+
const result = await existingPromise;
|
|
310
|
+
addParent(result, options.parent);
|
|
311
|
+
return result as S;
|
|
297
312
|
}
|
|
298
|
-
}
|
|
299
313
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
|
|
314
|
+
// Check if already fully opened
|
|
315
|
+
const existing = this.items.get(address);
|
|
316
|
+
if (existing) {
|
|
317
|
+
addParent(existing, options.parent);
|
|
318
|
+
return existing as S;
|
|
305
319
|
}
|
|
306
|
-
|
|
320
|
+
|
|
321
|
+
// Track this open and bypass queue (parent already holds queue)
|
|
322
|
+
const openPromise = fn();
|
|
323
|
+
this._openingPromises.set(address, openPromise as Promise<T>);
|
|
324
|
+
try {
|
|
325
|
+
return await openPromise;
|
|
326
|
+
} finally {
|
|
327
|
+
this._openingPromises.delete(address);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Non-parent opens use queue for serialization
|
|
332
|
+
let queue = this._openQueue.get(address);
|
|
333
|
+
if (!queue) {
|
|
334
|
+
queue = new PQueue({ concurrency: 1 });
|
|
335
|
+
this._openQueue.set(address, queue);
|
|
307
336
|
}
|
|
308
|
-
return fn
|
|
337
|
+
return queue.add(fn) as any as S;
|
|
309
338
|
}
|
|
310
339
|
}
|