octane 0.2.12 → 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 (243) 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/css.cjs +6 -27
  8. package/dist/cjs/data-encoding.cjs +160 -0
  9. package/dist/cjs/dom-binding-handoff.cjs +93 -0
  10. package/dist/cjs/dom-binding-protocol.cjs +115 -0
  11. package/dist/cjs/dom-binding-styles.cjs +292 -0
  12. package/dist/cjs/dom-bindings.cjs +700 -0
  13. package/dist/cjs/dom-focused-move.cjs +66 -0
  14. package/dist/cjs/dom-tables.cjs +4 -94
  15. package/dist/cjs/error-codes.client.generated.cjs +33 -0
  16. package/dist/cjs/error-codes.server.generated.cjs +19 -0
  17. package/dist/cjs/hydration/control-capture.cjs +244 -0
  18. package/dist/cjs/hydration/event-capture.cjs +125 -43
  19. package/dist/cjs/hydration/interaction-config.cjs +50 -2
  20. package/dist/cjs/hydration-markers.cjs +37 -0
  21. package/dist/cjs/independent-hydration-protocol.cjs +106 -0
  22. package/dist/cjs/index.cjs +6 -0
  23. package/dist/cjs/runtime.cjs +2791 -215
  24. package/dist/cjs/runtime.server.cjs +716 -76
  25. package/dist/cjs/server/early-signals.cjs +45 -0
  26. package/dist/cjs/server/index.cjs +44 -0
  27. package/dist/cjs/server/rpc-batch.cjs +149 -0
  28. package/dist/cjs/server/rpc-stream.cjs +146 -0
  29. package/dist/cjs/server/rpc.cjs +34 -15
  30. package/dist/cjs/server/signal-query-observation.cjs +158 -0
  31. package/dist/cjs/server/streamed-region.cjs +52 -0
  32. package/dist/cjs/server/streamed-signals.cjs +512 -0
  33. package/dist/cjs/server-call.cjs +103 -0
  34. package/dist/cjs/server-rpc-batch-client.cjs +141 -0
  35. package/dist/cjs/server-rpc-client.cjs +94 -27
  36. package/dist/cjs/server-rpc-protocol.cjs +141 -0
  37. package/dist/cjs/server-rpc-stream-client.cjs +118 -0
  38. package/dist/cjs/signals/actions.cjs +474 -0
  39. package/dist/cjs/signals/client.cjs +4 -1
  40. package/dist/cjs/signals/computations.cjs +460 -0
  41. package/dist/cjs/signals/control-binding.cjs +368 -0
  42. package/dist/cjs/signals/derived-facade.cjs +50 -0
  43. package/dist/cjs/signals/document-owner.cjs +71 -0
  44. package/dist/cjs/signals/early-values.cjs +155 -0
  45. package/dist/cjs/signals/encoding.cjs +6 -95
  46. package/dist/cjs/signals/engine.cjs +276 -12
  47. package/dist/cjs/signals/errors.cjs +18 -0
  48. package/dist/cjs/signals/facade.cjs +477 -0
  49. package/dist/cjs/signals/graph.cjs +163 -20
  50. package/dist/cjs/signals/handle-protocol.cjs +36 -0
  51. package/dist/cjs/signals/index.cjs +81 -2
  52. package/dist/cjs/signals/native-read-client.cjs +10 -0
  53. package/dist/cjs/signals/owner-context.cjs +112 -0
  54. package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
  55. package/dist/cjs/signals/query-facade.cjs +72 -0
  56. package/dist/cjs/signals/read-protocol.cjs +32 -0
  57. package/dist/cjs/signals/requests.cjs +287 -14
  58. package/dist/cjs/signals/scalar-computations.cjs +76 -0
  59. package/dist/cjs/signals/server.cjs +4 -1
  60. package/dist/cjs/signals/transition-candidate.cjs +567 -0
  61. package/dist/cjs/signals/transition-state.cjs +106 -0
  62. package/dist/cjs/signals/types.cjs +50 -0
  63. package/dist/cjs/stream-protocol.cjs +3 -0
  64. package/dist/cjs/streamed-signals-protocol.cjs +159 -0
  65. package/dist/cjs/style-values.cjs +122 -0
  66. package/dist/cjs/version.cjs +1 -1
  67. package/dist/class-names.d.ts +5 -0
  68. package/dist/class-names.js +25 -0
  69. package/dist/compiler/bundler.js +34 -6
  70. package/dist/compiler/compile.js +2234 -559
  71. package/dist/compiler/dom-binding-program.js +935 -0
  72. package/dist/compiler/dom-binding-request.js +57 -0
  73. package/dist/compiler/dom-bindings.js +2245 -0
  74. package/dist/compiler/hook-deps.js +26 -0
  75. package/dist/compiler/hydrate-boundaries.js +358 -15
  76. package/dist/compiler/index.d.ts +38 -1
  77. package/dist/compiler/index.js +1 -0
  78. package/dist/compiler/native-attribute-reads.js +127 -0
  79. package/dist/compiler/native-read-diagnostics.js +48 -9
  80. package/dist/compiler/native-read-types.js +55 -32
  81. package/dist/compiler/server-context.js +118 -0
  82. package/dist/compiler/signal-attempt-reads.js +479 -0
  83. package/dist/compiler/signal-declarations.js +557 -0
  84. package/dist/compiler/signal-start-reads.js +413 -0
  85. package/dist/compiler/slot-hooks.js +57 -10
  86. package/dist/compiler/template-ir.js +200 -0
  87. package/dist/compiler/typescript.d.ts +2 -0
  88. package/dist/compiler/typescript.js +2 -0
  89. package/dist/compiler/vite.d.ts +3 -1
  90. package/dist/compiler/vite.js +122 -4
  91. package/dist/compiler/volar.d.ts +6 -1
  92. package/dist/compiler/volar.js +674 -143
  93. package/dist/constants.d.ts +1 -0
  94. package/dist/constants.js +10 -0
  95. package/dist/css.d.ts +2 -5
  96. package/dist/css.js +2 -23
  97. package/dist/data-encoding.d.ts +9 -0
  98. package/dist/data-encoding.js +134 -0
  99. package/dist/dom-binding-classes.d.ts +15 -0
  100. package/dist/dom-binding-classes.js +129 -0
  101. package/dist/dom-binding-controls.d.ts +2 -0
  102. package/dist/dom-binding-controls.js +6 -0
  103. package/dist/dom-binding-handoff.d.ts +55 -0
  104. package/dist/dom-binding-handoff.js +62 -0
  105. package/dist/dom-binding-program.d.ts +300 -0
  106. package/dist/dom-binding-program.js +1625 -0
  107. package/dist/dom-binding-projections.d.ts +15 -0
  108. package/dist/dom-binding-projections.js +187 -0
  109. package/dist/dom-binding-protocol.d.ts +13 -0
  110. package/dist/dom-binding-protocol.js +88 -0
  111. package/dist/dom-binding-signals.d.ts +21 -0
  112. package/dist/dom-binding-signals.js +109 -0
  113. package/dist/dom-binding-styles.d.ts +17 -0
  114. package/dist/dom-binding-styles.js +272 -0
  115. package/dist/dom-bindings.d.ts +89 -0
  116. package/dist/dom-bindings.js +670 -0
  117. package/dist/dom-focused-move.d.ts +6 -0
  118. package/dist/dom-focused-move.js +42 -0
  119. package/dist/dom-tables.d.ts +1 -3
  120. package/dist/dom-tables.js +1 -91
  121. package/dist/error-codes.client.generated.d.ts +9 -0
  122. package/dist/error-codes.client.generated.js +33 -0
  123. package/dist/error-codes.server.generated.d.ts +5 -0
  124. package/dist/error-codes.server.generated.js +19 -0
  125. package/dist/hydration/control-capture.d.ts +62 -0
  126. package/dist/hydration/control-capture.js +223 -0
  127. package/dist/hydration/document-lifecycle.d.ts +23 -0
  128. package/dist/hydration/document-lifecycle.js +80 -0
  129. package/dist/hydration/event-capture.d.ts +20 -1
  130. package/dist/hydration/event-capture.js +128 -42
  131. package/dist/hydration/independent-island.d.ts +45 -0
  132. package/dist/hydration/independent-island.js +233 -0
  133. package/dist/hydration/index.d.ts +8 -1
  134. package/dist/hydration/index.js +55 -1
  135. package/dist/hydration/interaction-config.d.ts +5 -0
  136. package/dist/hydration/interaction-config.js +44 -1
  137. package/dist/hydration/stream-delivery.d.ts +32 -0
  138. package/dist/hydration/stream-delivery.js +333 -0
  139. package/dist/hydration/stream-receiver.d.ts +26 -0
  140. package/dist/hydration/stream-receiver.js +204 -0
  141. package/dist/hydration/stream-result-receiver.d.ts +70 -0
  142. package/dist/hydration/stream-result-receiver.js +246 -0
  143. package/dist/hydration/streamed-signals.d.ts +44 -0
  144. package/dist/hydration/streamed-signals.js +186 -0
  145. package/dist/hydration/types.d.ts +6 -0
  146. package/dist/hydration-markers.d.ts +7 -0
  147. package/dist/hydration-markers.js +10 -0
  148. package/dist/independent-hydration-protocol.d.ts +31 -0
  149. package/dist/independent-hydration-protocol.js +80 -0
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.js +4 -0
  152. package/dist/internal/signal-read.d.ts +1 -0
  153. package/dist/internal/signal-read.js +4 -0
  154. package/dist/jsx-runtime.d.ts +45 -6
  155. package/dist/public-types.d.ts +15 -1
  156. package/dist/runtime.d.ts +259 -21
  157. package/dist/runtime.js +2812 -220
  158. package/dist/runtime.server.d.ts +86 -6
  159. package/dist/runtime.server.js +712 -76
  160. package/dist/server/early-signals.d.ts +14 -0
  161. package/dist/server/early-signals.js +34 -0
  162. package/dist/server/index.d.ts +10 -2
  163. package/dist/server/index.js +48 -1
  164. package/dist/server/rpc-batch.d.ts +17 -0
  165. package/dist/server/rpc-batch.js +129 -0
  166. package/dist/server/rpc-stream.d.ts +9 -0
  167. package/dist/server/rpc-stream.js +125 -0
  168. package/dist/server/rpc.d.ts +5 -1
  169. package/dist/server/rpc.js +37 -13
  170. package/dist/server/signal-query-observation.d.ts +3 -0
  171. package/dist/server/signal-query-observation.js +134 -0
  172. package/dist/server/streamed-region.d.ts +15 -0
  173. package/dist/server/streamed-region.js +30 -0
  174. package/dist/server/streamed-signals.d.ts +45 -0
  175. package/dist/server/streamed-signals.js +488 -0
  176. package/dist/server-call.d.ts +41 -0
  177. package/dist/server-call.js +75 -0
  178. package/dist/server-rpc-batch-client.d.ts +7 -0
  179. package/dist/server-rpc-batch-client.js +119 -0
  180. package/dist/server-rpc-client.d.ts +3 -1
  181. package/dist/server-rpc-client.js +99 -27
  182. package/dist/server-rpc-protocol.d.ts +47 -0
  183. package/dist/server-rpc-protocol.js +109 -0
  184. package/dist/server-rpc-stream-client.d.ts +5 -0
  185. package/dist/server-rpc-stream-client.js +98 -0
  186. package/dist/signals/actions.d.ts +12 -0
  187. package/dist/signals/actions.js +466 -0
  188. package/dist/signals/client.d.ts +2 -0
  189. package/dist/signals/client.js +1 -0
  190. package/dist/signals/computations.d.ts +37 -0
  191. package/dist/signals/computations.js +455 -0
  192. package/dist/signals/control-binding.d.ts +31 -0
  193. package/dist/signals/control-binding.js +353 -0
  194. package/dist/signals/derived-facade.d.ts +3 -0
  195. package/dist/signals/derived-facade.js +25 -0
  196. package/dist/signals/document-owner.d.ts +10 -0
  197. package/dist/signals/document-owner.js +43 -0
  198. package/dist/signals/early-values.d.ts +24 -0
  199. package/dist/signals/early-values.js +124 -0
  200. package/dist/signals/encoding.d.ts +1 -3
  201. package/dist/signals/encoding.js +3 -93
  202. package/dist/signals/engine.d.ts +53 -4
  203. package/dist/signals/engine.js +275 -16
  204. package/dist/signals/errors.d.ts +7 -0
  205. package/dist/signals/errors.js +16 -0
  206. package/dist/signals/facade.d.ts +74 -0
  207. package/dist/signals/facade.js +452 -0
  208. package/dist/signals/graph.d.ts +50 -5
  209. package/dist/signals/graph.js +170 -19
  210. package/dist/signals/handle-protocol.d.ts +4 -0
  211. package/dist/signals/handle-protocol.js +11 -0
  212. package/dist/signals/index.d.ts +12 -3
  213. package/dist/signals/index.js +71 -2
  214. package/dist/signals/native-read-client.d.ts +3 -0
  215. package/dist/signals/native-read-client.js +10 -0
  216. package/dist/signals/owner-context.d.ts +22 -0
  217. package/dist/signals/owner-context.js +77 -0
  218. package/dist/signals/query-attempt-observer.d.ts +49 -0
  219. package/dist/signals/query-attempt-observer.js +41 -0
  220. package/dist/signals/query-facade.d.ts +3 -0
  221. package/dist/signals/query-facade.js +49 -0
  222. package/dist/signals/read-protocol.d.ts +32 -3
  223. package/dist/signals/read-protocol.js +26 -0
  224. package/dist/signals/requests.d.ts +38 -5
  225. package/dist/signals/requests.js +298 -15
  226. package/dist/signals/scalar-computations.d.ts +2 -0
  227. package/dist/signals/scalar-computations.js +60 -0
  228. package/dist/signals/server.d.ts +2 -0
  229. package/dist/signals/server.js +1 -0
  230. package/dist/signals/transition-candidate.d.ts +71 -0
  231. package/dist/signals/transition-candidate.js +557 -0
  232. package/dist/signals/transition-state.d.ts +51 -0
  233. package/dist/signals/transition-state.js +70 -0
  234. package/dist/signals/types.d.ts +95 -5
  235. package/dist/signals/types.js +20 -0
  236. package/dist/stream-protocol.d.ts +0 -5
  237. package/dist/stream-protocol.js +3 -0
  238. package/dist/streamed-signals-protocol.d.ts +60 -0
  239. package/dist/streamed-signals-protocol.js +130 -0
  240. package/dist/style-values.d.ts +3 -0
  241. package/dist/style-values.js +96 -0
  242. package/dist/version.js +1 -1
  243. package/package.json +37 -1
