octane 0.2.11 → 0.2.13

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 (264) hide show
  1. package/README.md +5 -0
  2. package/dist/behavior-root.d.ts +13 -3
  3. package/dist/behavior-root.js +28 -5
  4. package/dist/cjs/behavior-root.cjs +32 -6
  5. package/dist/cjs/class-names.cjs +49 -0
  6. package/dist/cjs/constants.cjs +9 -0
  7. package/dist/cjs/context-epoch.cjs +38 -0
  8. package/dist/cjs/css.cjs +6 -27
  9. package/dist/cjs/data-encoding.cjs +160 -0
  10. package/dist/cjs/dom-binding-handoff.cjs +93 -0
  11. package/dist/cjs/dom-binding-protocol.cjs +115 -0
  12. package/dist/cjs/dom-binding-styles.cjs +292 -0
  13. package/dist/cjs/dom-bindings.cjs +700 -0
  14. package/dist/cjs/dom-focused-move.cjs +66 -0
  15. package/dist/cjs/dom-stage.cjs +896 -0
  16. package/dist/cjs/dom-tables.cjs +4 -94
  17. package/dist/cjs/error-codes.client.generated.cjs +33 -0
  18. package/dist/cjs/error-codes.server.generated.cjs +24 -0
  19. package/dist/cjs/hydration/control-capture.cjs +244 -0
  20. package/dist/cjs/hydration/event-capture.cjs +125 -43
  21. package/dist/cjs/hydration/interaction-config.cjs +50 -2
  22. package/dist/cjs/hydration-markers.cjs +37 -0
  23. package/dist/cjs/independent-hydration-protocol.cjs +106 -0
  24. package/dist/cjs/index.cjs +9 -0
  25. package/dist/cjs/runtime.cjs +6397 -1683
  26. package/dist/cjs/runtime.server.cjs +1465 -213
  27. package/dist/cjs/server/early-signals.cjs +45 -0
  28. package/dist/cjs/server/index.cjs +47 -0
  29. package/dist/cjs/server/rpc-batch.cjs +149 -0
  30. package/dist/cjs/server/rpc-stream.cjs +146 -0
  31. package/dist/cjs/server/rpc.cjs +34 -15
  32. package/dist/cjs/server/signal-query-observation.cjs +158 -0
  33. package/dist/cjs/server/streamed-region.cjs +52 -0
  34. package/dist/cjs/server/streamed-signals.cjs +512 -0
  35. package/dist/cjs/server-call.cjs +103 -0
  36. package/dist/cjs/server-rpc-batch-client.cjs +141 -0
  37. package/dist/cjs/server-rpc-client.cjs +94 -27
  38. package/dist/cjs/server-rpc-protocol.cjs +141 -0
  39. package/dist/cjs/server-rpc-stream-client.cjs +118 -0
  40. package/dist/cjs/signals/actions.cjs +474 -0
  41. package/dist/cjs/signals/client.cjs +4 -1
  42. package/dist/cjs/signals/computations.cjs +460 -0
  43. package/dist/cjs/signals/control-binding.cjs +368 -0
  44. package/dist/cjs/signals/derived-facade.cjs +50 -0
  45. package/dist/cjs/signals/document-owner.cjs +71 -0
  46. package/dist/cjs/signals/early-values.cjs +155 -0
  47. package/dist/cjs/signals/encoding.cjs +6 -95
  48. package/dist/cjs/signals/engine.cjs +276 -12
  49. package/dist/cjs/signals/errors.cjs +18 -0
  50. package/dist/cjs/signals/facade.cjs +477 -0
  51. package/dist/cjs/signals/graph.cjs +166 -20
  52. package/dist/cjs/signals/handle-protocol.cjs +36 -0
  53. package/dist/cjs/signals/index.cjs +81 -2
  54. package/dist/cjs/signals/native-read-client.cjs +10 -0
  55. package/dist/cjs/signals/owner-context.cjs +112 -0
  56. package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
  57. package/dist/cjs/signals/query-facade.cjs +72 -0
  58. package/dist/cjs/signals/read-protocol.cjs +54 -0
  59. package/dist/cjs/signals/requests.cjs +287 -14
  60. package/dist/cjs/signals/scalar-computations.cjs +76 -0
  61. package/dist/cjs/signals/server.cjs +4 -1
  62. package/dist/cjs/signals/transition-candidate.cjs +567 -0
  63. package/dist/cjs/signals/transition-state.cjs +106 -0
  64. package/dist/cjs/signals/types.cjs +50 -0
  65. package/dist/cjs/stream-protocol.cjs +3 -0
  66. package/dist/cjs/streamed-signals-protocol.cjs +159 -0
  67. package/dist/cjs/style-values.cjs +122 -0
  68. package/dist/cjs/trusted-html.cjs +30 -0
  69. package/dist/cjs/version.cjs +1 -1
  70. package/dist/class-names.d.ts +5 -0
  71. package/dist/class-names.js +25 -0
  72. package/dist/compiler/bundler.js +51 -22
  73. package/dist/compiler/compile.js +2534 -581
  74. package/dist/compiler/dom-binding-program.js +935 -0
  75. package/dist/compiler/dom-binding-request.js +57 -0
  76. package/dist/compiler/dom-bindings.js +2245 -0
  77. package/dist/compiler/hook-deps.js +759 -10
  78. package/dist/compiler/hydrate-boundaries.js +358 -15
  79. package/dist/compiler/index.d.ts +39 -2
  80. package/dist/compiler/index.js +1 -0
  81. package/dist/compiler/native-attribute-reads.js +127 -0
  82. package/dist/compiler/native-change-diagnostics.js +32 -38
  83. package/dist/compiler/native-read-diagnostics.js +69 -8
  84. package/dist/compiler/native-read-types.js +80 -34
  85. package/dist/compiler/parser.node.js +1 -1
  86. package/dist/compiler/renderer-boundaries.js +40 -0
  87. package/dist/compiler/server-context.js +118 -0
  88. package/dist/compiler/signal-attempt-reads.js +479 -0
  89. package/dist/compiler/signal-declarations.js +557 -0
  90. package/dist/compiler/signal-start-reads.js +413 -0
  91. package/dist/compiler/slot-hooks.d.ts +3 -1
  92. package/dist/compiler/slot-hooks.js +168 -34
  93. package/dist/compiler/strong-auto-memo.js +90 -0
  94. package/dist/compiler/strong-html.js +143 -0
  95. package/dist/compiler/strong-mode.js +764 -66
  96. package/dist/compiler/strong-template-policy.js +307 -0
  97. package/dist/compiler/template-ir.js +200 -0
  98. package/dist/compiler/typescript.d.ts +2 -0
  99. package/dist/compiler/typescript.js +2 -0
  100. package/dist/compiler/vite.d.ts +3 -1
  101. package/dist/compiler/vite.js +122 -4
  102. package/dist/compiler/volar.LICENSES.txt +1 -1
  103. package/dist/compiler/volar.d.ts +6 -1
  104. package/dist/compiler/volar.js +750 -1433
  105. package/dist/constants.d.ts +1 -0
  106. package/dist/constants.js +10 -0
  107. package/dist/context-epoch.d.ts +2 -0
  108. package/dist/context-epoch.js +13 -0
  109. package/dist/css.d.ts +2 -5
  110. package/dist/css.js +2 -23
  111. package/dist/data-encoding.d.ts +9 -0
  112. package/dist/data-encoding.js +134 -0
  113. package/dist/dom-binding-classes.d.ts +15 -0
  114. package/dist/dom-binding-classes.js +129 -0
  115. package/dist/dom-binding-controls.d.ts +2 -0
  116. package/dist/dom-binding-controls.js +6 -0
  117. package/dist/dom-binding-handoff.d.ts +55 -0
  118. package/dist/dom-binding-handoff.js +62 -0
  119. package/dist/dom-binding-program.d.ts +300 -0
  120. package/dist/dom-binding-program.js +1625 -0
  121. package/dist/dom-binding-projections.d.ts +15 -0
  122. package/dist/dom-binding-projections.js +187 -0
  123. package/dist/dom-binding-protocol.d.ts +13 -0
  124. package/dist/dom-binding-protocol.js +88 -0
  125. package/dist/dom-binding-signals.d.ts +21 -0
  126. package/dist/dom-binding-signals.js +109 -0
  127. package/dist/dom-binding-styles.d.ts +17 -0
  128. package/dist/dom-binding-styles.js +272 -0
  129. package/dist/dom-bindings.d.ts +89 -0
  130. package/dist/dom-bindings.js +670 -0
  131. package/dist/dom-focused-move.d.ts +6 -0
  132. package/dist/dom-focused-move.js +42 -0
  133. package/dist/dom-stage.d.ts +52 -0
  134. package/dist/dom-stage.js +872 -0
  135. package/dist/dom-tables.d.ts +1 -3
  136. package/dist/dom-tables.js +1 -91
  137. package/dist/error-codes.client.generated.d.ts +9 -0
  138. package/dist/error-codes.client.generated.js +33 -0
  139. package/dist/error-codes.server.generated.d.ts +6 -0
  140. package/dist/error-codes.server.generated.js +24 -0
  141. package/dist/hydration/control-capture.d.ts +62 -0
  142. package/dist/hydration/control-capture.js +223 -0
  143. package/dist/hydration/document-lifecycle.d.ts +23 -0
  144. package/dist/hydration/document-lifecycle.js +80 -0
  145. package/dist/hydration/event-capture.d.ts +20 -1
  146. package/dist/hydration/event-capture.js +128 -42
  147. package/dist/hydration/independent-island.d.ts +45 -0
  148. package/dist/hydration/independent-island.js +233 -0
  149. package/dist/hydration/index.d.ts +8 -1
  150. package/dist/hydration/index.js +55 -1
  151. package/dist/hydration/interaction-config.d.ts +5 -0
  152. package/dist/hydration/interaction-config.js +44 -1
  153. package/dist/hydration/stream-delivery.d.ts +32 -0
  154. package/dist/hydration/stream-delivery.js +333 -0
  155. package/dist/hydration/stream-receiver.d.ts +26 -0
  156. package/dist/hydration/stream-receiver.js +204 -0
  157. package/dist/hydration/stream-result-receiver.d.ts +70 -0
  158. package/dist/hydration/stream-result-receiver.js +246 -0
  159. package/dist/hydration/streamed-signals.d.ts +44 -0
  160. package/dist/hydration/streamed-signals.js +186 -0
  161. package/dist/hydration/types.d.ts +6 -0
  162. package/dist/hydration-markers.d.ts +7 -0
  163. package/dist/hydration-markers.js +10 -0
  164. package/dist/independent-hydration-protocol.d.ts +31 -0
  165. package/dist/independent-hydration-protocol.js +80 -0
  166. package/dist/index.d.ts +3 -0
  167. package/dist/index.js +6 -0
  168. package/dist/internal/signal-read.d.ts +1 -0
  169. package/dist/internal/signal-read.js +4 -0
  170. package/dist/jsx-runtime-strong.d.ts +33 -0
  171. package/dist/jsx-runtime.d.ts +58 -2
  172. package/dist/public-types.d.ts +15 -1
  173. package/dist/runtime.d.ts +297 -23
  174. package/dist/runtime.js +6405 -1679
  175. package/dist/runtime.server.d.ts +110 -27
  176. package/dist/runtime.server.js +1458 -213
  177. package/dist/server/early-signals.d.ts +14 -0
  178. package/dist/server/early-signals.js +34 -0
  179. package/dist/server/index.d.ts +11 -2
  180. package/dist/server/index.js +50 -1
  181. package/dist/server/rpc-batch.d.ts +17 -0
  182. package/dist/server/rpc-batch.js +129 -0
  183. package/dist/server/rpc-stream.d.ts +9 -0
  184. package/dist/server/rpc-stream.js +125 -0
  185. package/dist/server/rpc.d.ts +5 -1
  186. package/dist/server/rpc.js +37 -13
  187. package/dist/server/signal-query-observation.d.ts +3 -0
  188. package/dist/server/signal-query-observation.js +134 -0
  189. package/dist/server/streamed-region.d.ts +15 -0
  190. package/dist/server/streamed-region.js +30 -0
  191. package/dist/server/streamed-signals.d.ts +45 -0
  192. package/dist/server/streamed-signals.js +488 -0
  193. package/dist/server-call.d.ts +41 -0
  194. package/dist/server-call.js +75 -0
  195. package/dist/server-rpc-batch-client.d.ts +7 -0
  196. package/dist/server-rpc-batch-client.js +119 -0
  197. package/dist/server-rpc-client.d.ts +3 -1
  198. package/dist/server-rpc-client.js +99 -27
  199. package/dist/server-rpc-protocol.d.ts +47 -0
  200. package/dist/server-rpc-protocol.js +109 -0
  201. package/dist/server-rpc-stream-client.d.ts +5 -0
  202. package/dist/server-rpc-stream-client.js +98 -0
  203. package/dist/signals/actions.d.ts +12 -0
  204. package/dist/signals/actions.js +466 -0
  205. package/dist/signals/client.d.ts +2 -0
  206. package/dist/signals/client.js +1 -0
  207. package/dist/signals/computations.d.ts +37 -0
  208. package/dist/signals/computations.js +455 -0
  209. package/dist/signals/control-binding.d.ts +31 -0
  210. package/dist/signals/control-binding.js +353 -0
  211. package/dist/signals/derived-facade.d.ts +3 -0
  212. package/dist/signals/derived-facade.js +25 -0
  213. package/dist/signals/document-owner.d.ts +10 -0
  214. package/dist/signals/document-owner.js +43 -0
  215. package/dist/signals/early-values.d.ts +24 -0
  216. package/dist/signals/early-values.js +124 -0
  217. package/dist/signals/encoding.d.ts +1 -3
  218. package/dist/signals/encoding.js +3 -93
  219. package/dist/signals/engine.d.ts +53 -4
  220. package/dist/signals/engine.js +275 -16
  221. package/dist/signals/errors.d.ts +7 -0
  222. package/dist/signals/errors.js +16 -0
  223. package/dist/signals/facade.d.ts +74 -0
  224. package/dist/signals/facade.js +452 -0
  225. package/dist/signals/graph.d.ts +52 -6
  226. package/dist/signals/graph.js +174 -19
  227. package/dist/signals/handle-protocol.d.ts +4 -0
  228. package/dist/signals/handle-protocol.js +11 -0
  229. package/dist/signals/index.d.ts +12 -3
  230. package/dist/signals/index.js +71 -2
  231. package/dist/signals/native-read-client.d.ts +3 -0
  232. package/dist/signals/native-read-client.js +10 -0
  233. package/dist/signals/owner-context.d.ts +22 -0
  234. package/dist/signals/owner-context.js +77 -0
  235. package/dist/signals/query-attempt-observer.d.ts +49 -0
  236. package/dist/signals/query-attempt-observer.js +41 -0
  237. package/dist/signals/query-facade.d.ts +3 -0
  238. package/dist/signals/query-facade.js +49 -0
  239. package/dist/signals/read-protocol.d.ts +37 -2
  240. package/dist/signals/read-protocol.js +44 -0
  241. package/dist/signals/requests.d.ts +38 -5
  242. package/dist/signals/requests.js +298 -15
  243. package/dist/signals/scalar-computations.d.ts +2 -0
  244. package/dist/signals/scalar-computations.js +60 -0
  245. package/dist/signals/server.d.ts +2 -0
  246. package/dist/signals/server.js +1 -0
  247. package/dist/signals/transition-candidate.d.ts +71 -0
  248. package/dist/signals/transition-candidate.js +557 -0
  249. package/dist/signals/transition-state.d.ts +51 -0
  250. package/dist/signals/transition-state.js +70 -0
  251. package/dist/signals/types.d.ts +95 -5
  252. package/dist/signals/types.js +20 -0
  253. package/dist/stream-protocol.d.ts +0 -5
  254. package/dist/stream-protocol.js +3 -0
  255. package/dist/streamed-signals-protocol.d.ts +60 -0
  256. package/dist/streamed-signals-protocol.js +130 -0
  257. package/dist/style-values.d.ts +3 -0
  258. package/dist/style-values.js +96 -0
  259. package/dist/trusted-html.d.ts +17 -0
  260. package/dist/trusted-html.js +6 -0
  261. package/dist/universal-core.d.ts +6 -0
  262. package/dist/universal-core.js +214 -202
  263. package/dist/version.js +1 -1
  264. package/package.json +48 -5
