signalium 3.0.2 → 4.0.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 (149) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/cjs/development/{component-shared-Cug2Y5YZ.js → component-shared-BjwFh5Jq.js} +2 -2
  3. package/dist/cjs/development/{component-shared-Cug2Y5YZ.js.map → component-shared-BjwFh5Jq.js.map} +1 -1
  4. package/dist/cjs/development/config-D6wyrhrW.js +58 -0
  5. package/dist/cjs/development/config-D6wyrhrW.js.map +1 -0
  6. package/dist/cjs/development/config.js +1 -1
  7. package/dist/cjs/development/{debug-C46WDxhL.js → debug-CbAX7VeM.js} +260 -43
  8. package/dist/cjs/development/debug-CbAX7VeM.js.map +1 -0
  9. package/dist/cjs/development/debug.js +3 -1
  10. package/dist/cjs/development/debug.js.map +1 -1
  11. package/dist/cjs/development/index.js +3 -2
  12. package/dist/cjs/development/index.js.map +1 -1
  13. package/dist/cjs/development/react/index.js +399 -52
  14. package/dist/cjs/development/react/index.js.map +1 -1
  15. package/dist/cjs/development/react/index.server.js +2 -2
  16. package/dist/cjs/development/react/index.server.js.map +1 -1
  17. package/dist/cjs/development/react/server.js +1 -1
  18. package/dist/cjs/development/{snapshot-CbZ6IH3B.js → snapshot-BTMVSd8Y.js} +4 -2
  19. package/dist/cjs/development/snapshot-BTMVSd8Y.js.map +1 -0
  20. package/dist/cjs/development/transform/index.js +5 -2
  21. package/dist/cjs/development/transform/index.js.map +1 -1
  22. package/dist/cjs/development/utils.js +34 -2
  23. package/dist/cjs/development/utils.js.map +1 -1
  24. package/dist/cjs/production/{component-shared-D0J85PUi.js → component-shared-CcxyLg4p.js} +2 -2
  25. package/dist/cjs/production/{component-shared-D0J85PUi.js.map → component-shared-CcxyLg4p.js.map} +1 -1
  26. package/dist/cjs/production/config-BHvmcsLQ.js +52 -0
  27. package/dist/cjs/production/config-BHvmcsLQ.js.map +1 -0
  28. package/dist/cjs/production/config.js +1 -1
  29. package/dist/cjs/production/{contexts-CM3QLfV8.js → contexts-waczQzHZ.js} +260 -43
  30. package/dist/cjs/production/contexts-waczQzHZ.js.map +1 -0
  31. package/dist/cjs/production/debug.js +3 -1
  32. package/dist/cjs/production/debug.js.map +1 -1
  33. package/dist/cjs/production/index.js +3 -2
  34. package/dist/cjs/production/index.js.map +1 -1
  35. package/dist/cjs/production/react/index.js +399 -52
  36. package/dist/cjs/production/react/index.js.map +1 -1
  37. package/dist/cjs/production/react/index.server.js +2 -2
  38. package/dist/cjs/production/react/index.server.js.map +1 -1
  39. package/dist/cjs/production/react/server.js +1 -1
  40. package/dist/cjs/production/{snapshot-DWwH7_9y.js → snapshot-7264bWj1.js} +4 -2
  41. package/dist/cjs/production/snapshot-7264bWj1.js.map +1 -0
  42. package/dist/cjs/production/transform/index.js +5 -2
  43. package/dist/cjs/production/transform/index.js.map +1 -1
  44. package/dist/cjs/production/utils.js +34 -2
  45. package/dist/cjs/production/utils.js.map +1 -1
  46. package/dist/esm/config.d.ts +1 -1
  47. package/dist/esm/config.d.ts.map +1 -1
  48. package/dist/esm/debug.d.ts +1 -0
  49. package/dist/esm/debug.d.ts.map +1 -1
  50. package/dist/esm/development/{component-shared-CLSmdnGU.js → component-shared-B3Q6mIzY.js} +2 -2
  51. package/dist/esm/development/{component-shared-CLSmdnGU.js.map → component-shared-B3Q6mIzY.js.map} +1 -1
  52. package/dist/esm/development/config-CQLKpPRj.js +59 -0
  53. package/dist/esm/development/config-CQLKpPRj.js.map +1 -0
  54. package/dist/esm/development/config.js +2 -2
  55. package/dist/esm/development/{debug-BTLbgTPK.js → debug-C3HD8WcT.js} +288 -71
  56. package/dist/esm/development/debug-C3HD8WcT.js.map +1 -0
  57. package/dist/esm/development/debug.js +12 -10
  58. package/dist/esm/development/index.js +18 -17
  59. package/dist/esm/development/react/index.js +400 -53
  60. package/dist/esm/development/react/index.js.map +1 -1
  61. package/dist/esm/development/react/index.server.js +2 -2
  62. package/dist/esm/development/react/index.server.js.map +1 -1
  63. package/dist/esm/development/react/server.js +1 -1
  64. package/dist/esm/development/{snapshot-CkndI4Hh.js → snapshot-CCKlBy-y.js} +7 -5
  65. package/dist/esm/development/snapshot-CCKlBy-y.js.map +1 -0
  66. package/dist/esm/development/transform/index.js +5 -2
  67. package/dist/esm/development/transform/index.js.map +1 -1
  68. package/dist/esm/development/utils.js +38 -6
  69. package/dist/esm/development/utils.js.map +1 -1
  70. package/dist/esm/index.d.ts +2 -2
  71. package/dist/esm/index.d.ts.map +1 -1
  72. package/dist/esm/internals/async.d.ts.map +1 -1
  73. package/dist/esm/internals/config.d.ts +40 -0
  74. package/dist/esm/internals/config.d.ts.map +1 -1
  75. package/dist/esm/internals/lease.d.ts +30 -0
  76. package/dist/esm/internals/lease.d.ts.map +1 -0
  77. package/dist/esm/internals/reactive.d.ts +18 -1
  78. package/dist/esm/internals/reactive.d.ts.map +1 -1
  79. package/dist/esm/internals/scheduling.d.ts +2 -1
  80. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  81. package/dist/esm/internals/utils/hash.d.ts +7 -0
  82. package/dist/esm/internals/utils/hash.d.ts.map +1 -1
  83. package/dist/esm/internals/utils/snapshot.d.ts +2 -0
  84. package/dist/esm/internals/utils/snapshot.d.ts.map +1 -1
  85. package/dist/esm/internals/watch.d.ts +3 -2
  86. package/dist/esm/internals/watch.d.ts.map +1 -1
  87. package/dist/esm/production/{component-shared-Dva0S5e3.js → component-shared-CycOXiis.js} +2 -2
  88. package/dist/esm/production/{component-shared-Dva0S5e3.js.map → component-shared-CycOXiis.js.map} +1 -1
  89. package/dist/esm/production/config-BhtwQYAN.js +53 -0
  90. package/dist/esm/production/config-BhtwQYAN.js.map +1 -0
  91. package/dist/esm/production/config.js +2 -2
  92. package/dist/esm/production/{contexts-FxCndlvf.js → contexts-ry5lvNSx.js} +291 -74
  93. package/dist/esm/production/contexts-ry5lvNSx.js.map +1 -0
  94. package/dist/esm/production/debug.js +3 -1
  95. package/dist/esm/production/index.js +19 -18
  96. package/dist/esm/production/react/index.js +400 -53
  97. package/dist/esm/production/react/index.js.map +1 -1
  98. package/dist/esm/production/react/index.server.js +2 -2
  99. package/dist/esm/production/react/index.server.js.map +1 -1
  100. package/dist/esm/production/react/server.js +1 -1
  101. package/dist/esm/production/{snapshot-CdCaJJ0L.js → snapshot-1d_HVP3L.js} +7 -5
  102. package/dist/esm/production/snapshot-1d_HVP3L.js.map +1 -0
  103. package/dist/esm/production/transform/index.js +5 -2
  104. package/dist/esm/production/transform/index.js.map +1 -1
  105. package/dist/esm/production/utils.js +39 -7
  106. package/dist/esm/production/utils.js.map +1 -1
  107. package/dist/esm/react/async-component.d.ts +10 -2
  108. package/dist/esm/react/async-component.d.ts.map +1 -1
  109. package/dist/esm/react/component-server.d.ts +6 -2
  110. package/dist/esm/react/component-server.d.ts.map +1 -1
  111. package/dist/esm/react/component.d.ts +5 -2
  112. package/dist/esm/react/component.d.ts.map +1 -1
  113. package/dist/esm/react/delivery.d.ts +107 -0
  114. package/dist/esm/react/delivery.d.ts.map +1 -0
  115. package/dist/esm/react/index.d.ts +3 -2
  116. package/dist/esm/react/index.d.ts.map +1 -1
  117. package/dist/esm/react/pause-signals-context.d.ts +16 -2
  118. package/dist/esm/react/pause-signals-context.d.ts.map +1 -1
  119. package/dist/esm/react/props-hash.d.ts +20 -0
  120. package/dist/esm/react/props-hash.d.ts.map +1 -0
  121. package/dist/esm/react/use-reactive.d.ts +6 -3
  122. package/dist/esm/react/use-reactive.d.ts.map +1 -1
  123. package/dist/esm/transform/async.d.ts.map +1 -1
  124. package/dist/esm/transform/callback.d.ts.map +1 -1
  125. package/dist/esm/transform/promise.d.ts.map +1 -1
  126. package/dist/esm/transform/use-reactive.d.ts.map +1 -1
  127. package/dist/esm/transform/utils.d.ts +1 -1
  128. package/dist/esm/transform/utils.d.ts.map +1 -1
  129. package/dist/esm/types.d.ts +20 -1
  130. package/dist/esm/types.d.ts.map +1 -1
  131. package/dist/esm/utils.d.ts +17 -1
  132. package/dist/esm/utils.d.ts.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/cjs/development/config-B0MtLBgx.js +0 -21
  135. package/dist/cjs/development/config-B0MtLBgx.js.map +0 -1
  136. package/dist/cjs/development/debug-C46WDxhL.js.map +0 -1
  137. package/dist/cjs/development/snapshot-CbZ6IH3B.js.map +0 -1
  138. package/dist/cjs/production/config-B0MtLBgx.js +0 -21
  139. package/dist/cjs/production/config-B0MtLBgx.js.map +0 -1
  140. package/dist/cjs/production/contexts-CM3QLfV8.js.map +0 -1
  141. package/dist/cjs/production/snapshot-DWwH7_9y.js.map +0 -1
  142. package/dist/esm/development/config-CPQL7hX-.js +0 -22
  143. package/dist/esm/development/config-CPQL7hX-.js.map +0 -1
  144. package/dist/esm/development/debug-BTLbgTPK.js.map +0 -1
  145. package/dist/esm/development/snapshot-CkndI4Hh.js.map +0 -1
  146. package/dist/esm/production/config-CPQL7hX-.js +0 -22
  147. package/dist/esm/production/config-CPQL7hX-.js.map +0 -1
  148. package/dist/esm/production/contexts-FxCndlvf.js.map +0 -1
  149. package/dist/esm/production/snapshot-CdCaJJ0L.js.map +0 -1
