@evolu/common 8.10.0 → 8.12.0

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 (152) hide show
  1. package/dist/src/Bytes.d.ts +39 -2
  2. package/dist/src/Bytes.d.ts.map +1 -1
  3. package/dist/src/Bytes.js +50 -2
  4. package/dist/src/Config.d.ts +22 -22
  5. package/dist/src/Config.d.ts.map +1 -1
  6. package/dist/src/Console.d.ts +62 -7
  7. package/dist/src/Console.d.ts.map +1 -1
  8. package/dist/src/Console.js +20 -4
  9. package/dist/src/Crypto.d.ts +76 -4
  10. package/dist/src/Crypto.d.ts.map +1 -1
  11. package/dist/src/Crypto.js +55 -4
  12. package/dist/src/Error.d.ts +45 -0
  13. package/dist/src/Error.d.ts.map +1 -1
  14. package/dist/src/Error.js +69 -0
  15. package/dist/src/Fs.d.ts +92 -18
  16. package/dist/src/Fs.d.ts.map +1 -1
  17. package/dist/src/Fs.js +2 -0
  18. package/dist/src/Identicon.d.ts +2 -2
  19. package/dist/src/Identicon.js +2 -2
  20. package/dist/src/LeakDetector.d.ts +22 -3
  21. package/dist/src/LeakDetector.d.ts.map +1 -1
  22. package/dist/src/LeakDetector.js +12 -2
  23. package/dist/src/LockManager.d.ts +8 -0
  24. package/dist/src/LockManager.d.ts.map +1 -1
  25. package/dist/src/LockManager.js +6 -0
  26. package/dist/src/Object.d.ts.map +1 -1
  27. package/dist/src/Object.js +5 -0
  28. package/dist/src/Platform.d.ts +47 -7
  29. package/dist/src/Platform.d.ts.map +1 -1
  30. package/dist/src/Platform.js +24 -5
  31. package/dist/src/Random.d.ts +25 -2
  32. package/dist/src/Random.d.ts.map +1 -1
  33. package/dist/src/Random.js +14 -2
  34. package/dist/src/Resource.d.ts +156 -1
  35. package/dist/src/Resource.d.ts.map +1 -1
  36. package/dist/src/Resource.js +201 -72
  37. package/dist/src/Schedule.d.ts +11 -10
  38. package/dist/src/Schedule.d.ts.map +1 -1
  39. package/dist/src/Schedule.js +1 -1
  40. package/dist/src/Sqlite.d.ts +132 -16
  41. package/dist/src/Sqlite.d.ts.map +1 -1
  42. package/dist/src/Sqlite.js +63 -9
  43. package/dist/src/Task.d.ts +15 -4
  44. package/dist/src/Task.d.ts.map +1 -1
  45. package/dist/src/Task.js +41 -15
  46. package/dist/src/Test.d.ts +9 -0
  47. package/dist/src/Test.d.ts.map +1 -1
  48. package/dist/src/Test.js +4 -0
  49. package/dist/src/Time.d.ts +106 -9
  50. package/dist/src/Time.d.ts.map +1 -1
  51. package/dist/src/Time.js +55 -4
  52. package/dist/src/Type.d.ts +1455 -1310
  53. package/dist/src/Type.d.ts.map +1 -1
  54. package/dist/src/Type.js +1274 -517
  55. package/dist/src/WebSocket.d.ts +164 -13
  56. package/dist/src/WebSocket.d.ts.map +1 -1
  57. package/dist/src/WebSocket.js +133 -24
  58. package/dist/src/Worker.d.ts +90 -8
  59. package/dist/src/Worker.d.ts.map +1 -1
  60. package/dist/src/Worker.js +28 -2
  61. package/dist/src/index.d.ts +6 -7
  62. package/dist/src/index.d.ts.map +1 -1
  63. package/dist/src/index.js +2 -3
  64. package/dist/src/local-first/Db.d.ts +52 -3
  65. package/dist/src/local-first/Db.d.ts.map +1 -1
  66. package/dist/src/local-first/Db.js +412 -137
  67. package/dist/src/local-first/Evolu.d.ts +412 -213
  68. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  69. package/dist/src/local-first/Evolu.js +181 -18
  70. package/dist/src/local-first/Owner.d.ts +13 -30
  71. package/dist/src/local-first/Owner.d.ts.map +1 -1
  72. package/dist/src/local-first/Owner.js +13 -30
  73. package/dist/src/local-first/Protocol.d.ts +106 -19
  74. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  75. package/dist/src/local-first/Protocol.js +162 -60
  76. package/dist/src/local-first/Query.d.ts +8 -15
  77. package/dist/src/local-first/Query.d.ts.map +1 -1
  78. package/dist/src/local-first/Relay.d.ts.map +1 -1
  79. package/dist/src/local-first/Relay.js +4 -2
  80. package/dist/src/local-first/Schema.d.ts +346 -23
  81. package/dist/src/local-first/Schema.d.ts.map +1 -1
  82. package/dist/src/local-first/Schema.js +214 -17
  83. package/dist/src/local-first/Shared.d.ts +537 -22
  84. package/dist/src/local-first/Shared.d.ts.map +1 -1
  85. package/dist/src/local-first/Shared.js +1437 -234
  86. package/dist/src/local-first/Storage.d.ts +195 -17
  87. package/dist/src/local-first/Storage.d.ts.map +1 -1
  88. package/dist/src/local-first/Storage.js +85 -22
  89. package/dist/src/local-first/Timestamp.d.ts +392 -41
  90. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  91. package/dist/src/local-first/Timestamp.js +403 -81
  92. package/dist/src/local-first/index.d.ts +0 -1
  93. package/dist/src/local-first/index.d.ts.map +1 -1
  94. package/dist/src/local-first/index.js +0 -1
  95. package/package.json +1 -1
  96. package/src/Assert.test.ts +2 -5
  97. package/src/Bytes.test.ts +27 -0
  98. package/src/Bytes.ts +58 -2
  99. package/src/Config.test.ts +2 -6
  100. package/src/Config.ts +133 -133
  101. package/src/Console.ts +62 -7
  102. package/src/Crypto.ts +76 -4
  103. package/src/Eq.test.ts +2 -3
  104. package/src/Error.test.ts +76 -3
  105. package/src/Error.ts +71 -0
  106. package/src/Fs.ts +92 -18
  107. package/src/Identicon.ts +2 -2
  108. package/src/LeakDetector.ts +22 -3
  109. package/src/LockManager.ts +8 -0
  110. package/src/Object.test.ts +27 -12
  111. package/src/Object.ts +5 -0
  112. package/src/Platform.ts +50 -8
  113. package/src/Random.ts +25 -2
  114. package/src/Resource.test.ts +837 -0
  115. package/src/Resource.ts +235 -15
  116. package/src/Schedule.test.ts +50 -12
  117. package/src/Schedule.ts +24 -14
  118. package/src/Sqlite.ts +137 -17
  119. package/src/Task.test.ts +189 -8
  120. package/src/Task.ts +56 -17
  121. package/src/Test.ts +9 -0
  122. package/src/Time.ts +106 -9
  123. package/src/Type.test.ts +946 -1028
  124. package/src/Type.ts +4195 -3136
  125. package/src/Types.test.ts +4 -14
  126. package/src/WebSocket.ts +313 -40
  127. package/src/Worker.ts +90 -8
  128. package/src/index.ts +20 -6
  129. package/src/local-first/Db.ts +644 -339
  130. package/src/local-first/Evolu.test.ts +994 -22
  131. package/src/local-first/Evolu.ts +625 -232
  132. package/src/local-first/Owner.ts +13 -30
  133. package/src/local-first/Protocol.test.ts +634 -10
  134. package/src/local-first/Protocol.ts +255 -109
  135. package/src/local-first/Query.ts +8 -15
  136. package/src/local-first/Relay.ts +4 -2
  137. package/src/local-first/Schema.test.ts +143 -0
  138. package/src/local-first/Schema.ts +376 -26
  139. package/src/local-first/Shared.test.ts +7731 -559
  140. package/src/local-first/Shared.ts +2036 -267
  141. package/src/local-first/Storage.ts +224 -36
  142. package/src/local-first/Timestamp.test.ts +344 -70
  143. package/src/local-first/Timestamp.ts +434 -118
  144. package/src/local-first/index.ts +0 -1
  145. package/dist/src/local-first/Error.d.ts +0 -12
  146. package/dist/src/local-first/Error.d.ts.map +0 -1
  147. package/dist/src/local-first/Error.js +0 -6
  148. package/dist/src/local-first/LocalAuth.d.ts +0 -150
  149. package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
  150. package/dist/src/local-first/LocalAuth.js +0 -179
  151. package/src/local-first/Error.ts +0 -17
  152. package/src/local-first/LocalAuth.ts +0 -457
