octane 0.2.11 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +5 -0
  2. package/dist/behavior-root.d.ts +13 -3
  3. package/dist/behavior-root.js +28 -5
  4. package/dist/cjs/behavior-root.cjs +32 -6
  5. package/dist/cjs/class-names.cjs +49 -0
  6. package/dist/cjs/constants.cjs +9 -0
  7. package/dist/cjs/context-epoch.cjs +38 -0
  8. package/dist/cjs/css.cjs +6 -27
  9. package/dist/cjs/data-encoding.cjs +160 -0
  10. package/dist/cjs/dom-binding-handoff.cjs +93 -0
  11. package/dist/cjs/dom-binding-protocol.cjs +115 -0
  12. package/dist/cjs/dom-binding-styles.cjs +292 -0
  13. package/dist/cjs/dom-bindings.cjs +700 -0
  14. package/dist/cjs/dom-focused-move.cjs +66 -0
  15. package/dist/cjs/dom-stage.cjs +896 -0
  16. package/dist/cjs/dom-tables.cjs +4 -94
  17. package/dist/cjs/error-codes.client.generated.cjs +33 -0
  18. package/dist/cjs/error-codes.server.generated.cjs +24 -0
  19. package/dist/cjs/hydration/control-capture.cjs +244 -0
  20. package/dist/cjs/hydration/event-capture.cjs +125 -43
  21. package/dist/cjs/hydration/interaction-config.cjs +50 -2
  22. package/dist/cjs/hydration-markers.cjs +37 -0
  23. package/dist/cjs/independent-hydration-protocol.cjs +106 -0
  24. package/dist/cjs/index.cjs +9 -0
  25. package/dist/cjs/runtime.cjs +6397 -1683
  26. package/dist/cjs/runtime.server.cjs +1465 -213
  27. package/dist/cjs/server/early-signals.cjs +45 -0
  28. package/dist/cjs/server/index.cjs +47 -0
  29. package/dist/cjs/server/rpc-batch.cjs +149 -0
  30. package/dist/cjs/server/rpc-stream.cjs +146 -0
  31. package/dist/cjs/server/rpc.cjs +34 -15
  32. package/dist/cjs/server/signal-query-observation.cjs +158 -0
  33. package/dist/cjs/server/streamed-region.cjs +52 -0
  34. package/dist/cjs/server/streamed-signals.cjs +512 -0
  35. package/dist/cjs/server-call.cjs +103 -0
  36. package/dist/cjs/server-rpc-batch-client.cjs +141 -0
  37. package/dist/cjs/server-rpc-client.cjs +94 -27
  38. package/dist/cjs/server-rpc-protocol.cjs +141 -0
  39. package/dist/cjs/server-rpc-stream-client.cjs +118 -0
  40. package/dist/cjs/signals/actions.cjs +474 -0
  41. package/dist/cjs/signals/client.cjs +4 -1
  42. package/dist/cjs/signals/computations.cjs +460 -0
  43. package/dist/cjs/signals/control-binding.cjs +368 -0
  44. package/dist/cjs/signals/derived-facade.cjs +50 -0
  45. package/dist/cjs/signals/document-owner.cjs +71 -0
  46. package/dist/cjs/signals/early-values.cjs +155 -0
  47. package/dist/cjs/signals/encoding.cjs +6 -95
  48. package/dist/cjs/signals/engine.cjs +276 -12
  49. package/dist/cjs/signals/errors.cjs +18 -0
  50. package/dist/cjs/signals/facade.cjs +477 -0
  51. package/dist/cjs/signals/graph.cjs +166 -20
  52. package/dist/cjs/signals/handle-protocol.cjs +36 -0
  53. package/dist/cjs/signals/index.cjs +81 -2
  54. package/dist/cjs/signals/native-read-client.cjs +10 -0
  55. package/dist/cjs/signals/owner-context.cjs +112 -0
  56. package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
  57. package/dist/cjs/signals/query-facade.cjs +72 -0
  58. package/dist/cjs/signals/read-protocol.cjs +54 -0
  59. package/dist/cjs/signals/requests.cjs +287 -14
  60. package/dist/cjs/signals/scalar-computations.cjs +76 -0
  61. package/dist/cjs/signals/server.cjs +4 -1
  62. package/dist/cjs/signals/transition-candidate.cjs +567 -0
  63. package/dist/cjs/signals/transition-state.cjs +106 -0
  64. package/dist/cjs/signals/types.cjs +50 -0
  65. package/dist/cjs/stream-protocol.cjs +3 -0
  66. package/dist/cjs/streamed-signals-protocol.cjs +159 -0
  67. package/dist/cjs/style-values.cjs +122 -0
  68. package/dist/cjs/trusted-html.cjs +30 -0
  69. package/dist/cjs/version.cjs +1 -1
  70. package/dist/class-names.d.ts +5 -0
  71. package/dist/class-names.js +25 -0
  72. package/dist/compiler/bundler.js +51 -22
  73. package/dist/compiler/compile.js +2534 -581
  74. package/dist/compiler/dom-binding-program.js +935 -0
  75. package/dist/compiler/dom-binding-request.js +57 -0
  76. package/dist/compiler/dom-bindings.js +2245 -0
  77. package/dist/compiler/hook-deps.js +759 -10
  78. package/dist/compiler/hydrate-boundaries.js +358 -15
  79. package/dist/compiler/index.d.ts +39 -2
  80. package/dist/compiler/index.js +1 -0
  81. package/dist/compiler/native-attribute-reads.js +127 -0
  82. package/dist/compiler/native-change-diagnostics.js +32 -38
  83. package/dist/compiler/native-read-diagnostics.js +69 -8
  84. package/dist/compiler/native-read-types.js +80 -34
  85. package/dist/compiler/parser.node.js +1 -1
  86. package/dist/compiler/renderer-boundaries.js +40 -0
  87. package/dist/compiler/server-context.js +118 -0
  88. package/dist/compiler/signal-attempt-reads.js +479 -0
  89. package/dist/compiler/signal-declarations.js +557 -0
  90. package/dist/compiler/signal-start-reads.js +413 -0
  91. package/dist/compiler/slot-hooks.d.ts +3 -1
  92. package/dist/compiler/slot-hooks.js +168 -34
  93. package/dist/compiler/strong-auto-memo.js +90 -0
  94. package/dist/compiler/strong-html.js +143 -0
  95. package/dist/compiler/strong-mode.js +764 -66
  96. package/dist/compiler/strong-template-policy.js +307 -0
  97. package/dist/compiler/template-ir.js +200 -0
  98. package/dist/compiler/typescript.d.ts +2 -0
  99. package/dist/compiler/typescript.js +2 -0
  100. package/dist/compiler/vite.d.ts +3 -1
  101. package/dist/compiler/vite.js +122 -4
  102. package/dist/compiler/volar.LICENSES.txt +1 -1
  103. package/dist/compiler/volar.d.ts +6 -1
  104. package/dist/compiler/volar.js +750 -1433
  105. package/dist/constants.d.ts +1 -0
  106. package/dist/constants.js +10 -0
  107. package/dist/context-epoch.d.ts +2 -0
  108. package/dist/context-epoch.js +13 -0
  109. package/dist/css.d.ts +2 -5
  110. package/dist/css.js +2 -23
  111. package/dist/data-encoding.d.ts +9 -0
  112. package/dist/data-encoding.js +134 -0
  113. package/dist/dom-binding-classes.d.ts +15 -0
  114. package/dist/dom-binding-classes.js +129 -0
  115. package/dist/dom-binding-controls.d.ts +2 -0
  116. package/dist/dom-binding-controls.js +6 -0
  117. package/dist/dom-binding-handoff.d.ts +55 -0
  118. package/dist/dom-binding-handoff.js +62 -0
  119. package/dist/dom-binding-program.d.ts +300 -0
  120. package/dist/dom-binding-program.js +1625 -0
  121. package/dist/dom-binding-projections.d.ts +15 -0
  122. package/dist/dom-binding-projections.js +187 -0
  123. package/dist/dom-binding-protocol.d.ts +13 -0
  124. package/dist/dom-binding-protocol.js +88 -0
  125. package/dist/dom-binding-signals.d.ts +21 -0
  126. package/dist/dom-binding-signals.js +109 -0
  127. package/dist/dom-binding-styles.d.ts +17 -0
  128. package/dist/dom-binding-styles.js +272 -0
  129. package/dist/dom-bindings.d.ts +89 -0
  130. package/dist/dom-bindings.js +670 -0
  131. package/dist/dom-focused-move.d.ts +6 -0
  132. package/dist/dom-focused-move.js +42 -0
  133. package/dist/dom-stage.d.ts +52 -0
  134. package/dist/dom-stage.js +872 -0
  135. package/dist/dom-tables.d.ts +1 -3
  136. package/dist/dom-tables.js +1 -91
  137. package/dist/error-codes.client.generated.d.ts +9 -0
  138. package/dist/error-codes.client.generated.js +33 -0
  139. package/dist/error-codes.server.generated.d.ts +6 -0
  140. package/dist/error-codes.server.generated.js +24 -0
  141. package/dist/hydration/control-capture.d.ts +62 -0
  142. package/dist/hydration/control-capture.js +223 -0
  143. package/dist/hydration/document-lifecycle.d.ts +23 -0
  144. package/dist/hydration/document-lifecycle.js +80 -0
  145. package/dist/hydration/event-capture.d.ts +20 -1
  146. package/dist/hydration/event-capture.js +128 -42
  147. package/dist/hydration/independent-island.d.ts +45 -0
  148. package/dist/hydration/independent-island.js +233 -0
  149. package/dist/hydration/index.d.ts +8 -1
  150. package/dist/hydration/index.js +55 -1
  151. package/dist/hydration/interaction-config.d.ts +5 -0
  152. package/dist/hydration/interaction-config.js +44 -1
  153. package/dist/hydration/stream-delivery.d.ts +32 -0
  154. package/dist/hydration/stream-delivery.js +333 -0
  155. package/dist/hydration/stream-receiver.d.ts +26 -0
  156. package/dist/hydration/stream-receiver.js +204 -0
  157. package/dist/hydration/stream-result-receiver.d.ts +70 -0
  158. package/dist/hydration/stream-result-receiver.js +246 -0
  159. package/dist/hydration/streamed-signals.d.ts +44 -0
  160. package/dist/hydration/streamed-signals.js +186 -0
  161. package/dist/hydration/types.d.ts +6 -0
  162. package/dist/hydration-markers.d.ts +7 -0
  163. package/dist/hydration-markers.js +10 -0
  164. package/dist/independent-hydration-protocol.d.ts +31 -0
  165. package/dist/independent-hydration-protocol.js +80 -0
  166. package/dist/index.d.ts +3 -0
  167. package/dist/index.js +6 -0
  168. package/dist/internal/signal-read.d.ts +1 -0
  169. package/dist/internal/signal-read.js +4 -0
  170. package/dist/jsx-runtime-strong.d.ts +33 -0
  171. package/dist/jsx-runtime.d.ts +58 -2
  172. package/dist/public-types.d.ts +15 -1
  173. package/dist/runtime.d.ts +297 -23
  174. package/dist/runtime.js +6405 -1679
  175. package/dist/runtime.server.d.ts +110 -27
  176. package/dist/runtime.server.js +1458 -213
  177. package/dist/server/early-signals.d.ts +14 -0
  178. package/dist/server/early-signals.js +34 -0
  179. package/dist/server/index.d.ts +11 -2
  180. package/dist/server/index.js +50 -1
  181. package/dist/server/rpc-batch.d.ts +17 -0
  182. package/dist/server/rpc-batch.js +129 -0
  183. package/dist/server/rpc-stream.d.ts +9 -0
  184. package/dist/server/rpc-stream.js +125 -0
  185. package/dist/server/rpc.d.ts +5 -1
  186. package/dist/server/rpc.js +37 -13
  187. package/dist/server/signal-query-observation.d.ts +3 -0
  188. package/dist/server/signal-query-observation.js +134 -0
  189. package/dist/server/streamed-region.d.ts +15 -0
  190. package/dist/server/streamed-region.js +30 -0
  191. package/dist/server/streamed-signals.d.ts +45 -0
  192. package/dist/server/streamed-signals.js +488 -0
  193. package/dist/server-call.d.ts +41 -0
  194. package/dist/server-call.js +75 -0
  195. package/dist/server-rpc-batch-client.d.ts +7 -0
  196. package/dist/server-rpc-batch-client.js +119 -0
  197. package/dist/server-rpc-client.d.ts +3 -1
  198. package/dist/server-rpc-client.js +99 -27
  199. package/dist/server-rpc-protocol.d.ts +47 -0
  200. package/dist/server-rpc-protocol.js +109 -0
  201. package/dist/server-rpc-stream-client.d.ts +5 -0
  202. package/dist/server-rpc-stream-client.js +98 -0
  203. package/dist/signals/actions.d.ts +12 -0
  204. package/dist/signals/actions.js +466 -0
  205. package/dist/signals/client.d.ts +2 -0
  206. package/dist/signals/client.js +1 -0
  207. package/dist/signals/computations.d.ts +37 -0
  208. package/dist/signals/computations.js +455 -0
  209. package/dist/signals/control-binding.d.ts +31 -0
  210. package/dist/signals/control-binding.js +353 -0
  211. package/dist/signals/derived-facade.d.ts +3 -0
  212. package/dist/signals/derived-facade.js +25 -0
  213. package/dist/signals/document-owner.d.ts +10 -0
  214. package/dist/signals/document-owner.js +43 -0
  215. package/dist/signals/early-values.d.ts +24 -0
  216. package/dist/signals/early-values.js +124 -0
  217. package/dist/signals/encoding.d.ts +1 -3
  218. package/dist/signals/encoding.js +3 -93
  219. package/dist/signals/engine.d.ts +53 -4
  220. package/dist/signals/engine.js +275 -16
  221. package/dist/signals/errors.d.ts +7 -0
  222. package/dist/signals/errors.js +16 -0
  223. package/dist/signals/facade.d.ts +74 -0
  224. package/dist/signals/facade.js +452 -0
  225. package/dist/signals/graph.d.ts +52 -6
  226. package/dist/signals/graph.js +174 -19
  227. package/dist/signals/handle-protocol.d.ts +4 -0
  228. package/dist/signals/handle-protocol.js +11 -0
  229. package/dist/signals/index.d.ts +12 -3
  230. package/dist/signals/index.js +71 -2
  231. package/dist/signals/native-read-client.d.ts +3 -0
  232. package/dist/signals/native-read-client.js +10 -0
  233. package/dist/signals/owner-context.d.ts +22 -0
  234. package/dist/signals/owner-context.js +77 -0
  235. package/dist/signals/query-attempt-observer.d.ts +49 -0
  236. package/dist/signals/query-attempt-observer.js +41 -0
  237. package/dist/signals/query-facade.d.ts +3 -0
  238. package/dist/signals/query-facade.js +49 -0
  239. package/dist/signals/read-protocol.d.ts +37 -2
  240. package/dist/signals/read-protocol.js +44 -0
  241. package/dist/signals/requests.d.ts +38 -5
  242. package/dist/signals/requests.js +298 -15
  243. package/dist/signals/scalar-computations.d.ts +2 -0
  244. package/dist/signals/scalar-computations.js +60 -0
  245. package/dist/signals/server.d.ts +2 -0
  246. package/dist/signals/server.js +1 -0
  247. package/dist/signals/transition-candidate.d.ts +71 -0
  248. package/dist/signals/transition-candidate.js +557 -0
  249. package/dist/signals/transition-state.d.ts +51 -0
  250. package/dist/signals/transition-state.js +70 -0
  251. package/dist/signals/types.d.ts +95 -5
  252. package/dist/signals/types.js +20 -0
  253. package/dist/stream-protocol.d.ts +0 -5
  254. package/dist/stream-protocol.js +3 -0
  255. package/dist/streamed-signals-protocol.d.ts +60 -0
  256. package/dist/streamed-signals-protocol.js +130 -0
  257. package/dist/style-values.d.ts +3 -0
  258. package/dist/style-values.js +96 -0
  259. package/dist/trusted-html.d.ts +17 -0
  260. package/dist/trusted-html.js +6 -0
  261. package/dist/universal-core.d.ts +6 -0
  262. package/dist/universal-core.js +214 -202
  263. package/dist/version.js +1 -1
  264. package/package.json +48 -5
