@hypersoniclabs/helix-cli 0.1.25-helix3.527 → 0.1.25-helix3.529

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 (26) hide show
  1. package/dist/api.d.ts +7 -1
  2. package/dist/api.js +56 -16
  3. package/dist/api.js.map +1 -1
  4. package/dist/device.js +4 -0
  5. package/dist/device.js.map +1 -1
  6. package/dist/index.js +4 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib.js +1 -1
  9. package/dist/lib.js.map +1 -1
  10. package/dist/tsconfig.build.tsbuildinfo +1 -1
  11. package/package.json +1 -1
  12. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  13. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  14. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  15. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  16. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  17. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  18. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  19. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  20. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  21. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  22. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  23. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  24. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  25. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  26. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
package/dist/api.d.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import { CliCredentials } from './config';
2
2
  export declare const API_FETCH_TIMEOUT_MS = 30000;
3
+ /** Server-side finalize reads and validates every uploaded file (about 35 s for a large world). */
4
+ export declare const FINALIZE_FETCH_TIMEOUT_MS = 300000;
5
+ export declare const apiFetchTimeoutMs: () => number;
6
+ export declare const finalizeFetchTimeoutMs: () => number;
3
7
  type NestErrorBody = {
4
8
  statusCode?: number;
5
9
  message?: string | string[];
@@ -29,7 +33,9 @@ export declare class HelixApi {
29
33
  * one-way fingerprint leaves memory.
30
34
  */
31
35
  scopeFingerprint(): string;
32
- request<T>(method: string, path: string, body?: unknown): Promise<T>;
36
+ request<T>(method: string, path: string, body?: unknown, opts?: {
37
+ timeoutMs?: number;
38
+ }): Promise<T>;
33
39
  requestItem<T>(method: string, path: string, body?: unknown): Promise<T>;
34
40
  requestBytes(path: string, headers?: Record<string, string>): Promise<{
35
41
  bytes: Uint8Array;
package/dist/api.js CHANGED
@@ -1,13 +1,49 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HelixApi = exports.ApiError = exports.API_FETCH_TIMEOUT_MS = void 0;
3
+ exports.HelixApi = exports.ApiError = exports.finalizeFetchTimeoutMs = exports.apiFetchTimeoutMs = exports.FINALIZE_FETCH_TIMEOUT_MS = exports.API_FETCH_TIMEOUT_MS = void 0;
4
4
  exports.uploadToTicket = uploadToTicket;
5
5
  const node_crypto_1 = require("node:crypto");
6
6
  const authRefresh_1 = require("./authRefresh");
7
7
  exports.API_FETCH_TIMEOUT_MS = 30_000;
8
- function withTimeout(init, timeoutMs = exports.API_FETCH_TIMEOUT_MS) {
8
+ /** Server-side finalize reads and validates every uploaded file (about 35 s for a large world). */
9
+ exports.FINALIZE_FETCH_TIMEOUT_MS = 300_000;
10
+ // HELIX_API_TIMEOUT_MS overrides the default per-request deadline for every API call;
11
+ // HELIX_FINALIZE_TIMEOUT_MS overrides the longer deadline a publish finalize uses.
12
+ function envTimeout(name, fallback) {
13
+ const parsed = Number(process.env[name]);
14
+ return Number.isFinite(parsed) && parsed >= 1000 ? Math.floor(parsed) : fallback;
15
+ }
16
+ const apiFetchTimeoutMs = () => envTimeout('HELIX_API_TIMEOUT_MS', exports.API_FETCH_TIMEOUT_MS);
17
+ exports.apiFetchTimeoutMs = apiFetchTimeoutMs;
18
+ const finalizeFetchTimeoutMs = () => envTimeout('HELIX_FINALIZE_TIMEOUT_MS', exports.FINALIZE_FETCH_TIMEOUT_MS);
19
+ exports.finalizeFetchTimeoutMs = finalizeFetchTimeoutMs;
20
+ function withTimeout(init, timeoutMs = (0, exports.apiFetchTimeoutMs)()) {
9
21
  return { ...init, signal: AbortSignal.timeout(timeoutMs) };
10
22
  }
23
+ // Turn a bare "The operation was aborted due to timeout" into something a creator can act on:
24
+ // the request, how long we waited, and that the server may still have processed it.
25
+ function timeoutError(err, method, path, timeoutMs) {
26
+ if (err instanceof Error && (err.name === 'TimeoutError' || err.name === 'AbortError')) {
27
+ // Keep the original name: callers (isAmbiguousCreateFailure) classify a timeout by err.name.
28
+ const wrapped = new Error(`${method} ${path} did not answer within ${Math.round(timeoutMs / 1000)}s (request timeout). The server may still be working on it; ` +
29
+ 'check the world before retrying, or raise the deadline with HELIX_API_TIMEOUT_MS (milliseconds).', { cause: err });
30
+ wrapped.name = err.name;
31
+ return wrapped;
32
+ }
33
+ return err;
34
+ }
35
+ // A non-2xx body is usually Nest JSON, but a proxy or gateway answers HTML or plain text. Keep
36
+ // whatever the server said instead of collapsing it to a bare "HTTP <status>".
37
+ async function readProblem(res) {
38
+ const copy = typeof res.clone === 'function' ? res.clone() : null;
39
+ try {
40
+ return (await res.json());
41
+ }
42
+ catch {
43
+ const text = copy ? await copy.text().catch(() => '') : '';
44
+ return text ? { message: text.trim().slice(0, 2000) } : {};
45
+ }
46
+ }
11
47
  class ApiError extends Error {
12
48
  status;
13
49
  body;
@@ -85,7 +121,8 @@ class HelixApi {
85
121
  .digest('hex')
86
122
  .slice(0, 32);
87
123
  }
88
- async request(method, path, body) {
124
+ async request(method, path, body, opts = {}) {
125
+ const timeoutMs = opts.timeoutMs ?? (0, exports.apiFetchTimeoutMs)();
89
126
  const send = () => fetch(`${this.baseUrl}${path}`, withTimeout({
90
127
  method,
91
128
  headers: {
@@ -93,19 +130,22 @@ class HelixApi {
93
130
  ...(this.token ? { authorization: `Bearer ${this.token}` } : {}),
94
131
  },
95
132
  body: body === undefined ? undefined : JSON.stringify(body),
96
- }));
133
+ }, timeoutMs));
97
134
  const sentWith = this.token;
98
- let res = await send();
99
- // A 401 means nothing was done: renew the token once and replay the identical request.
100
- if (res.status === 401 && (await this.renewToken(sentWith)))
101
- res = await send();
102
- if (!res.ok) {
103
- const problem = (await res.json().catch(() => ({})));
104
- throw new ApiError(res.status, problem);
135
+ try {
136
+ let res = await send();
137
+ // A 401 means nothing was done: renew the token once and replay the identical request.
138
+ if (res.status === 401 && (await this.renewToken(sentWith)))
139
+ res = await send();
140
+ if (!res.ok)
141
+ throw new ApiError(res.status, await readProblem(res));
142
+ if (res.status === 204)
143
+ return undefined;
144
+ return (await res.json());
145
+ }
146
+ catch (err) {
147
+ throw timeoutError(err, method, path, timeoutMs);
105
148
  }
106
- if (res.status === 204)
107
- return undefined;
108
- return (await res.json());
109
149
  }
110
150
  // Convenience for endpoints that return a SingleResponseDto ({ item: T }).
111
151
  async requestItem(method, path, body) {
@@ -136,12 +176,12 @@ class HelixApi {
136
176
  // which the server sees as a malformed body. Uses Node's built-in FormData /
137
177
  // Blob (globals since Node 18, same undici that already backs `fetch` above),
138
178
  // so multipart needs no dependency.
139
- async postMultipart(path, form, timeoutMs = exports.API_FETCH_TIMEOUT_MS) {
179
+ async postMultipart(path, form, timeoutMs = (0, exports.apiFetchTimeoutMs)()) {
140
180
  return this.sendMultipart('POST', path, form, timeoutMs);
141
181
  }
142
182
  // The same transport for the multipart endpoints that REPLACE rather than
143
183
  // create (achievement icon/trophy are PUTs).
144
- async sendMultipart(method, path, form, timeoutMs = exports.API_FETCH_TIMEOUT_MS) {
184
+ async sendMultipart(method, path, form, timeoutMs = (0, exports.apiFetchTimeoutMs)()) {
145
185
  const res = await fetch(`${this.baseUrl}${path}`, withTimeout({
146
186
  method,
147
187
  headers: this.token ? { authorization: `Bearer ${this.token}` } : {},
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/device.js CHANGED
@@ -1394,6 +1394,8 @@ function deviceWebPanelInteractionError(definition, interaction) {
1394
1394
  }
1395
1395
  return null;
1396
1396
  }
1397
+ /** The backend's `runtimeName` rule (helix-backend-api src/devices/continuum-device-definition.ts): publish refuses any other interaction id. */
1398
+ const DEVICE_RUNTIME_NAME = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;
1397
1399
  function validateDeviceProject(input, options = {}) {
1398
1400
  const target = readDefinitionPath(input);
1399
1401
  const errors = [];
@@ -1649,6 +1651,8 @@ function validateDeviceProject(input, options = {}) {
1649
1651
  errors.push('interaction id must be a non-empty string');
1650
1652
  else if (id.length > 48)
1651
1653
  errors.push(`interaction id "${id}" must be 48 characters or fewer`);
1654
+ else if (!DEVICE_RUNTIME_NAME.test(id))
1655
+ errors.push(`interaction id "${id}" must be a room-safe identifier: a letter, then letters, digits or underscores only (no hyphens or dots), as the backend requires (^[A-Za-z][A-Za-z0-9_]{0,63}$)`);
1652
1656
  else if (interactionIds.has(id))
1653
1657
  errors.push(`interactions: duplicate id "${id}"`);
1654
1658
  interactionIds.add(id);