@@ -1,3 +1,10 @@
1
+ /** One MurmurHash3 block round: mixes the 32-bit block `k` into `h`. */
2
+ export declare function mixHash(h: number, k: number): number;
3
+ /** MurmurHash3 finalization over `length` blocks. */
4
+ export declare function finalizeHash(h: number, length: number): number;
5
+ /** `hashObject` over keys the caller already has; `obj` must be on `seen`. */
6
+ export declare function hashObjectKeys(obj: object, keys: string[], seen: unknown[]): number;
7
+ export declare const ARRAY_SEED: number;
1
8
  export declare const registerCustomHash: <T>(ctor: new (...args: any[]) => T, hashFn: (obj: T) => number) => void;
2
9
  export declare function hashValue(node: unknown, seen?: unknown[]): number;
3
10
  export declare function getObjectHash(obj: object): number;
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../src/internals/utils/hash.ts"],"names":[],"mappings":"AAyLA,eAAO,MAAM,kBAAkB,GAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,SAEhG,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,OAAO,EAAO,UAsC5D;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAKD,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAW3D"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../src/internals/utils/hash.ts"],"names":[],"mappings":"AA+EA,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAc3C;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAYrD;AAgBD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAS1E;AAqDD,eAAO,MAAM,UAAU,QAAmC,CAAC;AAgB3D,eAAO,MAAM,kBAAkB,GAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,SAEhG,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,OAAO,EAAO,UAsC5D;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAKD,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAW3D"}
@@ -1,4 +1,6 @@
1
1
  export type SnapshotFn = (current: unknown, prev: unknown) => unknown;
