@rybosome/tspice 0.0.3 → 0.0.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.
Files changed (221) hide show
  1. package/README.md +145 -84
  2. package/backend-contract/dist/.tsbuildinfo +1 -1
  3. package/backend-contract/dist/domains/cells-windows.d.ts +94 -0
  4. package/backend-contract/dist/domains/cells-windows.js +10 -0
  5. package/backend-contract/dist/domains/coords-vectors.d.ts +53 -3
  6. package/backend-contract/dist/domains/dsk.d.ts +49 -0
  7. package/backend-contract/dist/domains/dsk.js +2 -0
  8. package/backend-contract/dist/domains/ek.d.ts +186 -0
  9. package/backend-contract/dist/domains/ek.js +8 -0
  10. package/backend-contract/dist/domains/ephemeris.d.ts +141 -3
  11. package/backend-contract/dist/domains/error.d.ts +42 -0
  12. package/backend-contract/dist/domains/error.js +33 -0
  13. package/backend-contract/dist/domains/file-io.d.ts +114 -0
  14. package/backend-contract/dist/domains/file-io.js +8 -0
  15. package/backend-contract/dist/domains/frames.d.ts +44 -4
  16. package/backend-contract/dist/domains/geometry-gf.d.ts +44 -0
  17. package/backend-contract/dist/domains/geometry-gf.js +14 -0
  18. package/backend-contract/dist/domains/geometry.d.ts +21 -1
  19. package/backend-contract/dist/domains/ids-names-normalize.d.ts +3 -0
  20. package/backend-contract/dist/domains/ids-names-normalize.js +74 -0
  21. package/backend-contract/dist/domains/ids-names.d.ts +37 -0
  22. package/backend-contract/dist/domains/kernel-pool.d.ts +134 -0
  23. package/backend-contract/dist/domains/kernel-pool.js +2 -0
  24. package/backend-contract/dist/domains/kernels-utils.d.ts +44 -0
  25. package/backend-contract/dist/domains/kernels-utils.js +265 -0
  26. package/backend-contract/dist/domains/kernels.d.ts +39 -3
  27. package/backend-contract/dist/domains/time.d.ts +102 -0
  28. package/backend-contract/dist/index.d.ts +34 -15
  29. package/backend-contract/dist/index.js +15 -1
  30. package/backend-contract/dist/shared/errors.d.ts +6 -0
  31. package/backend-contract/dist/shared/errors.js +8 -0
  32. package/backend-contract/dist/shared/mat3.d.ts +52 -0
  33. package/backend-contract/dist/shared/mat3.js +150 -0
  34. package/backend-contract/dist/shared/mat6.d.ts +34 -0
  35. package/backend-contract/dist/shared/mat6.js +116 -0
  36. package/backend-contract/dist/shared/spice-handles.d.ts +20 -0
  37. package/backend-contract/dist/shared/spice-handles.js +82 -0
  38. package/backend-contract/dist/shared/spice-int.d.ts +32 -0
  39. package/backend-contract/dist/shared/spice-int.js +41 -0
  40. package/backend-contract/dist/shared/types.d.ts +136 -5
  41. package/backend-contract/dist/shared/types.js +1 -1
  42. package/backend-contract/dist/shared/vec.d.ts +54 -0
  43. package/backend-contract/dist/shared/vec.js +162 -0
  44. package/backend-fake/dist/.tsbuildinfo +1 -1
  45. package/backend-fake/dist/index.d.ts +21 -1
  46. package/backend-fake/dist/index.js +1112 -33
  47. package/backend-node/dist/.tsbuildinfo +1 -1
  48. package/backend-node/dist/codec/arrays.d.ts +9 -0
  49. package/backend-node/dist/codec/arrays.js +36 -0
  50. package/backend-node/dist/codec/errors.d.ts +6 -6
  51. package/backend-node/dist/codec/errors.js +6 -6
  52. package/backend-node/dist/domains/cells-windows.d.ts +5 -0
  53. package/backend-node/dist/domains/cells-windows.js +112 -0
  54. package/backend-node/dist/domains/coords-vectors.d.ts +1 -0
  55. package/backend-node/dist/domains/coords-vectors.js +66 -0
  56. package/backend-node/dist/domains/dsk.d.ts +6 -0
  57. package/backend-node/dist/domains/dsk.js +108 -0
  58. package/backend-node/dist/domains/ek.d.ts +10 -0
  59. package/backend-node/dist/domains/ek.js +100 -0
  60. package/backend-node/dist/domains/ephemeris.d.ts +5 -1
  61. package/backend-node/dist/domains/ephemeris.js +150 -1
  62. package/backend-node/dist/domains/error.d.ts +5 -0
  63. package/backend-node/dist/domains/error.js +34 -0
  64. package/backend-node/dist/domains/file-io.d.ts +7 -0
  65. package/backend-node/dist/domains/file-io.js +105 -0
  66. package/backend-node/dist/domains/frames.d.ts +1 -0
  67. package/backend-node/dist/domains/frames.js +58 -6
  68. package/backend-node/dist/domains/geometry-gf.d.ts +5 -0
  69. package/backend-node/dist/domains/geometry-gf.js +74 -0
  70. package/backend-node/dist/domains/geometry.d.ts +1 -0
  71. package/backend-node/dist/domains/geometry.js +62 -0
  72. package/backend-node/dist/domains/ids-names.d.ts +2 -1
  73. package/backend-node/dist/domains/ids-names.js +30 -0
  74. package/backend-node/dist/domains/kernel-pool.d.ts +5 -0
  75. package/backend-node/dist/domains/kernel-pool.js +74 -0
  76. package/backend-node/dist/domains/kernels.d.ts +1 -0
  77. package/backend-node/dist/domains/kernels.js +100 -13
  78. package/backend-node/dist/domains/time.d.ts +1 -0
  79. package/backend-node/dist/domains/time.js +75 -1
  80. package/backend-node/dist/index.d.ts +5 -1
  81. package/backend-node/dist/index.js +62 -1
  82. package/backend-node/dist/lowlevel/binding.d.ts +3 -0
  83. package/backend-node/dist/lowlevel/binding.js +115 -0
  84. package/backend-node/dist/runtime/addon.d.ts +273 -2
  85. package/backend-node/dist/runtime/addon.js +3 -0
  86. package/backend-node/dist/runtime/kernel-staging.d.ts +17 -0
  87. package/backend-node/dist/runtime/kernel-staging.js +80 -7
  88. package/backend-node/dist/runtime/spice-handles.d.ts +3 -0
  89. package/backend-node/dist/runtime/spice-handles.js +2 -0
  90. package/backend-node/dist/runtime/virtual-output-staging.d.ts +16 -0
  91. package/backend-node/dist/runtime/virtual-output-staging.js +148 -0
  92. package/backend-wasm/dist/.tsbuildinfo +1 -1
  93. package/backend-wasm/dist/codec/alloc.d.ts +19 -0
  94. package/backend-wasm/dist/codec/alloc.js +64 -0
  95. package/backend-wasm/dist/codec/calls.d.ts +2 -0
  96. package/backend-wasm/dist/codec/calls.js +13 -24
  97. package/backend-wasm/dist/codec/errors.d.ts +6 -0
  98. package/backend-wasm/dist/codec/errors.js +34 -2
  99. package/backend-wasm/dist/codec/found.d.ts +2 -0
  100. package/backend-wasm/dist/codec/found.js +20 -43
  101. package/backend-wasm/dist/codec/strings.d.ts +31 -1
  102. package/backend-wasm/dist/codec/strings.js +93 -6
  103. package/backend-wasm/dist/domains/cells-windows.d.ts +9 -0
  104. package/backend-wasm/dist/domains/cells-windows.js +392 -0
  105. package/backend-wasm/dist/domains/coords-vectors.d.ts +1 -0
  106. package/backend-wasm/dist/domains/coords-vectors.js +377 -184
  107. package/backend-wasm/dist/domains/dsk.d.ts +6 -0
  108. package/backend-wasm/dist/domains/dsk.js +179 -0
  109. package/backend-wasm/dist/domains/ek.d.ts +6 -0
  110. package/backend-wasm/dist/domains/ek.js +543 -0
  111. package/backend-wasm/dist/domains/ephemeris.d.ts +4 -1
  112. package/backend-wasm/dist/domains/ephemeris.js +405 -46
  113. package/backend-wasm/dist/domains/error.d.ts +5 -0
  114. package/backend-wasm/dist/domains/error.js +109 -0
  115. package/backend-wasm/dist/domains/file-io.d.ts +7 -0
  116. package/backend-wasm/dist/domains/file-io.js +462 -0
  117. package/backend-wasm/dist/domains/frames.d.ts +1 -0
  118. package/backend-wasm/dist/domains/frames.js +139 -6
  119. package/backend-wasm/dist/domains/geometry-gf.d.ts +5 -0
  120. package/backend-wasm/dist/domains/geometry-gf.js +178 -0
  121. package/backend-wasm/dist/domains/geometry.d.ts +1 -0
  122. package/backend-wasm/dist/domains/geometry.js +210 -0
  123. package/backend-wasm/dist/domains/ids-names.d.ts +2 -1
  124. package/backend-wasm/dist/domains/ids-names.js +89 -0
  125. package/backend-wasm/dist/domains/kernel-pool.d.ts +5 -0
  126. package/backend-wasm/dist/domains/kernel-pool.js +357 -0
  127. package/backend-wasm/dist/domains/kernels.d.ts +1 -0
  128. package/backend-wasm/dist/domains/kernels.js +108 -4
  129. package/backend-wasm/dist/domains/time.d.ts +2 -0
  130. package/backend-wasm/dist/domains/time.js +235 -133
  131. package/backend-wasm/dist/index.d.ts +4 -2
  132. package/backend-wasm/dist/lowlevel/exports.d.ts +215 -1
  133. package/backend-wasm/dist/lowlevel/exports.js +217 -38
  134. package/backend-wasm/dist/runtime/create-backend-options.d.ts +21 -0
  135. package/backend-wasm/dist/runtime/create-backend.node.d.ts +11 -2
  136. package/backend-wasm/dist/runtime/create-backend.node.js +283 -14
  137. package/backend-wasm/dist/runtime/create-backend.web.d.ts +5 -2
  138. package/backend-wasm/dist/runtime/create-backend.web.js +40 -6
  139. package/backend-wasm/dist/runtime/fs.d.ts +6 -0
  140. package/backend-wasm/dist/runtime/fs.js +29 -3
  141. package/backend-wasm/dist/runtime/spice-handles.d.ts +3 -0
  142. package/backend-wasm/dist/runtime/spice-handles.js +2 -0
  143. package/backend-wasm/dist/runtime/virtual-outputs.d.ts +16 -0
  144. package/backend-wasm/dist/runtime/virtual-outputs.js +35 -0
  145. package/backend-wasm/dist/tspice_backend_wasm.node.js +3 -3
  146. package/backend-wasm/dist/tspice_backend_wasm.wasm +0 -0
  147. package/backend-wasm/dist/tspice_backend_wasm.web.js +1 -1
  148. package/core/dist/.tsbuildinfo +1 -1
  149. package/core/dist/index.d.ts +21 -0
  150. package/core/dist/index.js +57 -0
  151. package/dist/.tsbuildinfo +1 -1
  152. package/dist/backend.d.ts +15 -6
  153. package/dist/backend.js +3 -6
  154. package/dist/clients/createSpiceAsyncFromTransport.d.ts +5 -0
  155. package/dist/clients/createSpiceAsyncFromTransport.js +90 -0
  156. package/dist/clients/createSpiceSyncFromTransport.d.ts +5 -0
  157. package/dist/clients/createSpiceSyncFromTransport.js +88 -0
  158. package/dist/clients/spiceClients.d.ts +59 -0
  159. package/dist/clients/spiceClients.js +292 -0
  160. package/dist/errors.d.ts +4 -0
  161. package/dist/errors.js +4 -0
  162. package/dist/index.d.ts +12 -7
  163. package/dist/index.js +5 -2
  164. package/dist/kernels/defaultKernelPathFromUrl.d.ts +8 -0
  165. package/dist/kernels/defaultKernelPathFromUrl.js +32 -0
  166. package/dist/kernels/kernelPack.d.ts +88 -0
  167. package/dist/kernels/kernelPack.js +122 -0
  168. package/dist/kernels/kernels.d.ts +98 -0
  169. package/dist/kernels/kernels.js +217 -0
  170. package/dist/kernels/naifKernelId.d.ts +2 -0
  171. package/dist/kernels/naifKernelId.js +2 -0
  172. package/dist/kit/index.d.ts +4 -0
  173. package/dist/kit/index.js +3 -0
  174. package/dist/kit/math/mat3.d.ts +31 -0
  175. package/dist/kit/math/mat3.js +82 -0
  176. package/dist/kit/spice/create-kit.d.ts +12 -0
  177. package/dist/kit/spice/create-kit.js +23 -0
  178. package/dist/kit/spice/frames.d.ts +8 -0
  179. package/dist/kit/spice/frames.js +16 -0
  180. package/dist/kit/spice/kernels.d.ts +14 -0
  181. package/dist/kit/spice/kernels.js +39 -0
  182. package/dist/kit/spice/state.d.ts +7 -0
  183. package/dist/kit/spice/state.js +36 -0
  184. package/dist/kit/spice/time.d.ts +9 -0
  185. package/dist/kit/spice/time.js +31 -0
  186. package/dist/kit/types/spice-types.d.ts +51 -0
  187. package/dist/spice.d.ts +10 -1
  188. package/dist/spice.js +84 -72
  189. package/dist/transport/caching/policy.d.ts +16 -0
  190. package/dist/transport/caching/policy.js +77 -0
  191. package/dist/transport/caching/withCaching.d.ts +125 -0
  192. package/dist/transport/caching/withCaching.js +335 -0
  193. package/dist/transport/caching/withCachingSync.d.ts +24 -0
  194. package/dist/transport/caching/withCachingSync.js +161 -0
  195. package/dist/transport/rpc/protocol.d.ts +35 -0
  196. package/dist/transport/rpc/protocol.js +56 -0
  197. package/dist/transport/rpc/taskScheduling.d.ts +20 -0
  198. package/dist/transport/rpc/taskScheduling.js +98 -0
  199. package/dist/transport/rpc/valueCodec.d.ts +5 -0
  200. package/dist/transport/rpc/valueCodec.js +106 -0
  201. package/dist/transport/types.d.ts +7 -0
  202. package/dist/transport/types.js +2 -0
  203. package/dist/types.d.ts +8 -17
  204. package/dist/types.js +2 -1
  205. package/dist/worker/browser/createSpiceWorker.d.ts +22 -0
  206. package/dist/worker/browser/createSpiceWorker.js +41 -0
  207. package/dist/worker/browser/createSpiceWorkerClient.d.ts +40 -0
  208. package/dist/worker/browser/createSpiceWorkerClient.js +99 -0
  209. package/dist/worker/browser/spiceWorkerEntry.d.ts +2 -0
  210. package/dist/worker/browser/spiceWorkerEntry.js +129 -0
  211. package/dist/worker/browser/spiceWorkerInlineSource.d.ts +2 -0
  212. package/dist/worker/browser/spiceWorkerInlineSource.js +4 -0
  213. package/dist/worker/index.d.ts +10 -0
  214. package/dist/worker/index.js +7 -0
  215. package/dist/worker/transport/createWorkerTransport.d.ts +69 -0
  216. package/dist/worker/transport/createWorkerTransport.js +398 -0
  217. package/dist/worker/transport/exposeTransportToWorker.d.ts +51 -0
  218. package/dist/worker/transport/exposeTransportToWorker.js +196 -0
  219. package/package.json +4 -4
  220. package/dist/spice-types.d.ts +0 -36
  221. /package/dist/{spice-types.js → kit/types/spice-types.js} +0 -0