@@ -18,104 +18,15 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var encoding_exports = {};
20
20
  __export(encoding_exports, {
21
- decodeSignalValue: () => decodeSignalValue,
22
- encodeSignalValue: () => encodeSignalValue
21
+ decodeSignalValue: () => import_data_encoding.decodeSignalValue,
22
+ encodeSignalValue: () => import_data_encoding.encodeSignalValue,
23
+ snapshotSignalValue: () => import_data_encoding.snapshotSignalValue
23
24
  });
24
25
  module.exports = __toCommonJS(encoding_exports);
25
- var import_errors = require("./errors.cjs");
26
- function unsupported() {
27
- throw new import_errors.SignalSerializationError(
28
- "Signal request arguments and seeds require acyclic plain data: undefined, null, booleans, finite numbers, strings, dense arrays, and plain objects with enumerable string data properties."
29
- );
30
- }
31
- function encodeSignalValue(value, ancestors = /* @__PURE__ */ new Set()) {
32
- if (value === void 0) return ["undefined"];
33
- if (value === null) return ["null"];
34
- if (typeof value === "boolean") return ["boolean", value];
35
- if (typeof value === "string") return ["string", value];
36
- if (typeof value === "number") {
37
- if (!Number.isFinite(value)) return unsupported();
38
- return ["number", Object.is(value, -0) ? "-0" : value];
39
- }
40
- if (typeof value !== "object" || ancestors.has(value)) return unsupported();
41
- const prototype = Object.getPrototypeOf(value);
42
- if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) {
43
- return unsupported();
44
- }
45
- ancestors.add(value);
46
- try {
47
- if (Array.isArray(value)) {
48
- const keys2 = Reflect.ownKeys(value);
49
- if (keys2.length !== value.length + 1) return unsupported();
50
- const items = [];
51
- for (let i = 0; i < value.length; i++) {
52
- const descriptor = Object.getOwnPropertyDescriptor(value, String(i));
53
- if (!descriptor || !descriptor.enumerable || !("value" in descriptor)) return unsupported();
54
- items.push(encodeSignalValue(descriptor.value, ancestors));
55
- }
56
- return ["array", items];
57
- }
58
- const keys = Reflect.ownKeys(value);
59
- if (keys.some((key) => typeof key !== "string")) return unsupported();
60
- const entries = [];
61
- for (const key of keys.sort()) {
62
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
63
- if (!descriptor.enumerable || !("value" in descriptor)) return unsupported();
64
- entries.push([key, encodeSignalValue(descriptor.value, ancestors)]);
65
- }
66
- return ["object", entries];
67
- } finally {
68
- ancestors.delete(value);
69
- }
70
- }
71
- function decodeSignalValue(encoded) {
72
- if (!Array.isArray(encoded)) return unsupported();
73
- const [tag, value] = encoded;
74
- switch (tag) {
75
- case "undefined":
76
- if (encoded.length !== 1) return unsupported();
77
- return void 0;
78
- case "null":
79
- if (encoded.length !== 1) return unsupported();
80
- return null;
81
- case "boolean":
82
- if (encoded.length !== 2 || typeof value !== "boolean") return unsupported();
83
- return value;
84
- case "number":
85
- if (encoded.length !== 2) return unsupported();
86
- if (value === "-0") return -0;
87
- if (typeof value !== "number" || !Number.isFinite(value) || Object.is(value, -0)) {
88
- return unsupported();
89
- }
90
- return value;
91
- case "string":
92
- if (encoded.length !== 2 || typeof value !== "string") return unsupported();
93
- return value;
94
- case "array":
95
- if (encoded.length !== 2 || !Array.isArray(value)) return unsupported();
96
- return Object.freeze(value.map((item) => decodeSignalValue(item)));
97
- case "object": {
98
- if (encoded.length !== 2 || !Array.isArray(value)) return unsupported();
99
- const object = {};
100
- let previous;
101
- for (const entry of value) {
102
- if (!Array.isArray(entry) || entry.length !== 2 || typeof entry[0] !== "string" || previous !== void 0 && entry[0] <= previous) {
103
- return unsupported();
104
- }
105
- previous = entry[0];
106
- Object.defineProperty(object, entry[0], {
107
- value: decodeSignalValue(entry[1]),
108
- enumerable: true
109
- });
110
- }
111
- return Object.freeze(object);
112
- }
113
- default:
114
- return unsupported();
115
- }
116
- }
26
+ var import_data_encoding = require("../data-encoding.cjs");
117
27
  // Annotate the CommonJS export names for ESM import in node:
118
28
  0 && (module.exports = {
119
29
  decodeSignalValue,
120
- encodeSignalValue
30
+ encodeSignalValue,
31
+ snapshotSignalValue
121
32
  });
@@ -19,17 +19,26 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var engine_exports = {};
20
20
  __export(engine_exports, {
21
21
  ScopeImpl: () => ScopeImpl,
22
+ acceptScopeStreamedResult: () => acceptScopeStreamedResult,
23
+ adoptResourceValue: () => adoptResourceValue,
24
+ bindScopeStreamedSelection: () => bindScopeStreamedSelection,
25
+ createDeclaredSignalCell: () => createDeclaredSignalCell,
26
+ createDerivedCellWith: () => createDerivedCellWith,
22
27
  createLocalScope: () => createLocalScope,
28
+ createResourceCellWith: () => createResourceCellWith,
23
29
  createScope: () => createScope,
24
30
  endSignalBatch: () => import_graph.endSignalBatch,
31
+ failScopeStreamedResult: () => failScopeStreamedResult,
32
+ getResourceSelectionAuthority: () => getResourceSelectionAuthority,
33
+ getSignalScope: () => getSignalScope,
25
34
  startSignalBatch: () => import_graph.startSignalBatch
26
35
  });
27
36
  module.exports = __toCommonJS(engine_exports);
