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,512 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var streamed_signals_exports = {};
20
+ __export(streamed_signals_exports, {
21
+ createAutomaticStreamedSignalInjection: () => createAutomaticStreamedSignalInjection,
22
+ createStreamedRendererFrameStream: () => createStreamedRendererFrameStream,
23
+ createStreamedSignalInjection: () => createStreamedSignalInjection,
24
+ createStreamedSignalResultFrames: () => createStreamedSignalResultFrames,
25
+ streamedRendererFrameScript: () => streamedRendererFrameScript
26
+ });
27
+ module.exports = __toCommonJS(streamed_signals_exports);
28
+ var import_data_encoding = require("../data-encoding.cjs");
29
+ var import_streamed_signals_protocol = require("../streamed-signals-protocol.cjs");
30
+ var import_signal_query_observation = require("./signal-query-observation.cjs");
31
+ const DEFAULT_MAX_FRAME_BYTES = 4 * 1024 * 1024;
32
+ const DEFAULT_MAX_TOTAL_BYTES = 64 * 1024 * 1024;
33
+ const DEFAULT_TIMEOUT = 3e4;
34
+ function positiveLimit(value, fallback) {
35
+ const limit = value ?? fallback;
36
+ if (!Number.isSafeInteger(limit) || limit <= 0) {
37
+ throw new RangeError("Streamed renderer limits must be positive safe integers.");
38
+ }
39
+ return limit;
40
+ }
41
+ function limits(options) {
42
+ return {
43
+ maxFrameBytes: positiveLimit(options.maxFrameBytes, DEFAULT_MAX_FRAME_BYTES),
44
+ maxTotalBytes: positiveLimit(options.maxTotalBytes, DEFAULT_MAX_TOTAL_BYTES),
45
+ timeoutMs: positiveLimit(options.timeoutMs, DEFAULT_TIMEOUT)
46
+ };
47
+ }
48
+ function isAsyncIterable(value) {
49
+ return value !== null && (typeof value === "object" || typeof value === "function") && typeof value[Symbol.asyncIterator] === "function";
50
+ }
51
+ async function* createStreamedSignalResultFrames(identity, result, options = {}) {
52
+ if (!(0, import_streamed_signals_protocol.isStreamFrameIdentity)(identity)) throw new TypeError("Invalid streamed signal identity.");
53
+ let sequence = 0;
54
+ let resource = "promise";
55
+ let iterator;
56
+ const run = options.run ?? ((callback) => callback());
57
+ try {
58
+ const resolved = await result;
59
+ options.signal?.throwIfAborted();
60
+ if (isAsyncIterable(resolved)) {
61
+ resource = "stream";
62
+ iterator = run(() => resolved[Symbol.asyncIterator]());
63
+ yield { identity, sequence: sequence++, channel: "result", kind: "open", resource: "stream" };
64
+ for (; ; ) {
65
+ options.signal?.throwIfAborted();
66
+ const next = await run(() => iterator.next());
67
+ options.signal?.throwIfAborted();
68
+ if (next.done) break;
69
+ yield {
70
+ identity,
71
+ sequence: sequence++,
72
+ channel: "result",
73
+ kind: "value",
74
+ value: (0, import_data_encoding.encodeSignalValue)(next.value)
75
+ };
76
+ }
77
+ iterator = void 0;
78
+ } else {
79
+ yield {
80
+ identity,
81
+ sequence: sequence++,
82
+ channel: "result",
83
+ kind: "open",
84
+ resource: "promise"
85
+ };
86
+ yield {
87
+ identity,
88
+ sequence: sequence++,
89
+ channel: "result",
90
+ kind: "value",
91
+ value: (0, import_data_encoding.encodeSignalValue)(resolved)
92
+ };
93
+ }
94
+ yield { identity, sequence, channel: "result", kind: "complete" };
95
+ } catch {
96
+ if (sequence === 0) {
97
+ yield { identity, sequence: sequence++, channel: "result", kind: "open", resource };
98
+ }
99
+ yield { identity, sequence, channel: "result", kind: "error", code: "SERVER_RESULT_FAILED" };
100
+ } finally {
101
+ if (iterator !== void 0) {
102
+ try {
103
+ await run(() => iterator.return?.());
104
+ } catch {
105
+ }
106
+ }
107
+ }
108
+ }
109
+ function line(frame) {
110
+ if (!(0, import_streamed_signals_protocol.isStreamedRendererFrame)(frame)) throw new TypeError("Invalid streamed renderer frame.");
111
+ return new TextEncoder().encode(JSON.stringify(frame) + "\n");
112
+ }
113
+ function createStreamedRendererFrameStream(frames, options = {}) {
114
+ const budget = limits(options);
115
+ const iterator = frames[Symbol.asyncIterator]();
116
+ let totalBytes = 0;
117
+ let finished = false;
118
+ let controller;
119
+ const timer = setTimeout(
120
+ () => fail(new Error("Streamed renderer response timed out.")),
121
+ budget.timeoutMs
122
+ );
123
+ const cleanup = () => {
124
+ clearTimeout(timer);
125
+ options.signal?.removeEventListener("abort", abort);
126
+ };
127
+ const closeIterator = () => {
128
+ try {
129
+ void Promise.resolve(iterator.return?.(void 0)).catch(() => {
130
+ });
131
+ } catch {
132
+ }
133
+ };
134
+ const fail = (error) => {
135
+ if (finished) return;
136
+ finished = true;
137
+ cleanup();
138
+ closeIterator();
139
+ controller?.error(error);
140
+ };
141
+ const abort = () => fail(options.signal?.reason ?? new DOMException("Aborted", "AbortError"));
142
+ return new ReadableStream(
143
+ {
144
+ start(streamController) {
145
+ controller = streamController;
146
+ options.signal?.addEventListener("abort", abort, { once: true });
147
+ if (options.signal?.aborted) abort();
148
+ },
149
+ async pull() {
150
+ if (finished) return;
151
+ try {
152
+ const next = await iterator.next();
153
+ if (finished) return;
154
+ if (next.done) {
155
+ finished = true;
156
+ cleanup();
157
+ controller.close();
158
+ return;
159
+ }
160
+ const encoded = line(next.value);
161
+ if (encoded.byteLength > budget.maxFrameBytes || totalBytes + encoded.byteLength > budget.maxTotalBytes) {
162
+ throw new Error("Streamed renderer response exceeded its byte budget.");
163
+ }
164
+ totalBytes += encoded.byteLength;
165
+ controller.enqueue(encoded);
166
+ } catch (error) {
167
+ fail(error);
168
+ }
169
+ },
170
+ cancel() {
171
+ if (finished) return;
172
+ finished = true;
173
+ cleanup();
174
+ closeIterator();
175
+ }
176
+ },
177
+ { highWaterMark: 0 }
178
+ );
179
+ }
180
+ function escapeAttribute(value) {
181
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
182
+ }
183
+ function streamedRendererFrameScript(frame, nonce) {
184
+ const encoded = (0, import_streamed_signals_protocol.encodeStreamedRendererFrameForScript)(frame);
185
+ return `<script${nonce === void 0 ? "" : ` nonce="${escapeAttribute(nonce)}"`}>globalThis.__octaneStreamedRenderer.receive(${encoded});</script>`;
186
+ }
187
+ function streamedSignalSelectionScript(identity, nonce) {
188
+ if (!(0, import_streamed_signals_protocol.isStreamFrameIdentity)(identity)) throw new TypeError("Invalid streamed signal identity.");
189
+ const encoded = JSON.stringify(identity).replace(/&/g, "\\u0026").replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
190
+ return `<script${nonce === void 0 ? "" : ` nonce="${escapeAttribute(nonce)}"`}>(function(g){var k="__octaneStreamedRenderer",e=g[k];if(!e){var q=[];g[k]={version:1,frames:q,receive:function(f){if(q.length>=512){this.overflow=true;return;}q.push(f);}};}var z="__octaneStreamedSignalSelections",v=g[z];if(!v){var a=[];v=g[z]={version:1,identities:a,register:function(i){if(a.length>=256){this.overflow=true;return;}a.push(i);}};}v.register(${encoded});})(globalThis);</script>`;
191
+ }
192
+ function createStreamedSignalInjection(identity, result, options = {}) {
193
+ const budget = limits(options);
194
+ const iterator = createStreamedSignalResultFrames(identity, result, options)[Symbol.asyncIterator]();
195
+ let queued = options.announceSelection ? streamedSignalSelectionScript(identity, options.nonce) : "";
196
+ let pending = false;
197
+ let finished = false;
198
+ let subscribed = false;
199
+ let totalBytes = 0;
200
+ let notify;
201
+ let resolveDone;
202
+ let rejectDone;
203
+ const done = new Promise((resolve, reject) => {
204
+ resolveDone = resolve;
205
+ rejectDone = reject;
206
+ });
207
+ let timer;
208
+ const cleanup = () => {
209
+ clearTimeout(timer);
210
+ options.signal?.removeEventListener("abort", abort);
211
+ };
212
+ const closeIterator = () => {
213
+ try {
214
+ void Promise.resolve(iterator.return?.(void 0)).catch(() => {
215
+ });
216
+ } catch {
217
+ }
218
+ };
219
+ const fail = (error) => {
220
+ if (finished) return;
221
+ finished = true;
222
+ cleanup();
223
+ closeIterator();
224
+ rejectDone(error);
225
+ };
226
+ const pump = () => {
227
+ if (!subscribed || pending || queued !== "" || finished) return;
228
+ pending = true;
229
+ void iterator.next().then(
230
+ (next) => {
231
+ pending = false;
232
+ if (finished) return;
233
+ if (next.done) {
234
+ finished = true;
235
+ cleanup();
236
+ resolveDone();
237
+ return;
238
+ }
239
+ const html = streamedRendererFrameScript(next.value, options.nonce);
240
+ const bytes = new TextEncoder().encode(html).byteLength;
241
+ if (bytes > budget.maxFrameBytes || totalBytes + bytes > budget.maxTotalBytes) {
242
+ fail(new Error("Streamed renderer injection exceeded its byte budget."));
243
+ return;
244
+ }
245
+ totalBytes += bytes;
246
+ queued = html;
247
+ notify?.();
248
+ },
249
+ (error) => {
250
+ pending = false;
251
+ fail(error);
252
+ }
253
+ );
254
+ };
255
+ const abort = () => {
256
+ fail(options.signal?.reason ?? new DOMException("Aborted", "AbortError"));
257
+ };
258
+ timer = setTimeout(
259
+ () => fail(new Error("Streamed renderer injection timed out.")),
260
+ budget.timeoutMs
261
+ );
262
+ options.signal?.addEventListener("abort", abort, { once: true });
263
+ if (options.signal?.aborted) abort();
264
+ return {
265
+ streamedRenderer: true,
266
+ take() {
267
+ const html = queued;
268
+ queued = "";
269
+ return html;
270
+ },
271
+ subscribe(callback) {
272
+ notify = callback;
273
+ subscribed = true;
274
+ pump();
275
+ return () => {
276
+ if (notify === callback) notify = void 0;
277
+ };
278
+ },
279
+ accepted() {
280
+ pump();
281
+ },
282
+ cancel: fail,
283
+ done,
284
+ renderComplete() {
285
+ pump();
286
+ }
287
+ };
288
+ }
289
+ function createAutomaticStreamedSignalInjection(options, external) {
290
+ if (!options.buildId || !options.documentId) {
291
+ throw new TypeError("Automatic streamed signals require buildId and documentId.");
292
+ }
293
+ const budget = limits(options);
294
+ const selectionGeneration = options.selectionGeneration ?? 0;
295
+ if (!Number.isSafeInteger(selectionGeneration) || selectionGeneration < 0) {
296
+ throw new RangeError("selectionGeneration must be a nonnegative safe integer.");
297
+ }
298
+ const children = [];
299
+ const observedAttempts = /* @__PURE__ */ new Set();
300
+ let initialSelections = [];
301
+ let queued = "";
302
+ let active;
303
+ let subscribed = false;
304
+ let renderComplete = false;
305
+ let finished = false;
306
+ let totalBytes = 0;
307
+ let notify;
308
+ let timer;
309
+ let resolveDone;
310
+ let rejectDone;
311
+ const done = new Promise((resolve, reject) => {
312
+ resolveDone = resolve;
313
+ rejectDone = reject;
314
+ });
315
+ const cleanupChild = (child) => {
316
+ try {
317
+ child.unsubscribe();
318
+ } catch {
319
+ }
320
+ try {
321
+ child.release();
322
+ } catch {
323
+ }
324
+ };
325
+ const fail = (error) => {
326
+ if (finished) return;
327
+ finished = true;
328
+ if (timer !== void 0) clearTimeout(timer);
329
+ for (const child of children) {
330
+ try {
331
+ child.source.cancel?.(error);
332
+ } catch {
333
+ }
334
+ cleanupChild(child);
335
+ }
336
+ rejectDone(error);
337
+ };
338
+ const maybeDone = () => {
339
+ if (finished || !renderComplete || active !== void 0 || queued !== "") return;
340
+ for (const child of children) if (!child.done) return;
341
+ finished = true;
342
+ if (timer !== void 0) clearTimeout(timer);
343
+ for (const child of children) cleanupChild(child);
344
+ resolveDone();
345
+ };
346
+ const takeInitialSelections = () => {
347
+ const selections = initialSelections;
348
+ initialSelections = void 0;
349
+ let html = "";
350
+ for (const { identity, attempt } of selections ?? []) {
351
+ if (attempt.signal.aborted) continue;
352
+ const script = streamedSignalSelectionScript(identity, options.nonce);
353
+ const bytes = new TextEncoder().encode(script).byteLength;
354
+ if (bytes > budget.maxFrameBytes || totalBytes + bytes > budget.maxTotalBytes) {
355
+ const error = new Error("Automatic streamed signals exceeded their byte budget.");
356
+ fail(error);
357
+ throw error;
358
+ }
359
+ totalBytes += bytes;
360
+ html += script;
361
+ }
362
+ return html;
363
+ };
364
+ const pump = () => {
365
+ if (!subscribed || finished || active !== void 0 || queued !== "") return;
366
+ if (initialSelections !== void 0) {
367
+ try {
368
+ queued = takeInitialSelections();
369
+ } catch {
370
+ return;
371
+ }
372
+ if (queued !== "") {
373
+ notify?.();
374
+ return;
375
+ }
376
+ }
377
+ for (const child of children) {
378
+ const html = child.source.take();
379
+ if (html === "") continue;
380
+ const bytes = new TextEncoder().encode(html).byteLength;
381
+ if (bytes > budget.maxFrameBytes || totalBytes + bytes > budget.maxTotalBytes) {
382
+ fail(new Error("Automatic streamed signals exceeded their byte budget."));
383
+ return;
384
+ }
385
+ totalBytes += bytes;
386
+ active = child;
387
+ queued = html;
388
+ notify?.();
389
+ return;
390
+ }
391
+ maybeDone();
392
+ };
393
+ const addChild = (source, release, attempt) => {
394
+ const child = {
395
+ source,
396
+ release,
397
+ unsubscribe: () => {
398
+ },
399
+ ...attempt === void 0 ? {} : { attempt },
400
+ done: false
401
+ };
402
+ children.push(child);
403
+ child.unsubscribe = source.subscribe(pump);
404
+ source.done.then(
405
+ () => {
406
+ child.done = true;
407
+ pump();
408
+ },
409
+ (error) => {
410
+ if (child.attempt !== void 0 && !child.attempt.isCurrent()) {
411
+ child.done = true;
412
+ pump();
413
+ } else fail(error);
414
+ }
415
+ );
416
+ };
417
+ if (external !== void 0) addChild(external, () => {
418
+ });
419
+ return {
420
+ takeInitialSelections,
421
+ createSignalAttemptObservations: import_signal_query_observation.createServerSignalQueryAttemptObservations,
422
+ get streamedRenderer() {
423
+ return external?.streamedRenderer === true || children.some((child) => child.attempt !== void 0) ? true : void 0;
424
+ },
425
+ observeSignalAttempt(attempt, run) {
426
+ if (finished || !attempt.isCurrent()) {
427
+ attempt.release();
428
+ return;
429
+ }
430
+ const attemptKey = JSON.stringify([
431
+ attempt.ownerKey,
432
+ attempt.instanceKey,
433
+ attempt.nodeKey,
434
+ attempt.selectionKey,
435
+ attempt.attempt
436
+ ]);
437
+ if (observedAttempts.has(attemptKey)) {
438
+ attempt.release();
439
+ return;
440
+ }
441
+ if (children.length >= 256) {
442
+ attempt.release();
443
+ fail(new Error("Automatic streamed signals exceeded their channel budget."));
444
+ return;
445
+ }
446
+ observedAttempts.add(attemptKey);
447
+ if (timer === void 0) {
448
+ timer = setTimeout(
449
+ () => fail(new Error("Automatic streamed signals timed out.")),
450
+ budget.timeoutMs
451
+ );
452
+ }
453
+ const identity = {
454
+ protocol: 1,
455
+ buildId: options.buildId,
456
+ documentId: options.documentId,
457
+ ownerKey: attempt.ownerKey,
458
+ instanceKey: attempt.instanceKey,
459
+ nodeKey: attempt.nodeKey,
460
+ selectionKey: attempt.selectionKey,
461
+ selectionGeneration,
462
+ attempt: attempt.attempt
463
+ };
464
+ initialSelections?.push({ identity, attempt });
465
+ const source = createStreamedSignalInjection(identity, attempt.result, {
466
+ signal: attempt.signal,
467
+ run,
468
+ nonce: options.nonce,
469
+ announceSelection: initialSelections === void 0,
470
+ maxFrameBytes: budget.maxFrameBytes,
471
+ maxTotalBytes: budget.maxTotalBytes,
472
+ timeoutMs: budget.timeoutMs
473
+ });
474
+ addChild(source, attempt.release, attempt);
475
+ pump();
476
+ },
477
+ take() {
478
+ const html = queued;
479
+ queued = "";
480
+ return html;
481
+ },
482
+ subscribe(callback) {
483
+ notify = callback;
484
+ subscribed = true;
485
+ pump();
486
+ return () => {
487
+ if (notify === callback) notify = void 0;
488
+ };
489
+ },
490
+ accepted() {
491
+ const child = active;
492
+ active = void 0;
493
+ child?.source.accepted?.();
494
+ pump();
495
+ },
496
+ cancel: fail,
497
+ done,
498
+ renderComplete() {
499
+ renderComplete = true;
500
+ for (const child of children) child.source.renderComplete?.();
501
+ maybeDone();
502
+ }
503
+ };
504
+ }
505
+ // Annotate the CommonJS export names for ESM import in node:
506
+ 0 && (module.exports = {
507
+ createAutomaticStreamedSignalInjection,
508
+ createStreamedRendererFrameStream,
509
+ createStreamedSignalInjection,
510
+ createStreamedSignalResultFrames,
511
+ streamedRendererFrameScript
512
+ });
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var server_call_exports = {};
20
+ __export(server_call_exports, {
21
+ InvalidServerFunctionPayloadError: () => InvalidServerFunctionPayloadError,
22
+ __registerServerFunction: () => __registerServerFunction,
23
+ __serverCall: () => __serverCall,
24
+ __setServerCallContextSource: () => __setServerCallContextSource,
25
+ invokeServerFunction: () => invokeServerFunction
26
+ });
27
+ module.exports = __toCommonJS(server_call_exports);
28
+ const SERVER_FUNCTION = /* @__PURE__ */ Symbol.for("octane.server.function");
29
+ const SERVER_CALL_SOURCE = /* @__PURE__ */ Symbol.for("octane.server.call-context");
30
+ const globals = globalThis;
31
+ class InvalidServerFunctionPayloadError extends Error {
32
+ code = "OCTANE_INVALID_RPC_PAYLOAD";
33
+ constructor(cause) {
34
+ super("Invalid server function arguments", { cause });
35
+ this.name = "InvalidServerFunctionPayloadError";
36
+ }
37
+ }
38
+ function __setServerCallContextSource(source) {
39
+ globals[SERVER_CALL_SOURCE] = source;
40
+ }
41
+ function registration(fn) {
42
+ return fn[SERVER_FUNCTION];
43
+ }
44
+ function __registerServerFunction(fn, contextIndex, target) {
45
+ if (!Number.isSafeInteger(contextIndex) || contextIndex < 0) {
46
+ throw new TypeError("Invalid server function context position");
47
+ }
48
+ const registered = Object.freeze({ fn, contextIndex, target: Object.freeze({ ...target }) });
49
+ const callable = (...args) => {
50
+ let options;
51
+ if (args.length === contextIndex + 1) {
52
+ options = args.pop();
53
+ }
54
+ return __serverCall(callable, args, options);
55
+ };
56
+ Object.defineProperty(callable, SERVER_FUNCTION, { value: registered });
57
+ return callable;
58
+ }
59
+ async function __serverCall(fn, args, options = {}) {
60
+ const registered = registration(fn);
61
+ if (registered === void 0) {
62
+ throw new TypeError("The server function is not registered");
63
+ }
64
+ if (options === null || typeof options !== "object" || Object.keys(options).some((key) => key !== "signal") || options.signal !== void 0 && !(options.signal instanceof AbortSignal)) {
65
+ throw new TypeError("Server function options accept only a local AbortSignal");
66
+ }
67
+ if (args.length > registered.contextIndex) {
68
+ throw new InvalidServerFunctionPayloadError();
69
+ }
70
+ options.signal?.throwIfAborted();
71
+ const host = globals[SERVER_CALL_SOURCE]?.getStore();
72
+ if (host === void 0) {
73
+ throw new Error("A contextual server function requires an active server request");
74
+ }
75
+ return host.invoke(
76
+ registered.target,
77
+ options,
78
+ (context) => invokeServerFunction(fn, args, context)
79
+ );
80
+ }
81
+ function invokeServerFunction(fn, args, context) {
82
+ const registered = registration(fn);
83
+ if (registered === void 0) return fn.apply(null, args);
84
+ if (context === void 0) {
85
+ throw new Error("A contextual server function requires trusted request context");
86
+ }
87
+ if (args.length > registered.contextIndex) {
88
+ throw new InvalidServerFunctionPayloadError();
89
+ }
90
+ context.signal.throwIfAborted();
91
+ const input = args.slice();
92
+ while (input.length < registered.contextIndex) input.push(void 0);
93
+ input.push(Object.freeze({ ...context }));
94
+ return registered.fn.apply(null, input);
95
+ }
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ InvalidServerFunctionPayloadError,
99
+ __registerServerFunction,
100
+ __serverCall,
101
+ __setServerCallContextSource,
102
+ invokeServerFunction
103
+ });