@@ -1,81 +1,440 @@
1
+ import { assertSpiceInt32 } from "#backend-contract";
2
+ import { WASM_ERR_MAX_BYTES, withAllocs } from "../codec/alloc.js";
1
3
  import { throwWasmSpiceError } from "../codec/errors.js";
2
- import { writeUtf8CString } from "../codec/strings.js";
4
+ import { readFixedWidthCString, writeUtf8CString } from "../codec/strings.js";
5
+ import { resolveKernelPath } from "../runtime/fs.js";
6
+ const I32_MAX = 2147483647;
7
+ function isVirtualOutput(value) {
8
+ return (typeof value === "object" &&
9
+ value !== null &&
10
+ value.kind === "virtual-output" &&
11
+ typeof value.path === "string");
12
+ }
13
+ // SPK writer file semantics in the WASM backend:
14
+ //
15
+ // - `string` inputs are treated as *virtual kernel ids*, not raw Emscripten FS
16
+ // absolute paths. We route them through `resolveKernelPath()` to normalize
17
+ // into the `/kernels/...` namespace and to fail fast on accidental OS
18
+ // paths/URLs.
19
+ // - `VirtualOutput.path` is also a virtual id (not a raw absolute FS path) and
20
+ // is resolved the same way.
21
+ //
22
+ // This keeps the writer APIs consistent with `furnsh(string)` and
23
+ // `readVirtualOutput()`.
24
+ function resolveSpkPath(file, context) {
25
+ if (typeof file === "string") {
26
+ return resolveKernelPath(file);
27
+ }
28
+ if (!isVirtualOutput(file)) {
29
+ throw new Error(`${context}: expected VirtualOutput {kind:'virtual-output', path:string}`);
30
+ }
31
+ return resolveKernelPath(file.path);
32
+ }
33
+ function ensureParentDir(module, filePath) {
34
+ const dir = filePath.split("/").slice(0, -1).join("/") || "/";
35
+ if (dir && dir !== "/") {
36
+ module.FS.mkdirTree(dir);
37
+ }
38
+ }
39
+ function callVoidHandle(module, fn, handle) {
40
+ withAllocs(module, [WASM_ERR_MAX_BYTES], (errPtr) => {
41
+ const code = fn(handle, errPtr, WASM_ERR_MAX_BYTES);
42
+ if (code !== 0) {
43
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, code);
44
+ }
45
+ });
46
+ }
47
+ function tspiceCallSpkopn(module, path, ifname, ncomch) {
48
+ const pathPtr = writeUtf8CString(module, path);
49
+ const ifnamePtr = writeUtf8CString(module, ifname);
50
+ try {
51
+ return withAllocs(module, [4, WASM_ERR_MAX_BYTES], (outHandlePtr, errPtr) => {
52
+ module.HEAP32[outHandlePtr >> 2] = 0;
53
+ const code = module._tspice_spkopn(pathPtr, ifnamePtr, ncomch, outHandlePtr, errPtr, WASM_ERR_MAX_BYTES);
54
+ if (code !== 0) {
55
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, code);
56
+ }
57
+ return module.HEAP32[outHandlePtr >> 2] ?? 0;
58
+ });
59
+ }
60
+ finally {
61
+ module._free(ifnamePtr);
62
+ module._free(pathPtr);
63
+ }
64
+ }
65
+ function tspiceCallSpkopa(module, path) {
66
+ const pathPtr = writeUtf8CString(module, path);
67
+ try {
68
+ return withAllocs(module, [4, WASM_ERR_MAX_BYTES], (outHandlePtr, errPtr) => {
69
+ module.HEAP32[outHandlePtr >> 2] = 0;
70
+ const code = module._tspice_spkopa(pathPtr, outHandlePtr, errPtr, WASM_ERR_MAX_BYTES);
71
+ if (code !== 0) {
72
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, code);
73
+ }
74
+ return module.HEAP32[outHandlePtr >> 2] ?? 0;
75
+ });
76
+ }
77
+ finally {
78
+ module._free(pathPtr);
79
+ }
80
+ }
81
+ function tspiceCallSpkw08(module, nativeHandle, body, center, frame, first, last, segid, degree, states, epoch1, step) {
82
+ const framePtr = writeUtf8CString(module, frame);
83
+ const segidPtr = writeUtf8CString(module, segid);
84
+ try {
85
+ const n = states.length / 6;
86
+ if (!Number.isSafeInteger(n) || n <= 0 || n * 6 !== states.length) {
87
+ throw new Error("tspiceCallSpkw08(states): expected states.length to be a non-zero multiple of 6");
88
+ }
89
+ if (n > I32_MAX) {
90
+ throw new Error(`tspiceCallSpkw08(states): expected n to be a 32-bit signed integer (got n=${n})`);
91
+ }
92
+ if (states.length > I32_MAX) {
93
+ throw new Error(`tspiceCallSpkw08(states): expected states.length to be a 32-bit signed integer (got states.length=${states.length})`);
94
+ }
95
+ const statesBytes = n * 6 * 8;
96
+ // Allocate states bytes with padding to ensure 8-byte alignment.
97
+ withAllocs(module, [WASM_ERR_MAX_BYTES, statesBytes + 7], (errPtr, rawStatesPtr) => {
98
+ const statesPtr = (rawStatesPtr + 7) & ~7;
99
+ if (states.length > 0) {
100
+ module.HEAPF64.set(states, statesPtr >> 3);
101
+ }
102
+ const code = module._tspice_spkw08_v2(nativeHandle, body, center, framePtr, first, last, segidPtr, degree, n, statesPtr, states.length, epoch1, step, errPtr, WASM_ERR_MAX_BYTES);
103
+ if (code !== 0) {
104
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, code);
105
+ }
106
+ });
107
+ }
108
+ finally {
109
+ module._free(segidPtr);
110
+ module._free(framePtr);
111
+ }
112
+ }
3
113
  function tspiceCallSpkezr(module, target, et, ref, abcorr, obs) {
4
- const errMaxBytes = 2048;
5
- const errPtr = module._malloc(errMaxBytes);
6
114
  const targetPtr = writeUtf8CString(module, target);
7
115
  const refPtr = writeUtf8CString(module, ref);
8
116
  const abcorrPtr = writeUtf8CString(module, abcorr);
9
117
  const obsPtr = writeUtf8CString(module, obs);
10
- const outStatePtr = module._malloc(6 * 8);
11
- const outLtPtr = module._malloc(8);
12
- if (!errPtr || !targetPtr || !refPtr || !abcorrPtr || !obsPtr || !outStatePtr || !outLtPtr) {
13
- for (const ptr of [outLtPtr, outStatePtr, obsPtr, abcorrPtr, refPtr, targetPtr, errPtr]) {
14
- if (ptr)
15
- module._free(ptr);
16
- }
17
- throw new Error("WASM malloc failed");
18
- }
19
118
  try {
20
- module.HEAPF64[outLtPtr >> 3] = 0;
21
- const result = module._tspice_spkezr(targetPtr, et, refPtr, abcorrPtr, obsPtr, outStatePtr, outLtPtr, errPtr, errMaxBytes);
22
- if (result !== 0) {
23
- throwWasmSpiceError(module, errPtr, errMaxBytes, result);
24
- }
25
- const state = Array.from(module.HEAPF64.subarray(outStatePtr >> 3, (outStatePtr >> 3) + 6));
26
- const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
27
- return { state, lt };
119
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 6 * 8, 8], (errPtr, outStatePtr, outLtPtr) => {
120
+ module.HEAPF64[outLtPtr >> 3] = 0;
121
+ const result = module._tspice_spkezr(targetPtr, et, refPtr, abcorrPtr, obsPtr, outStatePtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
122
+ if (result !== 0) {
123
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
124
+ }
125
+ const state = Array.from(module.HEAPF64.subarray(outStatePtr >> 3, (outStatePtr >> 3) + 6));
126
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
127
+ return { state, lt };
128
+ });
28
129
  }