@@ -0,0 +1,14 @@
1
+ export interface EarlySignalBootstrapOptions {
2
+ readonly nonce?: string;
3
+ /** Include native intent capture for independently activated widgets. */
4
+ readonly independentHydration?: boolean;
5
+ }
6
+ /**
7
+ * Install the framework's renderer-free input and streaming mailboxes before
8
+ * exposing interactive HTML. Envelope-owning hosts emit this once and pass
9
+ * earlySignalBootstrap: 'external' to each fragment renderer. This does not
10
+ * import, preload or activate client modules, nor install application policy.
11
+ */
12
+ export declare function earlySignalBootstrapScript(options?: EarlySignalBootstrapOptions): string;
13
+ /** @internal Shared byte-identical bootstrap for buffered and streaming renderers. */
14
+ export declare function streamedSignalBootstrapJs(independentHydration?: boolean): string;
@@ -0,0 +1,34 @@
1
+ import {
2
+ HYDRATE_ID_ATTR,
3
+ HYDRATE_WHEN_ATTR,
4
+ HYDRATE_INDEPENDENT_ATTR,
5
+ SIGNAL_CONTROL_ATTR,
6
+ STREAM_SCRIPT_ATTR
7
+ } from "../constants.js";
8
+ import {
9
+ EARLY_HYDRATION_INTENTS_KEY,
10
+ EARLY_HYDRATION_INTENTS_LIMIT,
11
+ HYDRATE_DEFAULT_INTERACTION_EVENTS,
12
+ HYDRATE_INTERACTION_EVENTS_ATTR,
13
+ HYDRATE_NATIVE_DEFAULT_INTERACTION_EVENTS,
14
+ HYDRATE_SELECTION_ATTR,
15
+ HYDRATE_SUPPORTED_INTERACTION_EVENTS
16
+ } from "../hydration/interaction-config.js";
17
+ function earlySignalBootstrapScript(options = {}) {
18
+ const nonce = options.nonce === void 0 ? "" : ' nonce="' + options.nonce.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;") + '"';
19
+ return "<script " + STREAM_SCRIPT_ATTR + nonce + ">" + streamedSignalBootstrapJs(options.independentHydration) + "</script>";
20
+ }
21
+ let STREAMED_SIGNAL_BOOTSTRAP_JS;
22
+ let STREAMED_SIGNAL_INDEPENDENT_BOOTSTRAP_JS;
23
+ function streamedSignalBootstrapJs(independentHydration = false) {
24
+ const signals = STREAMED_SIGNAL_BOOTSTRAP_JS ??= '(function(g){var z="__octaneStreamedSignalSelections",v=g[z];if(!v){var a=[];g[z]={version:1,identities:a,register:function(i){if(a.length>=256){this.overflow=true;return;}a.push(i);}};}var k="__octaneStreamedRenderer",e=g[k];if(e)return;var q=[];g[k]={version:1,frames:q,receive:function(f){if(q.length>=512){this.overflow=true;return;}q.push(f);}};var s=g.__octaneEarlySignalControls||(g.__octaneEarlySignalControls={q:[],n:0});if(!s.l){s.l=1;document.addEventListener("input",function(e){var t=e.target;if(!t||!t.getAttribute||!t.getAttribute("' + SIGNAL_CONTROL_ATTR + '"))return;var r=++s.n,p=g.__octanePublishSignalControl;if(p){p(t,r);return;}for(var i=0;i<s.q.length;i++)if(s.q[i][0]===t){s.q[i]=[t,r];return;}if(s.q.length<256)s.q.push([t,r]);},true);}})(globalThis);';
25
+ if (!independentHydration) return signals;
26
+ return STREAMED_SIGNAL_INDEPENDENT_BOOTSTRAP_JS ??= signals + // A completed client build can contain its first independent widget only
27
+ // in a later streamed wave. Capture its intent before module evaluation,
28
+ // with no activation dependency on its parent or sidecar being present.
29
+ "(function(d){var h=" + JSON.stringify(EARLY_HYDRATION_INTENTS_KEY) + ";if(d[h])return;var u=d[h]={version:1,q:[]},es=" + JSON.stringify(HYDRATE_SUPPORTED_INTERACTION_EVENTS) + ",ds=" + JSON.stringify(HYDRATE_DEFAULT_INTERACTION_EVENTS) + ",ns=" + JSON.stringify(HYDRATE_NATIVE_DEFAULT_INTERACTION_EVENTS) + ',is="[' + HYDRATE_INDEPENDENT_ATTR + ']",ms="[' + HYDRATE_ID_ATTR + ']";function c(e){var t=e.target;if(!t||!t.closest)return;var b=t.closest(is);if(!b)return;var id=b.getAttribute("' + HYDRATE_ID_ATTR + '");if(id===null)return;var w=b.getAttribute("' + HYDRATE_WHEN_ATTR + '"),a=b.getAttribute("' + HYDRATE_INTERACTION_EVENTS_ATTR + '");if(w===null||w==="never")return;var link=t.closest("a[href],area[href]");if(link&&b.contains(link))return;if((e.type==="pointerenter"||e.type==="mouseenter")&&d.elementFromPoint){var hit=d.elementFromPoint(e.clientX,e.clientY),nested=hit&&hit.closest(is);if(nested&&nested!==b&&b.contains(nested))return;}var m=t.closest(ms),ok=false;while(m){var x=m.getAttribute("' + HYDRATE_WHEN_ATTR + '"),y=m.getAttribute("' + HYDRATE_INTERACTION_EVENTS_ATTR + '");if(x==="dynamic"&&e.type==="click"||x==="interaction"&&(y===null?ds:y.split(/\\s+/)).indexOf(e.type)!==-1)ok=true;if(m===b)break;m=m.parentElement&&m.parentElement.closest(ms);}if(!ok)return;var c=null,g=null,p=u.q[u.q.length-1];if(e.type==="click"&&e.button===0&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){c=t.closest("button[' + HYDRATE_SELECTION_ATTR + ']");if(c&&c.type==="button"&&c.closest(is)===b)g=c.getAttribute("' + HYDRATE_SELECTION_ATTR + '");}var v=g?[e,t,b,id,w,a,c,g]:[e,t,b,id,w,a];if(g&&p&&p[2]===b&&p[7]===g&&p[6].isConnected&&p[6].contains(p[1])&&p[6].type==="button"&&p[6].getAttribute("' + HYDRATE_SELECTION_ATTR + '")===g){u.q[u.q.length-1]=v;}else{if(u.q.length>=' + EARLY_HYDRATION_INTENTS_LIMIT + "){u.overflow=true;u.q.length=0;u.stop();return;}u.q.push(v);}if(e.bubbles){if(e.cancelable&&ns.indexOf(e.type)===-1)e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();}}u.stop=function(){for(var i=0;i<es.length;i++)d.removeEventListener(es[i],c,true);u.stop=null;};for(var j=0;j<es.length;j++)d.addEventListener(es[j],c,true);})(document);";
30
+ }
31
+ export {
32
+ earlySignalBootstrapScript,
33
+ streamedSignalBootstrapJs
34
+ };
@@ -21,9 +21,17 @@ export { trustHTML, type TrustedHTML } from '../trusted-html.js';
21
21
  * private ABI — present because compiled output needs them, not because apps