@@ -1,5 +1,29 @@
1
1
  /**
2
- * Concurrency-safe helpers for efficient reuse of disposable resources.
2
+ * Concurrency-safe helpers for efficient reuse and replacement of disposable
3
+ * resources.
4
+ *
5
+ * ## Replacement policies
6
+ *
7
+ * Replacing a live resource has two policies.
8
+ *
9
+ * Exclusive replacement disposes the current resource and then creates the
10
+ * next, so at most one exists and there is an observable gap with none.
11
+ * {@link ResettableResource} implements it. Leases do not fit this policy: a
12
+ * reset is requested precisely when holders are stuck on a dead resource, so
13
+ * waiting for them inverts the purpose, and revoking them is safe only when the
14
+ * resource's own API is total after disposal, in which case a lease adds
15
+ * nothing.
16
+ *
17
+ * Overlapping replacement creates the next generation first and disposes the
18
+ * previous one when its last lease is released, so work in progress finishes on
19
+ * the generation it started with. It keeps the old generation when creation
20
+ * fails, at the cost of both existing for a while. It is not implemented. It
21
+ * belongs on {@link SharedResource} as an invalidate operation: mark the current
22
+ * generation stale, stop leasing it, dispose it on its last release, and create
23
+ * the next on the next acquire. Before that can ship,
24
+ * {@link SharedResourceByKey} must stop removing a key when its resource is
25
+ * disposed, and {@link SharedResourceByKeyWithClaims} must stop keeping one
26
+ * resource object per key for the lifetime of its claims.
3
27
  *
4
28
  * @module
5
29
  */
