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.
- package/README.md +5 -0
- package/dist/behavior-root.d.ts +13 -3
- package/dist/behavior-root.js +28 -5
- package/dist/cjs/behavior-root.cjs +32 -6
- package/dist/cjs/class-names.cjs +49 -0
- package/dist/cjs/constants.cjs +9 -0
- package/dist/cjs/css.cjs +6 -27
- package/dist/cjs/data-encoding.cjs +160 -0
- package/dist/cjs/dom-binding-handoff.cjs +93 -0
- package/dist/cjs/dom-binding-protocol.cjs +115 -0
- package/dist/cjs/dom-binding-styles.cjs +292 -0
- package/dist/cjs/dom-bindings.cjs +700 -0
- package/dist/cjs/dom-focused-move.cjs +66 -0
- package/dist/cjs/dom-tables.cjs +4 -94
- package/dist/cjs/error-codes.client.generated.cjs +33 -0
- package/dist/cjs/error-codes.server.generated.cjs +19 -0
- package/dist/cjs/hydration/control-capture.cjs +244 -0
- package/dist/cjs/hydration/event-capture.cjs +125 -43
- package/dist/cjs/hydration/interaction-config.cjs +50 -2
- package/dist/cjs/hydration-markers.cjs +37 -0
- package/dist/cjs/independent-hydration-protocol.cjs +106 -0
- package/dist/cjs/index.cjs +6 -0
- package/dist/cjs/runtime.cjs +2791 -215
- package/dist/cjs/runtime.server.cjs +716 -76
- package/dist/cjs/server/early-signals.cjs +45 -0
- package/dist/cjs/server/index.cjs +44 -0
- package/dist/cjs/server/rpc-batch.cjs +149 -0
- package/dist/cjs/server/rpc-stream.cjs +146 -0
- package/dist/cjs/server/rpc.cjs +34 -15
- package/dist/cjs/server/signal-query-observation.cjs +158 -0
- package/dist/cjs/server/streamed-region.cjs +52 -0
- package/dist/cjs/server/streamed-signals.cjs +512 -0
- package/dist/cjs/server-call.cjs +103 -0
- package/dist/cjs/server-rpc-batch-client.cjs +141 -0
- package/dist/cjs/server-rpc-client.cjs +94 -27
- package/dist/cjs/server-rpc-protocol.cjs +141 -0
- package/dist/cjs/server-rpc-stream-client.cjs +118 -0
- package/dist/cjs/signals/actions.cjs +474 -0
- package/dist/cjs/signals/client.cjs +4 -1
- package/dist/cjs/signals/computations.cjs +460 -0
- package/dist/cjs/signals/control-binding.cjs +368 -0
- package/dist/cjs/signals/derived-facade.cjs +50 -0
- package/dist/cjs/signals/document-owner.cjs +71 -0
- package/dist/cjs/signals/early-values.cjs +155 -0
- package/dist/cjs/signals/encoding.cjs +6 -95
- package/dist/cjs/signals/engine.cjs +276 -12
- package/dist/cjs/signals/errors.cjs +18 -0
- package/dist/cjs/signals/facade.cjs +477 -0
- package/dist/cjs/signals/graph.cjs +163 -20
- package/dist/cjs/signals/handle-protocol.cjs +36 -0
- package/dist/cjs/signals/index.cjs +81 -2
- package/dist/cjs/signals/native-read-client.cjs +10 -0
- package/dist/cjs/signals/owner-context.cjs +112 -0
- package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
- package/dist/cjs/signals/query-facade.cjs +72 -0
- package/dist/cjs/signals/read-protocol.cjs +32 -0
- package/dist/cjs/signals/requests.cjs +287 -14
- package/dist/cjs/signals/scalar-computations.cjs +76 -0
- package/dist/cjs/signals/server.cjs +4 -1
- package/dist/cjs/signals/transition-candidate.cjs +567 -0
- package/dist/cjs/signals/transition-state.cjs +106 -0
- package/dist/cjs/signals/types.cjs +50 -0
- package/dist/cjs/stream-protocol.cjs +3 -0
- package/dist/cjs/streamed-signals-protocol.cjs +159 -0
- package/dist/cjs/style-values.cjs +122 -0
- package/dist/cjs/version.cjs +1 -1
- package/dist/class-names.d.ts +5 -0
- package/dist/class-names.js +25 -0
- package/dist/compiler/bundler.js +34 -6
- package/dist/compiler/compile.js +2234 -559
- package/dist/compiler/dom-binding-program.js +935 -0
- package/dist/compiler/dom-binding-request.js +57 -0
- package/dist/compiler/dom-bindings.js +2245 -0
- package/dist/compiler/hook-deps.js +26 -0
- package/dist/compiler/hydrate-boundaries.js +358 -15
- package/dist/compiler/index.d.ts +38 -1
- package/dist/compiler/index.js +1 -0
- package/dist/compiler/native-attribute-reads.js +127 -0
- package/dist/compiler/native-read-diagnostics.js +48 -9
- package/dist/compiler/native-read-types.js +55 -32
- package/dist/compiler/server-context.js +118 -0
- package/dist/compiler/signal-attempt-reads.js +479 -0
- package/dist/compiler/signal-declarations.js +557 -0
- package/dist/compiler/signal-start-reads.js +413 -0
- package/dist/compiler/slot-hooks.js +57 -10
- package/dist/compiler/template-ir.js +200 -0
- package/dist/compiler/typescript.d.ts +2 -0
- package/dist/compiler/typescript.js +2 -0
- package/dist/compiler/vite.d.ts +3 -1
- package/dist/compiler/vite.js +122 -4
- package/dist/compiler/volar.d.ts +6 -1
- package/dist/compiler/volar.js +674 -143
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +10 -0
- package/dist/css.d.ts +2 -5
- package/dist/css.js +2 -23
- package/dist/data-encoding.d.ts +9 -0
- package/dist/data-encoding.js +134 -0
- package/dist/dom-binding-classes.d.ts +15 -0
- package/dist/dom-binding-classes.js +129 -0
- package/dist/dom-binding-controls.d.ts +2 -0
- package/dist/dom-binding-controls.js +6 -0
- package/dist/dom-binding-handoff.d.ts +55 -0
- package/dist/dom-binding-handoff.js +62 -0
- package/dist/dom-binding-program.d.ts +300 -0
- package/dist/dom-binding-program.js +1625 -0
- package/dist/dom-binding-projections.d.ts +15 -0
- package/dist/dom-binding-projections.js +187 -0
- package/dist/dom-binding-protocol.d.ts +13 -0
- package/dist/dom-binding-protocol.js +88 -0
- package/dist/dom-binding-signals.d.ts +21 -0
- package/dist/dom-binding-signals.js +109 -0
- package/dist/dom-binding-styles.d.ts +17 -0
- package/dist/dom-binding-styles.js +272 -0
- package/dist/dom-bindings.d.ts +89 -0
- package/dist/dom-bindings.js +670 -0
- package/dist/dom-focused-move.d.ts +6 -0
- package/dist/dom-focused-move.js +42 -0
- package/dist/dom-tables.d.ts +1 -3
- package/dist/dom-tables.js +1 -91
- package/dist/error-codes.client.generated.d.ts +9 -0
- package/dist/error-codes.client.generated.js +33 -0
- package/dist/error-codes.server.generated.d.ts +5 -0
- package/dist/error-codes.server.generated.js +19 -0
- package/dist/hydration/control-capture.d.ts +62 -0
- package/dist/hydration/control-capture.js +223 -0
- package/dist/hydration/document-lifecycle.d.ts +23 -0
- package/dist/hydration/document-lifecycle.js +80 -0
- package/dist/hydration/event-capture.d.ts +20 -1
- package/dist/hydration/event-capture.js +128 -42
- package/dist/hydration/independent-island.d.ts +45 -0
- package/dist/hydration/independent-island.js +233 -0
- package/dist/hydration/index.d.ts +8 -1
- package/dist/hydration/index.js +55 -1
- package/dist/hydration/interaction-config.d.ts +5 -0
- package/dist/hydration/interaction-config.js +44 -1
- package/dist/hydration/stream-delivery.d.ts +32 -0
- package/dist/hydration/stream-delivery.js +333 -0
- package/dist/hydration/stream-receiver.d.ts +26 -0
- package/dist/hydration/stream-receiver.js +204 -0
- package/dist/hydration/stream-result-receiver.d.ts +70 -0
- package/dist/hydration/stream-result-receiver.js +246 -0
- package/dist/hydration/streamed-signals.d.ts +44 -0
- package/dist/hydration/streamed-signals.js +186 -0
- package/dist/hydration/types.d.ts +6 -0
- package/dist/hydration-markers.d.ts +7 -0
- package/dist/hydration-markers.js +10 -0
- package/dist/independent-hydration-protocol.d.ts +31 -0
- package/dist/independent-hydration-protocol.js +80 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/internal/signal-read.d.ts +1 -0
- package/dist/internal/signal-read.js +4 -0
- package/dist/jsx-runtime.d.ts +45 -6
- package/dist/public-types.d.ts +15 -1
- package/dist/runtime.d.ts +259 -21
- package/dist/runtime.js +2812 -220
- package/dist/runtime.server.d.ts +86 -6
- package/dist/runtime.server.js +712 -76
- package/dist/server/early-signals.d.ts +14 -0
- package/dist/server/early-signals.js +34 -0
- package/dist/server/index.d.ts +10 -2
- package/dist/server/index.js +48 -1
- package/dist/server/rpc-batch.d.ts +17 -0
- package/dist/server/rpc-batch.js +129 -0
- package/dist/server/rpc-stream.d.ts +9 -0
- package/dist/server/rpc-stream.js +125 -0
- package/dist/server/rpc.d.ts +5 -1
- package/dist/server/rpc.js +37 -13
- package/dist/server/signal-query-observation.d.ts +3 -0
- package/dist/server/signal-query-observation.js +134 -0
- package/dist/server/streamed-region.d.ts +15 -0
- package/dist/server/streamed-region.js +30 -0
- package/dist/server/streamed-signals.d.ts +45 -0
- package/dist/server/streamed-signals.js +488 -0
- package/dist/server-call.d.ts +41 -0
- package/dist/server-call.js +75 -0
- package/dist/server-rpc-batch-client.d.ts +7 -0
- package/dist/server-rpc-batch-client.js +119 -0
- package/dist/server-rpc-client.d.ts +3 -1
- package/dist/server-rpc-client.js +99 -27
- package/dist/server-rpc-protocol.d.ts +47 -0
- package/dist/server-rpc-protocol.js +109 -0
- package/dist/server-rpc-stream-client.d.ts +5 -0
- package/dist/server-rpc-stream-client.js +98 -0
- package/dist/signals/actions.d.ts +12 -0
- package/dist/signals/actions.js +466 -0
- package/dist/signals/client.d.ts +2 -0
- package/dist/signals/client.js +1 -0
- package/dist/signals/computations.d.ts +37 -0
- package/dist/signals/computations.js +455 -0
- package/dist/signals/control-binding.d.ts +31 -0
- package/dist/signals/control-binding.js +353 -0
- package/dist/signals/derived-facade.d.ts +3 -0
- package/dist/signals/derived-facade.js +25 -0
- package/dist/signals/document-owner.d.ts +10 -0
- package/dist/signals/document-owner.js +43 -0
- package/dist/signals/early-values.d.ts +24 -0
- package/dist/signals/early-values.js +124 -0
- package/dist/signals/encoding.d.ts +1 -3
- package/dist/signals/encoding.js +3 -93
- package/dist/signals/engine.d.ts +53 -4
- package/dist/signals/engine.js +275 -16
- package/dist/signals/errors.d.ts +7 -0
- package/dist/signals/errors.js +16 -0
- package/dist/signals/facade.d.ts +74 -0
- package/dist/signals/facade.js +452 -0
- package/dist/signals/graph.d.ts +50 -5
- package/dist/signals/graph.js +170 -19
- package/dist/signals/handle-protocol.d.ts +4 -0
- package/dist/signals/handle-protocol.js +11 -0
- package/dist/signals/index.d.ts +12 -3
- package/dist/signals/index.js +71 -2
- package/dist/signals/native-read-client.d.ts +3 -0
- package/dist/signals/native-read-client.js +10 -0
- package/dist/signals/owner-context.d.ts +22 -0
- package/dist/signals/owner-context.js +77 -0
- package/dist/signals/query-attempt-observer.d.ts +49 -0
- package/dist/signals/query-attempt-observer.js +41 -0
- package/dist/signals/query-facade.d.ts +3 -0
- package/dist/signals/query-facade.js +49 -0
- package/dist/signals/read-protocol.d.ts +32 -3
- package/dist/signals/read-protocol.js +26 -0
- package/dist/signals/requests.d.ts +38 -5
- package/dist/signals/requests.js +298 -15
- package/dist/signals/scalar-computations.d.ts +2 -0
- package/dist/signals/scalar-computations.js +60 -0
- package/dist/signals/server.d.ts +2 -0
- package/dist/signals/server.js +1 -0
- package/dist/signals/transition-candidate.d.ts +71 -0
- package/dist/signals/transition-candidate.js +557 -0
- package/dist/signals/transition-state.d.ts +51 -0
- package/dist/signals/transition-state.js +70 -0
- package/dist/signals/types.d.ts +95 -5
- package/dist/signals/types.js +20 -0
- package/dist/stream-protocol.d.ts +0 -5
- package/dist/stream-protocol.js +3 -0
- package/dist/streamed-signals-protocol.d.ts +60 -0
- package/dist/streamed-signals-protocol.js +130 -0
- package/dist/style-values.d.ts +3 -0
- package/dist/style-values.js +96 -0
- package/dist/version.js +1 -1
- 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, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">") + '"';
|
|
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
|
+
};
|
package/dist/server/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
+
};
|
package/dist/server/rpc.d.ts
CHANGED
|
@@ -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:
|
|
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>;
|
package/dist/server/rpc.js
CHANGED
|
@@ -1,24 +1,48 @@
|
|
|
1
1
|
import * as devalue from "devalue";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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;
|