22
22
  * should call them.
23
23
  */
24
- export { executeServerFunction } from './rpc.js';
24
+ export { executeServerFunction, executeServerFunctionStream } from './rpc.js';
25
+ export { earlySignalBootstrapScript, type EarlySignalBootstrapOptions } from './early-signals.js';
26
+ export { batchServerCalls, executeServerFunctionBatch, type ServerCallBatchOptions, type ServerBatchMember, } from './rpc-batch.js';
27
+ export type { ServerResultLimits } from '../server-rpc-protocol.js';
28
+ export { createStreamedRegionPlacementFrame, type StreamedRegionPlacementOptions, } from './streamed-region.js';
29
+ export { createAutomaticStreamedSignalInjection, createStreamedRendererFrameStream, createStreamedSignalInjection, createStreamedSignalResultFrames, streamedRendererFrameScript, type StreamedRendererLimits, type AutomaticStreamedSignalInjection, type AutomaticStreamedSignalOptions, type StreamedSignalResultOptions, } from './streamed-signals.js';
30
+ export { installSignalOwnerEnvironment, retireSignalOwnerIdentity, } from '../signals/owner-context.js';
31
+ export type { SignalOwner, SignalOwnerEnvironment } from '../signals/types.js';
32
+ export { __registerServerFunction, __serverCall, __setServerCallContextSource, type ServerCallContext, type ServerCallContextSource, type ServerCallHost, type ServerCallOptions, type ServerFunction, type ServerFunctionTarget, } from '../server-call.js';
25
33
  export { version } from '../version.js';