@@ -27,6 +51,7 @@ import { type DistributiveOmit } from "./Types.ts";
27
51
  * APIs let that error propagate as a defect. The purpose of resource helpers is
28
52
  * to guarantee cleanup and prevent leaks.
29
53
  *
54
+ * @see {@link ResettableResource}
30
55
  * @see {@link SharedResource}
31
56
  * @see {@link createSharedResource}
32
57
  */
@@ -278,6 +303,131 @@ export interface SharedResourceOptions {
278
303
  * the Run tree.
279
304
  */
280
305
  export declare const createSharedResource: <T extends Resource, D>(create: Task<T, never, D>, { idleDisposeAfter, onDisposed }?: SharedResourceOptions) => Task<SharedResource<T>, never, D>;
306
+ /**
307
+ * A {@link Resource} reset in place.
308
+ *
309
+ * Holds one current resource and resets it on request: the current resource is
310
+ * disposed first, then `create` runs again. At most one resource exists, and
311
+ * there is an observable gap with none. Consumers keep the ResettableResource
312
+ * and read the current resource through {@link ResettableResource.get | get}, so
313
+ * a reset needs no re-registration. A resource that cannot reset itself is the
314
+ * case for it. One that can, as `WebSocket.reconnect` does, keeps a stable
315
+ * identity and needs no wrapper.
316
+ *
317
+ * The ResettableResource keeps a stable identity while its current resource
318
+ * changes. {@link SharedResourceByKeyWithClaims} can retain it directly;
319
+ * consumers read the current resource through `get`.
320
+ *
321
+ * Repeated async disposal calls await the same cleanup and preserve any
322
+ * disposal failure.
323
+ *
324
+ * ### Example
325
+ *
326
+ * ```ts
327
+ * import {
328
+ * assertEqual,
329
+ * assertSame,
330
+ * createRun,
331
+ * createResettableResource,
332
+ * ok,
333
+ * type Task,
334
+ * } from "@evolu/common";
335
+ *
336
+ * interface Connection extends Disposable {
337
+ * readonly id: number;
338
+ * readonly isClosed: () => boolean;
339
+ * }
340
+ *
341
+ * let nextId = 1;
342
+ * const createConnection: Task<Connection> = () => {
343
+ * const id = nextId++;
344
+ * let isClosed = false;
345
+ * return ok({
346
+ * id,
347
+ * isClosed: () => isClosed,
348
+ * [Symbol.dispose]: () => {
349
+ * isClosed = true;
350
+ * },
351
+ * });
352
+ * };
353
+ *
354
+ * await using run = createRun();
355
+ * await using connection = await run.ok(
356
+ * createResettableResource(createConnection),
357
+ * );
358
+ * const first = connection.get();
359
+ * assertEqual(first?.id, 1);
360
+ *
361
+ * await run.ok(connection.reset(first));
362
+ * assertSame(first?.isClosed(), true);
363
+ * assertEqual(connection.get()?.id, 2);
364
+ * ```
365
+ */
366
+ export interface ResettableResource<T extends Resource> extends AsyncDisposable {
367
+ /**
368
+ * Returns the current resource, or `undefined` when there is none: while a
369
+ * reset is in progress, after a reset whose creation aborted, and after
370
+ * disposal. Callers treat every absence alike, as the resource's own
371
+ * not-ready state.
372
+ */
373
+ readonly get: () => BorrowedResource<T> | undefined;
374
+ /**
375
+ * Resets the current resource: disposes it, then creates the next one.
376
+ *
377
+ * A reset is requested because `observed` misbehaved, and it runs only while
378
+ * `observed` is still current or there is no current resource. A request that
379
+ * finds a different resource current returns without resetting, so every
380
+ * observer of one dead resource shares one reset, however late its request
381
+ * arrives. An `observed` of `undefined` is an observation of absence, as
382
+ * {@link ResettableResource.get | get} returns during a reset: the request
383
+ * runs only while nothing is current, so it retries an aborted creation and
384
+ * skips once a replacement exists.
385
+ *
386
+ * Resets are serialized. Owner disposal aborts a pending reset with
387
+ * `runDisposedAbortReason`, and a resource that `create` returns after
388
+ * disposal started is disposed and never becomes current.
389
+ *
390
+ * Resets follow the resource-owned {@link Run}'s lifecycle: an abort request
391
+ * can cancel them, and calling reset after that Run starts disposal is a
392
+ * programmer error. Aborting the caller's {@link Fiber} does not cancel a
393
+ * started reset; dependencies remain those captured at creation.
394
+ */
395
+ readonly reset: (observed: BorrowedResource<T> | undefined) => Task<void>;
396
+ }
397
+ /**
398
+ * Creates {@link ResettableResource}.
399
+ *
400
+ * The first resource is created before this Task returns; if that creation
401
+ * aborts, nothing is left running. If the caller's Fiber aborts during initial
402
+ * creation, this Task waits for creation to settle, disposes any created
403
+ * resource, and returns the abort instead of a resource.
404
+ *
405
+ * The `create` Task must not fail: the previous resource is already disposed
406
+ * when it runs, so a failure would leave nothing to fall back to. Handle
407
+ * recoverable failures inside `create`, or return a resource whose state models
408
+ * them.
409
+ *
410
+ * The resource's own API must model its not-ready state, as a reconnecting
411
+ * connection models "connecting": `get` returns `undefined` during a reset, and
412
+ * callers treat that absence the same way. A resource whose API assumes
413
+ * readiness gains nothing here; every caller would rebuild that state around
414
+ * it.
415
+ *
416
+ * As with {@link createSharedResource}, a returned resource must be live and
417
+ * independently owned, and `create` runs on a Run created from the Run that
418
+ * executes this Task, so dependencies are captured at creation time.
419
+ *
420
+ * Every successful `create` invocation must return a fresh object identity,
421
+ * never one returned earlier. A reset skips when the observed resource is no
422
+ * longer current, and that comparison is by identity; a reused object makes a
423
+ * stale observation match the replacement and reset it again.
424
+ *
425
+ * A reset runs `create` and the resource's disposer while holding a
426
+ * non-reentrant lock. Neither may directly or transitively await another
427
+ * {@link ResettableResource.reset | reset} of this ResettableResource, because
428
+ * that reset waits for the same lock.
429
+ */
430
+ export declare const createResettableResource: <T extends Resource, D>(create: Task<T, never, D>) => Task<ResettableResource<T>, never, D>;
281
431
  /**
282
432
  * Shared {@link Resource}s keyed by logical identity.
283
433
  *
@@ -487,6 +637,11 @@ export declare function createSharedResourceByKey<K, T extends Resource, D, L =
487
637
  * leases by key and the application does not need to associate those leases
488
638
  * with logical owners.
489
639
  *
640
+ * One resource object per key is kept for the lifetime of its claims, and
641
+ * callbacks receive that object. A {@link ResettableResource} can be retained
642
+ * directly because its identity is stable; consumers read its current resource
643
+ * through {@link ResettableResource.get | get}.
644
+ *
490
645
  * Two accounts can share a relay connection while one also uses a local-network
491
646
  * transport:
492
647
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Resource.d.ts","sourceRoot":"","sources":["../../src/Resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Resource.d.ts","sourceRoot":"","sources":["../../src/Resource.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,29 @@
1
1
  /**
2
- * Concurrency-safe helpers for efficient reuse of disposable resources.
2
+ * Concurrency-safe helpers for efficient reuse and replacement of disposable
3
+ * resources.
4
+ *
5
+ * ## Replacement policies
6
+ *
7
+ * Replacing a live resource has two policies.
8
+ *
9
+ * Exclusive replacement disposes the current resource and then creates the
10
+ * next, so at most one exists and there is an observable gap with none.
11
+ * {@link ResettableResource} implements it. Leases do not fit this policy: a
12
+ * reset is requested precisely when holders are stuck on a dead resource, so
13
+ * waiting for them inverts the purpose, and revoking them is safe only when the
14
+ * resource's own API is total after disposal, in which case a lease adds
15
+ * nothing.
16
+ *
17
+ * Overlapping replacement creates the next generation first and disposes the
18
+ * previous one when its last lease is released, so work in progress finishes on
19
+ * the generation it started with. It keeps the old generation when creation
20
+ * fails, at the cost of both existing for a while. It is not implemented. It
21
+ * belongs on {@link SharedResource} as an invalidate operation: mark the current
22
+ * generation stale, stop leasing it, dispose it on its last release, and create
23
+ * the next on the next acquire. Before that can ship,
24
+ * {@link SharedResourceByKey} must stop removing a key when its resource is
25
+ * disposed, and {@link SharedResourceByKeyWithClaims} must stop keeping one
26
+ * resource object per key for the lifetime of its claims.
3
27
  *
4
28
  * @module
5
29
  */
@@ -256,6 +280,124 @@ export const createSharedResource = (create, { idleDisposeAfter, onDisposed } =
256
280
  }, sharedResourceHandle);