29
130
  finally {
30
- module._free(outLtPtr);
31
- module._free(outStatePtr);
32
131
  module._free(obsPtr);
33
132
  module._free(abcorrPtr);
34
133
  module._free(refPtr);
35
134
  module._free(targetPtr);
36
- module._free(errPtr);
37
135
  }
38
136
  }
39
137
  function tspiceCallSpkpos(module, target, et, ref, abcorr, obs) {
40
- const errMaxBytes = 2048;
41
- const errPtr = module._malloc(errMaxBytes);
42
138
  const targetPtr = writeUtf8CString(module, target);
43
139
  const refPtr = writeUtf8CString(module, ref);
44
140
  const abcorrPtr = writeUtf8CString(module, abcorr);
45
141
  const obsPtr = writeUtf8CString(module, obs);
46
- const outPosPtr = module._malloc(3 * 8);
47
- const outLtPtr = module._malloc(8);
48
- if (!errPtr || !targetPtr || !refPtr || !abcorrPtr || !obsPtr || !outPosPtr || !outLtPtr) {
49
- for (const ptr of [outLtPtr, outPosPtr, obsPtr, abcorrPtr, refPtr, targetPtr, errPtr]) {
50
- if (ptr)
51
- module._free(ptr);
52
- }
53
- throw new Error("WASM malloc failed");
54
- }
55
142
  try {
56
- module.HEAPF64[outLtPtr >> 3] = 0;
57
- const result = module._tspice_spkpos(targetPtr, et, refPtr, abcorrPtr, obsPtr, outPosPtr, outLtPtr, errPtr, errMaxBytes);
58
- if (result !== 0) {
59
- throwWasmSpiceError(module, errPtr, errMaxBytes, result);
60
- }
61
- const pos = Array.from(module.HEAPF64.subarray(outPosPtr >> 3, (outPosPtr >> 3) + 3));
62
- const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
63
- return { pos, lt };
143
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 3 * 8, 8], (errPtr, outPosPtr, outLtPtr) => {
144
+ module.HEAPF64[outLtPtr >> 3] = 0;
145
+ const result = module._tspice_spkpos(targetPtr, et, refPtr, abcorrPtr, obsPtr, outPosPtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
146
+ if (result !== 0) {
147
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
148
+ }
149
+ const pos = Array.from(module.HEAPF64.subarray(outPosPtr >> 3, (outPosPtr >> 3) + 3));
150
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
151
+ return { pos, lt };
152
+ });
64
153
  }