26
34
  export { StrictMode, unstable_batchedUpdates } from '../compatibility.js';
27
35
  export { createSubSlot, subSlot, type SubSlot, type SlotlessSubSlot, type SubSlotOptions, } from '../sub-slot.js';
28
36
  export { __methodDep } from '../method-dep.js';
29
- export { renderToString, renderToStaticMarkup, renderToPipeableStream, renderToReadableStream, type RenderResult, type RenderOptions, type ServerRenderNode, type StreamOptions, type StreamInjectionSource, setSsrSuspenseTimeout, getSsrSuspenseTimeout, EXTERNAL_HYDRATION_PROMISE, HYDRATION_RANGE_BOUNDARY, useState, useLinkedState, useReducer, __useStateWithGetter, __useLinkedStateWithGetter, __useReducerWithGetter, type LinkedStatePrevious, type LinkedStateOptions, useEffect, useLayoutEffect, useInsertionEffect, useImperativeHandle, useMemo, useCallback, useRef, useId, useEffectEvent, useTransition, useDeferredValue, useSyncExternalStore, useActionState, useActionState as useFormState, useFormStatus, useOptimistic, useDebugValue, memo, lazy, hookSlots, withSlot, manualHook, invokeManualHook, startTransition, flushSync, isChildrenBlock, isValidElement, cloneElement, Children, createPortal, requestFormReset, preload, preinit, preloadModule, preinitModule, preconnect, prefetchDNS, Suspense, ErrorBoundary, Hydrate, Fragment, Activity, Activity as unstable_Activity, ViewTransition, ViewTransition as unstable_ViewTransition, addTransitionType, addTransitionType as unstable_addTransitionType, createContext, use, useContext, ssrIsSuspense, type Context, type FormStatus, markChildrenBlock, markWarm, ssrHtml, ssrChildTextPre, ssrChildPre, descriptorChildren, createElement, createScopedValue, createScopedElement, positionalChildren, escapeHtml, escapeAttr, ssrText, ssrTextPre, ssrNestingText, ssrChild, ssrChildText, ssrAttr, normalizeClass, ssrStyle, ssrClass, ssrAttrs, ssrSnapshotSpread, ssrSpread, ssrInnerHtml, ssrScriptInnerHtml, ssrChildrenSources, ssrSpreadContent, ssrVoidContent, ssrValueAttr, ssrCheckedAttr, ssrInputAttrs, ssrFormAuthoringDiagnostics, ssrTextareaValue, ssrTextareaValueSources, ssrSelectAttrs, ssrSelectScope, ssrSelectScopeSources, ssrOptionValueSources, ssrOption, ssrElement, ssrComponent, ssrComponentNS, ssrInNamespace, ssrBlock, ssrFragmentMarker, ssrActivity, ssrForBlock, mapSlot, ssrControl, ssrArm, ssrForItem, ssrTry, ssrPortal, injectStyle, ssrHeadEl, styleMap, touchStyleMap, ssrStylesheetResource, ssrStyleResource, ssrScriptResource, namespaceHead, namespaceHeadElement, puMemo, puBatch, warmMemo, warmChild, } from '../runtime.server.js';
37
+ export { renderToString, renderToStaticMarkup, renderToPipeableStream, renderToReadableStream, type RenderResult, type RenderOptions, type ServerRenderNode, type StreamOptions, type StreamInjectionSource, setSsrSuspenseTimeout, getSsrSuspenseTimeout, EXTERNAL_HYDRATION_PROMISE, HYDRATION_RANGE_BOUNDARY, useState, useLinkedState, useReducer, __useStateWithGetter, __useLinkedStateWithGetter, __useReducerWithGetter, type LinkedStatePrevious, type LinkedStateOptions, useEffect, useLayoutEffect, useInsertionEffect, useImperativeHandle, useMemo, useCallback, useRef, useId, useEffectEvent, useTransition, useDeferredValue, useSyncExternalStore, useActionState, useActionState as useFormState, useFormStatus, useOptimistic, useDebugValue, memo, lazy, hookSlots, withSlot, manualHook, invokeManualHook, startTransition, flushSync, isChildrenBlock, isValidElement, cloneElement, Children, createPortal, requestFormReset, preload, preinit, preloadModule, preinitModule, preconnect, prefetchDNS, Suspense, ErrorBoundary, Hydrate, Fragment, Activity, Activity as unstable_Activity, ViewTransition, ViewTransition as unstable_ViewTransition, addTransitionType, addTransitionType as unstable_addTransitionType, createContext, use, useContext, ssrIsSuspense, type Context, type FormStatus, markChildrenBlock, markWarm, ssrHtml, ssrChildTextPre, ssrChildPre, descriptorChildren, createElement, createScopedValue, createScopedElement, positionalChildren, escapeHtml, escapeAttr, ssrText, ssrTextPre, ssrNestingText, ssrChild, ssrChildText, ssrAttr, normalizeClass, ssrStyle, ssrClass, ssrAttrs, ssrSignalValue, ssrSignalControlValue, ssrSignalControlAttrs, ssrSnapshotSpread, enableServerSignalBindings, ssrSpread, ssrInnerHtml, ssrScriptInnerHtml, ssrChildrenSources, ssrSpreadContent, ssrVoidContent, ssrValueAttr, ssrCheckedAttr, ssrInputAttrs, ssrFormAuthoringDiagnostics, ssrTextareaValue, ssrTextareaValueSources, ssrSelectAttrs, ssrSelectScope, ssrSelectScopeSources, ssrOptionValueSources, ssrOption, ssrElement, ssrComponent, ssrComponentNS, ssrInNamespace, ssrBlock, ssrFragmentMarker, ssrActivity, ssrForBlock, mapSlot, ssrControl, ssrArm, ssrForItem, ssrTry, ssrPortal, injectStyle, ssrHeadEl, styleMap, touchStyleMap, ssrStylesheetResource, ssrStyleResource, ssrScriptResource, namespaceHead, namespaceHeadElement, puMemo, puBatch, warmMemo, warmChild, } from '../runtime.server.js';
@@ -1,5 +1,29 @@
1
1
  import { trustHTML } from "../trusted-html.js";
