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.
- 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/context-epoch.cjs +38 -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-stage.cjs +896 -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 +24 -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 +9 -0
- package/dist/cjs/runtime.cjs +6397 -1683
- package/dist/cjs/runtime.server.cjs +1465 -213
- package/dist/cjs/server/early-signals.cjs +45 -0
- package/dist/cjs/server/index.cjs +47 -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 +166 -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 +54 -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/trusted-html.cjs +30 -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 +51 -22
- package/dist/compiler/compile.js +2534 -581
- 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 +759 -10
- package/dist/compiler/hydrate-boundaries.js +358 -15
- package/dist/compiler/index.d.ts +39 -2
- package/dist/compiler/index.js +1 -0
- package/dist/compiler/native-attribute-reads.js +127 -0
- package/dist/compiler/native-change-diagnostics.js +32 -38
- package/dist/compiler/native-read-diagnostics.js +69 -8
- package/dist/compiler/native-read-types.js +80 -34
- package/dist/compiler/parser.node.js +1 -1
- package/dist/compiler/renderer-boundaries.js +40 -0
- 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.d.ts +3 -1
- package/dist/compiler/slot-hooks.js +168 -34
- package/dist/compiler/strong-auto-memo.js +90 -0
- package/dist/compiler/strong-html.js +143 -0
- package/dist/compiler/strong-mode.js +764 -66
- package/dist/compiler/strong-template-policy.js +307 -0
- 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.LICENSES.txt +1 -1
- package/dist/compiler/volar.d.ts +6 -1
- package/dist/compiler/volar.js +750 -1433
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +10 -0
- package/dist/context-epoch.d.ts +2 -0
- package/dist/context-epoch.js +13 -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-stage.d.ts +52 -0
- package/dist/dom-stage.js +872 -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 +6 -0
- package/dist/error-codes.server.generated.js +24 -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 +3 -0
- package/dist/index.js +6 -0
- package/dist/internal/signal-read.d.ts +1 -0
- package/dist/internal/signal-read.js +4 -0
- package/dist/jsx-runtime-strong.d.ts +33 -0
- package/dist/jsx-runtime.d.ts +58 -2
- package/dist/public-types.d.ts +15 -1
- package/dist/runtime.d.ts +297 -23
- package/dist/runtime.js +6405 -1679
- package/dist/runtime.server.d.ts +110 -27
- package/dist/runtime.server.js +1458 -213
- package/dist/server/early-signals.d.ts +14 -0
- package/dist/server/early-signals.js +34 -0
- package/dist/server/index.d.ts +11 -2
- package/dist/server/index.js +50 -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 +52 -6
- package/dist/signals/graph.js +174 -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 +37 -2
- package/dist/signals/read-protocol.js +44 -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/trusted-html.d.ts +17 -0
- package/dist/trusted-html.js +6 -0
- package/dist/universal-core.d.ts +6 -0
- package/dist/universal-core.js +214 -202
- package/dist/version.js +1 -1
- 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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
+
});
|