@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.
- package/dist/api.d.ts +7 -1
- package/dist/api.js +56 -16
- package/dist/api.js.map +1 -1
- package/dist/device.js +4 -0
- package/dist/device.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
- 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
|
|
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
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
res
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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.
|
|
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.
|
|
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":";;;
|
|
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);
|