257
281
  return ok(sharedResource);
258
282
  };
283
+ /**
284
+ * Creates {@link ResettableResource}.
285
+ *
286
+ * The first resource is created before this Task returns; if that creation
287
+ * aborts, nothing is left running. If the caller's Fiber aborts during initial
288
+ * creation, this Task waits for creation to settle, disposes any created
289
+ * resource, and returns the abort instead of a resource.
290
+ *
291
+ * The `create` Task must not fail: the previous resource is already disposed
292
+ * when it runs, so a failure would leave nothing to fall back to. Handle
293
+ * recoverable failures inside `create`, or return a resource whose state models
294
+ * them.
295
+ *
296
+ * The resource's own API must model its not-ready state, as a reconnecting
297
+ * connection models "connecting": `get` returns `undefined` during a reset, and
298
+ * callers treat that absence the same way. A resource whose API assumes
299
+ * readiness gains nothing here; every caller would rebuild that state around
300
+ * it.
301
+ *
302
+ * As with {@link createSharedResource}, a returned resource must be live and
303
+ * independently owned, and `create` runs on a Run created from the Run that
304
+ * executes this Task, so dependencies are captured at creation time.
305
+ *
306
+ * Every successful `create` invocation must return a fresh object identity,
307
+ * never one returned earlier. A reset skips when the observed resource is no
308
+ * longer current, and that comparison is by identity; a reused object makes a
309
+ * stale observation match the replacement and reset it again.
310
+ *
311
+ * A reset runs `create` and the resource's disposer while holding a
312
+ * non-reentrant lock. Neither may directly or transitively await another
313
+ * {@link ResettableResource.reset | reset} of this ResettableResource, because
314
+ * that reset waits for the same lock.
315
+ */
316
+ export const createResettableResource = (create) => async (run) => {
317
+ const env_3 = { stack: [], error: void 0, hasError: false };
318
+ try {
319
+ const { leakDetector } = run.deps;
320
+ let current;
321
+ const disposer = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
322
+ const resettableResourceRun = disposer.use(run.create());
323
+ const mutex = createMutex();
324
+ const resettableResourceHandle = {};
325
+ const resetFrom = (observed) => mutex.withLock(async (run) => {
326
+ // A resource other than the observed one is current. An aborted
327
+ // creation leaves no current resource, so a queued request still runs.
328
+ if (current !== undefined && current !== observed) {
329
+ return ok();
330
+ }
331
+ const previous = current;
332
+ await disposeCurrent();
333
+ const next = await run.ok(create);
334
+ assert(next !== previous, "ResettableResource create must return a fresh object identity.");
335
+ // A resource returned after disposal started is disposed here, so
336
+ // `get` never exposes it while owner finalization runs.
337
+ if (run.signal.aborted) {
338
+ const env_4 = { stack: [], error: void 0, hasError: false };
339
+ try {
340
+ const _next = __addDisposableResource(env_4, next, true);
341
+ }
342
+ catch (e_4) {
343
+ env_4.error = e_4;
344
+ env_4.hasError = true;
345
+ }
346
+ finally {
347
+ const result_3 = __disposeResources(env_4);
348
+ if (result_3)
349
+ await result_3;
350
+ }
351
+ }
352
+ run.signal.throwIfAborted();
353
+ current = next;
354
+ return ok();
355
+ });
356
+ const disposeCurrent = async () => {
357
+ const env_5 = { stack: [], error: void 0, hasError: false };
358
+ try {
359
+ const _resource = __addDisposableResource(env_5, current, true);
360
+ current = undefined;
361
+ }
362
+ catch (e_5) {
363
+ env_5.error = e_5;
364
+ env_5.hasError = true;
365
+ }
366
+ finally {
367
+ const result_4 = __disposeResources(env_5);
368
+ if (result_4)
369
+ await result_4;
370
+ }
371
+ };
372
+ resettableResourceRun.defer(() => {
373
+ leakDetector.untrack(resettableResourceHandle);
374
+ });
375
+ resettableResourceRun.defer(disposeCurrent);
376
+ await resettableResourceRun.ok(resetFrom(undefined));
377
+ // The caller can abort independently of the resource-owned Run.
378
+ run.signal.throwIfAborted();
379
+ const resettableResource = {
380
+ get: () => current,
381
+ reset: (observed) => () => resettableResourceRun(resetFrom(observed)),
382
+ [Symbol.asyncDispose]: () => resettableResourceRun[Symbol.asyncDispose](),
383
+ };
384
+ leakDetector.track(resettableResource, {
385
+ name: "ResettableResource",
386
+ isLeaked: () => resettableResourceRun.getState().type === "Running",
387
+ }, resettableResourceHandle);
388
+ disposer.move();
389
+ return ok(resettableResource);
390
+ }
391
+ catch (e_3) {
392
+ env_3.error = e_3;
393
+ env_3.hasError = true;
394
+ }
395
+ finally {
396
+ const result_2 = __disposeResources(env_3);
397
+ if (result_2)
398
+ await result_2;
399
+ }
400
+ };
259
401
  export function createSharedResourceByKey(create, { idleDisposeAfter, lookup = identity, onDisposed, } = {}) {
260
402
  return (run) => {
261
403
  const sharedResourceByKeyRun = run.create();
@@ -287,21 +429,21 @@ export function createSharedResourceByKey(create, { idleDisposeAfter, lookup = i
287
429
  // SharedResource disposals are aborted and awaited before the registered
288
430
  // SharedResources are disposed.
289
431
  disposer.defer(async () => {
290
- const env_3 = { stack: [], error: void 0, hasError: false };
432
+ const env_6 = { stack: [], error: void 0, hasError: false };
291
433
  try {
292
- const keyDisposer = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
434
+ const keyDisposer = __addDisposableResource(env_6, new AsyncDisposableStack(), true);
293
435
  for (const sharedResource of sharedResourcesByKey.values())
294
436
  keyDisposer.use(sharedResource);
295
437
  sharedResourcesByKey.clear();
296
438
  }
297
- catch (e_3) {
298
- env_3.error = e_3;
299
- env_3.hasError = true;
439
+ catch (e_6) {
440
+ env_6.error = e_6;
441
+ env_6.hasError = true;
300
442
  }
301
443
  finally {
302
- const result_2 = __disposeResources(env_3);
303
- if (result_2)
304
- await result_2;
444
+ const result_5 = __disposeResources(env_6);
445
+ if (result_5)
446
+ await result_5;
305
447
  }
306
448
  });
307
449
  disposer.use(sharedResourceByKeyRun);
@@ -346,23 +488,23 @@ export function createSharedResourceByKey(create, { idleDisposeAfter, lookup = i
346
488
  return ok(lease);
347
489
  })),
348
490
  use: (key, callback) => async (run) => {
349
- const env_4 = { stack: [], error: void 0, hasError: false };
491
+ const env_7 = { stack: [], error: void 0, hasError: false };
350
492
  try {
351
- const lease = __addDisposableResource(env_4, await run.ok(sharedResourceByKey.acquire(key)), false);
493
+ const lease = __addDisposableResource(env_7, await run.ok(sharedResourceByKey.acquire(key)), false);
352
494
  return await run(callback(lease.resource, lease.created));
353
495
  }
354
- catch (e_4) {
355
- env_4.error = e_4;
356
- env_4.hasError = true;
496
+ catch (e_7) {
497
+ env_7.error = e_7;
498
+ env_7.hasError = true;
357
499
  }
358
500
  finally {
359
- __disposeResources(env_4);
501
+ __disposeResources(env_7);
360
502
  }
361
503
  },
362
504
  forEachCurrent: (callback) => async (run) => {
363
- const env_5 = { stack: [], error: void 0, hasError: false };
505
+ const env_8 = { stack: [], error: void 0, hasError: false };
364
506
  try {
365
- const leaseDisposer = __addDisposableResource(env_5, new DisposableStack(), false);
507
+ const leaseDisposer = __addDisposableResource(env_8, new DisposableStack(), false);
366
508
  const leasesByKey = [];
367
509
  // oxlint-disable-next-line unicorn/no-useless-spread -- Snapshot keys because each acquisition awaits and can mutate the registry.
368
510
  for (const [key] of [...sharedResourcesByKey]) {
@@ -375,12 +517,12 @@ export function createSharedResourceByKey(create, { idleDisposeAfter, lookup = i
375
517
  callback(lease.resource, key);
376
518
  return ok();
377
519
  }
378
- catch (e_5) {
379
- env_5.error = e_5;
380
- env_5.hasError = true;
520
+ catch (e_8) {
521
+ env_8.error = e_8;
522
+ env_8.hasError = true;
381
523
  }
382
524
  finally {
383
- __disposeResources(env_5);
525
+ __disposeResources(env_8);
384
526
  }
385
527
  },
386
528
  snapshot: () => {
@@ -423,7 +565,7 @@ export function createSharedResourceByKey(create, { idleDisposeAfter, lookup = i
423
565
  * happen later when `idleDisposeAfter` is configured.
424
566
  */
425
567
  export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter, resourceLookup = identity, claimLookup = identity, onFirstClaimAdded, onLastClaimRemoved, } = {}) => async (run) => {
426
- const env_6 = { stack: [], error: void 0, hasError: false };
568
+ const env_9 = { stack: [], error: void 0, hasError: false };
427
569
  try {
428
570
  const sharedResourceByKeyWithClaimsRun = run.create();
429
571
  const { leakDetector } = run.deps;
@@ -446,7 +588,7 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
446
588
  sharedResourceByKeyWithClaimsRun.panic(defect);
447
589
  }
448
590
  };
449
- const disposer = __addDisposableResource(env_6, new AsyncDisposableStack(), true);
591
+ const disposer = __addDisposableResource(env_9, new AsyncDisposableStack(), true);
450
592
  // Explicit disposal stops claim operations and runs their finalizers before
451
593
  // disposing the keyed registry. The nested stack is empty if keyed-registry
452
594
  // creation fails. Both internal Runs attach to the root, whose disposal
@@ -454,12 +596,12 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
454
596
  const sharedResourceByKeyDisposer = disposer.use(new AsyncDisposableStack());
455
597
  disposer.use(sharedResourceByKeyWithClaimsRun);
456
598
  const releaseClaimLease = (heldClaimLease, notifyTransition = true) => {
457
- const env_7 = { stack: [], error: void 0, hasError: false };
599
+ const env_10 = { stack: [], error: void 0, hasError: false };
458
600
  try {
459
601
  if (!heldClaimLeases.delete(heldClaimLease))
460
602
  return false;
461
603
  leakDetector.untrack(heldClaimLease);
462
- const _resourceLeases = __addDisposableResource(env_7, heldClaimLease.resourceLeases, false);
604
+ const _resourceLeases = __addDisposableResource(env_10, heldClaimLease.resourceLeases, false);
463
605
  for (const resourceKey of heldClaimLease.resourceKeys) {
464
606
  const decremented = claimResourceRelation.decrement(heldClaimLease.claim, resourceKey);
465
607
  if (decremented.count > 0)
@@ -477,18 +619,18 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
477
619
  }
478
620
  return true;
479
621
  }
480
- catch (e_7) {
481
- env_7.error = e_7;
482
- env_7.hasError = true;
622
+ catch (e_10) {
623
+ env_10.error = e_10;
624
+ env_10.hasError = true;
483
625
  }
484
626
  finally {
485
- __disposeResources(env_7);
627
+ __disposeResources(env_10);
486
628
  }
487
629
  };
488
630
  const drainClaimLeases = () => {
489
- const env_8 = { stack: [], error: void 0, hasError: false };
631
+ const env_11 = { stack: [], error: void 0, hasError: false };
490
632
  try {
491
- const disposer = __addDisposableResource(env_8, new DisposableStack(), false);
633
+ const disposer = __addDisposableResource(env_11, new DisposableStack(), false);
492
634
  disposer.defer(() => {
493
635
  claimResourceRelation.clear();
494
636
  resourcesByKey.clear();
@@ -499,12 +641,12 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
499
641
  });
500
642
  }
501
643
  }
502
- catch (e_8) {
503
- env_8.error = e_8;
504
- env_8.hasError = true;
644
+ catch (e_11) {
645
+ env_11.error = e_11;
646
+ env_11.hasError = true;
505
647
  }
506
648
  finally {
507
- __disposeResources(env_8);
649
+ __disposeResources(env_11);
508
650
  }
509
651
  };
510
652
  sharedResourceByKeyWithClaimsRun.defer(() => {
@@ -523,13 +665,13 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
523
665
  ...resourceKeys.slice(1),
524
666
  ];
525
667
  return sharedResourceByKeyWithClaimsRun(async (run) => {
526
- const env_9 = { stack: [], error: void 0, hasError: false };
668
+ const env_12 = { stack: [], error: void 0, hasError: false };
527
669
  try {
528
670
  assert(createLookupSet({
529
671
  lookup: resourceLookup,
530
672
  values: resourceKeysSnapshot,
531
673
  }).size === resourceKeysSnapshot.length, "resourceKeys must not contain lookup duplicates.");
532
- const resourceLeases = __addDisposableResource(env_9, new DisposableStack(), false);
674
+ const resourceLeases = __addDisposableResource(env_12, new DisposableStack(), false);
533
675
  const [firstResourceKey, ...remainingResourceKeys] = resourceKeysSnapshot;
534
676
  // acquire releases a transferred lease before surfacing owner abort,
535
677
  // so a throwing await cannot leave ownership uncollected.
@@ -572,10 +714,10 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
572
714
  isLeaked: () => heldClaimLeases.has(heldClaimLease),
573
715
  }, heldClaimLease);
574
716
  try {
575
- const env_10 = { stack: [], error: void 0, hasError: false };
717
+ const env_13 = { stack: [], error: void 0, hasError: false };
576
718
  try {
577
719
  let succeeded = false;
578
- const compensations = __addDisposableResource(env_10, new DisposableStack(), false);
720
+ const compensations = __addDisposableResource(env_13, new DisposableStack(), false);
579
721
  for (const [claim, resource, resourceKey,] of firstClaimTransitions) {
580
722
  onFirstClaimAdded?.(claim, resource, resourceKey);
581
723
  // oxlint-disable-next-line eslint/no-loop-func -- Captures this iteration's block-scoped transition values for rollback.
@@ -587,12 +729,12 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
587
729
  }
588
730
  succeeded = true;
589
731
  }
590
- catch (e_9) {
591
- env_10.error = e_9;
592
- env_10.hasError = true;
732
+ catch (e_12) {
733
+ env_13.error = e_12;
734
+ env_13.hasError = true;
593
735
  }
594
736
  finally {
595
- __disposeResources(env_10);
737
+ __disposeResources(env_13);
596
738
  }
597
739
  }
598
740
  catch (defect) {
@@ -601,33 +743,33 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
601
743
  }
602
744
  return ok(project(claimLease, resources));
603
745
  }
604
- catch (e_10) {
605
- env_9.error = e_10;
606
- env_9.hasError = true;
746
+ catch (e_13) {
747
+ env_12.error = e_13;
748
+ env_12.hasError = true;
607
749
  }
608
750
  finally {
609
- __disposeResources(env_9);
751
+ __disposeResources(env_12);
610
752
  }
611
753
  });
612
754
  };
613
755
  const sharedResourceByKeyWithClaims = {
614
756
  claim: (claim, resourceKeys) => acquireClaim(claim, resourceKeys, (claimLease) => claimLease),
615
757
  use: (claim, resourceKeys, callback) => async (run) => {
616
- const env_11 = { stack: [], error: void 0, hasError: false };
758
+ const env_14 = { stack: [], error: void 0, hasError: false };
617
759
  try {
618
760
  const acquired = await run.ok(acquireClaim(claim, resourceKeys, (claimLease, resources) => ({
619
761
  claimLease,
620
762
  resources,
621
763
  })));
622
- const _claimLease = __addDisposableResource(env_11, acquired.claimLease, false);
764
+ const _claimLease = __addDisposableResource(env_14, acquired.claimLease, false);
623
765
  return await run(callback(acquired.resources));
624
766
  }
625
- catch (e_11) {
626
- env_11.error = e_11;
627
- env_11.hasError = true;
767
+ catch (e_14) {
768
+ env_14.error = e_14;
769
+ env_14.hasError = true;
628
770
  }
629
771
  finally {
630
- __disposeResources(env_11);
772
+ __disposeResources(env_14);
631
773
  }
632
774
  },
633
775
  getClaimsForResource: (resourceKey) => new Set(claimResourceRelation.getAs(resourceKey)),
@@ -668,26 +810,13 @@ export const createSharedResourceByKeyWithClaims = (create, { idleDisposeAfter,
668
810
  }, sharedResourceByKeyWithClaimsHandle);
669
811
  return ok(sharedResourceByKeyWithClaims);
670
812
  }
671
- catch (e_6) {
672
- env_6.error = e_6;
673
- env_6.hasError = true;
813
+ catch (e_9) {
814
+ env_9.error = e_9;
815
+ env_9.hasError = true;
674
816
  }
675
817
  finally {
676
- const result_3 = __disposeResources(env_6);
677
- if (result_3)
678
- await result_3;
818
+ const result_6 = __disposeResources(env_9);
819
+ if (result_6)
820
+ await result_6;
679
821
  }
680
822
  };
681
- // TODO: Add a lease-based reloadable resource when a concrete use case needs
682
- // resource swapping. A ResourceRef-style get/set API is unsafe because set can
683
- // dispose a resource still held by a caller of get. Model resource generations
684
- // explicitly and distinguish two replacement policies, probably as separate
685
- // APIs rather than a boolean option:
686
- // - Overlapping: create and validate the replacement, publish it to new leases,
687
- // then dispose the old generation after its existing leases drain. This
688
- // supports zero-downtime reload and keeps the old generation when creation
689
- // fails, but both generations temporarily exist.
690
- // - Exclusive: stop or queue new leases, drain and dispose the old generation,
691
- // then create and publish the replacement. This guarantees at most one live
692
- // resource, but introduces downtime and leaves no valid resource when creation
693
- // fails unless the owner retries or recreates the old configuration.