2
+ export declare function snapshotArray(current: unknown[], prev: unknown, snap: SnapshotFn): unknown[];
3
+ export declare function snapshotPlainObject(current: Record<string, unknown>, prev: unknown, snap: SnapshotFn): Record<string, unknown>;
2
4
  /**
3
5
  * Register a custom snapshot function for instances of a class.
4
6
  * The function receives the current value, the previous snapshot (or undefined),
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../../src/internals/utils/snapshot.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAkJtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,QAC/C,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,cACnB,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,KAAK,CAAC,KACvE,IAUF,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAuB3E"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../../src/internals/utils/snapshot.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAMtE,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,CAa5F;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,UAAU,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAsGD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,QAC/C,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,cACnB,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,KAAK,CAAC,KACvE,IAUF,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAuB3E"}
@@ -1,6 +1,7 @@
1
1
  import { ReactiveSignal } from './reactive.js';
2
+ import type { DeactivateOptions } from '../types.js';
2
3
  export declare function watchSignal(signal: ReactiveSignal<any, any>): void;
3
- export declare function unwatchSignal(signal: ReactiveSignal<any, any>): void;
4
+ export declare function unwatchSignal(signal: ReactiveSignal<any, any>, options?: DeactivateOptions): void;
4
5
  export declare function activateSignal(signal: ReactiveSignal<any, any>): void;
5
- export declare function deactivateSignal(signal: ReactiveSignal<any, any>): void;
6
+ export declare function deactivateSignal(signal: ReactiveSignal<any, any>, options?: DeactivateOptions): void;
6
7
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/internals/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,eAAe,CAAC;AAIxD,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAelE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,QAS7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAQrE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,QAehE"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/internals/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAelE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAE,iBAAsB,QAS9F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAQrE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAE,iBAAsB,QAejG"}
@@ -1,4 +1,4 @@
1
- import { g as getCurrentScope, c as createReactiveSignal, a as generatorResultToPromiseWithConsumer, b as setCurrentConsumer, d as getCurrentConsumer } from "./contexts-FxCndlvf.js";
1
+ import { a as getCurrentScope, c as createReactiveSignal, b as generatorResultToPromiseWithConsumer, d as setCurrentConsumer, e as getCurrentConsumer } from "./contexts-ry5lvNSx.js";
2
2
  function isGeneratorFunction(fn) {
3
3
  return typeof fn === "function" && fn.constructor?.name === "GeneratorFunction";
4
4
  }
@@ -31,4 +31,4 @@ export {
31
31
  createServerAsyncComponentWrapper as c,
32
32
  isAsyncFunctionWithoutTransform as i
33
33
  };
34
- //# sourceMappingURL=component-shared-Dva0S5e3.js.map
34
+ //# sourceMappingURL=component-shared-CycOXiis.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-shared-Dva0S5e3.js","sources":["../../../.tsc-out/react/component-shared.js"],"sourcesContent":["import { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { getCurrentScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { generatorResultToPromiseWithConsumer } from '../internals/generators.js';\nexport function isGeneratorFunction(fn) {\n return (typeof fn === 'function' && fn.constructor?.name === 'GeneratorFunction');\n}\nexport function isAsyncFunctionWithoutTransform(fn) {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n/**\n * Wrap a Babel-transformed async generator in a real `async function` that drives it\n * with {@link generatorResultToPromiseWithConsumer}. Used on the server (RSC + SSR)\n * where hooks-based Suspense replay is not appropriate.\n */\nexport function createServerAsyncComponentWrapper(fn) {\n return async function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n return generatorResultToPromiseWithConsumer(fn(props), owned);\n };\n}\n/**\n * Wrap a sync render function with consumer/scope tracking. Used by the server\n * `component()` for non-generator definitions.\n */\nexport function createServerSyncComponentWrapper(fn) {\n return function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(owned);\n return fn(props);\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n };\n}\n"],"names":[],"mappings":";AAIO,SAAS,oBAAoB,IAAI;AACpC,SAAQ,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AACjE;AACO,SAAS,gCAAgC,IAAI;AAChD,SAAO,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AAChE;AAMO,SAAS,kCAAkC,IAAI;AAClD,SAAO,eAAgB,OAAO;AAC1B,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,WAAO,qCAAqC,GAAG,KAAK,GAAG,KAAK;AAAA,EAChE;AACJ;AAKO,SAAS,iCAAiC,IAAI;AACjD,SAAO,SAAU,OAAO;AACpB,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,UAAM,eAAe,mBAAkB;AACvC,QAAI;AACA,yBAAmB,KAAK;AACxB,aAAO,GAAG,KAAK;AAAA,IACnB,UACR;AACY,yBAAmB,YAAY;AAAA,IACnC;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"component-shared-CycOXiis.js","sources":["../../../.tsc-out/react/component-shared.js"],"sourcesContent":["import { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { getCurrentScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { generatorResultToPromiseWithConsumer } from '../internals/generators.js';\nexport function isGeneratorFunction(fn) {\n return (typeof fn === 'function' && fn.constructor?.name === 'GeneratorFunction');\n}\nexport function isAsyncFunctionWithoutTransform(fn) {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n/**\n * Wrap a Babel-transformed async generator in a real `async function` that drives it\n * with {@link generatorResultToPromiseWithConsumer}. Used on the server (RSC + SSR)\n * where hooks-based Suspense replay is not appropriate.\n */\nexport function createServerAsyncComponentWrapper(fn) {\n return async function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n return generatorResultToPromiseWithConsumer(fn(props), owned);\n };\n}\n/**\n * Wrap a sync render function with consumer/scope tracking. Used by the server\n * `component()` for non-generator definitions.\n */\nexport function createServerSyncComponentWrapper(fn) {\n return function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(owned);\n return fn(props);\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n };\n}\n"],"names":[],"mappings":";AAIO,SAAS,oBAAoB,IAAI;AACpC,SAAQ,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AACjE;AACO,SAAS,gCAAgC,IAAI;AAChD,SAAO,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AAChE;AAMO,SAAS,kCAAkC,IAAI;AAClD,SAAO,eAAgB,OAAO;AAC1B,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,WAAO,qCAAqC,GAAG,KAAK,GAAG,KAAK;AAAA,EAChE;AACJ;AAKO,SAAS,iCAAiC,IAAI;AACjD,SAAO,SAAU,OAAO;AACpB,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,UAAM,eAAe,mBAAkB;AACvC,QAAI;AACA,yBAAmB,KAAK;AACxB,aAAO,GAAG,KAAK;AAAA,IACnB,UACR;AACY,yBAAmB,YAAY;AAAA,IACnC;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,53 @@
1
+ let _scheduleFlush = (flushWatchers) => {
2
+ setTimeout(() => {
3
+ flushWatchers();
4
+ }, 0);
5
+ };
6
+ let _runBatch = (fn) => fn();
7
+ const DEFAULT_RENDER_LEASE_TTL = 1e4;
8
+ let _renderLeaseTtl = DEFAULT_RENDER_LEASE_TTL;
9
+ const MAX_TIMEOUT = 2 ** 31 - 1;
10
+ function validateRenderLeaseTtl(ttl) {
11
+ if (typeof ttl !== "number" || Number.isNaN(ttl) || ttl <= 0) {
12
+ return _renderLeaseTtl;
13
+ }
14
+ if (ttl > MAX_TIMEOUT) {
15
+ return MAX_TIMEOUT;
16
+ }
17
+ return ttl;
18
+ }
19
+ let _reactDelivery = "sync";
20
+ const resolvedPromise = Promise.resolve();
21
+ let _scheduleReactDelivery = (fn) => {
22
+ resolvedPromise.then(fn);
23
+ };
24
+ function setConfig(cfg) {
25
+ _scheduleFlush = cfg.scheduleFlush ?? _scheduleFlush;
26
+ _runBatch = cfg.runBatch ?? _runBatch;
27
+ if (cfg.renderLeaseTtl !== void 0) {
28
+ _renderLeaseTtl = validateRenderLeaseTtl(cfg.renderLeaseTtl);
29
+ }
30
+ _reactDelivery = cfg.reactDelivery ?? _reactDelivery;
31
+ _scheduleReactDelivery = cfg.scheduleReactDelivery ?? _scheduleReactDelivery;
32
+ }
33
+ const scheduleFlush = (fn) => {
34
+ _scheduleFlush(fn);
35
+ };
36
+ const runBatch = (fn) => {
37
+ _runBatch(fn);
38
+ };
39
+ const getRenderLeaseTtl = () => _renderLeaseTtl;
40
+ const getReactDelivery = () => _reactDelivery;
41
+ const scheduleReactDelivery = (fn) => {
42
+ _scheduleReactDelivery(fn);
43
+ };
44
+ export {
45
+ MAX_TIMEOUT as M,
46
+ scheduleFlush as a,
47
+ getRenderLeaseTtl as b,
48
+ setConfig as c,
49
+ getReactDelivery as g,
50
+ runBatch as r,
51
+ scheduleReactDelivery as s
52
+ };
53
+ //# sourceMappingURL=config-BhtwQYAN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BhtwQYAN.js","sources":["../../../.tsc-out/internals/config.js"],"sourcesContent":["let _scheduleFlush = flushWatchers => {\n setTimeout(() => {\n flushWatchers();\n }, 0);\n};\nlet _runBatch = fn => fn();\n/** Default render lease TTL (ms). It must outlive a transition render, which React caps at 5 s. */\nexport const DEFAULT_RENDER_LEASE_TTL = 10_000;\nlet _renderLeaseTtl = DEFAULT_RENDER_LEASE_TTL;\n/** The longest `setTimeout` delay (2^31 - 1 ms); longer ones fire immediately. */\nexport const MAX_TIMEOUT = 2 ** 31 - 1;\nfunction validateRenderLeaseTtl(ttl) {\n if (typeof ttl !== 'number' || Number.isNaN(ttl) || ttl <= 0) {\n if (IS_DEV) {\n console.warn(`signalium: setConfig({ renderLeaseTtl: ${String(ttl)} }) ignored; it must be a positive number of milliseconds.`);\n }\n return _renderLeaseTtl;\n }\n if (ttl > MAX_TIMEOUT) {\n if (IS_DEV) {\n console.warn(`signalium: setConfig({ renderLeaseTtl: ${String(ttl)} }) clamped to ${MAX_TIMEOUT} ms, the longest timer delay.`);\n }\n return MAX_TIMEOUT;\n }\n return ttl;\n}\nlet _reactDelivery = 'sync';\nconst resolvedPromise = Promise.resolve();\nlet _scheduleReactDelivery = fn => {\n resolvedPromise.then(fn);\n};\nexport function setConfig(cfg) {\n _scheduleFlush = cfg.scheduleFlush ?? _scheduleFlush;\n _runBatch = cfg.runBatch ?? _runBatch;\n if (cfg.renderLeaseTtl !== undefined) {\n _renderLeaseTtl = validateRenderLeaseTtl(cfg.renderLeaseTtl);\n }\n _reactDelivery = cfg.reactDelivery ?? _reactDelivery;\n _scheduleReactDelivery = cfg.scheduleReactDelivery ?? _scheduleReactDelivery;\n}\nexport const scheduleFlush = (fn) => {\n _scheduleFlush(fn);\n};\nexport const runBatch = (fn) => {\n _runBatch(fn);\n};\nexport const getRenderLeaseTtl = () => _renderLeaseTtl;\nexport const getReactDelivery = () => _reactDelivery;\nexport const scheduleReactDelivery = (fn) => {\n _scheduleReactDelivery(fn);\n};\n"],"names":[],"mappings":"AAAA,IAAI,iBAAiB,CAAA,kBAAiB;AAClC,aAAW,MAAM;AACb,kBAAA;AAAA,EACJ,GAAG,CAAC;AACR;AACA,IAAI,YAAY,QAAM,GAAA;AAEf,MAAM,2BAA2B;AACxC,IAAI,kBAAkB;AAEf,MAAM,cAAc,KAAK,KAAK;AACrC,SAAS,uBAAuB,KAAK;AACjC,MAAI,OAAO,QAAQ,YAAY,OAAO,MAAM,GAAG,KAAK,OAAO,GAAG;AAI1D,WAAO;AAAA,EACX;AACA,MAAI,MAAM,aAAa;AAInB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AACA,IAAI,iBAAiB;AACrB,MAAM,kBAAkB,QAAQ,QAAA;AAChC,IAAI,yBAAyB,CAAA,OAAM;AAC/B,kBAAgB,KAAK,EAAE;AAC3B;AACO,SAAS,UAAU,KAAK;AAC3B,mBAAiB,IAAI,iBAAiB;AACtC,cAAY,IAAI,YAAY;AAC5B,MAAI,IAAI,mBAAmB,QAAW;AAClC,sBAAkB,uBAAuB,IAAI,cAAc;AAAA,EAC/D;AACA,mBAAiB,IAAI,iBAAiB;AACtC,2BAAyB,IAAI,yBAAyB;AAC1D;AACO,MAAM,gBAAgB,CAAC,OAAO;AACjC,iBAAe,EAAE;AACrB;AACO,MAAM,WAAW,CAAC,OAAO;AAC5B,YAAU,EAAE;AAChB;AACO,MAAM,oBAAoB,MAAM;AAChC,MAAM,mBAAmB,MAAM;AAC/B,MAAM,wBAAwB,CAAC,OAAO;AACzC,yBAAuB,EAAE;AAC7B;"}
@@ -1,5 +1,5 @@
1
- import { a } from "./config-CPQL7hX-.js";
1
+ import { c } from "./config-BhtwQYAN.js";
2
2
  export {
3
- a as setConfig
3
+ c as setConfig
4
4
  };