2
- import { executeServerFunction } from "./rpc.js";
2
+ import { executeServerFunction, executeServerFunctionStream } from "./rpc.js";
3
+ import { earlySignalBootstrapScript } from "./early-signals.js";
4
+ import {
5
+ batchServerCalls,
6
+ executeServerFunctionBatch
7
+ } from "./rpc-batch.js";
8
+ import {
9
+ createStreamedRegionPlacementFrame
10
+ } from "./streamed-region.js";
11
+ import {
12
+ createAutomaticStreamedSignalInjection,
13
+ createStreamedRendererFrameStream,
14
+ createStreamedSignalInjection,
15
+ createStreamedSignalResultFrames,
16
+ streamedRendererFrameScript
17
+ } from "./streamed-signals.js";
18
+ import {
19
+ installSignalOwnerEnvironment,
20
+ retireSignalOwnerIdentity
21
+ } from "../signals/owner-context.js";
22
+ import {
23
+ __registerServerFunction,
24
+ __serverCall,
25
+ __setServerCallContextSource
26
+ } from "../server-call.js";
3
27
  import { version } from "../version.js";
4
28
  import { StrictMode, unstable_batchedUpdates } from "../compatibility.js";
5
29
  import {
@@ -95,7 +119,11 @@ import {
95
119
  ssrStyle,
96
120
  ssrClass,
97
121
  ssrAttrs,
122
+ ssrSignalValue,
123
+ ssrSignalControlValue,
124
+ ssrSignalControlAttrs,
98
125
  ssrSnapshotSpread,
126
+ enableServerSignalBindings,
99
127
  ssrSpread,
100
128
  ssrInnerHtml,
101
129
  ssrScriptInnerHtml,
@@ -153,25 +181,39 @@ export {
153
181
  Suspense,
154
182
  ViewTransition,
155
183
  __methodDep,
184
+ __registerServerFunction,
185
+ __serverCall,
186
+ __setServerCallContextSource,
156
187
  __useLinkedStateWithGetter,
157
188
  __useReducerWithGetter,
158
189
  __useStateWithGetter,
159
190
  addTransitionType,
191
+ batchServerCalls,
160
192
  cloneElement,
193
+ createAutomaticStreamedSignalInjection,
161
194
  createContext,
162
195
  createElement,
163
196
  createPortal,
164
197
  createScopedElement,
165
198
  createScopedValue,
199
+ createStreamedRegionPlacementFrame,
200
+ createStreamedRendererFrameStream,
201
+ createStreamedSignalInjection,
202
+ createStreamedSignalResultFrames,
166
203
  createSubSlot,
167
204
  descriptorChildren,
205
+ earlySignalBootstrapScript,
206
+ enableServerSignalBindings,
168
207
  escapeAttr,
169
208
  escapeHtml,
170
209
  executeServerFunction,
210
+ executeServerFunctionBatch,
211
+ executeServerFunctionStream,
171
212
  flushSync,
172
213
  getSsrSuspenseTimeout,
173
214
  hookSlots,
174
215
  injectStyle,
216
+ installSignalOwnerEnvironment,
175
217
  invokeManualHook,
176
218
  isChildrenBlock,
177
219
  isValidElement,
@@ -198,6 +240,7 @@ export {
198
240
  renderToStaticMarkup,
199
241
  renderToString,
200
242
  requestFormReset,
243
+ retireSignalOwnerIdentity,
201
244
  setSsrSuspenseTimeout,
202
245
  ssrActivity,
203
246
  ssrArm,
@@ -234,6 +277,9 @@ export {
234
277
  ssrSelectAttrs,
235
278
  ssrSelectScope,
236
279
  ssrSelectScopeSources,
280
+ ssrSignalControlAttrs,
281
+ ssrSignalControlValue,
282
+ ssrSignalValue,
237
283
  ssrSnapshotSpread,
238
284
  ssrSpread,
239
285
  ssrSpreadContent,
@@ -248,6 +294,7 @@ export {
248
294
  ssrValueAttr,
249
295
  ssrVoidContent,
250
296
  startTransition,
297
+ streamedRendererFrameScript,
251
298
  styleMap,
252
299
  subSlot,
253
300
  touchStyleMap,
@@ -0,0 +1,17 @@
1
+ import { type ServerCallBatchOptions, type ServerResultLimits } from '../server-rpc-protocol.js';
2
+ export type { ServerCallBatchOptions } from '../server-rpc-protocol.js';
3
+ /** In-process calls keep their per-call authorization; there is no HTTP batch to collect. */
4
+ export declare function batchServerCalls<T>(options: ServerCallBatchOptions, callback: () => T): T;
5
+ export interface ServerBatchMember {
6
+ id: number;
7
+ hash: string;
8
+ body: string;
9
+ }
10
+ /**
11
+ * Finite independent reads only. Each member crosses the ordinary authorized
12
+ * request boundary. Multi-yield subscriptions use their own demand-driven RPC.
13
+ * At most 32 bounded single values can be ready; no unbounded per-channel queue.
14
+ */
15
+ export declare function executeServerFunctionBatch(body: string, invoke: (member: ServerBatchMember, signal: AbortSignal) => Promise<Response>, options?: ServerResultLimits & {
16
+ signal?: AbortSignal;
17
+ }): ReadableStream<Uint8Array>;
@@ -0,0 +1,129 @@
1
+ import { InvalidServerFunctionPayloadError } from "../server-call.js";
2
+ import {
3
+ decodeServerArguments,
4
+ encodeServerResultFrame,
5
+ serverResultLimits,
6
+ validateServerCallBatch
7
+ } from "../server-rpc-protocol.js";
8
+ import { readServerResult } from "../server-rpc-stream-client.js";
9
+ import { createServerResultStream } from "./rpc-stream.js";
10
+ function batchServerCalls(options, callback) {
11
+ validateServerCallBatch(options);
12
+ return callback();
13
+ }
14
+ function executeServerFunctionBatch(body, invoke, options = {}) {
15
+ const limits = serverResultLimits(options);
16
+ let members;
17
+ try {
18
+ const envelope = JSON.parse(body);
19
+ if (!Array.isArray(envelope) || envelope.length !== 2 || envelope[0] !== 1 || !Array.isArray(envelope[1]) || envelope[1].length === 0 || envelope[1].length > 32) {
20
+ throw new Error("Invalid batch");
21
+ }
22
+ members = envelope[1].map((member, id) => {
23
+ if (!Array.isArray(member) || member.length !== 3 || member[0] !== id || typeof member[1] !== "string" || !/^[a-f0-9]{8}$/.test(member[1]) || typeof member[2] !== "string") {
24
+ throw new Error("Invalid batch member");
25
+ }
26
+ decodeServerArguments(member[2]);
27
+ return { id, hash: member[1], body: member[2] };
28
+ });
29
+ } catch (error) {
30
+ throw new InvalidServerFunctionPayloadError(error);
31
+ }
32
+ const cancellation = new AbortController();
33
+ const signal = options.signal === void 0 ? cancellation.signal : AbortSignal.any([options.signal, cancellation.signal]);
34
+ async function* results() {
35
+ const ready = [];
36
+ let wake;
37
+ let remaining = members.length;
38
+ let closed = false;
39
+ let sequence = 1;
40
+ for (const member of members) {
41
+ void (async () => {
42
+ const timeout = new AbortController();
43
+ const memberSignal = AbortSignal.any([signal, timeout.signal]);
44
+ const timer = setTimeout(
45
+ () => timeout.abort(new DOMException("Server batch member timed out", "TimeoutError")),
46
+ limits.timeoutMs
47
+ );
48
+ let abort;
49
+ const aborted = new Promise((_, reject) => {
50
+ abort = () => reject(memberSignal.reason);
51
+ memberSignal.addEventListener("abort", abort, { once: true });
52
+ if (memberSignal.aborted) abort();
53
+ });
54
+ let outcome;
55
+ try {
56
+ const work = (async () => {
57
+ memberSignal.throwIfAborted();
58
+ const response = await invoke(member, memberSignal);
59
+ if (memberSignal.aborted) {
60
+ void response.body?.cancel().catch(() => {
61
+ });
62
+ memberSignal.throwIfAborted();
63
+ }
64
+ if (!response.ok) {
65
+ void response.body?.cancel().catch(() => {
66
+ });
67
+ return [
68
+ member.id,
69
+ response.headers.get("Octane-RPC-Outcome") === "rejected" ? "rejected" : "uncertain",
70
+ `Server function failed with status ${response.status}`
71
+ ];
72
+ }
73
+ const value = await readServerResult(response, { ...limits, signal: memberSignal });
74
+ if (value !== null && typeof value === "object" && Symbol.asyncIterator in value) {
75
+ await value[Symbol.asyncIterator]().return?.();
76
+ throw new Error("Subscriptions cannot join a finite server-call batch");
77
+ }
78
+ return [member.id, "value", value];
79
+ })();
80
+ outcome = await Promise.race([work, aborted]);
81
+ } catch {
82
+ outcome = [
83
+ member.id,
84
+ "uncertain",
85
+ "Server batch member did not produce an authoritative result"
86
+ ];
87
+ } finally {
88
+ clearTimeout(timer);
89
+ memberSignal.removeEventListener("abort", abort);
90
+ }
91
+ if (!closed) {
92
+ ready.push(outcome);
93
+ wake?.();
94
+ }
95
+ })();
96
+ }
97
+ try {
98
+ while (remaining > 0) {
99
+ if (ready.length === 0)
100
+ await new Promise((resolve) => {
101
+ wake = resolve;
102
+ });
103
+ wake = void 0;
104
+ while (ready.length > 0) {
105
+ remaining--;
106
+ let outcome = ready.shift();
107
+ if (encodeServerResultFrame(sequence, { kind: "value", value: outcome }).byteLength > limits.maxFrameBytes) {
108
+ outcome = [outcome[0], "uncertain", "Server batch member exceeded its frame budget"];
109
+ }
110
+ sequence++;
111
+ yield outcome;
112
+ }
113
+ }
114
+ } finally {
115
+ closed = true;
116
+ cancellation.abort();
117
+ ready.length = 0;
118
+ }
119
+ }
120
+ return createServerResultStream(results(), {
121
+ ...limits,
122
+ signal,
123
+ cancel: () => cancellation.abort()
124
+ });
125
+ }
126
+ export {
127
+ batchServerCalls,
128
+ executeServerFunctionBatch
129
+ };
@@ -0,0 +1,9 @@
1
+ import { type ServerResultLimits } from '../server-rpc-protocol.js';
2
+ /**
3
+ * One invocation, one bounded result channel. next() is demand-driven: a slow
4
+ * reader cannot make a generator produce an unbounded server-side mailbox.
5
+ */
6
+ export declare function createServerResultStream(result: unknown, options?: ServerResultLimits & {
7
+ signal?: AbortSignal;
8
+ cancel?: () => void;
9
+ }): ReadableStream<Uint8Array>;
@@ -0,0 +1,125 @@
1
+ import {
2
+ encodeServerResultFrame,
3
+ serverResultLimits
4
+ } from "../server-rpc-protocol.js";
5
+ function createServerResultStream(result, options = {}) {
6
+ const limits = serverResultLimits(options);
7
+ let sequence = 0;
8
+ let totalBytes = 0;
9
+ let iterator;
10
+ let finished = false;
11
+ let terminal = false;
12
+ let streaming = false;
13
+ let initialized = false;
14
+ let pending = Promise.resolve(result);
15
+ void pending.catch(() => {
16
+ });
17
+ let controller;
18
+ let timer;
19
+ const cleanup = () => {
20
+ clearTimeout(timer);
21
+ options.signal?.removeEventListener("abort", abort);
22
+ };
23
+ const closeIterator = () => {
24
+ try {
25
+ void Promise.resolve(iterator?.return?.()).catch(() => {
26
+ });
27
+ } catch {
28
+ }
29
+ iterator = void 0;
30
+ };
31
+ const write = (frame) => {
32
+ const encoded = encodeServerResultFrame(sequence, frame);
33
+ if (encoded.byteLength > limits.maxFrameBytes || totalBytes + encoded.byteLength > limits.maxTotalBytes) {
34
+ throw new Error("Server result exceeded its response budget");
35
+ }
36
+ sequence++;
37
+ totalBytes += encoded.byteLength;
38
+ controller.enqueue(encoded);
39
+ };
40
+ const fail = (message) => {
41
+ if (finished) return;
42
+ finished = true;
43
+ pending = void 0;
44
+ cleanup();
45
+ options.cancel?.();
46
+ closeIterator();
47
+ try {
48
+ write({ kind: "error", error: message });
49
+ controller.close();
50
+ } catch (error) {
51
+ controller.error(error);
52
+ }
53
+ };
54
+ const abort = () => fail("Server function was canceled");
55
+ return new ReadableStream(
56
+ {
57
+ start(streamController) {
58
+ controller = streamController;
59
+ timer = setTimeout(() => fail("Server function timed out"), limits.timeoutMs);
60
+ options.signal?.addEventListener("abort", abort, { once: true });
61
+ if (options.signal?.aborted) abort();
62
+ },
63
+ async pull() {
64
+ if (finished) return;
65
+ try {
66
+ if (terminal) {
67
+ write({ kind: "complete" });
68
+ finished = true;
69
+ cleanup();
70
+ controller.close();
71
+ return;
72
+ }
73
+ if (!initialized) {
74
+ const value = await pending;
75
+ pending = void 0;
76
+ if (finished) {
77
+ if (value !== null && typeof value === "object" && Symbol.asyncIterator in value) {
78
+ iterator = value[Symbol.asyncIterator]();
79
+ closeIterator();
80
+ }
81
+ return;
82
+ }
83
+ initialized = true;
84
+ if (value !== null && typeof value === "object" && Symbol.asyncIterator in value) {
85
+ iterator = value[Symbol.asyncIterator]();
86
+ streaming = true;
87
+ write({ kind: "stream" });
88
+ return;
89
+ }
90
+ write({ kind: "value", value });
91
+ terminal = true;
92
+ return;
93
+ }
94
+ if (streaming) {
95
+ const item = await iterator.next();
96
+ if (finished) return;
97
+ if (item.done) {
98
+ iterator = void 0;
99
+ write({ kind: "complete" });
100
+ finished = true;
101
+ cleanup();
102
+ controller.close();
103
+ } else {
104
+ write({ kind: "value", value: item.value });
105
+ }
106
+ }
107
+ } catch {
108
+ fail("Server function failed");
109
+ }
110
+ },
111
+ cancel() {
112
+ if (finished) return;
113
+ finished = true;
114
+ pending = void 0;
115
+ cleanup();
116
+ options.cancel?.();
117
+ closeIterator();
118
+ }
119
+ },
120
+ { highWaterMark: 0 }
121
+ );
122
+ }
123
+ export {
124
+ createServerResultStream
125
+ };
@@ -1,3 +1,5 @@
1
+ import { type ServerCallContext } from '../server-call.js';
2
+ import { type ServerResultLimits } from '../server-rpc-protocol.js';
1
3
  /**
2
4
  * Execute a `module server` function for an RPC request. The wire format is
3
5
  * devalue on both sides (matching @ripple-ts/adapter's client stub, and chosen
@@ -7,4 +9,6 @@
7
9
  * graph (`ssrLoadModule('octane/server')`) so the executor and the resolved
8
10
  * server function share one runtime.
9
11
  */
10
- export declare function executeServerFunction(fn: (...args: any[]) => unknown, body: string): Promise<string>;
12
+ export declare function executeServerFunction(fn: Function, body: string, context?: ServerCallContext): Promise<string>;
13
+ /** Opt-in result streaming; application authorization runs before this executor. */
14
+ export declare function executeServerFunctionStream(fn: Function, body: string, context?: ServerCallContext, limits?: ServerResultLimits): ReadableStream<Uint8Array>;
@@ -1,24 +1,48 @@
1
1
  import * as devalue from "devalue";
2
- class InvalidServerFunctionPayloadError extends Error {
3
- code = "OCTANE_INVALID_RPC_PAYLOAD";
4
- constructor(cause) {
5
- super("Invalid server function arguments", { cause });
6
- this.name = "InvalidServerFunctionPayloadError";
7
- }
8
- }
9
- async function executeServerFunction(fn, body) {
2
+ import {
3
+ InvalidServerFunctionPayloadError,
4
+ invokeServerFunction
5
+ } from "../server-call.js";
6
+ import { createServerResultStream } from "./rpc-stream.js";
7
+ import {
8
+ decodeServerArguments,
9
+ serverResultLimits
10
+ } from "../server-rpc-protocol.js";
11
+ function serverArguments(body) {
10
12
  let args;
11
13
  try {
12
14
  args = devalue.parse(body);
13
15
  } catch (error) {
14
16
  throw new InvalidServerFunctionPayloadError(error);
15
17
  }
16
- if (!Array.isArray(args)) {
17
- throw new InvalidServerFunctionPayloadError();
18
- }
19
- const value = await fn.apply(null, args);
18
+ if (!Array.isArray(args)) throw new InvalidServerFunctionPayloadError();
19
+ return args;
20
+ }
21
+ async function executeServerFunction(fn, body, context) {
22
+ const args = serverArguments(body);
23
+ const value = await invokeServerFunction(fn, args, context);
20
24
  return devalue.stringify({ value });
21
25
  }
26
+ function executeServerFunctionStream(fn, body, context, limits) {
27
+ const resolvedLimits = serverResultLimits(limits);
28
+ let args;
29
+ try {
30
+ args = decodeServerArguments(body);
31
+ } catch (error) {
32
+ throw new InvalidServerFunctionPayloadError(error);
33
+ }
34
+ const cancellation = new AbortController();
35
+ const signal = context === void 0 ? cancellation.signal : AbortSignal.any([context.signal, cancellation.signal]);
36
+ const trusted = context === void 0 ? void 0 : { ...context, signal };
37
+ return createServerResultStream(
38
+ Promise.resolve().then(() => {
39
+ signal.throwIfAborted();
40
+ return invokeServerFunction(fn, args, trusted);
41
+ }),
42
+ { ...resolvedLimits, signal, cancel: () => cancellation.abort() }
43
+ );
44
+ }
22
45
  export {
23
- executeServerFunction
46
+ executeServerFunction,
47
+ executeServerFunctionStream
24
48
  };
@@ -0,0 +1,3 @@
1
+ import type { ServerSignalQueryAttemptObservations } from '../signals/query-attempt-observer.js';
2
+ /** Allocate server mirrors only for an observed attempt, not ordinary browser requests. */
3
+ export declare function createServerSignalQueryAttemptObservations(): ServerSignalQueryAttemptObservations;