space-data-module-sdk 0.8.6 → 0.8.8
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 +13 -0
- package/docs/AGENTS.md +5 -0
- package/docs/browser-wasmedge-isomorphic.md +65 -1
- package/docs/language-runtime-matrix.md +2 -2
- package/docs/provider-access-abi.md +600 -0
- package/package.json +15 -6
- package/schemas/orbpro/Propagator.fbs +19 -3
- package/src/browser.js +14 -4
- package/src/bundle/artifactBytes.js +44 -0
- package/src/bundle/index.js +1 -0
- package/src/compiler/compileModule.js +24 -1
- package/src/flow/flowCompiler.js +141 -2
- package/src/flow/flowRuntimeHost.js +7 -1
- package/src/flow/isomorphicFlowHost.js +1 -1
- package/src/flow/vendor/sdn-flow/MethodRegistry.js +6 -1
- package/src/generated/orbpro/propagator/propagator-source-description.js +2 -2
- package/src/generated/orbpro/propagator/propagator-source-description.ts +2 -2
- package/src/generated/orbpro/propagator/propagator-source-kind.js +13 -2
- package/src/generated/orbpro/propagator/propagator-source-kind.ts +13 -2
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +18 -1
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -1
- package/src/generated/spacedatastandards/plg/pluginCategory.js +17 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.ts +21 -1
- package/src/{testing → host}/browserModuleHarness.js +69 -34
- package/src/host/index.js +6 -0
- package/src/host/isomorphicLoader.js +17 -45
- package/src/host/isomorphicLoaderBrowser.js +47 -0
- package/src/host/isomorphicLoaderCore.js +58 -0
- package/src/host/nodeBuiltinSpecifier.js +43 -0
- package/src/host/providerAccess.js +727 -0
- package/src/host/providerAccessAbi.js +403 -0
- package/src/host/providerAccessEngineAdapter.js +338 -0
- package/src/host/providerAccessFixtureAdapter.js +444 -0
- package/src/host/providerAccessTileStoreAdapter.js +366 -0
- package/src/host/sabHostcallChannel.js +1 -1
- package/src/host/terrainSourceSeam.js +205 -0
- package/src/host/wasiThreadHost.js +11 -1
- package/src/{testing → host}/workerModuleHarness.js +45 -12
- package/src/{testing → host}/workerModuleHarnessWorker.js +6 -5
- package/src/index.d.ts +29 -2
- package/src/standards/browser.js +95 -0
- package/src/standards/catalogCore.js +290 -0
- package/src/standards/index.js +27 -251
- package/src/testing/AGENTS.md +25 -2
- package/src/testing/browser.js +32 -0
- package/src/testing/index.d.ts +12 -1
- package/src/testing/index.js +3 -3
- package/src/testing/parityBrowserRunner.js +9 -2
- package/src/testing/parityHarness.js +1 -1
- package/templates/provider-access-module/include/space_data_provider_abi.h +227 -0
- /package/src/{testing → host}/moduleFlatbufferStreamPump.js +0 -0
|
@@ -21,9 +21,25 @@ enum StateFlags : uint {
|
|
|
21
21
|
HAS_COVARIANCE = 32
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
// Synced to the ratified SDS VCM.propagatorFamily vocabulary (schema/VCM/main.fbs)
|
|
25
|
+
// so any provider self-identifying in PropagatorDescribeSourcesBatchResult uses
|
|
26
|
+
// the SAME family codes SDS already carries — HPOP/Cowell-class numerical
|
|
27
|
+
// integrators map to COWELL (no HPOP-specific code needed); new codes go
|
|
28
|
+
// through Themis's SDS auto-ratification law, never invented here first.
|
|
24
29
|
enum PropagatorSourceKind : ubyte {
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
NONE = 0,
|
|
31
|
+
SEMI_ANALYTICAL = 1,
|
|
32
|
+
VINTI = 2,
|
|
33
|
+
SGP4 = 3,
|
|
34
|
+
COWELL = 4,
|
|
35
|
+
RK4 = 5,
|
|
36
|
+
NYX = 6,
|
|
37
|
+
GMAT = 7,
|
|
38
|
+
SPICE = 8,
|
|
39
|
+
SGP = 9,
|
|
40
|
+
SDP4 = 10,
|
|
41
|
+
SGP8 = 11,
|
|
42
|
+
SDP8 = 12
|
|
27
43
|
}
|
|
28
44
|
|
|
29
45
|
struct StateVector {
|
|
@@ -41,7 +57,7 @@ table PropagatorDescribeSourcesBatchRequest {
|
|
|
41
57
|
|
|
42
58
|
table PropagatorSourceDescription {
|
|
43
59
|
sourceHandle:uint = 0;
|
|
44
|
-
sourceKind:PropagatorSourceKind =
|
|
60
|
+
sourceKind:PropagatorSourceKind = NONE;
|
|
45
61
|
objectName:string;
|
|
46
62
|
objectId:string;
|
|
47
63
|
noradCatId:uint = 0;
|
package/src/browser.js
CHANGED
|
@@ -16,7 +16,17 @@ export * from "./host/sabHostcallChannel.js";
|
|
|
16
16
|
export * from "./host/timerDriver.js";
|
|
17
17
|
export * from "./flow/index.js";
|
|
18
18
|
export * from "./compat/index.js";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export
|
|
19
|
+
// The browser leg of `./host/isomorphic`. NEVER isomorphicLoader.js: that is
|
|
20
|
+
// the Node leg, and a bundler resolves its node:* branches even though a
|
|
21
|
+
// browser can never take them.
|
|
22
|
+
export * from "./host/isomorphicLoaderBrowser.js";
|
|
23
|
+
// Browser module hosts. These are runtime surface and live in src/host/;
|
|
24
|
+
// nothing under src/testing/ is reachable from this entry.
|
|
25
|
+
export {
|
|
26
|
+
createBrowserModuleHarness,
|
|
27
|
+
detectArtifactProfile,
|
|
28
|
+
zeroWasmBytes,
|
|
29
|
+
isSharedArrayBufferLike,
|
|
30
|
+
} from "./host/browserModuleHarness.js";
|
|
31
|
+
export { createWorkerModuleHarness } from "./host/workerModuleHarness.js";
|
|
32
|
+
export { createModuleFlatBufferStreamPump } from "./host/moduleFlatbufferStreamPump.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Artifact byte reduction — runtime surface, not test-harness surface.
|
|
3
|
+
*
|
|
4
|
+
* A published module artifact is `module.wasm` plus an appended publication
|
|
5
|
+
* record collection (MBL bundle: the sds.signature entry, PNM/REC trailers).
|
|
6
|
+
* EVERY runtime that loads a module — browser, native WasmEdge, Docker
|
|
7
|
+
* WasmEdge — must reduce the artifact to the same canonical payload before it
|
|
8
|
+
* reaches a wasm engine, because every engine rejects the trailing bytes
|
|
9
|
+
* ("unknown section code" / "malformed section id"). Same input bytes in,
|
|
10
|
+
* byte-identical payload out, in all three runtimes.
|
|
11
|
+
*
|
|
12
|
+
* That makes this an ARTIFACT concern and it belongs beside signing and
|
|
13
|
+
* verification, on `space-data-module-sdk/bundle`. It previously lived in
|
|
14
|
+
* `src/testing/browserModuleHarness.js`, which forced production delivery code
|
|
15
|
+
* (OrbPro's SDN module decryptor) to import a TEST-harness subpath to get it —
|
|
16
|
+
* the import that dragged the Node harnesses into a browser bundle and blanked
|
|
17
|
+
* all 275 gallery demos (`orbpro-engine-bundle-ships-node-builtins`).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { extractPublicationRecordCollection } from "../transport/records.js";
|
|
21
|
+
import { ModuleSignatureError } from "./signing.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Reduce a module artifact to the bytes a wasm engine can compile.
|
|
25
|
+
*
|
|
26
|
+
* ENC-protected payloads cannot be reduced here — decryption is a host
|
|
27
|
+
* concern, and the caller must decrypt before loading.
|
|
28
|
+
*
|
|
29
|
+
* @param {Uint8Array} bytes - raw artifact bytes
|
|
30
|
+
* @returns {Uint8Array} compilable wasm bytes
|
|
31
|
+
*/
|
|
32
|
+
export function toLoadableWasmBytes(bytes) {
|
|
33
|
+
const publication = extractPublicationRecordCollection(bytes);
|
|
34
|
+
if (!publication) {
|
|
35
|
+
return bytes;
|
|
36
|
+
}
|
|
37
|
+
if (publication.enc) {
|
|
38
|
+
throw new ModuleSignatureError(
|
|
39
|
+
"encrypted_artifact",
|
|
40
|
+
"Module artifact payload is ENC-protected; decrypt it before loading.",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return publication.payloadBytes;
|
|
44
|
+
}
|
package/src/bundle/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./constants.js";
|
|
2
2
|
export * from "./codec.js";
|
|
3
3
|
export * from "./wasm.js";
|
|
4
|
+
export * from "./artifactBytes.js";
|
|
4
5
|
export * from "./signing.js";
|
|
5
6
|
// Re-exported under explicit names rather than `export *`: sigdomain's own
|
|
6
7
|
// names (`statement`, `domains`, `describe`, `registered`) are deliberately
|
|
@@ -160,6 +160,15 @@ function usesPthreadCompileFlags(options = {}) {
|
|
|
160
160
|
const MIN_STACK_SIZE_BYTES = 64 * 1024;
|
|
161
161
|
const MAX_STACK_SIZE_BYTES = 1024 * 1024 * 1024;
|
|
162
162
|
|
|
163
|
+
// The wasi-sequential heap contract. 16 MiB initial matches what the previous
|
|
164
|
+
// (Emscripten) sequential artifacts shipped with; the 2 GiB ceiling is the SAME
|
|
165
|
+
// number PTHREAD_FINAL_LINK_FLAGS pins, so the two thread models differ in
|
|
166
|
+
// their threading contract and NOTHING else. wasm-ld defaults the maximum to
|
|
167
|
+
// the computed minimum when neither flag is given, which is what made a
|
|
168
|
+
// sequential guest unable to grow its heap by a single page.
|
|
169
|
+
const SEQUENTIAL_INITIAL_MEMORY_BYTES = 16 * 1024 * 1024;
|
|
170
|
+
const SEQUENTIAL_MAX_MEMORY_BYTES = 2147483648;
|
|
171
|
+
|
|
163
172
|
function resolveStackSize(stackSize) {
|
|
164
173
|
if (stackSize === undefined || stackSize === null) {
|
|
165
174
|
return null;
|
|
@@ -193,7 +202,21 @@ function buildCompilerArgs(exportedSymbols, options = {}) {
|
|
|
193
202
|
// refuses to instantiate it ("unknown import: env.memory"). Held to that
|
|
194
203
|
// shape by assertSequentialArtifact.
|
|
195
204
|
if (options.threadModel === ModuleThreadModel.WASI_SEQUENTIAL) {
|
|
196
|
-
|
|
205
|
+
// A sequential guest still needs a HEAP. Without an explicit ceiling the
|
|
206
|
+
// sequential link emitted a memory whose maximum equalled its minimum (18
|
|
207
|
+
// pages for a status node), so the guest could not grow at all and
|
|
208
|
+
// plugin_alloc returned null for the first frame larger than ~1 MiB — while
|
|
209
|
+
// the SAME source on the pthreads profile got a 2 GiB-growable memory.
|
|
210
|
+
// Two thread models must differ in their THREADING contract only; a guest
|
|
211
|
+
// that cannot allocate is not "sequential", it is broken. Same ceiling as
|
|
212
|
+
// PTHREAD_FINAL_LINK_FLAGS' --max-memory, unshared and unimported so the
|
|
213
|
+
// browser needs no cross-origin isolation to load it.
|
|
214
|
+
const sequentialArgs = [
|
|
215
|
+
"-O3",
|
|
216
|
+
"-mbulk-memory",
|
|
217
|
+
`-Wl,--initial-memory=${SEQUENTIAL_INITIAL_MEMORY_BYTES}`,
|
|
218
|
+
`-Wl,--max-memory=${SEQUENTIAL_MAX_MEMORY_BYTES}`,
|
|
219
|
+
];
|
|
197
220
|
if (options.noEntry === true) {
|
|
198
221
|
sequentialArgs.push("-mexec-model=reactor");
|
|
199
222
|
}
|
package/src/flow/flowCompiler.js
CHANGED
|
@@ -84,7 +84,7 @@ import {
|
|
|
84
84
|
TriggerBindingT,
|
|
85
85
|
TriggerKind,
|
|
86
86
|
} from "../generated/orbpro/flow.js";
|
|
87
|
-
import { DrainPolicy } from "../generated/orbpro/manifest.js";
|
|
87
|
+
import { DrainPolicy, PluginFamily } from "../generated/orbpro/manifest.js";
|
|
88
88
|
|
|
89
89
|
const RUNTIME_TEMPLATE_PATH = fileURLToPath(
|
|
90
90
|
new URL("./runtime-src/flow_runtime.cpp", import.meta.url),
|
|
@@ -1184,6 +1184,131 @@ export function validateFlowAPIDeclaration(flow, issues) {
|
|
|
1184
1184
|
});
|
|
1185
1185
|
}
|
|
1186
1186
|
|
|
1187
|
+
// ---------------------------------------------------------------------------
|
|
1188
|
+
// Family/interface-typed node binding (PLUGGABLE-PROPAGATION LAW, ruling E).
|
|
1189
|
+
//
|
|
1190
|
+
// The exact-pluginId path above is the ONLY binding mode this compiler has
|
|
1191
|
+
// ever had — every propagator reference in every flow.json was a design-time
|
|
1192
|
+
// fixed ID, which is exactly the gap the law's own flow-side contract
|
|
1193
|
+
// ("propagator input ports in composed flows") left unclosed. This adds an
|
|
1194
|
+
// ADDITIVE alternative: a node may declare `pluginFamily` (e.g.
|
|
1195
|
+
// "propagator") instead of `pluginId`, and is bound at CHECK TIME to the one
|
|
1196
|
+
// dependency in that family whose manifest exposes `methodId` — "any
|
|
1197
|
+
// pluginFamily:propagator satisfying method X". Resolution is a
|
|
1198
|
+
// DECLARATION, never an inference: zero or more than one qualifying
|
|
1199
|
+
// candidate is a compile error, never a guess (mirrors the wasi-sequential
|
|
1200
|
+
// thread model's own rule, applied here).
|
|
1201
|
+
//
|
|
1202
|
+
// Ruling C (provider method vocabulary): providers in one family are NOT
|
|
1203
|
+
// required to share a uniform method vocabulary beyond whatever the
|
|
1204
|
+
// binding's own declared `methodId` demands — sgp4 exposes
|
|
1205
|
+
// ingest_omm/upsert_cat/propagate_state/propagate_path/catalog_query, hpop
|
|
1206
|
+
// exposes invoke/ingest_state/propagate_state/prepare_trajectory_segments/
|
|
1207
|
+
// describe_trajectory_segments; a node that asks for "propagator satisfying
|
|
1208
|
+
// propagate_state" resolves against either, a node that asks for
|
|
1209
|
+
// "propagator satisfying catalog_query" resolves only against sgp4-shaped
|
|
1210
|
+
// providers. No vocabulary unification is needed: findMethod() already
|
|
1211
|
+
// enforces this per-candidate, the same check exact-ID binding uses.
|
|
1212
|
+
//
|
|
1213
|
+
// Ruling E (scope): this binds NODE -> PLUGIN only. Edge type contracts
|
|
1214
|
+
// still resolve by concrete SDS type refs (unrelated mechanism), and
|
|
1215
|
+
// requiredPlugins still enumerates concrete plugin ids — once a family
|
|
1216
|
+
// binding resolves, `node.pluginId` is backfilled with the concrete winner
|
|
1217
|
+
// BEFORE any other validation runs, so every downstream stage (edge typing,
|
|
1218
|
+
// manifest capability union, generateFlowTables, buildFlowModuleManifest,
|
|
1219
|
+
// the embedded FlowProgram record itself) sees an ordinary exact-ID node.
|
|
1220
|
+
// This is authoring-time sugar, not a new wire concept: zero ABI/schema
|
|
1221
|
+
// change, zero tri-runtime parity impact — the compiled artifact never
|
|
1222
|
+
// carries the word "pluginFamily".
|
|
1223
|
+
function normalizePluginFamilyName(value) {
|
|
1224
|
+
if (typeof value === "number") {
|
|
1225
|
+
return PluginFamily[value] ?? null;
|
|
1226
|
+
}
|
|
1227
|
+
const trimmed = String(value ?? "").trim();
|
|
1228
|
+
if (!trimmed) return null;
|
|
1229
|
+
const upper = trimmed.toUpperCase().replace(/[\s-]+/g, "_");
|
|
1230
|
+
return upper === "DATASOURCE" ? "DATA_SOURCE" : upper;
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
function resolveNodePluginFamilyBindings({ flow, dependencies, issues }) {
|
|
1234
|
+
const failed = new Set();
|
|
1235
|
+
const nodes = Array.isArray(flow?.nodes) ? flow.nodes : [];
|
|
1236
|
+
nodes.forEach((node, index) => {
|
|
1237
|
+
if (!node || !node.pluginFamily) return;
|
|
1238
|
+
const label = node.nodeId || `flow.nodes[${index}]`;
|
|
1239
|
+
const location = `flow.nodes[${index}].pluginFamily`;
|
|
1240
|
+
if (node.pluginId) {
|
|
1241
|
+
pushIssue(
|
|
1242
|
+
issues,
|
|
1243
|
+
"error",
|
|
1244
|
+
"ambiguous-plugin-binding",
|
|
1245
|
+
`Node "${label}" declares both pluginId and pluginFamily; a node binds by ` +
|
|
1246
|
+
`EXACTLY ONE (declaration, never inference).`,
|
|
1247
|
+
location,
|
|
1248
|
+
);
|
|
1249
|
+
failed.add(node);
|
|
1250
|
+
return;
|
|
1251
|
+
}
|
|
1252
|
+
const requestedFamily = normalizePluginFamilyName(node.pluginFamily);
|
|
1253
|
+
if (!requestedFamily) {
|
|
1254
|
+
pushIssue(
|
|
1255
|
+
issues,
|
|
1256
|
+
"error",
|
|
1257
|
+
"invalid-plugin-family",
|
|
1258
|
+
`Node "${label}" declares an empty or unreadable pluginFamily.`,
|
|
1259
|
+
location,
|
|
1260
|
+
);
|
|
1261
|
+
failed.add(node);
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
if (!node.methodId) {
|
|
1265
|
+
pushIssue(
|
|
1266
|
+
issues,
|
|
1267
|
+
"error",
|
|
1268
|
+
"missing-method-id",
|
|
1269
|
+
`Node "${label}" declares pluginFamily "${node.pluginFamily}" but no methodId to resolve ` +
|
|
1270
|
+
`against (family binding always resolves by "pluginFamily:<X> satisfying method <Y>").`,
|
|
1271
|
+
location,
|
|
1272
|
+
);
|
|
1273
|
+
failed.add(node);
|
|
1274
|
+
return;
|
|
1275
|
+
}
|
|
1276
|
+
const candidates = [...dependencies.values()].filter(
|
|
1277
|
+
(dependency) =>
|
|
1278
|
+
normalizePluginFamilyName(dependency.normalized?.pluginFamily) === requestedFamily &&
|
|
1279
|
+
findMethod(dependency.normalized, node.methodId),
|
|
1280
|
+
);
|
|
1281
|
+
if (candidates.length === 0) {
|
|
1282
|
+
pushIssue(
|
|
1283
|
+
issues,
|
|
1284
|
+
"error",
|
|
1285
|
+
"unresolvable-plugin-family",
|
|
1286
|
+
`Node "${label}" requests pluginFamily "${node.pluginFamily}" satisfying method ` +
|
|
1287
|
+
`"${node.methodId}", but no resolvable dependency in that family exposes it.`,
|
|
1288
|
+
location,
|
|
1289
|
+
);
|
|
1290
|
+
failed.add(node);
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1293
|
+
if (candidates.length > 1) {
|
|
1294
|
+
pushIssue(
|
|
1295
|
+
issues,
|
|
1296
|
+
"error",
|
|
1297
|
+
"ambiguous-plugin-family",
|
|
1298
|
+
`Node "${label}" requests pluginFamily "${node.pluginFamily}" satisfying method ` +
|
|
1299
|
+
`"${node.methodId}", but ${candidates.length} dependencies qualify (` +
|
|
1300
|
+
`${candidates.map((c) => c.pluginId).sort().join(", ")}); disambiguate with an exact pluginId.`,
|
|
1301
|
+
location,
|
|
1302
|
+
);
|
|
1303
|
+
failed.add(node);
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
node.pluginId = candidates[0].pluginId;
|
|
1307
|
+
node.resolvedFromPluginFamily = requestedFamily;
|
|
1308
|
+
});
|
|
1309
|
+
return failed;
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1187
1312
|
/**
|
|
1188
1313
|
* Validate a flow document against its dependency manifests. Returns
|
|
1189
1314
|
* { ok, issues, capabilities, nodes } where `capabilities` is the computed
|
|
@@ -1192,6 +1317,11 @@ export function validateFlowAPIDeclaration(flow, issues) {
|
|
|
1192
1317
|
*/
|
|
1193
1318
|
export function checkFlowProgram({ flow, dependencies = new Map() } = {}) {
|
|
1194
1319
|
const issues = [];
|
|
1320
|
+
const familyResolutionFailed = resolveNodePluginFamilyBindings({
|
|
1321
|
+
flow,
|
|
1322
|
+
dependencies,
|
|
1323
|
+
issues,
|
|
1324
|
+
});
|
|
1195
1325
|
const nodes = Array.isArray(flow?.nodes) ? flow.nodes : [];
|
|
1196
1326
|
const edges = Array.isArray(flow?.edges) ? flow.edges : [];
|
|
1197
1327
|
const triggers = Array.isArray(flow?.triggers) ? flow.triggers : [];
|
|
@@ -1270,7 +1400,11 @@ export function checkFlowProgram({ flow, dependencies = new Map() } = {}) {
|
|
|
1270
1400
|
location,
|
|
1271
1401
|
);
|
|
1272
1402
|
}
|
|
1273
|
-
} else if (!isHostModelNode(node)) {
|
|
1403
|
+
} else if (!isHostModelNode(node) && !familyResolutionFailed.has(node)) {
|
|
1404
|
+
// A node in familyResolutionFailed already has its own precise error
|
|
1405
|
+
// (ambiguous/unresolvable/invalid pluginFamily) from
|
|
1406
|
+
// resolveNodePluginFamilyBindings above; "references plugin undefined"
|
|
1407
|
+
// here would just be a confusing echo of that same failure.
|
|
1274
1408
|
pushIssue(
|
|
1275
1409
|
issues,
|
|
1276
1410
|
"error",
|
|
@@ -1655,6 +1789,9 @@ export function checkFlowProgram({ flow, dependencies = new Map() } = {}) {
|
|
|
1655
1789
|
pluginId: entry.node.pluginId,
|
|
1656
1790
|
methodId: entry.node.methodId,
|
|
1657
1791
|
dispatchModel: entry.dispatchModel,
|
|
1792
|
+
// Present only for nodes bound via the additive pluginFamily path;
|
|
1793
|
+
// absent (undefined) for ordinary exact-pluginId nodes.
|
|
1794
|
+
resolvedFromPluginFamily: entry.node.resolvedFromPluginFamily ?? null,
|
|
1658
1795
|
})),
|
|
1659
1796
|
};
|
|
1660
1797
|
}
|
|
@@ -2897,4 +3034,6 @@ export const __testables = {
|
|
|
2897
3034
|
// SHARED statement-domain vectors directly, instead of inferring it from a
|
|
2898
3035
|
// full compile that fails for a dozen later reasons.
|
|
2899
3036
|
verifyIsomorphicNodeArtifacts,
|
|
3037
|
+
normalizePluginFamilyName,
|
|
3038
|
+
resolveNodePluginFamilyBindings,
|
|
2900
3039
|
};
|
|
@@ -202,7 +202,13 @@ export async function createFlowRuntimeHost(options = {}) {
|
|
|
202
202
|
const bytes = stripPublicationTrailer(
|
|
203
203
|
source instanceof Uint8Array ? source : new Uint8Array(source),
|
|
204
204
|
);
|
|
205
|
-
|
|
205
|
+
// Plaintext hygiene: `bytes` is a VIEW over the caller's own buffer
|
|
206
|
+
// (stripPublicationTrailer only ever narrows via subarray(), never
|
|
207
|
+
// copies), so it is never this function's buffer to zero — and
|
|
208
|
+
// WebAssembly.compile accepts a BufferSource view directly, so a
|
|
209
|
+
// defensive `.slice().buffer` copy here would only add an extra
|
|
210
|
+
// plaintext buffer that nothing zeroes. Compile from the view; no copy.
|
|
211
|
+
wasmModule = await WebAssembly.compile(bytes);
|
|
206
212
|
}
|
|
207
213
|
|
|
208
214
|
const wasi = createBrowserWasiShim({
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "../bundle/signing.js";
|
|
6
6
|
import { getWasmCustomSections } from "../bundle/wasm.js";
|
|
7
7
|
import { decodePlgManifest } from "../manifest/plgCodec.js";
|
|
8
|
-
import { createBrowserModuleHarness } from "../
|
|
8
|
+
import { createBrowserModuleHarness } from "../host/browserModuleHarness.js";
|
|
9
9
|
import { extractPublicationRecordCollection } from "../transport/records.js";
|
|
10
10
|
import { sha256Bytes } from "../utils/crypto.js";
|
|
11
11
|
import { bytesToHex } from "../utils/encoding.js";
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { DrainPolicy } from "./constants.js";
|
|
2
|
+
// Import the type-ref helpers from their own module, NOT from the manifest
|
|
3
|
+
// barrel: `manifest/index.js` re-exports the build-time embedded-manifest
|
|
4
|
+
// writers, which pull `node:fs`/`node:path`. A relative import bypasses the
|
|
5
|
+
// package's `browser` export condition, so the barrel would drag Node builtins
|
|
6
|
+
// into every browser bundle that reaches the flow runtime host.
|
|
2
7
|
import {
|
|
3
8
|
clonePayloadTypeRef,
|
|
4
9
|
normalizePayloadWireFormatName,
|
|
5
10
|
payloadTypeRefsMatch,
|
|
6
11
|
selectPreferredPayloadTypeRef,
|
|
7
|
-
} from "../../../manifest/
|
|
12
|
+
} from "../../../manifest/typeRefs.js";
|
|
8
13
|
import { normalizeFrame, normalizeManifest } from "./normalize.js";
|
|
9
14
|
|
|
10
15
|
const INTERNAL_ALIGNED_BINARY_EXCEPTION_INTERFACE_KINDS = new Set([
|
|
@@ -29,7 +29,7 @@ class PropagatorSourceDescription {
|
|
|
29
29
|
}
|
|
30
30
|
sourceKind() {
|
|
31
31
|
const offset = this.bb.__offset(this.bb_pos, 6);
|
|
32
|
-
return offset ? this.bb.readUint8(this.bb_pos + offset) : PropagatorSourceKind.
|
|
32
|
+
return offset ? this.bb.readUint8(this.bb_pos + offset) : PropagatorSourceKind.NONE;
|
|
33
33
|
}
|
|
34
34
|
objectName(optionalEncoding) {
|
|
35
35
|
const offset = this.bb.__offset(this.bb_pos, 8);
|
|
@@ -114,7 +114,7 @@ class PropagatorSourceDescription {
|
|
|
114
114
|
builder.addFieldInt32(0, sourceHandle, 0);
|
|
115
115
|
}
|
|
116
116
|
static addSourceKind(builder, sourceKind) {
|
|
117
|
-
builder.addFieldInt8(1, sourceKind, PropagatorSourceKind.
|
|
117
|
+
builder.addFieldInt8(1, sourceKind, PropagatorSourceKind.NONE);
|
|
118
118
|
}
|
|
119
119
|
static addObjectName(builder, objectNameOffset) {
|
|
120
120
|
builder.addFieldOffset(2, objectNameOffset, 0);
|
|
@@ -32,7 +32,7 @@ sourceHandle():number {
|
|
|
32
32
|
|
|
33
33
|
sourceKind():PropagatorSourceKind {
|
|
34
34
|
const offset = this.bb!.__offset(this.bb_pos, 6);
|
|
35
|
-
return offset ? this.bb!.readUint8(this.bb_pos + offset) : PropagatorSourceKind.
|
|
35
|
+
return offset ? this.bb!.readUint8(this.bb_pos + offset) : PropagatorSourceKind.NONE;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
objectName():string|null
|
|
@@ -145,7 +145,7 @@ static addSourceHandle(builder:flatbuffers.Builder, sourceHandle:number) {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
static addSourceKind(builder:flatbuffers.Builder, sourceKind:PropagatorSourceKind) {
|
|
148
|
-
builder.addFieldInt8(1, sourceKind, PropagatorSourceKind.
|
|
148
|
+
builder.addFieldInt8(1, sourceKind, PropagatorSourceKind.NONE);
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
static addObjectName(builder:flatbuffers.Builder, objectNameOffset:flatbuffers.Offset) {
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
var PropagatorSourceKind = /* @__PURE__ */ ((PropagatorSourceKind2) => {
|
|
2
|
-
PropagatorSourceKind2[PropagatorSourceKind2["
|
|
3
|
-
PropagatorSourceKind2[PropagatorSourceKind2["
|
|
2
|
+
PropagatorSourceKind2[PropagatorSourceKind2["NONE"] = 0] = "NONE";
|
|
3
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SEMI_ANALYTICAL"] = 1] = "SEMI_ANALYTICAL";
|
|
4
|
+
PropagatorSourceKind2[PropagatorSourceKind2["VINTI"] = 2] = "VINTI";
|
|
5
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SGP4"] = 3] = "SGP4";
|
|
6
|
+
PropagatorSourceKind2[PropagatorSourceKind2["COWELL"] = 4] = "COWELL";
|
|
7
|
+
PropagatorSourceKind2[PropagatorSourceKind2["RK4"] = 5] = "RK4";
|
|
8
|
+
PropagatorSourceKind2[PropagatorSourceKind2["NYX"] = 6] = "NYX";
|
|
9
|
+
PropagatorSourceKind2[PropagatorSourceKind2["GMAT"] = 7] = "GMAT";
|
|
10
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SPICE"] = 8] = "SPICE";
|
|
11
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SGP"] = 9] = "SGP";
|
|
12
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SDP4"] = 10] = "SDP4";
|
|
13
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SGP8"] = 11] = "SGP8";
|
|
14
|
+
PropagatorSourceKind2[PropagatorSourceKind2["SDP8"] = 12] = "SDP8";
|
|
4
15
|
return PropagatorSourceKind2;
|
|
5
16
|
})(PropagatorSourceKind || {});
|
|
6
17
|
export {
|
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */
|
|
4
4
|
|
|
5
5
|
export enum PropagatorSourceKind {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
NONE = 0,
|
|
7
|
+
SEMI_ANALYTICAL = 1,
|
|
8
|
+
VINTI = 2,
|
|
9
|
+
SGP4 = 3,
|
|
10
|
+
COWELL = 4,
|
|
11
|
+
RK4 = 5,
|
|
12
|
+
NYX = 6,
|
|
13
|
+
GMAT = 7,
|
|
14
|
+
SPICE = 8,
|
|
15
|
+
SGP = 9,
|
|
16
|
+
SDP4 = 10,
|
|
17
|
+
SGP8 = 11,
|
|
18
|
+
SDP8 = 12
|
|
8
19
|
}
|
|
@@ -77,6 +77,23 @@ export declare enum pluginCategory {
|
|
|
77
77
|
/**
|
|
78
78
|
* Basilisk astrodynamics simulation module
|
|
79
79
|
*/
|
|
80
|
-
Basilisk = 18
|
|
80
|
+
Basilisk = 18,
|
|
81
|
+
/**
|
|
82
|
+
* Maneuver planning, targeting and trajectory optimization
|
|
83
|
+
*/
|
|
84
|
+
Maneuver = 19,
|
|
85
|
+
/**
|
|
86
|
+
* A composed flow published as a single loadable module. The unit is a
|
|
87
|
+
* graph of other modules, not a leaf algorithm.
|
|
88
|
+
*/
|
|
89
|
+
Flow = 20,
|
|
90
|
+
/**
|
|
91
|
+
* No family stated. Sits at the end of the enum rather than at 0 because
|
|
92
|
+
* this enum is append-only and `Sensor` already holds 0; it exists so a
|
|
93
|
+
* record can distinguish "the provider did not say" from "Sensor". A
|
|
94
|
+
* consumer MUST render an `Unspecified` module as ungrouped, never as a
|
|
95
|
+
* member of any family.
|
|
96
|
+
*/
|
|
97
|
+
Unspecified = 21
|
|
81
98
|
}
|
|
82
99
|
//# sourceMappingURL=pluginCategory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pluginCategory.d.ts","sourceRoot":"","sources":["../../../ts/PLG/pluginCategory.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,oBAAY,cAAc;IACxB;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,UAAU,IAAI;IAEd;;OAEG;IACH,QAAQ,IAAI;IAEZ;;OAEG;IACH,QAAQ,IAAI;IAEZ;;OAEG;IACH,UAAU,IAAI;IAEd;;OAEG;IACH,EAAE,IAAI;IAEN;;OAEG;IACH,KAAK,IAAI;IAET;;OAEG;IACH,OAAO,IAAI;IAEX;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,YAAY,KAAK;IAEjB;;OAEG;IACH,QAAQ,KAAK;IAEb;;OAEG;IACH,UAAU,KAAK;IAEf;;OAEG;IACH,cAAc,KAAK;IAEnB;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,UAAU,KAAK;IAEf;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,QAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"pluginCategory.d.ts","sourceRoot":"","sources":["../../../ts/PLG/pluginCategory.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,oBAAY,cAAc;IACxB;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,UAAU,IAAI;IAEd;;OAEG;IACH,QAAQ,IAAI;IAEZ;;OAEG;IACH,QAAQ,IAAI;IAEZ;;OAEG;IACH,UAAU,IAAI;IAEd;;OAEG;IACH,EAAE,IAAI;IAEN;;OAEG;IACH,KAAK,IAAI;IAET;;OAEG;IACH,OAAO,IAAI;IAEX;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,YAAY,KAAK;IAEjB;;OAEG;IACH,QAAQ,KAAK;IAEb;;OAEG;IACH,UAAU,KAAK;IAEf;;OAEG;IACH,cAAc,KAAK;IAEnB;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,UAAU,KAAK;IAEf;;OAEG;IACH,SAAS,KAAK;IAEd;;OAEG;IACH,QAAQ,KAAK;IAEb;;OAEG;IACH,QAAQ,KAAK;IAEb;;;OAGG;IACH,IAAI,KAAK;IAET;;;;;;OAMG;IACH,WAAW,KAAK;CACjB"}
|
|
@@ -81,4 +81,21 @@ export var pluginCategory;
|
|
|
81
81
|
* Basilisk astrodynamics simulation module
|
|
82
82
|
*/
|
|
83
83
|
pluginCategory[pluginCategory["Basilisk"] = 18] = "Basilisk";
|
|
84
|
+
/**
|
|
85
|
+
* Maneuver planning, targeting and trajectory optimization
|
|
86
|
+
*/
|
|
87
|
+
pluginCategory[pluginCategory["Maneuver"] = 19] = "Maneuver";
|
|
88
|
+
/**
|
|
89
|
+
* A composed flow published as a single loadable module. The unit is a
|
|
90
|
+
* graph of other modules, not a leaf algorithm.
|
|
91
|
+
*/
|
|
92
|
+
pluginCategory[pluginCategory["Flow"] = 20] = "Flow";
|
|
93
|
+
/**
|
|
94
|
+
* No family stated. Sits at the end of the enum rather than at 0 because
|
|
95
|
+
* this enum is append-only and `Sensor` already holds 0; it exists so a
|
|
96
|
+
* record can distinguish "the provider did not say" from "Sensor". A
|
|
97
|
+
* consumer MUST render an `Unspecified` module as ungrouped, never as a
|
|
98
|
+
* member of any family.
|
|
99
|
+
*/
|
|
100
|
+
pluginCategory[pluginCategory["Unspecified"] = 21] = "Unspecified";
|
|
84
101
|
})(pluginCategory || (pluginCategory = {}));
|
|
@@ -99,5 +99,25 @@ export enum pluginCategory {
|
|
|
99
99
|
/**
|
|
100
100
|
* Basilisk astrodynamics simulation module
|
|
101
101
|
*/
|
|
102
|
-
Basilisk = 18
|
|
102
|
+
Basilisk = 18,
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Maneuver planning, targeting and trajectory optimization
|
|
106
|
+
*/
|
|
107
|
+
Maneuver = 19,
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* A composed flow published as a single loadable module. The unit is a
|
|
111
|
+
* graph of other modules, not a leaf algorithm.
|
|
112
|
+
*/
|
|
113
|
+
Flow = 20,
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* No family stated. Sits at the end of the enum rather than at 0 because
|
|
117
|
+
* this enum is append-only and `Sensor` already holds 0; it exists so a
|
|
118
|
+
* record can distinguish "the provider did not say" from "Sensor". A
|
|
119
|
+
* consumer MUST render an `Unspecified` module as ungrouped, never as a
|
|
120
|
+
* member of any family.
|
|
121
|
+
*/
|
|
122
|
+
Unspecified = 21
|
|
103
123
|
}
|