5
5
  //# sourceMappingURL=config.js.map
@@ -1,4 +1,4 @@
1
- import { s as scheduleFlush$1, r as runBatch } from "./config-CPQL7hX-.js";
1
+ import { a as scheduleFlush$1, r as runBatch, b as getRenderLeaseTtl, M as MAX_TIMEOUT } from "./config-BhtwQYAN.js";
2
2
  let CURRENT_CONSUMER;
3
3
  const setCurrentConsumer = (consumer) => {
4
4
  CURRENT_CONSUMER = consumer;
@@ -99,12 +99,12 @@ function watchSignal(signal2) {
99
99
  }
100
100
  activateSignal(signal2);
101
101
  }
102
- function unwatchSignal(signal2) {
102
+ function unwatchSignal(signal2, options = {}) {
103
103
  const { watchCount } = signal2;
104
104
  const newWatchCount = Math.max(watchCount - 1, 0);
105
105
  signal2.watchCount = newWatchCount;
106
106
  if (newWatchCount === 0) {
107
- scheduleDeactivate(signal2);
107
+ scheduleDeactivate(signal2, options);
108
108
  }
109
109
  }
110
110
  function activateSignal(signal2) {
@@ -114,22 +114,22 @@ function activateSignal(signal2) {
114
114
  checkSignal(signal2);
115
115
  }
116
116
  }
117
- function deactivateSignal(signal2) {
117
+ function deactivateSignal(signal2, options = {}) {
118
118
  signal2._isActive = false;
119
119
  for (const dep of signal2.deps.keys()) {
120
120
  const newWatchCount = Math.max(dep.watchCount - 1, 0);
121
121
  dep.watchCount = newWatchCount;
122
122
  if (newWatchCount === 0) {
123
- deactivateSignal(dep);
123
+ deactivateSignal(dep, options);
124
124
  }
125
125
  }
126
126
  if (isRelay(signal2)) {
127
- signal2._value?.();
127
+ signal2._value?.(options);
128
128
  }
129
129
  }
130
130
  let PENDING_PULLS = /* @__PURE__ */ new Set();
131
131
  let PENDING_ASYNC_PULLS = [];
132
- let PENDING_DEACTIVE = /* @__PURE__ */ new Set();
132
+ let PENDING_DEACTIVE = /* @__PURE__ */ new Map();
133
133
  let PENDING_LISTENERS = [];
134
134
  const microtask = () => Promise.resolve();
135
135
  let currentFlush = null;
@@ -152,8 +152,9 @@ const scheduleAsyncPull = (signal2) => {
152
152
  PENDING_ASYNC_PULLS.push(signal2);
153
153
  scheduleFlush();
154
154
  };
155
- const scheduleDeactivate = (signal2) => {
156
- PENDING_DEACTIVE.add(signal2);
155
+ const scheduleDeactivate = (signal2, options = {}) => {
156
+ const existing = PENDING_DEACTIVE.get(signal2);
157
+ PENDING_DEACTIVE.set(signal2, existing === void 0 ? options : { isPausing: Boolean(existing.isPausing && options.isPausing) });
157
158
  scheduleFlush();
158
159
  };
159
160
  const cancelDeactivate = (signal2) => {
@@ -184,8 +185,8 @@ const flushWatchers = async () => {
184
185
  }
185
186
  currentFlush = null;
186
187
  runBatch(() => {
187
- for (const signal2 of PENDING_DEACTIVE) {
188
- deactivateSignal(signal2);
188
+ for (const [signal2, options] of PENDING_DEACTIVE) {
189
+ deactivateSignal(signal2, options);
189
190
  }
190
191
  PENDING_DEACTIVE.clear();
191
192
  for (const signal2 of PENDING_LISTENERS) {
@@ -927,11 +928,11 @@ function createRelay(activate, scope, opts) {
927
928
  const p = new ReactivePromiseImpl();
928
929
  let active = false;
929
930
  let currentSub;
930
- const unsubscribe = () => {
931
+ const unsubscribe = (options) => {
931
932
  if (typeof currentSub === "function") {
932
933
  currentSub();
933
934
  } else if (currentSub !== void 0) {
934
- currentSub.deactivate?.();
935
+ currentSub.deactivate?.(options);
935
936
  }
936
937
  const signal2 = p["_signal"];
937
938
  signal2.subs = /* @__PURE__ */ new Map();
@@ -1203,32 +1204,43 @@ function hashNumber(num, seed = 0) {
1203
1204
  h ^= h >>> 16;
1204
1205
  return h >>> 0;
1205
1206
  }
1206
- function hashArray(arr, seen) {
1207
- let h = ARRAY;
1207
+ function mixHash(h, k) {
1208
1208
  const c1 = 3432918353;
1209
1209
  const c2 = 461845907;
1210
- for (const item of arr) {
1211
- let k = hashValue(item, seen);
1212
- k = imul(k, c1);
1213
- k = k << 15 | k >>> 17;
1214
- k = imul(k, c2);
1215
- h ^= k;
1216
- h = h << 13 | h >>> 19;
1217
- h = imul(h, 5) + 3864292196;
1218
- }
1219
- h ^= arr.length;
1210
+ const n = 3864292196;
1211
+ k = imul(k, c1);
1212
+ k = k << 15 | k >>> 17;
1213
+ k = imul(k, c2);
1214
+ h ^= k;
1215
+ h = h << 13 | h >>> 19;
1216
+ return imul(h, 5) + n | 0;
1217
+ }
1218
+ function finalizeHash(h, length) {
1219
+ const fmix1 = 2246822507;
1220
+ const fmix2 = 3266489909;
1221
+ h ^= length;
1220
1222
  h ^= h >>> 16;
1221
- h = imul(h, 2246822507);
1223
+ h = imul(h, fmix1);
1222
1224
  h ^= h >>> 13;
1223
- h = imul(h, 3266489909);
1225
+ h = imul(h, fmix2);
1224
1226
  h ^= h >>> 16;
1225
1227
  return h >>> 0;
1226
1228
  }
1229
+ function hashArray(arr, seen) {
1230
+ let h = ARRAY_SEED;
1231
+ for (const item of arr) {
1232
+ h = mixHash(h, hashValue(item, seen));
1233
+ }
1234
+ return finalizeHash(h, arr.length);
1235
+ }
1227
1236
  function hashObject(obj, seen) {
1237
+ return hashObjectKeys(obj, Object.keys(obj), seen);
1238
+ }
1239
+ function hashObjectKeys(obj, keys, seen) {
1240
+ const keyMultiplier = 2654435769;
1228
1241
  let sum = OBJECT;
1229
- const keys = Object.keys(obj);
1230
1242
  for (const key of keys) {
1231
- sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(obj[key], seen);
1243
+ sum += imul(hashValue(key, seen), keyMultiplier) ^ hashValue(obj[key], seen);
1232
1244
  }
1233
1245
  return sum >>> 0;
1234
1246
  }
@@ -1240,9 +1252,10 @@ function hashSet(set, seen) {
1240
1252
  return sum >>> 0;
1241
1253
  }
1242
1254
  function hashMap(map, seen) {
1255
+ const keyMultiplier = 2654435769;
1243
1256
  let sum = MAP;
1244
1257
  for (const [key, value] of map) {
1245
- sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(value, seen);
1258
+ sum += imul(hashValue(key, seen), keyMultiplier) ^ hashValue(value, seen);
1246
1259
  }
1247
1260
  return sum >>> 0;
1248
1261
  }
@@ -1281,7 +1294,7 @@ const FALSE = hashStr(
1281
1294
  3
1282
1295
  /* HashType.FALSE */
1283
1296
  );
1284
- const ARRAY = hashStr(
1297
+ const ARRAY_SEED = hashStr(
1285
1298
  "array",
1286
1299
  7
1287
1300
  /* HashType.ARRAY */
@@ -1393,6 +1406,95 @@ function hashReactiveFn(fn, args) {
1393
1406
  h = h << 13 | h >>> 19;
1394
1407
  return imul(h, 5) + 3864292196 >>> 0;
1395
1408
  }
1409
+ let young = /* @__PURE__ */ new Set();
1410
+ let old = /* @__PURE__ */ new Set();
1411
+ let timer;
1412
+ const pinned = /* @__PURE__ */ new Map();
1413
+ const SUSPENDED_LEASE_HOLD_TTLS = 30;
1414
+ function armTimer() {
1415
+ timer = setTimeout(sweepLeases, getRenderLeaseTtl());
1416
+ timer.unref?.();
1417
+ }
1418
+ function sweepLeases() {
1419
+ timer = void 0;
1420
+ const expired = old;
1421
+ for (const signal2 of expired) {
1422
+ signal2._releaseLease();
1423
+ }
1424
+ expired.clear();
1425
+ old = young;
1426
+ young = expired;
1427
+ if (old.size > 0) {
1428
+ armTimer();
1429
+ }
1430
+ }
1431
+ function addLease(signal2) {
1432
+ if (!pinned.delete(signal2)) {
1433
+ old.delete(signal2);
1434
+ }
1435
+ young.add(signal2);
1436
+ if (timer === void 0) {
1437
+ armTimer();
1438
+ }
1439
+ }
1440
+ function removeLease(signal2) {
1441
+ if (!young.delete(signal2) && !old.delete(signal2)) {
1442
+ pinned.delete(signal2);
1443
+ }
1444
+ }
1445
+ function pinLease(signal2) {
1446
+ if (!signal2._isLeased) {
1447
+ return void 0;
1448
+ }
1449
+ young.delete(signal2);
1450
+ old.delete(signal2);
1451
+ const token = {};
1452
+ pinned.set(signal2, token);
1453
+ return token;
1454
+ }
1455
+ function unpinLease(signal2, token) {
1456
+ if (pinned.get(signal2) === token && signal2._isLeased) {
1457
+ addLease(signal2);
1458
+ }
1459
+ }
1460
+ function holdLeaseUntilSettled(signal2, thenable) {
1461
+ const token = pinLease(signal2);
1462
+ if (token === void 0) {
1463
+ return;
1464
+ }
1465
+ const renew = () => unpinLease(signal2, token);
1466
+ thenable.then(renew, renew);
1467
+ }
1468
+ function holdSuspendedLease(signal2) {
1469
+ const token = pinLease(signal2);
1470
+ if (token === void 0) {
1471
+ return;
1472
+ }
1473
+ const hold = setTimeout(() => unpinLease(signal2, token), Math.min(getRenderLeaseTtl() * SUSPENDED_LEASE_HOLD_TTLS, MAX_TIMEOUT));
1474
+ hold.unref?.();
1475
+ }
1476
+ function releaseAbandonedAttempt(signal2) {
1477
+ const token = pinned.get(signal2);
1478
+ if (token !== void 0) {
1479
+ unpinLease(signal2, token);
1480
+ }
1481
+ }
1482
+ function releaseRenderLeases() {
1483
+ if (timer !== void 0) {
1484
+ clearTimeout(timer);
1485
+ timer = void 0;
1486
+ }
1487
+ const leases = [...old, ...young, ...pinned.keys()];
1488
+ old = /* @__PURE__ */ new Set();
1489
+ young = /* @__PURE__ */ new Set();
1490
+ pinned.clear();
1491
+ for (const signal2 of leases) {
1492
+ signal2._releaseLease();
1493
+ }
1494
+ }
1495
+ function getRenderLeaseCount() {
1496
+ return young.size + old.size + pinned.size;
1497
+ }
1396
1498
  let ID = 0;
1397
1499
  function createReactiveDefinition(id, desc, compute, equals, isRelay2, paramKey, tracer) {
1398
1500
  const def = {
@@ -1452,6 +1554,9 @@ class ReactiveSignal {
1452
1554
  this.flags &= -33;
1453
1555
  }
1454
1556
  }
1557
+ get _isLeased() {
1558
+ return (this.flags & 128) !== 0;
1559
+ }
1455
1560
  get _isLazy() {
1456
1561
  return (this.flags & 64) !== 0;
1457
1562
  }
@@ -1466,6 +1571,7 @@ class ReactiveSignal {
1466
1571
  return this._listeners ?? (this._listeners = {
1467
1572
  updatedAt: 0,
1468
1573
  current: /* @__PURE__ */ new Map(),
1574
+ pausedReaders: 0,
1469
1575
  cachedBoundAdd: this.addListener.bind(this)
1470
1576
  });
1471
1577
  }
@@ -1473,7 +1579,8 @@ class ReactiveSignal {
1473
1579
  return getSignal(this);
1474
1580
  }
1475
1581
  addListener(listener, opts) {
1476
- const { current } = this.listeners;
1582
+ const meta = this.listeners;
1583
+ const { current } = meta;
1477
1584
  if (!current.has(listener)) {
1478
1585
  let effective = listener;
1479
1586
  if (opts?.skipInitial) {
@@ -1486,23 +1593,39 @@ class ReactiveSignal {
1486
1593
  listener();
1487
1594
  };
1488
1595
  }
1489
- if (!this._isListener) {
1490
- watchSignal(this);
1491
- this.flags |= 16;
1596
+ const flags = this.flags;
1597
+ current.set(listener, effective);
1598
+ const unpaused = meta.pausedReaders < current.size;
1599
+ if ((flags & 16) === 0) {
1600
+ this.flags = flags | 16;
1601
+ } else if ((flags & 128) !== 0 && (unpaused || (flags & 256) === 0)) {
1602
+ this.flags = flags & -129;
1603
+ removeLease(this);
1604
+ }
1605
+ if (unpaused) {
1606
+ this._takeListenerWatch();
1607
+ } else {
1608
+ this._pauseListenerWatch();
1492
1609
  }
1493
1610
  if (this.watchCount > 0) {
1494
1611
  schedulePull(this);
1495
1612
  }
1496
- current.set(listener, effective);
1497
1613
  }
1498
1614
  return () => {
1499
1615
  if (current.has(listener)) {
1500
1616
  current.delete(listener);
1501
1617
  if (current.size === 0) {
1618
+ const flags = this.flags;
1619
+ if ((flags & 128) !== 0)
1620
+ return;
1502
1621
  cancelPull(this);
1503
- unwatchSignal(this);
1504
- this.flags &= -17;
1505
- this.listeners.updatedAt = 0;
1622
+ this.flags = flags & -273;
1623
+ if ((flags & 256) !== 0) {
1624
+ unwatchSignal(this);
1625
+ }
1626
+ meta.updatedAt = 0;
1627
+ } else if (meta.pausedReaders >= current.size) {
1628
+ this._pauseListenerWatch();
1506
1629
  }
1507
1630
  }
1508
1631
  };
@@ -1510,15 +1633,99 @@ class ReactiveSignal {
1510
1633
  // This method is used in React hooks specifically. It returns a bound add method
1511
1634
  // that is cached to avoid creating a new one on each call, and it eagerly sets
1512
1635
  // the listener as watched so that relays that are accessed will be activated.
1636
+ //
1637
+ // The eager watch is a lease (see `lease.ts`): the commit's subscription claims it, and a
1638
+ // discarded render's lease expires. Each render of a still-leased signal extends it.
1513
1639
  addListenerLazy(watch = true) {
1514
- if (!this._isListener) {
1640
+ const flags = this.flags;
1641
+ if ((flags & 16) === 0) {
1515
1642
  if (watch) {
1516
1643
  watchSignal(this);
1644
+ this.flags |= 16 | 128 | 256;
1645
+ } else {
1646
+ this.flags |= 16 | 128;
1517
1647
  }
1518
- this.flags |= 16;
1648
+ addLease(this);
1649
+ } else if ((flags & 128) !== 0 || watch && (flags & 256) === 0) {
1650
+ if (watch && (flags & 256) === 0) {
1651
+ watchSignal(this);
1652
+ this.flags |= 256;
1653
+ }
1654
+ this.flags |= 128;
1655
+ addLease(this);
1519
1656
  }
1520
1657
  return this.listeners.cachedBoundAdd;
1521
1658
  }
1659
+ /** Drops the listener watch; listeners stay subscribed. */
1660
+ _pauseWatch() {
1661
+ const flags = this.flags;
1662
+ if ((flags & 256) !== 0) {
1663
+ this.flags = flags & -257;
1664
+ unwatchSignal(this, { isPausing: true });
1665
+ }
1666
+ }
1667
+ /** Retakes the listener watch, pulling changes missed while unwatched. */
1668
+ _resumeWatch() {
1669
+ if ((this.flags & 16) !== 0 && this._takeListenerWatch()) {
1670
+ schedulePull(this);
1671
+ }
1672
+ }
1673
+ _takeListenerWatch() {
1674
+ if ((this.flags & 256) !== 0) {
1675
+ return false;
1676
+ }
1677
+ watchSignal(this);
1678
+ this.flags |= 256;
1679
+ return true;
1680
+ }
1681
+ /** `deferred` reconciles in a microtask, for a reader that unregisters before it unsubscribes. */
1682
+ _addPausedReaders(delta, deferred = false) {
1683
+ this.listeners.pausedReaders += delta;
1684
+ if (deferred) {
1685
+ queueMicrotask(() => this._reconcilePausedReaders());
1686
+ } else {
1687
+ this._reconcilePausedReaders();
1688
+ }
1689
+ }
1690
+ _reconcilePausedReaders() {
1691
+ const { current, pausedReaders } = this.listeners;
1692
+ if (current.size === 0)
1693
+ return;
1694
+ if (pausedReaders < current.size) {
1695
+ this._resumeWatch();
1696
+ } else {
1697
+ this._pauseListenerWatch();
1698
+ }
1699
+ }
1700
+ /** Pauses for the listeners' sake; an unclaimed render lease's watch belongs to its render. */
1701
+ _pauseListenerWatch() {
1702
+ if ((this.flags & 128) === 0) {
1703
+ this._pauseWatch();
1704
+ }
1705
+ }
1706
+ /** Releases an unclaimed render lease; a no-op once claimed. */
1707
+ _releaseLease() {
1708
+ const flags = this.flags;
1709
+ if ((flags & 128) === 0) {
1710
+ return;
1711
+ }
1712
+ const meta = this._listeners;
1713
+ if (meta !== null && meta.current.size > 0) {
1714
+ this.flags = flags & -129;
1715
+ if (meta.pausedReaders >= meta.current.size) {
1716
+ this._pauseWatch();
1717
+ }
1718
+ return;
1719
+ }
1720
+ this.flags = flags & -401;
1721
+ if (meta !== null) {
1722
+ meta.updatedAt = 0;
1723
+ }
1724
+ cancelPull(this);
1725
+ if ((flags & 256) !== 0) {
1726
+ unwatchSignal(this);
1727
+ }
1728
+ }
1522
1729
  }
1523
1730
  const runListeners = (signal2) => {
1524
1731
  const { listeners } = signal2;
@@ -1659,41 +1866,51 @@ const getScopeOwner = (obj) => {
1659
1866
  return scope;
1660
1867
  };
1661
1868
  export {
1662
- callback as A,
1663
- settled as B,
1664
- context as C,
1665
- getContext as D,
1666
- withContexts as E,
1667
- setGlobalContexts as F,
1668
- clearGlobalContexts as G,
1669
- setScopeOwner as H,
1869
+ ARRAY_SEED as A,
1870
+ releaseAbandonedAttempt as B,
1871
+ signal as C,
1872
+ watchSignal as D,
1873
+ getSignal as E,
1874
+ unwatchSignal as F,
1875
+ registerCustomHash as G,
1876
+ setReactivePromise as H,
1877
+ notifier as I,
1878
+ isSignal as J,
1879
+ callback as K,
1880
+ settled as L,
1881
+ context as M,
1882
+ getContext as N,
1883
+ withContexts as O,
1884
+ setGlobalContexts as P,
1885
+ clearGlobalContexts as Q,
1670
1886
  ReactivePromise as R,
1671
1887
  SignalScope as S,
1672
- generatorResultToPromiseWithConsumer as a,
1673
- setCurrentConsumer as b,
1888
+ setScopeOwner as T,
1889
+ getCurrentScope as a,
1890
+ generatorResultToPromiseWithConsumer as b,
1674
1891
  createReactiveSignal as c,
1675
- getCurrentConsumer as d,
1676
- setRequestScopeGetter as e,
1677
- createReactiveDefinition as f,
1678
- getCurrentScope as g,
1679
- createTask as h,
1680
- createRelay as i,
1681
- getScopeOwner as j,
1682
- isReactivePromise as k,
1683
- getGlobalScope as l,
1684
- hashValue as m,
1685
- schedulePull as n,
1686
- isPromise as o,
1687
- isThennable as p,
1688
- signal as q,
1689
- runSignal as r,
1892
+ setCurrentConsumer as d,
1893
+ getCurrentConsumer as e,
1894
+ setRequestScopeGetter as f,
1895
+ getRenderLeaseCount as g,
1896
+ createReactiveDefinition as h,
1897
+ createTask as i,
1898
+ createRelay as j,
1899
+ getScopeOwner as k,
1900
+ isReactivePromise as l,
1901
+ getGlobalScope as m,
1902
+ hashValue as n,
1903
+ getObjectHash as o,
1904
+ hashObjectKeys as p,
1905
+ mixHash as q,
1906
+ releaseRenderLeases as r,
1690
1907
  scheduleTracer as s,
1691
- getSignal as t,
1692
- unwatchSignal as u,
1693
- registerCustomHash as v,
1694
- watchSignal as w,
1695
- setReactivePromise as x,
1696
- notifier as y,
1697
- isSignal as z
1908
+ finalizeHash as t,
1909
+ checkSignal as u,
1910
+ isPromise as v,
1911
+ isThennable as w,
1912
+ runSignal as x,
1913
+ holdLeaseUntilSettled as y,
1914
+ holdSuspendedLease as z
1698
1915
  };
1699
- //# sourceMappingURL=contexts-FxCndlvf.js.map
1916
+ //# sourceMappingURL=contexts-ry5lvNSx.js.map