@@ -0,0 +1,141 @@
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_rpc_batch_client_exports = {};
20
+ __export(server_rpc_batch_client_exports, {
21
+ SERVER_BATCH_CONTENT_TYPE: () => SERVER_BATCH_CONTENT_TYPE,
22
+ batchServerCalls: () => batchServerCalls,
23
+ enqueueServerCall: () => enqueueServerCall
24
+ });
25
+ module.exports = __toCommonJS(server_rpc_batch_client_exports);
26
+ var import_server_rpc_stream_client = require("./server-rpc-stream-client.cjs");
27
+ var import_server_rpc_protocol = require("./server-rpc-protocol.cjs");
28
+ const SERVER_BATCH_CONTENT_TYPE = "application/x-octane-rpc-batch+ndjson";
29
+ let collecting;
30
+ function batchServerCalls(options, callback) {
31
+ (0, import_server_rpc_protocol.validateServerCallBatch)(options);
32
+ const previous = collecting;
33
+ collecting = { options: { ...options }, members: [] };
34
+ try {
35
+ return callback();
36
+ } finally {
37
+ collecting = previous;
38
+ }
39
+ }
40
+ function enqueueServerCall(hash, body, options, limits) {
41
+ const batch = collecting;
42
+ if (batch === void 0 || limits !== void 0) return void 0;
43
+ if (batch.members.length === 32) {
44
+ collecting = { options: batch.options, members: [] };
45
+ return enqueueServerCall(hash, body, options);
46
+ }
47
+ if (batch.members.length === 0)
48
+ queueMicrotask(() => {
49
+ void dispatch(batch);
50
+ });
51
+ return new Promise((resolve, reject) => {
52
+ const abort = () => {
53
+ if (member.settled) return;
54
+ member.settled = true;
55
+ member.dispose();
56
+ reject(new import_server_rpc_protocol.ServerCallUncertainError(options.signal?.reason));
57
+ };
58
+ const member = {
59
+ hash,
60
+ body,
61
+ signal: options.signal,
62
+ resolve,
63
+ reject,
64
+ settled: false,
65
+ dispose: () => options.signal?.removeEventListener("abort", abort)
66
+ };
67
+ options.signal?.addEventListener("abort", abort, { once: true });
68
+ batch.members.push(member);
69
+ if (options.signal?.aborted) abort();
70
+ });
71
+ }
72
+ async function dispatch(batch) {
73
+ const members = batch.members.filter((member) => !member.settled);
74
+ if (members.length === 0) return;
75
+ const limits = (0, import_server_rpc_protocol.serverResultLimits)(batch.options);
76
+ const transport = new AbortController();
77
+ let definitiveRejection = false;
78
+ const timer = setTimeout(
79
+ () => transport.abort(new DOMException("Server batch timed out", "TimeoutError")),
80
+ limits.timeoutMs
81
+ );
82
+ try {
83
+ const response = await fetch(
84
+ new URL("/_$_ripple_rpc_$_/" + members[0].hash, globalThis.location.href).href,
85
+ {
86
+ method: "POST",
87
+ headers: { "Content-Type": "application/json", Accept: SERVER_BATCH_CONTENT_TYPE },
88
+ body: JSON.stringify([1, members.map((member, id) => [id, member.hash, member.body])]),
89
+ signal: transport.signal
90
+ }
91
+ );
92
+ if (!response.ok || response.headers.get("content-type")?.split(";", 1)[0] !== SERVER_BATCH_CONTENT_TYPE) {
93
+ definitiveRejection = !response.ok && response.headers.get("Octane-RPC-Outcome") === "rejected";
94
+ try {
95
+ void response.body?.cancel().catch(() => {
96
+ });
97
+ } catch {
98
+ }
99
+ throw new Error("Server-call batching was rejected or is unavailable");
100
+ }
101
+ const result = await (0, import_server_rpc_stream_client.readServerResult)(response, { ...limits, signal: transport.signal });
102
+ if (result === null || typeof result !== "object" || !(Symbol.asyncIterator in result)) {
103
+ throw new Error("Invalid server batch result");
104
+ }
105
+ const seen = /* @__PURE__ */ new Set();
106
+ for await (const frame of result) {
107
+ if (!Array.isArray(frame) || frame.length !== 3 || !Number.isSafeInteger(frame[0]) || frame[0] < 0 || frame[0] >= members.length || seen.has(frame[0]) || !["value", "rejected", "uncertain"].includes(frame[1]) || frame[1] !== "value" && typeof frame[2] !== "string") {
108
+ throw new Error("Invalid or duplicate server batch member");
109
+ }
110
+ seen.add(frame[0]);
111
+ const member = members[frame[0]];
112
+ if (member.settled) continue;
113
+ member.settled = true;
114
+ member.dispose();
115
+ if (frame[1] === "value") member.resolve(frame[2]);
116
+ else {
117
+ const error = new Error(frame[2]);
118
+ member.reject(frame[1] === "rejected" ? error : new import_server_rpc_protocol.ServerCallUncertainError(error));
119
+ }
120
+ }
121
+ if (seen.size !== members.length) throw new Error("Server batch ended with missing members");
122
+ } catch (error) {
123
+ for (const member of members) {
124
+ if (member.settled) continue;
125
+ member.settled = true;
126
+ member.dispose();
127
+ member.reject(
128
+ definitiveRejection || error instanceof import_server_rpc_protocol.ServerCallUncertainError ? error : new import_server_rpc_protocol.ServerCallUncertainError(error)
129
+ );
130
+ }
131
+ } finally {
132
+ clearTimeout(timer);
133
+ transport.abort();
134
+ }
135
+ }
136
+ // Annotate the CommonJS export names for ESM import in node:
137
+ 0 && (module.exports = {
138
+ SERVER_BATCH_CONTENT_TYPE,
139
+ batchServerCalls,
140
+ enqueueServerCall
141
+ });
@@ -32,37 +32,104 @@ __export(server_rpc_client_exports, {
32
32
  });
