@swmmrs/swmmrs 0.1.0

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 (120) hide show
  1. package/README.md +264 -0
  2. package/dist/README.md +264 -0
  3. package/dist/serial/README.md +264 -0
  4. package/dist/serial/swmmrs.d.ts +395 -0
  5. package/dist/serial/swmmrs.js +3169 -0
  6. package/dist/serial/swmmrs_bg.wasm +0 -0
  7. package/dist/snippets/swmmrs-parallel-5d1c71108133e81d/worker-pool/browser.js +98 -0
  8. package/dist/swmmrs.d.ts +422 -0
  9. package/dist/swmmrs.js +3330 -0
  10. package/dist/swmmrs_bg.wasm +0 -0
  11. package/index.d.ts +2 -0
  12. package/index.js +2 -0
  13. package/lib/swmmrs/client.d.ts +11 -0
  14. package/lib/swmmrs/client.d.ts.map +1 -0
  15. package/lib/swmmrs/client.js +82 -0
  16. package/lib/swmmrs/client.js.map +1 -0
  17. package/lib/swmmrs/enums.d.ts +41 -0
  18. package/lib/swmmrs/enums.d.ts.map +1 -0
  19. package/lib/swmmrs/enums.js +2 -0
  20. package/lib/swmmrs/enums.js.map +1 -0
  21. package/lib/swmmrs/exceptions.d.ts +98 -0
  22. package/lib/swmmrs/exceptions.d.ts.map +1 -0
  23. package/lib/swmmrs/exceptions.js +86 -0
  24. package/lib/swmmrs/exceptions.js.map +1 -0
  25. package/lib/swmmrs/index.d.ts +27 -0
  26. package/lib/swmmrs/index.d.ts.map +1 -0
  27. package/lib/swmmrs/index.js +13 -0
  28. package/lib/swmmrs/index.js.map +1 -0
  29. package/lib/swmmrs/objects/amm.d.ts +114 -0
  30. package/lib/swmmrs/objects/amm.d.ts.map +1 -0
  31. package/lib/swmmrs/objects/amm.js +19 -0
  32. package/lib/swmmrs/objects/amm.js.map +1 -0
  33. package/lib/swmmrs/objects/collections.d.ts +109 -0
  34. package/lib/swmmrs/objects/collections.d.ts.map +1 -0
  35. package/lib/swmmrs/objects/collections.js +158 -0
  36. package/lib/swmmrs/objects/collections.js.map +1 -0
  37. package/lib/swmmrs/objects/definitions.d.ts +215 -0
  38. package/lib/swmmrs/objects/definitions.d.ts.map +1 -0
  39. package/lib/swmmrs/objects/definitions.js +69 -0
  40. package/lib/swmmrs/objects/definitions.js.map +1 -0
  41. package/lib/swmmrs/objects/lids.d.ts +446 -0
  42. package/lib/swmmrs/objects/lids.d.ts.map +1 -0
  43. package/lib/swmmrs/objects/lids.js +90 -0
  44. package/lib/swmmrs/objects/lids.js.map +1 -0
  45. package/lib/swmmrs/objects/links.d.ts +615 -0
  46. package/lib/swmmrs/objects/links.d.ts.map +1 -0
  47. package/lib/swmmrs/objects/links.js +90 -0
  48. package/lib/swmmrs/objects/links.js.map +1 -0
  49. package/lib/swmmrs/objects/nodes.d.ts +494 -0
  50. package/lib/swmmrs/objects/nodes.d.ts.map +1 -0
  51. package/lib/swmmrs/objects/nodes.js +147 -0
  52. package/lib/swmmrs/objects/nodes.js.map +1 -0
  53. package/lib/swmmrs/objects/options.d.ts +112 -0
  54. package/lib/swmmrs/objects/options.d.ts.map +1 -0
  55. package/lib/swmmrs/objects/options.js +27 -0
  56. package/lib/swmmrs/objects/options.js.map +1 -0
  57. package/lib/swmmrs/objects/rtk.d.ts +82 -0
  58. package/lib/swmmrs/objects/rtk.d.ts.map +1 -0
  59. package/lib/swmmrs/objects/rtk.js +19 -0
  60. package/lib/swmmrs/objects/rtk.js.map +1 -0
  61. package/lib/swmmrs/objects/subcatchments.d.ts +575 -0
  62. package/lib/swmmrs/objects/subcatchments.d.ts.map +1 -0
  63. package/lib/swmmrs/objects/subcatchments.js +243 -0
  64. package/lib/swmmrs/objects/subcatchments.js.map +1 -0
  65. package/lib/swmmrs/output.d.ts +412 -0
  66. package/lib/swmmrs/output.d.ts.map +1 -0
  67. package/lib/swmmrs/output.js +507 -0
  68. package/lib/swmmrs/output.js.map +1 -0
  69. package/lib/swmmrs/protocol.d.ts +80 -0
  70. package/lib/swmmrs/protocol.d.ts.map +1 -0
  71. package/lib/swmmrs/protocol.js +2 -0
  72. package/lib/swmmrs/protocol.js.map +1 -0
  73. package/lib/swmmrs/runtime.d.ts +22 -0
  74. package/lib/swmmrs/runtime.d.ts.map +1 -0
  75. package/lib/swmmrs/runtime.js +146 -0
  76. package/lib/swmmrs/runtime.js.map +1 -0
  77. package/lib/swmmrs/scenarios.d.ts +41 -0
  78. package/lib/swmmrs/scenarios.d.ts.map +1 -0
  79. package/lib/swmmrs/scenarios.js +2 -0
  80. package/lib/swmmrs/scenarios.js.map +1 -0
  81. package/lib/swmmrs/simulation.d.ts +249 -0
  82. package/lib/swmmrs/simulation.d.ts.map +1 -0
  83. package/lib/swmmrs/simulation.js +415 -0
  84. package/lib/swmmrs/simulation.js.map +1 -0
  85. package/lib/swmmrs/snapshots.d.ts +192 -0
  86. package/lib/swmmrs/snapshots.d.ts.map +1 -0
  87. package/lib/swmmrs/snapshots.js +2 -0
  88. package/lib/swmmrs/snapshots.js.map +1 -0
  89. package/lib/swmmrs/types.d.ts +123 -0
  90. package/lib/swmmrs/types.d.ts.map +1 -0
  91. package/lib/swmmrs/types.js +2 -0
  92. package/lib/swmmrs/types.js.map +1 -0
  93. package/lib/swmmrs/worker.d.ts +2 -0
  94. package/lib/swmmrs/worker.d.ts.map +1 -0
  95. package/lib/swmmrs/worker.js +488 -0
  96. package/lib/swmmrs/worker.js.map +1 -0
  97. package/package.json +33 -0
  98. package/src/swmmrs/client.ts +76 -0
  99. package/src/swmmrs/enums.ts +73 -0
  100. package/src/swmmrs/exceptions.ts +120 -0
  101. package/src/swmmrs/index.ts +79 -0
  102. package/src/swmmrs/objects/amm.ts +113 -0
  103. package/src/swmmrs/objects/collections.ts +153 -0
  104. package/src/swmmrs/objects/definitions.ts +246 -0
  105. package/src/swmmrs/objects/lids.ts +487 -0
  106. package/src/swmmrs/objects/links.ts +626 -0
  107. package/src/swmmrs/objects/nodes.ts +504 -0
  108. package/src/swmmrs/objects/options.ts +114 -0
  109. package/src/swmmrs/objects/rtk.ts +79 -0
  110. package/src/swmmrs/objects/subcatchments.ts +650 -0
  111. package/src/swmmrs/output.ts +798 -0
  112. package/src/swmmrs/protocol.ts +62 -0
  113. package/src/swmmrs/runtime.ts +188 -0
  114. package/src/swmmrs/scenarios.ts +40 -0
  115. package/src/swmmrs/simulation.ts +406 -0
  116. package/src/swmmrs/snapshots.ts +199 -0
  117. package/src/swmmrs/types.ts +123 -0
  118. package/src/swmmrs/worker.ts +233 -0
  119. package/worker-node.js +142 -0
  120. package/worker.js +1 -0