65
154
  finally {
66
- module._free(outLtPtr);
67
- module._free(outPosPtr);
68
155
  module._free(obsPtr);
69
156
  module._free(abcorrPtr);
70
157
  module._free(refPtr);
71
158
  module._free(targetPtr);
72
- module._free(errPtr);
73
159
  }
74
160
  }
75
- export function createEphemerisApi(module) {
161
+ function tspiceCallSpkez(module, target, et, ref, abcorr, observer) {
162
+ assertSpiceInt32(target, "spkez(target)");
163
+ assertSpiceInt32(observer, "spkez(observer)");
164
+ const refPtr = writeUtf8CString(module, ref);
165
+ const abcorrPtr = writeUtf8CString(module, abcorr);
166
+ try {
167
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 6 * 8, 8], (errPtr, outStatePtr, outLtPtr) => {
168
+ module.HEAPF64[outLtPtr >> 3] = 0;
169
+ const result = module._tspice_spkez(target, et, refPtr, abcorrPtr, observer, outStatePtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
170
+ if (result !== 0) {
171
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
172
+ }
173
+ const state = Array.from(module.HEAPF64.subarray(outStatePtr >> 3, (outStatePtr >> 3) + 6));
174
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
175
+ return { state, lt };
176
+ });
177
+ }
178
+ finally {
179
+ module._free(abcorrPtr);
180
+ module._free(refPtr);
181
+ }
182
+ }
183
+ function tspiceCallSpkezp(module, target, et, ref, abcorr, observer) {
184
+ assertSpiceInt32(target, "spkezp(target)");
185
+ assertSpiceInt32(observer, "spkezp(observer)");
186
+ const refPtr = writeUtf8CString(module, ref);
187
+ const abcorrPtr = writeUtf8CString(module, abcorr);
188
+ try {
189
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 3 * 8, 8], (errPtr, outPosPtr, outLtPtr) => {
190
+ module.HEAPF64[outLtPtr >> 3] = 0;
191
+ const result = module._tspice_spkezp(target, et, refPtr, abcorrPtr, observer, outPosPtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
192
+ if (result !== 0) {
193
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
194
+ }
195
+ const pos = Array.from(module.HEAPF64.subarray(outPosPtr >> 3, (outPosPtr >> 3) + 3));
196
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
197
+ return { pos, lt };
198
+ });
199
+ }
200
+ finally {
201
+ module._free(abcorrPtr);
202
+ module._free(refPtr);
203
+ }
204
+ }
205
+ function tspiceCallSpkgeo(module, target, et, ref, observer) {
206
+ assertSpiceInt32(target, "spkgeo(target)");
207
+ assertSpiceInt32(observer, "spkgeo(observer)");
208
+ const refPtr = writeUtf8CString(module, ref);
209
+ try {
210
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 6 * 8, 8], (errPtr, outStatePtr, outLtPtr) => {
211
+ module.HEAPF64[outLtPtr >> 3] = 0;
212
+ const result = module._tspice_spkgeo(target, et, refPtr, observer, outStatePtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
213
+ if (result !== 0) {
214
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
215
+ }
216
+ const state = Array.from(module.HEAPF64.subarray(outStatePtr >> 3, (outStatePtr >> 3) + 6));
217
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
218
+ return { state, lt };
219
+ });
220
+ }
221
+ finally {
222
+ module._free(refPtr);
223
+ }
224
+ }
225
+ function tspiceCallSpkgps(module, target, et, ref, observer) {
226
+ assertSpiceInt32(target, "spkgps(target)");
227
+ assertSpiceInt32(observer, "spkgps(observer)");
228
+ const refPtr = writeUtf8CString(module, ref);
229
+ try {
230
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 3 * 8, 8], (errPtr, outPosPtr, outLtPtr) => {
231
+ module.HEAPF64[outLtPtr >> 3] = 0;
232
+ const result = module._tspice_spkgps(target, et, refPtr, observer, outPosPtr, outLtPtr, errPtr, WASM_ERR_MAX_BYTES);
233
+ if (result !== 0) {
234
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
235
+ }
236
+ const pos = Array.from(module.HEAPF64.subarray(outPosPtr >> 3, (outPosPtr >> 3) + 3));
237
+ const lt = module.HEAPF64[outLtPtr >> 3] ?? 0;
238
+ return { pos, lt };
239
+ });
240
+ }
241
+ finally {
242
+ module._free(refPtr);
243
+ }
244
+ }
245
+ function tspiceCallSpkssb(module, target, et, ref) {
246
+ assertSpiceInt32(target, "spkssb(target)");
247
+ const refPtr = writeUtf8CString(module, ref);
248
+ try {
249
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 6 * 8], (errPtr, outStatePtr) => {
250
+ const result = module._tspice_spkssb(target, et, refPtr, outStatePtr, errPtr, WASM_ERR_MAX_BYTES);
251
+ if (result !== 0) {
252
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
253
+ }
254
+ return Array.from(module.HEAPF64.subarray(outStatePtr >> 3, (outStatePtr >> 3) + 6));
255
+ });
256
+ }
257
+ finally {
258
+ module._free(refPtr);
259
+ }
260
+ }
261
+ function tspiceCallSpkcov(module, spk, idcode, cover) {
262
+ assertSpiceInt32(idcode, "spkcov(idcode)");
263
+ const resolvedSpk = resolveKernelPath(spk);
264
+ const spkPtr = writeUtf8CString(module, resolvedSpk);
265
+ try {
266
+ return withAllocs(module, [WASM_ERR_MAX_BYTES], (errPtr) => {
267
+ const result = module._tspice_spkcov(spkPtr, idcode, cover, errPtr, WASM_ERR_MAX_BYTES);
268
+ if (result !== 0) {
269
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
270
+ }
271
+ });
272
+ }
273
+ finally {
274
+ module._free(spkPtr);
275
+ }
276
+ }
277
+ function tspiceCallSpkobj(module, spk, ids) {
278
+ const resolvedSpk = resolveKernelPath(spk);
279
+ const spkPtr = writeUtf8CString(module, resolvedSpk);
280
+ try {
281
+ return withAllocs(module, [WASM_ERR_MAX_BYTES], (errPtr) => {
282
+ const result = module._tspice_spkobj(spkPtr, ids, errPtr, WASM_ERR_MAX_BYTES);
283
+ if (result !== 0) {
284
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
285
+ }
286
+ });
287
+ }
288
+ finally {
289
+ module._free(spkPtr);
290
+ }
291
+ }
292
+ function tspiceCallSpksfs(module, body, et) {
293
+ assertSpiceInt32(body, "spksfs(body)");
294
+ // SIDLEN=40 + NUL.
295
+ const identMaxBytes = 41;
296
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 4, 5 * 8, identMaxBytes, 4], (errPtr, outHandlePtr, outDescrPtr, outIdentPtr, outFoundPtr) => {
297
+ module.HEAP32[outHandlePtr >> 2] = 0;
298
+ module.HEAP32[outFoundPtr >> 2] = 0;
299
+ module.HEAPU8[outIdentPtr] = 0;
300
+ const result = module._tspice_spksfs(body, et, outHandlePtr, outDescrPtr, outIdentPtr, identMaxBytes, outFoundPtr, errPtr, WASM_ERR_MAX_BYTES);
301
+ if (result !== 0) {
302
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
303
+ }
304
+ const found = (module.HEAP32[outFoundPtr >> 2] ?? 0) !== 0;
305
+ if (!found) {
306
+ return { found: false };
307
+ }
308
+ const handle = module.HEAP32[outHandlePtr >> 2] ?? 0;
309
+ const descr = Array.from(module.HEAPF64.subarray(outDescrPtr >> 3, (outDescrPtr >> 3) + 5));
310
+ const ident = readFixedWidthCString(module, outIdentPtr, identMaxBytes);
311
+ return {
312
+ found: true,
313
+ handle,
314
+ descr,
315
+ ident,
316
+ };
317
+ });
318
+ }
319
+ function tspiceCallSpkpds(module, body, center, frame, type, first, last) {
320
+ assertSpiceInt32(body, "spkpds(body)");
321
+ assertSpiceInt32(center, "spkpds(center)");
322
+ assertSpiceInt32(type, "spkpds(type)");
323
+ const framePtr = writeUtf8CString(module, frame);
324
+ try {
325
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 5 * 8], (errPtr, outDescrPtr) => {
326
+ const result = module._tspice_spkpds(body, center, framePtr, type, first, last, outDescrPtr, errPtr, WASM_ERR_MAX_BYTES);
327
+ if (result !== 0) {
328
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
329
+ }
330
+ return Array.from(module.HEAPF64.subarray(outDescrPtr >> 3, (outDescrPtr >> 3) + 5));
331
+ });
332
+ }
333
+ finally {
334
+ module._free(framePtr);
335
+ }
336
+ }
337
+ function tspiceCallSpkuds(module, descr) {
338
+ return withAllocs(module, [WASM_ERR_MAX_BYTES, 5 * 8, 4, 4, 4, 4, 8, 8, 4, 4], (errPtr, descrPtr, outBodyPtr, outCenterPtr, outFramePtr, outTypePtr, outFirstPtr, outLastPtr, outBaddrPtr, outEaddrPtr) => {
339
+ const base = descrPtr >> 3;
340
+ for (let i = 0; i < 5; i++) {
341
+ module.HEAPF64[base + i] = descr[i] ?? 0;
342
+ }
343
+ module.HEAP32[outBodyPtr >> 2] = 0;
344
+ module.HEAP32[outCenterPtr >> 2] = 0;
345
+ module.HEAP32[outFramePtr >> 2] = 0;
346
+ module.HEAP32[outTypePtr >> 2] = 0;
347
+ module.HEAPF64[outFirstPtr >> 3] = 0;
348
+ module.HEAPF64[outLastPtr >> 3] = 0;
349
+ module.HEAP32[outBaddrPtr >> 2] = 0;
350
+ module.HEAP32[outEaddrPtr >> 2] = 0;
351
+ const result = module._tspice_spkuds(descrPtr, outBodyPtr, outCenterPtr, outFramePtr, outTypePtr, outFirstPtr, outLastPtr, outBaddrPtr, outEaddrPtr, errPtr, WASM_ERR_MAX_BYTES);
352
+ if (result !== 0) {
353
+ throwWasmSpiceError(module, errPtr, WASM_ERR_MAX_BYTES, result);
354
+ }
355
+ return {
356
+ body: module.HEAP32[outBodyPtr >> 2] ?? 0,
357
+ center: module.HEAP32[outCenterPtr >> 2] ?? 0,
358
+ frame: module.HEAP32[outFramePtr >> 2] ?? 0,
359
+ type: module.HEAP32[outTypePtr >> 2] ?? 0,
360
+ first: module.HEAPF64[outFirstPtr >> 3] ?? 0,
361
+ last: module.HEAPF64[outLastPtr >> 3] ?? 0,
362
+ baddr: module.HEAP32[outBaddrPtr >> 2] ?? 0,
363
+ eaddr: module.HEAP32[outEaddrPtr >> 2] ?? 0,
364
+ };
365
+ });
366
+ }
367
+ /** Create an {@link EphemerisApi} implementation backed by a WASM Emscripten module. */
368
+ export function createEphemerisApi(module, handles, virtualOutputs) {
369
+ const virtualOutputPathByHandle = new Map();
76
370
  return {
77
371
  spkezr: (target, et, ref, abcorr, observer) => tspiceCallSpkezr(module, target, et, ref, abcorr, observer),
78
372
  spkpos: (target, et, ref, abcorr, observer) => tspiceCallSpkpos(module, target, et, ref, abcorr, observer),
373
+ spkez: (target, et, ref, abcorr, observer) => tspiceCallSpkez(module, target, et, ref, abcorr, observer),
374
+ spkezp: (target, et, ref, abcorr, observer) => tspiceCallSpkezp(module, target, et, ref, abcorr, observer),
375
+ spkgeo: (target, et, ref, observer) => tspiceCallSpkgeo(module, target, et, ref, observer),
376
+ spkgps: (target, et, ref, observer) => tspiceCallSpkgps(module, target, et, ref, observer),
377
+ spkssb: (target, et, ref) => tspiceCallSpkssb(module, target, et, ref),
378
+ spkcov: (spk, idcode, cover) => tspiceCallSpkcov(module, spk, idcode, cover),
379
+ spkobj: (spk, ids) => tspiceCallSpkobj(module, spk, ids),
380
+ spksfs: (body, et) => tspiceCallSpksfs(module, body, et),
381
+ spkpds: (body, center, frame, type, first, last) => tspiceCallSpkpds(module, body, center, frame, type, first, last),
382
+ spkuds: (descr) => tspiceCallSpkuds(module, descr),
383
+ // --- SPK writers -------------------------------------------------------
384
+ spkopn: (file, ifname, ncomch) => {
385
+ const resolved = resolveSpkPath(file, "spkopn(file)");
386
+ ensureParentDir(module, resolved);
387
+ const nativeHandle = tspiceCallSpkopn(module, resolved, ifname, ncomch);
388
+ const handle = handles.register("SPK", nativeHandle);
389
+ if (typeof file !== "string") {
390
+ // `resolveSpkPath` already validated, but be defensive: callers can cast.
391
+ if (!isVirtualOutput(file)) {
392
+ throw new Error("spkopn(file): expected VirtualOutput {kind:'virtual-output', path:string}");
393
+ }
394
+ virtualOutputs.markOpen(resolved);
395
+ virtualOutputPathByHandle.set(handle, resolved);
396
+ }
397
+ return handle;
398
+ },
399
+ spkopa: (file) => {
400
+ const resolved = resolveSpkPath(file, "spkopa(file)");
401
+ ensureParentDir(module, resolved);
402
+ const nativeHandle = tspiceCallSpkopa(module, resolved);
403
+ const handle = handles.register("SPK", nativeHandle);
404
+ if (typeof file !== "string") {
405
+ if (!isVirtualOutput(file)) {
406
+ throw new Error("spkopa(file): expected VirtualOutput {kind:'virtual-output', path:string}");
407
+ }
408
+ virtualOutputs.markOpen(resolved);
409
+ virtualOutputPathByHandle.set(handle, resolved);
410
+ }
411
+ return handle;
412
+ },
413
+ spkcls: (handle) => {
414
+ const resolved = virtualOutputPathByHandle.get(handle);
415
+ handles.close(handle, ["SPK"], (entry) => callVoidHandle(module, module._tspice_spkcls, entry.nativeHandle), "spkcls");
416
+ if (resolved) {
417
+ virtualOutputs.markClosed(resolved);
418
+ virtualOutputPathByHandle.delete(handle);
419
+ }
420
+ },
421
+ spkw08: (handle, body, center, frame, first, last, segid, degree, states, epoch1, step) => {
422
+ if (!Array.isArray(states) && !(states instanceof Float64Array)) {
423
+ throw new Error("spkw08(states): expected number[] or Float64Array");
424
+ }
425
+ if (states.length === 0 || states.length % 6 !== 0) {
426
+ throw new Error("spkw08(): expected states.length to be a non-zero multiple of 6");
427
+ }
428
+ const n = states.length / 6;
429
+ if (!Number.isSafeInteger(n) || n <= 0 || n > I32_MAX) {
430
+ throw new Error(`spkw08(): expected states.length/6 to be a 32-bit signed integer (got n=${n})`);
431
+ }
432
+ if (states.length > I32_MAX) {
433
+ throw new Error(`spkw08(): expected states.length to be a 32-bit signed integer (got states.length=${states.length})`);
434
+ }
435
+ const nativeHandle = handles.lookup(handle, ["SPK"], "spkw08").nativeHandle;
436
+ tspiceCallSpkw08(module, nativeHandle, body, center, frame, first, last, segid, degree, states, epoch1, step);
437
+ },
79
438
  };
80
439
  }