33
33
  module.exports = __toCommonJS(server_rpc_client_exports);
34
34
  var devalue = __toESM(require("devalue"), 1);
35
- async function __serverRpc(hash, args) {
36
- let response;
37
- try {
38
- response = await fetch("/_$_ripple_rpc_$_/" + hash, {
39
- method: "POST",
40
- headers: { "Content-Type": "application/json" },
41
- body: devalue.stringify(args)
42
- });
43
- } catch {
44
- throw new Error("An error occurred while trying to call the Octane server function.");
35
+ var import_server_rpc_protocol = require("./server-rpc-protocol.cjs");
36
+ var import_server_rpc_stream_client = require("./server-rpc-stream-client.cjs");
37
+ var import_server_rpc_batch_client = require("./server-rpc-batch-client.cjs");
38
+ async function __serverRpc(hash, args, options = {}, stream = false, limits) {
39
+ if (options === null || typeof options !== "object" || Object.keys(options).some((key) => key !== "signal") || options.signal !== void 0 && !(options.signal instanceof AbortSignal))
40
+ throw new TypeError("Server function options accept only a local AbortSignal");
41
+ options.signal?.throwIfAborted();
42
+ const resolvedLimits = stream ? (0, import_server_rpc_protocol.serverResultLimits)(limits) : void 0;
43
+ const payload = stream ? (0, import_server_rpc_protocol.encodeServerArguments)(args) : devalue.stringify(args);
44
+ if (stream) {
45
+ const batched = (0, import_server_rpc_batch_client.enqueueServerCall)(hash, payload, options, limits);
46
+ if (batched !== void 0) return batched;
45
47
  }
46
- if (!response.ok) {
47
- let message = `Server function call failed with status ${response.status}`;
48
- const body2 = await response.text().catch(() => "");
49
- if (body2) {
50
- try {
51
- const parsed = JSON.parse(body2);
52
- message = typeof parsed?.error === "string" && parsed.error ? parsed.error : body2;
53
- } catch {
54
- message = body2;
48
+ const deadline = resolvedLimits === void 0 ? void 0 : Date.now() + resolvedLimits.timeoutMs;
49
+ const cancellation = resolvedLimits === void 0 ? void 0 : new AbortController();
50
+ const timer = resolvedLimits === void 0 ? void 0 : setTimeout(() => {
51
+ cancellation.abort(new DOMException("Server function timed out", "TimeoutError"));
52
+ }, resolvedLimits.timeoutMs);
53
+ const signal = cancellation === void 0 ? options.signal : options.signal === void 0 ? cancellation.signal : AbortSignal.any([options.signal, cancellation.signal]);
54
+ try {
55
+ let response;
56
+ try {
57
+ response = await fetch(new URL("/_$_ripple_rpc_$_/" + hash, globalThis.location.href).href, {
58
+ method: "POST",
59
+ headers: {
60
+ "Content-Type": "application/json",
61
+ ...stream ? { Accept: import_server_rpc_protocol.SERVER_RESULT_CONTENT_TYPE } : {}
62
+ },
63
+ body: payload,
64
+ signal
65
+ });
66
+ } catch (cause) {
67
+ throw new import_server_rpc_protocol.ServerCallUncertainError(
68
+ new Error("An error occurred while trying to call the Octane server function.", { cause })
69
+ );
70
+ }
71
+ if (!response.ok) {
72
+ let message = `Server function call failed with status ${response.status}`;
73
+ let body2 = "";
74
+ if (stream) {
75
+ try {
76
+ void response.body?.cancel().catch(() => {
77
+ });
78
+ } catch {
79
+ }
80
+ } else {
81
+ body2 = await response.text().catch(() => "");
55
82
  }
83
+ if (body2) {
84
+ try {
85
+ const parsed = JSON.parse(body2);
86
+ message = typeof parsed?.error === "string" && parsed.error ? parsed.error : body2;
87
+ } catch {
88
+ message = body2;
89
+ }
90
+ }
91
+ const error = Object.assign(new Error(message), { status: response.status });
92
+ throw response.headers.get("Octane-RPC-Outcome") === "rejected" ? error : new import_server_rpc_protocol.ServerCallUncertainError(error);
56
93
  }
57
- throw new Error(message);
58
- }
59
- const body = await response.text();
60
- if (body === "") {
61
- throw new Error(
62
- "The server function endpoint returned an empty response. Is the Octane server running?"
63
- );
94
+ if (stream) {
95
+ if (response.headers.get("content-type")?.split(";", 1)[0] !== import_server_rpc_protocol.SERVER_RESULT_CONTENT_TYPE) {
96
+ void response.body?.cancel().catch(() => {
97
+ });
98
+ throw new import_server_rpc_protocol.ServerCallUncertainError(
99
+ new Error("The server does not support the requested result protocol")
100
+ );
101
+ }
102
+ const remaining = deadline - Date.now();
103
+ if (remaining <= 0) {
104
+ void response.body?.cancel().catch(() => {
105
+ });
106
+ throw new import_server_rpc_protocol.ServerCallUncertainError(
107
+ new DOMException("Server function timed out", "TimeoutError")
108
+ );
109
+ }
110
+ return await (0, import_server_rpc_stream_client.readServerResult)(response, { ...resolvedLimits, timeoutMs: remaining, signal });
111
+ }
112
+ let body;
113
+ try {
114
+ body = await response.text();
115
+ } catch (error) {
116
+ throw new import_server_rpc_protocol.ServerCallUncertainError(error);
117
+ }
118
+ if (body === "") {
119
+ throw new import_server_rpc_protocol.ServerCallUncertainError(
120
+ new Error(
121
+ "The server function endpoint returned an empty response. Is the Octane server running?"
122
+ )
123
+ );
124
+ }
125
+ try {
126
+ return devalue.parse(body).value;
127
+ } catch (error) {
128
+ throw new import_server_rpc_protocol.ServerCallUncertainError(error);
129
+ }
130
+ } finally {
131
+ clearTimeout(timer);
64
132
  }
65
- return devalue.parse(body).value;
66
133
  }
67
134
  // Annotate the CommonJS export names for ESM import in node:
68
135
  0 && (module.exports = {
@@ -0,0 +1,141 @@
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_rpc_protocol_exports = {};
20
+ __export(server_rpc_protocol_exports, {
21
+ SERVER_RESULT_CONTENT_TYPE: () => SERVER_RESULT_CONTENT_TYPE,
22
+ ServerCallUncertainError: () => ServerCallUncertainError,
23
+ decodeServerArguments: () => decodeServerArguments,
24
+ decodeServerResultFrame: () => decodeServerResultFrame,
25
+ encodeServerArguments: () => encodeServerArguments,
26
+ encodeServerResultFrame: () => encodeServerResultFrame,
27
+ serverResultLimits: () => serverResultLimits,
28
+ serverResultReader: () => serverResultReader,
29
+ validateServerCallBatch: () => validateServerCallBatch
30
+ });
31
+ module.exports = __toCommonJS(server_rpc_protocol_exports);
32
+ var import_data_encoding = require("./data-encoding.cjs");
33
+ const SERVER_RESULT_CONTENT_TYPE = "application/x-octane-rpc+ndjson";
34
+ function encodeServerArguments(args) {
35
+ return JSON.stringify([1, (0, import_data_encoding.encodeSignalValue)(args)]);
36
+ }
37
+ function decodeServerArguments(body) {
38
+ const envelope = JSON.parse(body);
39
+ if (!Array.isArray(envelope) || envelope.length !== 2 || envelope[0] !== 1) {
40
+ throw new Error("Invalid server argument protocol");
41
+ }
42
+ const args = (0, import_data_encoding.decodeSignalValue)(envelope[1]);
43
+ if (!Array.isArray(args)) throw new Error("Invalid server arguments");
44
+ return args;
45
+ }
46
+ class ServerCallUncertainError extends Error {
47
+ code = "OCTANE_RPC_UNCERTAIN";
48
+ constructor(cause) {
49
+ super(cause instanceof Error ? cause.message : "Server function outcome is uncertain", {
50
+ cause
51
+ });
52
+ this.name = "ServerCallUncertainError";
53
+ }
54
+ }
55
+ function validateServerCallBatch(options) {
56
+ if (options.kind !== "independent-reads" || !options.authority || !options.document) {
57
+ throw new TypeError(
58
+ "A server-call batch requires independent reads and authority/document keys"
59
+ );
60
+ }
61
+ serverResultLimits(options);
62
+ }
63
+ function serverResultLimits(limits = {}) {
64
+ const result = {
65
+ maxFrameBytes: limits.maxFrameBytes ?? 1024 * 1024,
66
+ maxTotalBytes: limits.maxTotalBytes ?? 16 * 1024 * 1024,
67
+ timeoutMs: limits.timeoutMs ?? 3e4
68
+ };
69
+ for (const value of Object.values(result)) {
70
+ if (!Number.isSafeInteger(value) || value <= 0) {
71
+ throw new RangeError("Server result limits must be positive safe integers");
72
+ }
73
+ }
74
+ if (result.maxFrameBytes > result.maxTotalBytes) {
75
+ throw new RangeError("A server result frame cannot exceed the total response budget");
76
+ }
77
+ return result;
78
+ }
79
+ function encodeServerResultFrame(sequence, frame) {
80
+ const payload = frame.kind === "value" ? (0, import_data_encoding.encodeSignalValue)(frame.value) : frame.kind === "error" ? frame.error : null;
81
+ return new TextEncoder().encode(JSON.stringify([1, sequence, frame.kind, payload]) + "\n");
82
+ }
83
+ function decodeServerResultFrame(line, sequence) {
84
+ const frame = JSON.parse(line);
85
+ if (!Array.isArray(frame) || frame.length !== 4 || frame[0] !== 1 || frame[1] !== sequence) {
86
+ throw new Error("Invalid or out-of-order server result frame");
87
+ }
88
+ const [, , kind, payload] = frame;
89
+ if (kind === "value") {
90
+ return { kind, value: (0, import_data_encoding.decodeSignalValue)(payload) };
91
+ }
92
+ if (kind === "error" && typeof payload === "string") return { kind, error: payload };
93
+ if ((kind === "stream" || kind === "complete") && payload === null) return { kind };
94
+ throw new Error("Invalid server result frame");
95
+ }
96
+ function serverResultReader(reader, limits) {
97
+ let chunk = new Uint8Array(0);
98
+ let offset = 0;
99
+ let sequence = 0;
100
+ let totalBytes = 0;
101
+ return async () => {
102
+ const parts = [];
103
+ let bytes = 0;
104
+ while (true) {
105
+ if (offset === chunk.length) {
106
+ const next = await reader.read();
107
+ if (next.done) throw new Error("Server result ended without a terminal frame");
108
+ chunk = next.value;
109
+ offset = 0;
110
+ }
111
+ const newline = chunk.indexOf(10, offset);
112
+ const end = newline === -1 ? chunk.length : newline + 1;
113
+ const part = chunk.subarray(offset, end);
114
+ bytes += part.length;
115
+ totalBytes += part.length;
116
+ if (bytes > limits.maxFrameBytes || totalBytes > limits.maxTotalBytes) {
117
+ throw new Error("Server result exceeded its response budget");
118
+ }
119
+ parts.push(part);
120
+ offset = end;
121
+ if (newline !== -1) {
122
+ const decoder = new TextDecoder("utf-8", { fatal: true });
123
+ const text = parts.map((value) => decoder.decode(value, { stream: true }));
124
+ text.push(decoder.decode());
125
+ return decodeServerResultFrame(text.join(""), sequence++);
126
+ }
127
+ }
128
+ };
129
+ }
130
+ // Annotate the CommonJS export names for ESM import in node:
131
+ 0 && (module.exports = {
132
+ SERVER_RESULT_CONTENT_TYPE,
133
+ ServerCallUncertainError,
134
+ decodeServerArguments,
135
+ decodeServerResultFrame,
136
+ encodeServerArguments,
137
+ encodeServerResultFrame,
138
+ serverResultLimits,
139
+ serverResultReader,
140
+ validateServerCallBatch
141
+ });
@@ -0,0 +1,118 @@
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_rpc_stream_client_exports = {};
20
+ __export(server_rpc_stream_client_exports, {
21
+ readServerResult: () => readServerResult
22
+ });
23
+ module.exports = __toCommonJS(server_rpc_stream_client_exports);
24
+ var import_server_rpc_protocol = require("./server-rpc-protocol.cjs");
25
+ async function readServerResult(response, options = {}) {
26
+ if (response.body === null)
27
+ throw new import_server_rpc_protocol.ServerCallUncertainError(new Error("Server function returned an empty response"));
28
+ const limits = (0, import_server_rpc_protocol.serverResultLimits)(options);
29
+ const reader = response.body.getReader();
30
+ const read = (0, import_server_rpc_protocol.serverResultReader)(reader, limits);
31
+ let finished = false;
32
+ let failure;
33
+ const cleanup = () => {
34
+ clearTimeout(timer);
35
+ options.signal?.removeEventListener("abort", abort);
36
+ };
37
+ const close = async () => {
38
+ if (finished) return;
39
+ finished = true;
40
+ cleanup();
41
+ try {
42
+ void reader.cancel().catch(() => {
43
+ });
44
+ } catch {
45
+ }
46
+ reader.releaseLock();
47
+ };
48
+ const abort = () => {
49
+ failure = new import_server_rpc_protocol.ServerCallUncertainError(
50
+ options.signal?.reason ?? new DOMException("Server function canceled", "AbortError")
51
+ );
52
+ void close();
53
+ };
54
+ const timer = setTimeout(() => {
55
+ failure = new import_server_rpc_protocol.ServerCallUncertainError(
56
+ new DOMException("Server function timed out", "TimeoutError")
57
+ );
58
+ void close();
59
+ }, limits.timeoutMs);
60
+ options.signal?.addEventListener("abort", abort, { once: true });
61
+ if (options.signal?.aborted) abort();
62
+ const next = async () => {
63
+ if (failure !== void 0) throw failure;
64
+ try {
65
+ const frame = await read();
66
+ if (failure !== void 0) throw failure;
67
+ if (frame.kind === "error") throw new Error(frame.error);
68
+ return frame;
69
+ } catch (error) {
70
+ await close();
71
+ throw failure ?? new import_server_rpc_protocol.ServerCallUncertainError(error);
72
+ }
73
+ };
74
+ try {
75
+ const first = await next();
76
+ if (first.kind === "value") {
77
+ if ((await next()).kind !== "complete") throw new Error("Invalid one-shot server result");
78
+ await close();
79
+ return first.value;
80
+ }
81
+ if (first.kind !== "stream") throw new Error("Invalid server result opening frame");
82
+ let claimed = false;
83
+ return {
84
+ [Symbol.asyncIterator]() {
85
+ if (claimed) throw new Error("A server result stream supports one consumer");
86
+ claimed = true;
87
+ let pulls = Promise.resolve();
88
+ const pull = async () => {
89
+ if (failure !== void 0) throw failure;
90
+ if (finished) return { done: true, value: void 0 };
91
+ const frame = await next();
92
+ if (frame.kind === "value") return { done: false, value: frame.value };
93
+ await close();
94
+ if (frame.kind !== "complete") throw new Error("Invalid server result continuation");
95
+ return { done: true, value: void 0 };
96
+ };
97
+ return {
98
+ next() {
99
+ const result = pulls.then(pull, pull);
100
+ pulls = result;
101
+ return result;
102
+ },
103
+ async return() {
104
+ await close();
105
+ return { done: true, value: void 0 };
106
+ }
107
+ };
108
+ }
109
+ };
110
+ } catch (error) {
111
+ await close();
112
+ throw error instanceof import_server_rpc_protocol.ServerCallUncertainError ? error : new import_server_rpc_protocol.ServerCallUncertainError(error);
113
+ }
114
+ }
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ readServerResult
118
+ });