@@ -0,0 +1,507 @@
1
+ import { WorkerClient } from "./client.js";
2
+ import { LifecycleError } from "./exceptions.js";
3
+ import { bytes, createWorker } from "./runtime.js";
4
+ const EMPTY_TIMES = [];
5
+ /** Lossless stored output name, retaining bytes even when UTF-8 decoding fails. */
6
+ export class OutputName {
7
+ #bytes;
8
+ /** Decoded UTF-8 text, or null for invalid UTF-8. A leading byte-order mark is preserved. */
9
+ text;
10
+ /** Copy an exact stored name byte sequence.
11
+ * @param raw - Byte values copied into owned storage.
12
+ */
13
+ constructor(raw) {
14
+ this.#bytes = new Uint8Array(raw);
15
+ this.text = decodeName(this.#bytes);
16
+ Object.freeze(this);
17
+ }
18
+ /** Return a defensive copy of the exact stored name bytes. */
19
+ get raw() { return this.#bytes.slice(); }
20
+ }
21
+ /** Fixed report schedule and available complete-period count. */
22
+ export class ReportTiming {
23
+ /** Nominal schedule origin in SWMM serial days, not an epoch-millisecond timestamp. */
24
+ reportScheduleOrigin;
25
+ /** Fixed interval between report periods in seconds. */
26
+ reportStepSeconds;
27
+ /** Number of available complete periods. */
28
+ periodCount;
29
+ /** Construct report timing, normally obtained from reader metadata.
30
+ * @param reportScheduleOrigin - SWMM serial-day schedule origin.
31
+ * @param reportStepSeconds - Report interval in seconds.
32
+ * @param periodCount - Available complete-period count.
33
+ */
34
+ constructor(reportScheduleOrigin, reportStepSeconds, periodCount) {
35
+ this.reportScheduleOrigin = reportScheduleOrigin;
36
+ this.reportStepSeconds = reportStepSeconds;
37
+ this.periodCount = periodCount;
38
+ Object.freeze(this);
39
+ }
40
+ /** Return the rounded timezone-free nominal date, not the exact stored serial-day value.
41
+ * @param period - Zero-based integer period index; period zero is one report step after the origin.
42
+ * @returns Nominal date, or null if the integer is outside the available range.
43
+ * @throws `TypeError` when the index is not an integer.
44
+ */
45
+ nominalDate(period) {
46
+ if (!Number.isInteger(period))
47
+ throw new TypeError("period must be an integer");
48
+ if (period < 0 || period >= this.periodCount)
49
+ return null;
50
+ return modelTimeFromSerial(this.reportScheduleOrigin + (period + 1) * this.reportStepSeconds / 86_400);
51
+ }
52
+ }
53
+ /** Immutable column-oriented result for an ordered bulk request. */
54
+ export class BulkSeriesResult {
55
+ /** Shared rounded nominal dates for the selected period range. */
56
+ times;
57
+ /** Columns in requested selection order, including duplicates. */
58
+ series;
59
+ /** Copy the outer axis and column arrays; normally constructed by the reader with immutable, aligned columns.
60
+ * @param times - Shared nominal date axis.
61
+ * @param series - Selection-labelled columns aligned to that axis.
62
+ */
63
+ constructor(times, series) {
64
+ this.times = freezeArray(times);
65
+ this.series = freezeArray(series);
66
+ Object.freeze(this);
67
+ }
68
+ /** Read one value using offsets local to this result, not absolute file periods.
69
+ * @param periodOffset - Zero-based offset into `times`.
70
+ * @param selectionOffset - Zero-based offset into `series`.
71
+ * @returns Selected value in stored output units.
72
+ * @throws `RangeError` if either offset is non-integral or out of range.
73
+ */
74
+ value(periodOffset, selectionOffset) {
75
+ if (!Number.isInteger(periodOffset) || periodOffset < 0 || periodOffset >= this.times.length) {
76
+ throw new RangeError("period offset is outside this result");
77
+ }
78
+ if (!Number.isInteger(selectionOffset) || selectionOffset < 0 || selectionOffset >= this.series.length) {
79
+ throw new RangeError("selection offset is outside this result");
80
+ }
81
+ return this.series[selectionOffset].values[periodOffset];
82
+ }
83
+ }
84
+ /** Structured output-reader failure preserved across the worker boundary. */
85
+ export class OutputError extends Error {
86
+ /** Machine-readable failure category, such as `invalid_period_range`, `element_not_found`, or `ambiguous_element`. */
87
+ category;
88
+ /** Failing reader operation when available. */
89
+ operation;
90
+ /** Construct a structured reader error.
91
+ * @param category - Failure classification.
92
+ * @param message - Human-readable diagnostic.
93
+ * @param operation - Optional operation context; omitted when unavailable.
94
+ */
95
+ constructor(category, message, operation) {
96
+ super(message);
97
+ this.name = "OutputError";
98
+ this.category = category;
99
+ this.operation = operation;
100
+ }
101
+ }
102
+ /** Byte-owned standalone output reader with its own worker, independent of Simulation. Always await `close()`; copied results and metadata remain usable afterward. */
103
+ export class OutputReader {
104
+ /** Immutable parsed metadata, available without another worker query. */
105
+ metadata;
106
+ #client;
107
+ #times;
108
+ #closing;
109
+ #closed = false;
110
+ constructor(client, metadata) {
111
+ this.#client = client;
112
+ this.metadata = metadata;
113
+ Object.freeze(this);
114
+ }
115
+ /** Open finalized or incomplete SWMM output in an independent worker.
116
+ * @param input - File contents, never a host path. In Node, pass bytes from `fs.readFile`.
117
+ * @param options - Worker asset override; defaults to the bundled worker.
118
+ * @returns Reader with immutable validated metadata and available complete periods.
119
+ * @throws {@link OutputError} for invalid output; a worker created during a failed open is stopped.
120
+ */
121
+ static async open(input, options = {}) {
122
+ const worker = await createWorker(options);
123
+ const client = new WorkerClient(worker);
124
+ const call = client.call;
125
+ try {
126
+ const payload = await call("openOutput", await bytes(input));
127
+ return new OutputReader(client, metadataFromPayload(payload));
128
+ }
129
+ catch (error) {
130
+ client.stop(error instanceof Error ? error : new Error(String(error)));
131
+ throw outputFailure(error, "openOutput");
132
+ }
133
+ }
134
+ /** True when the opened bytes contained a valid finalized trailer. */
135
+ get isFinalized() { return this.metadata.runStatus.isFinalized; }
136
+ /** Lazily derive the shared nominal report-date axis from validated metadata. */
137
+ get times() {
138
+ if (this.#times === undefined) {
139
+ const values = Array.from({ length: this.metadata.reportTiming.periodCount }, (_, period) => this.metadata.reportTiming.nominalDate(period));
140
+ this.#times = freezeArray(values);
141
+ }
142
+ return this.#times;
143
+ }
144
+ /** Read ordered selections; duplicates remain repeated columns and empty dimensions are preserved.
145
+ * @param selections - Family-compatible element/attribute selections in desired column order.
146
+ * @param options - Half-open range and I/O strategy; defaults to all periods and whole-period reads.
147
+ * @returns Detached immutable columns sharing one nominal date axis.
148
+ * @throws {@link OutputError} for missing/ambiguous elements, absent attributes, or invalid ranges; TypeError/RangeError for malformed selectors. Reads after close reject with LifecycleError.
149
+ * @example
150
+ * ```typescript
151
+ * import type { OutputReader } from "@swmmrs/swmmrs";
152
+ * declare const reader: OutputReader;
153
+ * const result = await reader.readBulkSeries([
154
+ * { elementType: "node", element: "J1", attribute: "hydraulic_head" },
155
+ * ], { start: 0, end: 24, lowMemory: true });
156
+ * console.log(result.times, result.series[0]?.values);
157
+ * ```
158
+ */
159
+ readBulkSeries(selections, options = {}) {
160
+ const [start, end] = this.#resolveBounds(options);
161
+ const nativeSelections = selections.map((selection) => this.#nativeSelection(selection));
162
+ const method = options.lowMemory === true ? "outputReadBulkSeries" : "outputReadBulkSeriesByPeriod";
163
+ return this.#call(method, nativeSelections, start, end).then((payload) => bulkFromPayload(payload, this.metadata));
164
+ }
165
+ /** Read one subcatchment column with the validation and lifecycle contract of `readBulkSeries`.
166
+ * @param element - Zero-based index or exact stored name selector.
167
+ * @param attribute - Subcatchment attribute, pollutant, or stored result code.
168
+ * @param options - Half-open range and I/O strategy; defaults to all periods and whole-period reads.
169
+ * @returns Immutable selection, nominal dates, and aligned values.
170
+ */
171
+ subcatchmentSeries(element, attribute, options = {}) {
172
+ return this.#singleSeries({ elementType: "subcatchment", element, attribute }, options);
173
+ }
174
+ /** Read one node column with the validation and lifecycle contract of `readBulkSeries`.
175
+ * @param element - Zero-based index or exact stored name selector.
176
+ * @param attribute - Node attribute, pollutant, or stored result code.
177
+ * @param options - Half-open range and I/O strategy; defaults to all periods and whole-period reads.
178
+ * @returns Immutable selection, nominal dates, and aligned values.
179
+ */
180
+ nodeSeries(element, attribute, options = {}) {
181
+ return this.#singleSeries({ elementType: "node", element, attribute }, options);
182
+ }
183
+ /** Read one link column with the validation and lifecycle contract of `readBulkSeries`.
184
+ * @param element - Zero-based index or exact stored name selector.
185
+ * @param attribute - Link attribute, pollutant, or stored result code.
186
+ * @param options - Half-open range and I/O strategy; defaults to all periods and whole-period reads.
187
+ * @returns Immutable selection, nominal dates, and aligned values.
188
+ */
189
+ linkSeries(element, attribute, options = {}) {
190
+ return this.#singleSeries({ elementType: "link", element, attribute }, options);
191
+ }
192
+ /** Read one system column with the validation and lifecycle contract of `readBulkSeries`.
193
+ * @param attribute - System attribute or stored result code; pollutants are not supported.
194
+ * @param options - Half-open range and I/O strategy; defaults to all periods and whole-period reads.
195
+ * @returns Immutable selection with null element, nominal dates, and aligned values.
196
+ */
197
+ systemSeries(attribute, options = {}) {
198
+ return this.#singleSeries({ elementType: "system", element: null, attribute }, options);
199
+ }
200
+ /** Read exact stored report dates rather than the rounded nominal date axis; requires an open reader.
201
+ * @param options - Half-open period/date bounds; defaults to all complete periods.
202
+ * @returns Immutable SWMM serial-day values read from the output bytes.
203
+ * @throws {@link OutputError} for invalid ranges or unreadable output; LifecycleError after close.
204
+ */
205
+ readStoredDates(options = {}) {
206
+ const [start, end] = this.#resolveBounds(options);
207
+ return this.#call("outputReadStoredDates", start, end).then((values) => freezeArray(values));
208
+ }
209
+ /** Release the reader worker. Repeated calls share one cleanup request; future reads reject.
210
+ * @returns Resolves after cleanup. Previously copied metadata/results remain usable.
211
+ */
212
+ async close() {
213
+ if (this.#closing !== undefined)
214
+ return this.#closing;
215
+ this.#closing = this.#call("closeOutput").finally(() => {
216
+ this.#closed = true;
217
+ this.#client.stop(new LifecycleError({ message: "Output reader is closed", operation: "closeOutput" }));
218
+ });
219
+ return this.#closing;
220
+ }
221
+ /** Delegate asynchronous disposal to `close()`.
222
+ * @returns Reader cleanup completion.
223
+ */
224
+ [Symbol.asyncDispose]() { return this.close(); }
225
+ #singleSeries(selection, options) {
226
+ return this.readBulkSeries([selection], options).then((result) => {
227
+ const series = result.series[0];
228
+ if (series === undefined)
229
+ throw new OutputError("output", "native output returned no series");
230
+ return Object.freeze({ selection: series.selection, times: result.times, values: series.values });
231
+ });
232
+ }
233
+ #nativeSelection(selection) {
234
+ if (selection.elementType === "system") {
235
+ if (selection.element !== null)
236
+ throw new TypeError("system selections do not carry an element");
237
+ return ["system", 0, attributeCode(this.metadata, selection.elementType, selection.attribute)];
238
+ }
239
+ if (selection.element === null)
240
+ throw new TypeError("non-system selections require an element");
241
+ return [
242
+ selection.elementType,
243
+ resolveElement(this.metadata, selection.elementType, selection.element),
244
+ attributeCode(this.metadata, selection.elementType, selection.attribute),
245
+ ];
246
+ }
247
+ #resolveBounds(options) {
248
+ if (options === null || typeof options !== "object")
249
+ throw new TypeError("options must be an object");
250
+ if (options.lowMemory !== undefined && typeof options.lowMemory !== "boolean") {
251
+ throw new TypeError("lowMemory must be a boolean");
252
+ }
253
+ const count = this.metadata.reportTiming.periodCount;
254
+ const needsAxis = isModelTime(options.start) || isModelTime(options.end);
255
+ const axis = needsAxis ? this.times : EMPTY_TIMES;
256
+ const start = resolveBound(options.start, 0, count, axis);
257
+ const end = resolveBound(options.end, count, count, axis);
258
+ if (isModelTime(options.start) && isModelTime(options.end) && options.start > options.end) {
259
+ throw new OutputError("invalid_period_range", "start bound must not be later than end bound");
260
+ }
261
+ if (start > end)
262
+ throw new OutputError("invalid_period_range", "resolved period range is inverted");
263
+ return [start, end];
264
+ }
265
+ #call(method, ...args) {
266
+ if (this.#closed)
267
+ return Promise.reject(new LifecycleError({ message: "Output reader is closed", operation: String(method) }));
268
+ const call = this.#client.call;
269
+ return call(method, ...args).catch((error) => { throw outputFailure(error, String(method)); });
270
+ }
271
+ }
272
+ function metadataFromPayload(payload) {
273
+ const timing = new ReportTiming(payload.reportTiming.reportScheduleOrigin, payload.reportTiming.reportStepSeconds, payload.reportTiming.periodCount);
274
+ const metadata = {
275
+ solverRelease: payload.solverRelease,
276
+ runStatus: Object.freeze({
277
+ code: payload.runStatus.code,
278
+ isFinalized: payload.runStatus.code !== null,
279
+ isSuccess: payload.runStatus.code === 0,
280
+ }),
281
+ flowUnits: category(payload.flowUnits),
282
+ unitSystem: payload.unitSystem,
283
+ reportTiming: timing,
284
+ subcatchments: freezeArray(payload.subcatchments.map((item) => Object.freeze({ index: item.index, name: nameFromPayload(item.name), area: item.area }))),
285
+ nodes: freezeArray(payload.nodes.map((item) => Object.freeze({ index: item.index, name: nameFromPayload(item.name), kind: category(item.kind), invertElevation: item.invertElevation, maximumDepth: item.maximumDepth }))),
286
+ links: freezeArray(payload.links.map((item) => Object.freeze({ index: item.index, name: nameFromPayload(item.name), kind: category(item.kind), inletOffset: item.inletOffset, outletOffset: item.outletOffset, maximumDepth: item.maximumDepth, length: item.length }))),
287
+ pollutants: freezeArray(payload.pollutants.map((item) => Object.freeze({ index: item.index, name: nameFromPayload(item.name), concentrationUnits: category(item.concentrationUnits) }))),
288
+ resultSchema: Object.freeze({
289
+ subcatchment: freezeArray(payload.resultSchema.subcatchment.map((item) => attributeFromPayload(item, "subcatchment"))),
290
+ node: freezeArray(payload.resultSchema.node.map((item) => attributeFromPayload(item, "node"))),
291
+ link: freezeArray(payload.resultSchema.link.map((item) => attributeFromPayload(item, "link"))),
292
+ system: freezeArray(payload.resultSchema.system.map((item) => attributeFromPayload(item, "system"))),
293
+ }),
294
+ };
295
+ return Object.freeze(metadata);
296
+ }
297
+ function bulkFromPayload(payload, metadata) {
298
+ const times = freezeArray(payload.times.map(modelTimeFromSerial));
299
+ const series = payload.series.map((item) => Object.freeze({
300
+ selection: selectionFromPayload(item.selection, metadata),
301
+ values: freezeArray(item.values),
302
+ }));
303
+ return new BulkSeriesResult(times, series);
304
+ }
305
+ function selectionFromPayload(payload, metadata) {
306
+ const elementType = payload.elementType;
307
+ const attribute = attributeFromPayload(payload.attribute, elementType);
308
+ return Object.freeze({ elementType, element: elementType === "system" ? null : payload.element, attribute });
309
+ }
310
+ function attributeFromPayload(value, _family) {
311
+ const attribute = typeof value === "string" ? value
312
+ : Object.freeze("pollutant" in value ? { selector: value.pollutant } : { code: value.code });
313
+ return attribute;
314
+ }
315
+ function attributeCode(metadata, family, attribute) {
316
+ if (typeof attribute === "string") {
317
+ const known = knownAttributeCode(family, attribute);
318
+ if (known === undefined)
319
+ throw new TypeError(`unknown ${family} attribute ${attribute}`);
320
+ return known;
321
+ }
322
+ if ("selector" in attribute) {
323
+ const pollutant = resolvePollutant(metadata, attribute.selector);
324
+ const schema = schemaFor(metadata, family);
325
+ const entry = schema.find((candidate) => typeof candidate === "object" && candidate !== null && "selector" in candidate && candidate.selector === pollutant);
326
+ if (entry === undefined)
327
+ throw new OutputError("attribute_not_found", `pollutant ${pollutant} is absent from ${family} schema`);
328
+ return pollutantCode(family, pollutant);
329
+ }
330
+ if (!Number.isInteger(attribute.code) || attribute.code < -2_147_483_648 || attribute.code > 2_147_483_647) {
331
+ throw new RangeError("result code must fit a signed 32-bit integer");
332
+ }
333
+ return attribute.code;
334
+ }
335
+ function knownAttributeCode(family, attribute) {
336
+ const known = {
337
+ subcatchment: ["rainfall", "snow_depth", "evap_loss", "infil_loss", "runoff_rate", "gw_outflow_rate", "gw_table_elev", "soil_moisture"],
338
+ node: ["invert_depth", "hydraulic_head", "ponded_volume", "lateral_inflow", "total_inflow", "flooding_losses"],
339
+ link: ["flow_rate", "flow_depth", "flow_velocity", "flow_volume", "capacity"],
340
+ system: ["air_temp", "rainfall", "snow_depth", "evap_infil_loss", "runoff_flow", "dry_weather_inflow", "gw_inflow", "rdii_inflow", "direct_inflow", "total_lateral_inflow", "flood_losses", "outfall_flows", "volume_stored", "evap_rate", "ptnl_evap_rate"],
341
+ };
342
+ const index = known[family].indexOf(attribute);
343
+ return index < 0 ? undefined : index;
344
+ }
345
+ function pollutantCode(family, index) {
346
+ const offset = family === "subcatchment" ? 8 : family === "node" ? 6 : 5;
347
+ if (family === "system")
348
+ throw new TypeError("system selections do not support pollutants");
349
+ const code = offset + index;
350
+ if (code > 2_147_483_647)
351
+ throw new RangeError("pollutant result code does not fit a signed 32-bit integer");
352
+ return code;
353
+ }
354
+ function resolveElement(metadata, family, selector) {
355
+ if (typeof selector === "number") {
356
+ if (!Number.isInteger(selector) || selector < 0)
357
+ throw new RangeError("element index must be a nonnegative integer");
358
+ const count = family === "subcatchment" ? metadata.subcatchments.length : family === "node" ? metadata.nodes.length : metadata.links.length;
359
+ if (selector >= count)
360
+ throw new OutputError("invalid_element_id", `invalid ${family} element index ${selector}`);
361
+ return selector;
362
+ }
363
+ const raw = selector instanceof OutputName ? selector.raw : typeof selector === "string" ? new TextEncoder().encode(selector) : selector;
364
+ const records = family === "subcatchment" ? metadata.subcatchments : family === "node" ? metadata.nodes : metadata.links;
365
+ let found = -1;
366
+ let count = 0;
367
+ for (const [index, record] of records.entries()) {
368
+ if (bytesEqual(record.name.raw, raw)) {
369
+ found = index;
370
+ count += 1;
371
+ }
372
+ }
373
+ if (count === 0)
374
+ throw new OutputError("element_not_found", `${family} element name was not found`);
375
+ if (count > 1)
376
+ throw new OutputError("ambiguous_element", `${family} element name matched ${count} elements`);
377
+ return found;
378
+ }
379
+ function resolvePollutant(metadata, selector) {
380
+ if (typeof selector === "number") {
381
+ if (!Number.isInteger(selector) || selector < 0 || selector >= metadata.pollutants.length)
382
+ throw new OutputError("pollutant_not_found", `pollutant index ${selector} was not found`);
383
+ return selector;
384
+ }
385
+ const raw = selector instanceof OutputName ? selector.raw : typeof selector === "string" ? new TextEncoder().encode(selector) : selector;
386
+ let found = -1;
387
+ let count = 0;
388
+ for (const [index, pollutant] of metadata.pollutants.entries()) {
389
+ if (bytesEqual(pollutant.name.raw, raw)) {
390
+ found = index;
391
+ count += 1;
392
+ }
393
+ }
394
+ if (count === 0)
395
+ throw new OutputError("pollutant_not_found", "pollutant name was not found");
396
+ if (count > 1)
397
+ throw new OutputError("ambiguous_pollutant", `pollutant name matched ${count} pollutants`);
398
+ return found;
399
+ }
400
+ function schemaFor(metadata, family) {
401
+ return metadata.resultSchema[family];
402
+ }
403
+ function resolveBound(bound, fallback, count, axis) {
404
+ if (bound === undefined || bound === null)
405
+ return fallback;
406
+ if (typeof bound === "number") {
407
+ if (!Number.isInteger(bound))
408
+ throw new TypeError("period bounds must be integers or ModelTime strings");
409
+ if (bound < 0 || bound > count)
410
+ throw new RangeError("period bound is outside the available range");
411
+ return bound;
412
+ }
413
+ if (!isModelTime(bound))
414
+ throw new TypeError("date bounds must be timezone-free ModelTime strings");
415
+ let low = 0;
416
+ let high = axis.length;
417
+ while (low < high) {
418
+ const middle = (low + high) >>> 1;
419
+ if (axis[middle] < bound)
420
+ low = middle + 1;
421
+ else
422
+ high = middle;
423
+ }
424
+ return low;
425
+ }
426
+ function isModelTime(value) {
427
+ if (typeof value !== "string")
428
+ return false;
429
+ const match = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$/.exec(value);
430
+ if (match === null)
431
+ return false;
432
+ const year = Number(match[1]);
433
+ const month = Number(match[2]);
434
+ const day = Number(match[3]);
435
+ const hour = Number(match[4]);
436
+ const minute = Number(match[5]);
437
+ const second = Number(match[6]);
438
+ if (year < 1 || year > 9999 || month < 1 || month > 12 || hour > 23 || minute > 59 || second > 59)
439
+ return false;
440
+ const date = new Date(0);
441
+ date.setUTCFullYear(year, month - 1, day);
442
+ date.setUTCHours(hour, minute, second, 0);
443
+ return date.getUTCFullYear() === year
444
+ && date.getUTCMonth() === month - 1
445
+ && date.getUTCDate() === day
446
+ && date.getUTCHours() === hour
447
+ && date.getUTCMinutes() === minute
448
+ && date.getUTCSeconds() === second;
449
+ }
450
+ function modelTimeFromSerial(serial) {
451
+ const totalSeconds = serial * 86_400;
452
+ if (!Number.isFinite(totalSeconds))
453
+ throw new OutputError("datetime_out_of_range", "nominal report date is outside the supported time range");
454
+ const rounded = roundHalfEven(totalSeconds);
455
+ const unixSeconds = rounded - 2_209_161_600;
456
+ if (unixSeconds < -62_135_596_800 || unixSeconds > 253_402_300_799) {
457
+ throw new OutputError("datetime_out_of_range", "nominal report date is outside the supported time range");
458
+ }
459
+ const date = new Date(unixSeconds * 1_000);
460
+ if (!Number.isFinite(date.getTime()))
461
+ throw new OutputError("datetime_out_of_range", "nominal report date is outside the supported time range");
462
+ return date.toISOString().slice(0, 19);
463
+ }
464
+ function roundHalfEven(value) {
465
+ const lower = Math.floor(value);
466
+ const fraction = value - lower;
467
+ if (fraction < 0.5)
468
+ return lower;
469
+ if (fraction > 0.5)
470
+ return lower + 1;
471
+ return lower % 2 === 0 ? lower : lower + 1;
472
+ }
473
+ function decodeName(raw) {
474
+ try {
475
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(raw);
476
+ }
477
+ catch {
478
+ return null;
479
+ }
480
+ }
481
+ function nameFromPayload(value) {
482
+ return new OutputName(value.raw);
483
+ }
484
+ function category(value) {
485
+ return typeof value === "string" ? value : Object.freeze({ code: value.code });
486
+ }
487
+ function bytesEqual(left, right) {
488
+ if (left.length !== right.length)
489
+ return false;
490
+ for (let index = 0; index < left.length; index += 1)
491
+ if (left[index] !== right[index])
492
+ return false;
493
+ return true;
494
+ }
495
+ function freezeArray(values) {
496
+ return Object.freeze(Array.from(values));
497
+ }
498
+ function outputFailure(error, operation) {
499
+ if (error instanceof OutputError)
500
+ return error;
501
+ const source = error;
502
+ if (source && typeof source.category === "string") {
503
+ return new OutputError(source.category, typeof source.message === "string" ? source.message : String(error), typeof source.operation === "string" ? source.operation : operation);
504
+ }
505
+ return error instanceof Error ? error : new Error(String(error));
506
+ }
507
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/swmmrs/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { SimulationState, ModelTime } from "./enums.js";
2
+ import type { ErrorDetails } from "./exceptions.js";
3
+ import type { NodeConfiguration, NodePatch, NodeOperations } from "./objects/nodes.js";
4
+ import type { LinkConfiguration, LinkPatch, LinkOperations } from "./objects/links.js";
5
+ import type { SubcatchmentConfiguration, SubcatchmentPatch, SubcatchmentOperations } from "./objects/subcatchments.js";
6
+ import type { ModelOptions, ModelOptionsPatch, OptionsOperations } from "./objects/options.js";
7
+ import type { DefinitionOperations } from "./objects/definitions.js";
8
+ import type { AmmOperations } from "./objects/amm.js";
9
+ import type { RtkOperations } from "./objects/rtk.js";
10
+ import type { LidOperations } from "./objects/lids.js";
11
+ import type { OutputOperations } from "./output.js";
12
+ import type { ScenarioOperations } from "./scenarios.js";
13
+ import type { NodeResults, LinkResults, NodeSnapshot, LinkSnapshot, SubcatchmentResults, SubcatchmentSnapshot, RainGageResults, SimulationStatistics } from "./snapshots.js";
14
+ import type { SimulationInfo, SimulationStatus, RunResults } from "./types.js";
15
+ type Operation<A extends unknown[], R> = {
16
+ args: A;
17
+ result: R;
18
+ };
19
+ export interface Operations extends NodeOperations, LinkOperations, SubcatchmentOperations, OptionsOperations, DefinitionOperations, AmmOperations, RtkOperations, LidOperations, OutputOperations, ScenarioOperations {
20
+ open: Operation<[Uint8Array, Record<string, Uint8Array>, number], SimulationInfo>;
21
+ state: Operation<[], SimulationState>;
22
+ info: Operation<[], SimulationInfo>;
23
+ status: Operation<[], SimulationStatus>;
24
+ start: Operation<[boolean], void>;
25
+ step: Operation<[], ModelTime | null>;
26
+ stride: Operation<[number, boolean], ModelTime | null>;
27
+ node: Operation<[string], NodeResults>;
28
+ link: Operation<[string], LinkResults>;
29
+ nodes: Operation<[readonly string[] | undefined], NodeSnapshot>;
30
+ links: Operation<[readonly string[] | undefined], LinkSnapshot>;
31
+ subcatchment: Operation<[string], SubcatchmentResults>;
32
+ subcatchments: Operation<[readonly string[] | undefined], SubcatchmentSnapshot>;
33
+ rainGage: Operation<[string], RainGageResults>;
34
+ nodeConfiguration: Operation<[string], NodeConfiguration>;
35
+ linkConfiguration: Operation<[string], LinkConfiguration>;
36
+ subcatchmentConfiguration: Operation<[string], SubcatchmentConfiguration>;
37
+ configureNode: Operation<[string, NodePatch], void>;
38
+ configureLink: Operation<[string, LinkPatch], void>;
39
+ configureSubcatchment: Operation<[string, SubcatchmentPatch], void>;
40
+ setNodeExternalInflow: Operation<[string, number], void>;
41
+ setLinkTargetSetting: Operation<[string, number], void>;
42
+ setOutfallStage: Operation<[string, number], void>;
43
+ setRainGagePrecipitation: Operation<[string, number], void>;
44
+ setRainGageRainfallOverride: Operation<[string, number | null], void>;
45
+ options: Operation<[], ModelOptions>;
46
+ configureOptions: Operation<[ModelOptionsPatch], void>;
47
+ statistics: Operation<[], SimulationStatistics>;
48
+ finish: Operation<[], RunResults>;
49
+ run: Operation<[boolean], RunResults>;
50
+ end: Operation<[], void>;
51
+ finalizeReport: Operation<[], void>;
52
+ report: Operation<[], void>;
53
+ resetSolver: Operation<[], void>;
54
+ sleepWorkers: Operation<[], void>;
55
+ readFile: Operation<[string], Uint8Array>;
56
+ close: Operation<[], void>;
57
+ }
58
+ export type Method = keyof Operations;
59
+ export type Args<K extends Method> = Operations[K]["args"];
60
+ export type Result<K extends Method> = Operations[K]["result"];
61
+ export type Call = <K extends Method>(method: K, ...args: Args<K>) => Promise<Result<K>>;
62
+ export type Request = {
63
+ [K in Method]: {
64
+ id: number;
65
+ method: K;
66
+ args: Args<K>;
67
+ };
68
+ }[Method];
69
+ export type Response = {
70
+ id: number;
71
+ ok: true;
72
+ result: unknown;
73
+ } | {
74
+ id: number;
75
+ ok: false;
76
+ error: ErrorDetails;
77
+ fatal: boolean;
78
+ };
79
+ export {};
80
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/swmmrs/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/swmmrs/protocol.ts"],"names":[],"mappings":""}