81
440
  //# sourceMappingURL=ephemeris.js.map
@@ -0,0 +1,5 @@
1
+ import { type ErrorApi } from "#backend-contract";
2
+ import type { EmscriptenModule } from "../lowlevel/exports.js";
3
+ /** Create an {@link ErrorApi} implementation backed by a WASM Emscripten module. */
4
+ export declare function createErrorApi(module: EmscriptenModule): ErrorApi;
5
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1,109 @@
1
+ import { assertGetmsgWhich } from "#backend-contract";
2
+ import { WASM_ERR_MAX_BYTES, withMalloc, withAllocs } from "../codec/alloc.js";
3
+ import { throwWasmSpiceError } from "../codec/errors.js";
4
+ import { writeUtf8CString } from "../codec/strings.js";
5
+ /** Create an {@link ErrorApi} implementation backed by a WASM Emscripten module. */
6
+ export function createErrorApi(module) {
7
+ return {
8
+ failed: () => {
9
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
10
+ return withAllocs(module, [4, errMaxBytes], (outFailedPtr, errPtr) => {
11
+ module.HEAP32[outFailedPtr >> 2] = 0;
12
+ const result = module._tspice_failed(outFailedPtr, errPtr, errMaxBytes);
13
+ if (result !== 0) {
14
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
15
+ }
16
+ return (module.HEAP32[outFailedPtr >> 2] ?? 0) !== 0;
17
+ });
18
+ },
19
+ reset: () => {
20
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
21
+ withMalloc(module, errMaxBytes, (errPtr) => {
22
+ const result = module._tspice_reset(errPtr, errMaxBytes);
23
+ if (result !== 0) {
24
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
25
+ }
26
+ });
27
+ },
28
+ getmsg: (which) => {
29
+ assertGetmsgWhich(which);
30
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
31
+ const outMaxBytes = WASM_ERR_MAX_BYTES;
32
+ const whichPtr = writeUtf8CString(module, which);
33
+ try {
34
+ return withAllocs(module, [outMaxBytes, errMaxBytes], (outPtr, errPtr) => {
35
+ module.HEAPU8[outPtr] = 0;
36
+ const result = module._tspice_getmsg(whichPtr, outPtr, outMaxBytes, errPtr, errMaxBytes);
37
+ if (result !== 0) {
38
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
39
+ }
40
+ return module.UTF8ToString(outPtr, outMaxBytes).trim();
41
+ });
42
+ }
43
+ finally {
44
+ module._free(whichPtr);
45
+ }
46
+ },
47
+ setmsg: (message) => {
48
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
49
+ const messagePtr = writeUtf8CString(module, message);
50
+ try {
51
+ withMalloc(module, errMaxBytes, (errPtr) => {
52
+ const result = module._tspice_setmsg(messagePtr, errPtr, errMaxBytes);
53
+ if (result !== 0) {
54
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
55
+ }
56
+ });
57
+ }
58
+ finally {
59
+ module._free(messagePtr);
60
+ }
61
+ },
62
+ sigerr: (short) => {
63
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
64
+ const shortPtr = writeUtf8CString(module, short);
65
+ try {
66
+ withMalloc(module, errMaxBytes, (errPtr) => {
67
+ const result = module._tspice_sigerr(shortPtr, errPtr, errMaxBytes);
68
+ if (result !== 0) {
69
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
70
+ }
71
+ });
72
+ }
73
+ finally {
74
+ module._free(shortPtr);
75
+ }
76
+ },
77
+ chkin: (name) => {
78
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
79
+ const namePtr = writeUtf8CString(module, name);
80
+ try {
81
+ withMalloc(module, errMaxBytes, (errPtr) => {
82
+ const result = module._tspice_chkin(namePtr, errPtr, errMaxBytes);
83
+ if (result !== 0) {
84
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
85
+ }
86
+ });
87
+ }
88
+ finally {
89
+ module._free(namePtr);
90
+ }
91
+ },
92
+ chkout: (name) => {
93
+ const errMaxBytes = WASM_ERR_MAX_BYTES;
94
+ const namePtr = writeUtf8CString(module, name);
95
+ try {
96
+ withMalloc(module, errMaxBytes, (errPtr) => {
97
+ const result = module._tspice_chkout(namePtr, errPtr, errMaxBytes);
98
+ if (result !== 0) {
99
+ throwWasmSpiceError(module, errPtr, errMaxBytes, result);
100
+ }
101
+ });
102
+ }
103
+ finally {
104
+ module._free(namePtr);
105
+ }
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1,7 @@
1
+ import type { FileIoApi } from "#backend-contract";
2
+ import type { EmscriptenModule } from "../lowlevel/exports.js";
3
+ import type { SpiceHandleRegistry } from "../runtime/spice-handles.js";
4
+ import type { VirtualOutputRegistry } from "../runtime/virtual-outputs.js";
5
+ /** Create a {@link FileIoApi} implementation backed by a WASM Emscripten module. */
6
+ export declare function createFileIoApi(module: EmscriptenModule, handles: SpiceHandleRegistry, virtualOutputs: VirtualOutputRegistry): FileIoApi;
7
+ //# sourceMappingURL=file-io.d.ts.map