28
37
  var import_encoding = require("./encoding.cjs");
29
38
  var import_errors = require("./errors.cjs");
39
+ var import_streamed_signals_protocol = require("../streamed-signals-protocol.cjs");
30
40
  var import_graph = require("./graph.cjs");
31
41
  var import_read_protocol = require("./read-protocol.cjs");
32
- var import_requests = require("./requests.cjs");
33
42
  let activeFrames;
34
43
  (0, import_read_protocol.registerNativeBatchHooks)({ startBatch: import_graph.startSignalBatch, endBatch: import_graph.endSignalBatch });
35
44
  function requireKey(key, label) {
@@ -49,7 +58,7 @@ function seedState(seed) {
49
58
  });
50
59
  }
51
60
  function decodeSeed(scopeKey, seed) {
52
- seed = (0, import_encoding.decodeSignalValue)((0, import_encoding.encodeSignalValue)(seed));
61
+ seed = (0, import_encoding.snapshotSignalValue)(seed);
53
62
  if (!seed || seed.version !== 1 || seed.scopeKey !== scopeKey || !Array.isArray(seed.entries)) {
54
63
  throw new import_errors.SignalFrameError(`A signal seed must match scope "${scopeKey}" and version 1.`);
55
64
  }
@@ -70,10 +79,11 @@ function decodeSeed(scopeKey, seed) {
70
79
  if (!entry.request || typeof entry.request.queryKey !== "string" || !entry.request.queryKey.trim() || !["promise", "stream"].includes(entry.request.kind)) {
71
80
  throw new import_errors.SignalFrameError("Async seed entries require a query identity.");
72
81
  }
82
+ (0, import_encoding.decodeSignalValue)(entry.request.argument);
73
83
  request = {
74
84
  queryKey: entry.request.queryKey,
75
85
  kind: entry.request.kind,
76
- argument: (0, import_encoding.encodeSignalValue)((0, import_encoding.decodeSignalValue)(entry.request.argument))
86
+ argument: entry.request.argument
77
87
  };
78
88
  } else if (entry.request !== void 0) {
79
89
  throw new import_errors.SignalFrameError("Only async seed entries may contain a query identity.");
@@ -83,7 +93,7 @@ function decodeSeed(scopeKey, seed) {
83
93
  entry: {
84
94
  key: entry.key,
85
95
  kind: entry.kind,
86
- value: (0, import_encoding.encodeSignalValue)(value),
96
+ value: entry.value,
87
97
  complete: entry.complete,
88
98
  ...read !== "value" ? { read } : {},
89
99
  ...entry.available === false ? { available: false } : {},
@@ -114,6 +124,11 @@ class ScopeImpl {
114
124
  requests = /* @__PURE__ */ new Map();
115
125
  queryDefinitions = /* @__PURE__ */ new Map();
116
126
  resources = /* @__PURE__ */ new Map();
127
+ streamedSelections = /* @__PURE__ */ new Map();
128
+ streamedFrames = /* @__PURE__ */ new Map();
129
+ streamedFailures = /* @__PURE__ */ new Map();
130
+ streamedReady = /* @__PURE__ */ new Map();
131
+ derivedBindings = /* @__PURE__ */ new Map();
117
132
  frames = /* @__PURE__ */ new Set();
118
133
  seedEntries;
119
134
  traceLimit;
@@ -121,6 +136,39 @@ class ScopeImpl {
121
136
  sequence = 0;
122
137
  lifetime = 0;
123
138
  disposed = false;
139
+ readBarrier;
140
+ /** Internal document lifecycle: mark every owner before cancellation runs user code. */
141
+ suspendReads() {
142
+ if (this.disposed || this.readBarrier === void 0) return;
143
+ for (const key of this.streamedSelections.keys()) {
144
+ if (this.streamedFrames.get(key)?.at(-1)?.kind === "complete") continue;
145
+ this.streamedSelections.delete(key);
146
+ this.streamedFrames.delete(key);
147
+ this.streamedReady.delete(key);
148
+ }
149
+ this.streamedFailures.clear();
150
+ for (const entry of this.requests.values()) entry.stopAttempt();
151
+ for (const binding of this.derivedBindings.values()) binding.suspend();
152
+ }
153
+ resumeReads() {
154
+ if (this.disposed || this.readBarrier !== void 0) return;
155
+ (0, import_graph.signalBatch)(() => {
156
+ for (const [node, binding] of this.resources) {
157
+ (0, import_graph.refreshNode)(node);
158
+ const identity = this.streamedSelections.get(node.key);
159
+ if (identity && this.streamedFrames.has(node.key) && binding.bindStreamedSelection(identity)) {
160
+ this.flushStreamedResult(node, binding);
161
+ }
162
+ }
163
+ for (const entry of this.requests.values()) {
164
+ if (this.readBarrier !== void 0) break;
165
+ if (!entry.active && !entry.state.snapshot.complete && entry.state.snapshot.status !== "error" && entry.consumers.size) {
166
+ entry.start(entry.state.snapshot.status !== "ready");
167
+ }
168
+ }
169
+ for (const binding of this.derivedBindings.values()) binding.resume();
170
+ });
171
+ }
124
172
  get scopeKey() {
125
173
  return this.key;
126
174
  }
@@ -130,9 +178,9 @@ class ScopeImpl {
130
178
  get retired() {
131
179
  return this.disposed;
132
180
  }
133
- createNode(key, kind) {
181
+ createNode(key, kind, allowDuringRead = false) {
134
182
  (0, import_graph.assertAlive)(this);
135
- if (this.seedable) (0, import_graph.assertWritable)();
183
+ if (this.seedable && !allowDuringRead) (0, import_graph.assertWritable)();
136
184
  requireKey(key, "Signal key");
137
185
  if (this.nodes.has(key))
138
186
  throw new TypeError(`Signal key "${key}" already exists in this scope.`);
@@ -146,6 +194,18 @@ class ScopeImpl {
146
194
  this.nodes.set(key, node);
147
195
  return node;
148
196
  }
197
+ declaredNode(key, kind) {
198
+ (0, import_graph.assertAlive)(this);
199
+ requireKey(key, "Signal key");
200
+ const existing = this.nodes.get(key);
201
+ if (existing) {
202
+ if (existing.kind !== kind) {
203
+ throw new TypeError(`Signal key "${key}" already has kind "${existing.kind}".`);
204
+ }
205
+ return [existing, false];
206
+ }
207
+ return [this.createNode(key, kind, true), true];
208
+ }
149
209
  initialSeed(key) {
150
210
  return this.seedEntries.get(seedKey(key)) ?? this.seedEntries.get(seedKey(key, "snapshot"));
151
211
  }
@@ -175,28 +235,182 @@ class ScopeImpl {
175
235
  this.consumeSeed(key);
176
236
  return node;
177
237
  }
238
+ createSignalDeclaration(key, initial, preferInitial = false) {
239
+ const [node, created] = this.declaredNode(key, "signal");
240
+ if (!created) return node;
241
+ const seed = this.initialSeed(key) ?? this.retainedSeed(key);
242
+ node.state = (0, import_graph.readyState)(seed && !preferInitial ? seed.value : initial);
243
+ node.lastState = node.state;
244
+ node.last = node.state.snapshot.value;
245
+ node.hasLast = true;
246
+ this.consumeSeed(key);
247
+ return node;
248
+ }
178
249
  derived$(key, compute) {
179
250
  if (typeof compute !== "function") throw new TypeError("derived$ requires a function.");
180
251
  const node = this.createNode(key, "derived");
181
- node.compute = () => (0, import_graph.derivedState)(node, compute);
252
+ node.compute = (target) => (0, import_graph.derivedState)(target, compute);
182
253
  this.initializeRetention(node);
183
254
  this.consumeSeed(key);
184
255
  return node;
185
256
  }
186
- asyncSignal$(key, describe) {
187
- if (typeof describe !== "function") throw new TypeError("asyncSignal$ requires a description.");
188
- const node = this.createNode(key, "async");
257
+ /** Candidate state is private; the ordinary node/binding maps stay untouched. */
258
+ forkCandidate(node, target, frame) {
259
+ if (this.nodes.get(node.key) !== node || this.readBarrier || this.frames.size) {
260
+ throw new import_graph.CandidateUnsupportedError("Candidate frames require live, non-adopting nodes.");
261
+ }
262
+ const resource = this.resources.get(node);
263
+ if (resource) return resource.forkCandidate(target);
264
+ const binding = this.derivedBindings.get(node);
265
+ if (binding) {
266
+ if (!binding.forkCandidate) {
267
+ throw new import_graph.CandidateUnsupportedError(
268
+ "Async derived candidates are not supported by this prototype."
269
+ );
270
+ }
271
+ return binding.forkCandidate(target, frame);
272
+ }
273
+ target.compute = node.compute;
274
+ }
275
+ createDerivedDeclaration(key, compute, options, Binding) {
276
+ if (typeof compute !== "function") throw new TypeError("derived$ requires a function.");
277
+ const [node, created] = this.declaredNode(key, "derived");
278
+ if (!created) return node;
279
+ const binding = new Binding(this, node, compute, options);
280
+ this.derivedBindings.set(node, binding);
281
+ this.initializeRetention(node);
282
+ this.consumeSeed(key);
283
+ return node;
284
+ }
285
+ createResourceDeclaration(key, describe, initialize, unique = false) {
286
+ if (typeof describe !== "function")
287
+ throw new TypeError("A query resource requires a description.");
288
+ let node;
289
+ if (unique) node = this.createNode(key, "async");
290
+ else {
291
+ const [declared, created] = this.declaredNode(key, "async");
292
+ if (!created) return declared;
293
+ node = declared;
294
+ }
189
295
  const seed = this.initialSeed(key);
190
296
  const retained = this.retainedSeed(key);
191
297
  this.initializeRetention(node);
192
298
  (0, import_graph.signalBatch)(() => {
193
- const binding = (0, import_requests.initializeResource)(this, node, describe, seed, retained);
299
+ const binding = initialize(this, node, describe, seed, retained);
194
300
  this.resources.set(node, binding);
195
301
  (0, import_graph.refreshNode)(node);
302
+ this.flushStreamedResult(node, binding);
196
303
  });
197
304
  this.consumeSeed(key);
198
305
  return node;
199
306
  }
307
+ bindStreamedSelection(identity) {
308
+ (0, import_graph.assertAlive)(this);
309
+ const node = this.nodes.get(identity.nodeKey);
310
+ if (node && node.kind !== "async") return false;
311
+ const previous = this.streamedSelections.get(identity.nodeKey);
312
+ if (previous && !(0, import_streamed_signals_protocol.sameStreamFrameIdentity)(previous, identity)) {
313
+ this.streamedFrames.delete(identity.nodeKey);
314
+ this.streamedFailures.delete(identity.nodeKey);
315
+ this.streamedReady.delete(identity.nodeKey);
316
+ }
317
+ this.streamedSelections.set(identity.nodeKey, identity);
318
+ if (!node) return true;
319
+ return this.resources.get(node)?.bindStreamedSelection(identity) === true;
320
+ }
321
+ isStreamedSelectionPending(identity) {
322
+ const selected = this.streamedSelections.get(identity.nodeKey);
323
+ const node = this.nodes.get(identity.nodeKey);
324
+ return !this.retired && selected !== void 0 && (0, import_streamed_signals_protocol.sameStreamFrameIdentity)(selected, identity) && node?.kind === "async" && this.resources.get(node)?.isStreamedSelectionReady(selected) === false;
325
+ }
326
+ whenStreamedSelectionReady(identity, ready) {
327
+ const node = this.nodes.get(identity.nodeKey);
328
+ if (node && this.resources.get(node)?.isStreamedSelectionReady(identity)) return () => {
329
+ };
330
+ const registration = { identity, ready };
331
+ this.streamedReady.set(identity.nodeKey, registration);
332
+ return () => {
333
+ if (this.streamedReady.get(identity.nodeKey) === registration)
334
+ this.streamedReady.delete(identity.nodeKey);
335
+ };
336
+ }
337
+ streamedSelectionReady(binding) {
338
+ if (this.readBarrier !== void 0 || this.retired) return;
339
+ this.flushStreamedResult(binding.node, binding);
340
+ const registration = this.streamedReady.get(binding.node.key);
341
+ if (registration && binding.isStreamedSelectionReady(registration.identity)) {
342
+ this.streamedReady.delete(binding.node.key);
343
+ registration.ready();
344
+ }
345
+ }
346
+ retainCompletedStreamedResult(identity, frames) {
347
+ if (!this.isStreamedSelectionPending(identity) || frames.at(-1)?.kind !== "complete")
348
+ return false;
349
+ const previous = this.streamedFrames.get(identity.nodeKey);
350
+ if (previous?.at(-1)?.kind === "complete") return false;
351
+ let sequence = previous?.length ?? 0;
352
+ for (const frame of frames) {
353
+ if (!(0, import_streamed_signals_protocol.sameStreamFrameIdentity)(identity, frame.identity) || frame.sequence !== sequence++)
354
+ return false;
355
+ }
356
+ if (previous) previous.push(...frames);
357
+ else this.streamedFrames.set(identity.nodeKey, frames);
358
+ return true;
359
+ }
360
+ discardCompletedStreamedSelection(identity) {
361
+ if (this.streamedSelections.get(identity.nodeKey) !== identity || this.streamedFrames.get(identity.nodeKey)?.at(-1)?.kind !== "complete")
362
+ return;
363
+ this.streamedFrames.delete(identity.nodeKey);
364
+ this.streamedSelections.delete(identity.nodeKey);
365
+ this.streamedReady.delete(identity.nodeKey);
366
+ this.streamedFailures.delete(identity.nodeKey);
367
+ }
368
+ acceptStreamedResult(frame) {
369
+ (0, import_graph.assertAlive)(this);
370
+ const selected = this.streamedSelections.get(frame.identity.nodeKey);
371
+ if (!selected || !(0, import_streamed_signals_protocol.sameStreamFrameIdentity)(selected, frame.identity)) return false;
372
+ const node = this.nodes.get(frame.identity.nodeKey);
373
+ if (!node) {
374
+ let frames = this.streamedFrames.get(frame.identity.nodeKey);
375
+ if (!frames) this.streamedFrames.set(frame.identity.nodeKey, frames = []);
376
+ frames.push(frame);
377
+ return true;
378
+ }
379
+ if (node.kind !== "async") return false;
380
+ return this.resources.get(node)?.acceptStreamed(frame) === true;
381
+ }
382
+ failStreamedResult(identity, error) {
383
+ (0, import_graph.assertAlive)(this);
384
+ const selected = this.streamedSelections.get(identity.nodeKey);
385
+ if (!selected || !(0, import_streamed_signals_protocol.sameStreamFrameIdentity)(selected, identity)) return false;
386
+ const node = this.nodes.get(identity.nodeKey);
387
+ if (!node) {
388
+ this.streamedFailures.set(identity.nodeKey, { identity, error });
389
+ return true;
390
+ }
391
+ if (node.kind !== "async") return false;
392
+ return this.resources.get(node)?.failStreamed(identity, error) === true;
393
+ }
394
+ flushStreamedResult(node, binding) {
395
+ if (this.readBarrier !== void 0) return;
396
+ const identity = this.streamedSelections.get(node.key);
397
+ if (!identity || !binding.isStreamedSelectionReady(identity)) return;
398
+ const frames = this.streamedFrames.get(node.key);
399
+ if (frames) {
400
+ this.streamedFrames.delete(node.key);
401
+ for (const frame of frames) {
402
+ if (!binding.acceptStreamed(frame)) {
403
+ binding.failStreamed(identity, new import_errors.SignalStreamError("identity"));
404
+ break;
405
+ }
406
+ }
407
+ }
408
+ const failure = this.streamedFailures.get(node.key);
409
+ if (failure) {
410
+ this.streamedFailures.delete(node.key);
411
+ binding.failStreamed(failure.identity, failure.error);
412
+ }
413
+ }
200
414
  own(handle$) {
201
415
  (0, import_graph.assertAlive)(this);
202
416
  if (!(handle$ instanceof import_graph.ScopedNode) || handle$.owner !== this) {
@@ -205,7 +419,8 @@ class ScopeImpl {
205
419
  return handle$;
206
420
  }
207
421
  get(handle$) {
208
- return (0, import_graph.strictValue)((0, import_graph.readNode)(this.own(handle$)));
422
+ const node = this.own(handle$);
423
+ return (0, import_graph.strictValue)((0, import_graph.readNode)(node), node.key);
209
424
  }
210
425
  set(handle$, value) {
211
426
  this.own(handle$).set(value);
@@ -382,6 +597,12 @@ class ScopeImpl {
382
597
  this.lifetime++;
383
598
  for (const resource of this.resources.values()) resource.dispose();
384
599
  this.resources.clear();
600
+ this.streamedSelections.clear();
601
+ this.streamedFrames.clear();
602
+ this.streamedFailures.clear();
603
+ this.streamedReady.clear();
604
+ for (const binding of this.derivedBindings.values()) binding.dispose();
605
+ this.derivedBindings.clear();
385
606
  this.requests.clear();
386
607
  this.queryDefinitions.clear();
387
608
  for (const frame of this.frames) frame.release();
@@ -513,11 +734,54 @@ function createScope(options) {
513
734
  function createLocalScope(scopeKey) {
514
735
  return new ScopeImpl(scopeKey, { scopeKey }, false);
515
736
  }
737
+ function createDeclaredSignalCell(owner, key, initial, preferInitial = false) {
738
+ if (!(owner instanceof ScopeImpl)) throw new TypeError("A direct signal needs an Octane scope.");
739
+ return owner.createSignalDeclaration(key, initial, preferInitial);
740
+ }
741
+ function createDerivedCellWith(owner, key, compute, options, Binding) {
742
+ if (!(owner instanceof ScopeImpl))
743
+ throw new TypeError("A direct derived signal needs an Octane scope.");
744
+ return owner.createDerivedDeclaration(key, compute, options, Binding);
745
+ }
746
+ function createResourceCellWith(owner, key, describe, initialize, unique = false) {
747
+ if (!(owner instanceof ScopeImpl)) throw new TypeError("A direct query needs an Octane scope.");
748
+ return owner.createResourceDeclaration(key, describe, initialize, unique);
749
+ }
750
+ function adoptResourceValue(handle$, requestKey, value) {
751
+ if (!(handle$ instanceof import_graph.ScopedNode) || !(handle$.owner instanceof ScopeImpl)) return false;
752
+ const binding = handle$.owner.resources.get(handle$);
753
+ return binding ? binding.adopt(requestKey, value) : false;
754
+ }
755
+ function getSignalScope(handle$) {
756
+ return handle$ instanceof import_graph.ScopedNode && handle$.owner instanceof ScopeImpl ? handle$.owner : void 0;
757
+ }
758
+ function getResourceSelectionAuthority(handle$) {
759
+ if (!(handle$ instanceof import_graph.ScopedNode) || !(handle$.owner instanceof ScopeImpl)) return;
760
+ return handle$.owner.resources.get(handle$)?.authority;
761
+ }
762
+ function bindScopeStreamedSelection(owner, identity) {
763
+ return owner instanceof ScopeImpl ? owner.bindStreamedSelection(identity) : false;
764
+ }
765
+ function acceptScopeStreamedResult(owner, frame) {
766
+ return owner instanceof ScopeImpl ? owner.acceptStreamedResult(frame) : false;
767
+ }
768
+ function failScopeStreamedResult(owner, identity, error) {
769
+ return owner instanceof ScopeImpl ? owner.failStreamedResult(identity, error) : false;
770
+ }
516
771
  // Annotate the CommonJS export names for ESM import in node:
517
772
  0 && (module.exports = {
518
773
  ScopeImpl,
774
+ acceptScopeStreamedResult,
775
+ adoptResourceValue,
776
+ bindScopeStreamedSelection,
777
+ createDeclaredSignalCell,
778
+ createDerivedCellWith,
519
779
  createLocalScope,
780
+ createResourceCellWith,
520
781
  createScope,
521
782
  endSignalBatch,
783
+ failScopeStreamedResult,
784
+ getResourceSelectionAuthority,
785
+ getSignalScope,
522
786
  startSignalBatch
523
787
  });
@@ -21,7 +21,9 @@ __export(errors_exports, {
21
21
  ScopeDisposedError: () => ScopeDisposedError,
22
22
  SignalCycleError: () => SignalCycleError,
23
23
  SignalFrameError: () => SignalFrameError,
24
+ SignalIdleError: () => SignalIdleError,
24
25
  SignalSerializationError: () => SignalSerializationError,
26
+ SignalStreamError: () => SignalStreamError,
25
27
  SignalWriteError: () => SignalWriteError
26
28
  });
27
29
  module.exports = __toCommonJS(errors_exports);
@@ -43,12 +45,26 @@ class SignalCycleError extends Error {
43
45
  this.name = "SignalCycleError";
44
46
  }
45
47
  }
48
+ class SignalIdleError extends Error {
49
+ constructor(key) {
50
+ super(`Signal "${key}" has no selected value.`);
51
+ this.name = "SignalIdleError";
52
+ }
53
+ }
46
54
  class SignalFrameError extends Error {
47
55
  constructor(message) {
48
56
  super(message);
49
57
  this.name = "SignalFrameError";
50
58
  }
51
59
  }
60
+ class SignalStreamError extends Error {
61
+ code;
62
+ constructor(code) {
63
+ super(`Streamed signal failed with code "${code}".`);
64
+ this.code = code;
65
+ this.name = "SignalStreamError";
66
+ }
67
+ }
52
68
  class SignalSerializationError extends Error {
53
69
  constructor(message) {
54
70
  super(message);
@@ -60,6 +76,8 @@ class SignalSerializationError extends Error {
60
76
  ScopeDisposedError,
61
77
  SignalCycleError,
62
78
  SignalFrameError,
79
+ SignalIdleError,
63
80
  SignalSerializationError,
81
+ SignalStreamError,
64
82
  SignalWriteError
65
83
  });