@selvajs/compute 1.5.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.
- package/LICENSE.md +21 -0
- package/README.md +106 -0
- package/dist/base-dtik4Dlu.d.cts +138 -0
- package/dist/base-dtik4Dlu.d.ts +138 -0
- package/dist/chunk-FRSLCR7G.cjs +2 -0
- package/dist/chunk-FRSLCR7G.cjs.map +1 -0
- package/dist/chunk-IJZNCO5X.cjs +3 -0
- package/dist/chunk-IJZNCO5X.cjs.map +1 -0
- package/dist/chunk-LNIUUPA5.cjs +2 -0
- package/dist/chunk-LNIUUPA5.cjs.map +1 -0
- package/dist/chunk-PZ4HZLFJ.js +2 -0
- package/dist/chunk-PZ4HZLFJ.js.map +1 -0
- package/dist/chunk-VK2TSW7S.js +3 -0
- package/dist/chunk-VK2TSW7S.js.map +1 -0
- package/dist/chunk-WXQGTKU6.js +2 -0
- package/dist/chunk-WXQGTKU6.js.map +1 -0
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +140 -0
- package/dist/core.d.ts +140 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/grasshopper.cjs +2 -0
- package/dist/grasshopper.cjs.map +1 -0
- package/dist/grasshopper.d.cts +1014 -0
- package/dist/grasshopper.d.ts +1014 -0
- package/dist/grasshopper.js +2 -0
- package/dist/grasshopper.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas-Ct7lU-IH.d.cts +247 -0
- package/dist/schemas-Ct7lU-IH.d.ts +247 -0
- package/dist/types-B24K2LG4.d.cts +85 -0
- package/dist/types-B24K2LG4.d.ts +85 -0
- package/dist/visualization.cjs +2 -0
- package/dist/visualization.cjs.map +1 -0
- package/dist/visualization.d.cts +205 -0
- package/dist/visualization.d.ts +205 -0
- package/dist/visualization.js +2 -0
- package/dist/visualization.js.map +1 -0
- package/package.json +122 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Selva FelixBrunold VektorNode
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<!-- Badges -->
|
|
2
|
+
<div align="center">
|
|
3
|
+
|
|
4
|
+
[](https://www.npmjs.com/package/@selvajs/compute)
|
|
5
|
+
[](https://www.npmjs.com/package/@selvajs/compute)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
[](https://nodejs.org/)
|
|
9
|
+
[](https://github.com/VektorNode/compute.selvajs)
|
|
10
|
+
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
# @selvajs/compute
|
|
14
|
+
|
|
15
|
+
An intermediate-level TypeScript framework for building web applications with Rhino Compute and Grasshopper.
|
|
16
|
+
|
|
17
|
+
`@selvajs/compute` simplifies the process of communicating with Rhino Compute, handling Grasshopper definitions, and visualizing results in the browser with Three.js.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @selvajs/compute three
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
_(Note: `three` is a peer dependency if you use the visualization features)_
|
|
26
|
+
|
|
27
|
+
## Why this project exists
|
|
28
|
+
|
|
29
|
+
`@selvajs/compute` provides a type-safe, production-ready foundation for building with Rhino Compute:
|
|
30
|
+
|
|
31
|
+
- **Type-safe API** – Full TypeScript support with advanced error handling for stability
|
|
32
|
+
- **High-level abstractions** – Use `GrasshopperClient` and `GrasshopperResponseProcessor` to get started quickly
|
|
33
|
+
- **Ready-to-use visualization** – Integrated Three.js setup with `initScene()` and configurable rendering options
|
|
34
|
+
|
|
35
|
+
Whether you're building a simple solver or a complex web application, `@selvajs/compute` handles the complexity so you can focus on your Grasshopper definitions.
|
|
36
|
+
|
|
37
|
+
> **Note:** The library currently focuses on the Grasshopper endpoint but is designed to support other Rhino Compute endpoints in future releases.
|
|
38
|
+
|
|
39
|
+
### Example with GrasshopperClient
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
// Configuration
|
|
43
|
+
const DEFINITION_FILE = 'my-definition.gh';
|
|
44
|
+
const COMPUTE_SERVER = 'http://localhost:6500';
|
|
45
|
+
const API_KEY = 'your-api-key';
|
|
46
|
+
|
|
47
|
+
const config = {
|
|
48
|
+
serverUrl: COMPUTE_SERVER,
|
|
49
|
+
apiKey: API_KEY
|
|
50
|
+
} as GrasshopperComputeConfig;
|
|
51
|
+
|
|
52
|
+
let client: GrasshopperClient | null = null;
|
|
53
|
+
|
|
54
|
+
// Step 1: Create and initialize the client
|
|
55
|
+
client = await GrasshopperClient.create(config);
|
|
56
|
+
|
|
57
|
+
// Step 2: Get definition inputs and outputs
|
|
58
|
+
const io = await client.getIO(DEFINITION_FILE);
|
|
59
|
+
|
|
60
|
+
// Step 3: Build input data tree from definition parameters
|
|
61
|
+
const inputTree = TreeBuilder.fromInputParams(io.inputs);
|
|
62
|
+
|
|
63
|
+
// Step 4: Run the computation
|
|
64
|
+
const result = await client.solve(DEFINITION_FILE, inputTree);
|
|
65
|
+
|
|
66
|
+
// Step 5: Process and display results
|
|
67
|
+
const processor = new GrasshopperResponseProcessor(result);
|
|
68
|
+
const { values } = processor.getValues();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Requirements
|
|
72
|
+
|
|
73
|
+
### Core Requirements
|
|
74
|
+
|
|
75
|
+
- **Node.js** >= 20
|
|
76
|
+
- **three** >= 0.179.0 (required for visualization features)
|
|
77
|
+
|
|
78
|
+
### Rhino Compute Compatibility
|
|
79
|
+
|
|
80
|
+
`selva-compute` works with both standard Rhino Compute and enhanced versions:
|
|
81
|
+
|
|
82
|
+
**Standard Rhino Compute** – The [official McNeel repository](https://github.com/mcneel/compute.rhino3d) works for basic Grasshopper solving with core features.
|
|
83
|
+
|
|
84
|
+
**Enhanced Setup** (Recommended) – Unlock advanced features:
|
|
85
|
+
|
|
86
|
+
1. **Selva Rhino Plugin** – Grasshopper plugin that simplifies building Three.js visualizations and exporting results directly from Grasshopper. [Download from Food4Rhino](https://www.food4rhino.com/en/app/selva?lang=en). Detailed documentation will be available when the Selva project is open-sourced.
|
|
87
|
+
2. **Custom Compute Server** – Our [custom branch](https://github.com/VektorNode/compute.rhino3d) enables:
|
|
88
|
+
- **Input Grouping** – Organize inputs with the `groupName` property
|
|
89
|
+
- **Persistent IDs** – Uniquely identify inputs across definition changes using Grasshopper object GUIDs
|
|
90
|
+
|
|
91
|
+
> Features requiring the enhanced setup will be clearly marked in the documentation.
|
|
92
|
+
|
|
93
|
+
## Acknowledgement
|
|
94
|
+
|
|
95
|
+
This library is built on production experience and draws from several official McNeel repositories. Where code has been adapted, it is clearly marked in the relevant files.
|
|
96
|
+
|
|
97
|
+
**Key References:**
|
|
98
|
+
|
|
99
|
+
- [compute.rhino3d.appserver](https://github.com/mcneel/compute.rhino3d.appserver) – Server implementation reference
|
|
100
|
+
- [IO/Schema.cs](https://github.com/mcneel/compute.rhino3d/blob/8.x/src/compute.geometry/IO/Schema.cs) – Grasshopper API structure
|
|
101
|
+
- [GrasshopperDefinition.cs](https://github.com/mcneel/compute.rhino3d/blob/8.x/src/compute.geometry/GrasshopperDefinition.cs) – Definition parsing logic
|
|
102
|
+
- [computeclient_js](https://github.com/mcneel/computeclient_js) – JavaScript client implementation
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
MIT
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComputeServerStats provides methods to query Rhino Compute server statistics.
|
|
3
|
+
*
|
|
4
|
+
* @public Use this for server health monitoring and statistics.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const stats = new ComputeServerStats('http://localhost:6500', 'your-api-key');
|
|
9
|
+
*
|
|
10
|
+
* try {
|
|
11
|
+
* const isOnline = await stats.isServerOnline();
|
|
12
|
+
* const children = await stats.getActiveChildren();
|
|
13
|
+
* const version = await stats.getVersion();
|
|
14
|
+
*
|
|
15
|
+
* // Or get everything at once
|
|
16
|
+
* const allStats = await stats.getServerStats();
|
|
17
|
+
* } finally {
|
|
18
|
+
* await stats.dispose(); // Clean up resources
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare class ComputeServerStats {
|
|
23
|
+
private readonly serverUrl;
|
|
24
|
+
private readonly apiKey?;
|
|
25
|
+
private disposed;
|
|
26
|
+
private activeMonitors;
|
|
27
|
+
private activeTimeouts;
|
|
28
|
+
/**
|
|
29
|
+
* @param serverUrl - Base URL of the Rhino Compute server with http:// or https:// scheme (e.g., 'http://localhost:6500')
|
|
30
|
+
* @param apiKey - Optional API key for authentication
|
|
31
|
+
*/
|
|
32
|
+
constructor(serverUrl: string, apiKey?: string);
|
|
33
|
+
/**
|
|
34
|
+
* Build request headers with optional API key.
|
|
35
|
+
*/
|
|
36
|
+
private buildHeaders;
|
|
37
|
+
/**
|
|
38
|
+
* Check if the server is online.
|
|
39
|
+
*/
|
|
40
|
+
isServerOnline(): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the number of active child processes on the server.
|
|
43
|
+
*
|
|
44
|
+
* @returns Number of active children, or null if unavailable
|
|
45
|
+
*/
|
|
46
|
+
getActiveChildren(): Promise<number | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Get the server version information.
|
|
49
|
+
*
|
|
50
|
+
* @returns Version object with rhino, compute, and git_sha, or null if unavailable
|
|
51
|
+
*/
|
|
52
|
+
getVersion(): Promise<{
|
|
53
|
+
rhino: string;
|
|
54
|
+
compute: string;
|
|
55
|
+
git_sha: string | null;
|
|
56
|
+
} | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get comprehensive server statistics.
|
|
59
|
+
* Fetches all available server information in parallel.
|
|
60
|
+
*
|
|
61
|
+
* @returns Object containing server status and available stats
|
|
62
|
+
*/
|
|
63
|
+
getServerStats(): Promise<{
|
|
64
|
+
isOnline: boolean;
|
|
65
|
+
version?: {
|
|
66
|
+
rhino: string;
|
|
67
|
+
compute: string;
|
|
68
|
+
git_sha: string | null;
|
|
69
|
+
};
|
|
70
|
+
activeChildren?: number;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Continuously monitor server stats at specified interval.
|
|
74
|
+
*
|
|
75
|
+
* @param callback - Function called with stats on each interval
|
|
76
|
+
* @param intervalMs - Milliseconds between checks (default: 5000)
|
|
77
|
+
* @returns Function to stop monitoring
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const stopMonitoring = stats.monitor((data) => {
|
|
82
|
+
* console.log('Server stats:', data);
|
|
83
|
+
* }, 3000);
|
|
84
|
+
*
|
|
85
|
+
* // Later...
|
|
86
|
+
* stopMonitoring();
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
monitor(callback: (stats: Awaited<ReturnType<typeof this.getServerStats>>) => void, intervalMs?: number): () => void;
|
|
90
|
+
/**
|
|
91
|
+
* Disposes of all resources and stops all active monitors.
|
|
92
|
+
* Call this when you're done using the stats instance.
|
|
93
|
+
*/
|
|
94
|
+
dispose(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Ensures the instance hasn't been disposed.
|
|
97
|
+
*/
|
|
98
|
+
private ensureNotDisposed;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Simplified error for Rhino Compute operations
|
|
103
|
+
*
|
|
104
|
+
* @public Use this for error handling with error codes and context.
|
|
105
|
+
*/
|
|
106
|
+
declare class RhinoComputeError extends Error {
|
|
107
|
+
readonly code: string;
|
|
108
|
+
readonly statusCode?: number;
|
|
109
|
+
readonly context?: Record<string, unknown>;
|
|
110
|
+
readonly originalError?: Error;
|
|
111
|
+
constructor(message: string, code?: string, options?: {
|
|
112
|
+
statusCode?: number;
|
|
113
|
+
context?: Record<string, unknown>;
|
|
114
|
+
originalError?: Error;
|
|
115
|
+
});
|
|
116
|
+
/**
|
|
117
|
+
* Create a generic validation error with custom reason
|
|
118
|
+
*/
|
|
119
|
+
static validation(inputName: string, reason: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
120
|
+
/**
|
|
121
|
+
* Create an error for missing/empty values
|
|
122
|
+
*/
|
|
123
|
+
static missingValues(inputName: string, expectedType?: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
124
|
+
/**
|
|
125
|
+
* Create an error for invalid default value in value list
|
|
126
|
+
*/
|
|
127
|
+
static invalidDefault(inputName: string, defaultValue: unknown, availableValues: unknown[], context?: Record<string, unknown>): RhinoComputeError;
|
|
128
|
+
/**
|
|
129
|
+
* Create an error for unknown parameter type
|
|
130
|
+
*/
|
|
131
|
+
static unknownParamType(paramType: string, paramName?: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
132
|
+
/**
|
|
133
|
+
* Create an error for invalid input structure
|
|
134
|
+
*/
|
|
135
|
+
static invalidStructure(inputName: string, expectedStructure: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { ComputeServerStats as C, RhinoComputeError as R };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComputeServerStats provides methods to query Rhino Compute server statistics.
|
|
3
|
+
*
|
|
4
|
+
* @public Use this for server health monitoring and statistics.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const stats = new ComputeServerStats('http://localhost:6500', 'your-api-key');
|
|
9
|
+
*
|
|
10
|
+
* try {
|
|
11
|
+
* const isOnline = await stats.isServerOnline();
|
|
12
|
+
* const children = await stats.getActiveChildren();
|
|
13
|
+
* const version = await stats.getVersion();
|
|
14
|
+
*
|
|
15
|
+
* // Or get everything at once
|
|
16
|
+
* const allStats = await stats.getServerStats();
|
|
17
|
+
* } finally {
|
|
18
|
+
* await stats.dispose(); // Clean up resources
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare class ComputeServerStats {
|
|
23
|
+
private readonly serverUrl;
|
|
24
|
+
private readonly apiKey?;
|
|
25
|
+
private disposed;
|
|
26
|
+
private activeMonitors;
|
|
27
|
+
private activeTimeouts;
|
|
28
|
+
/**
|
|
29
|
+
* @param serverUrl - Base URL of the Rhino Compute server with http:// or https:// scheme (e.g., 'http://localhost:6500')
|
|
30
|
+
* @param apiKey - Optional API key for authentication
|
|
31
|
+
*/
|
|
32
|
+
constructor(serverUrl: string, apiKey?: string);
|
|
33
|
+
/**
|
|
34
|
+
* Build request headers with optional API key.
|
|
35
|
+
*/
|
|
36
|
+
private buildHeaders;
|
|
37
|
+
/**
|
|
38
|
+
* Check if the server is online.
|
|
39
|
+
*/
|
|
40
|
+
isServerOnline(): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the number of active child processes on the server.
|
|
43
|
+
*
|
|
44
|
+
* @returns Number of active children, or null if unavailable
|
|
45
|
+
*/
|
|
46
|
+
getActiveChildren(): Promise<number | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Get the server version information.
|
|
49
|
+
*
|
|
50
|
+
* @returns Version object with rhino, compute, and git_sha, or null if unavailable
|
|
51
|
+
*/
|
|
52
|
+
getVersion(): Promise<{
|
|
53
|
+
rhino: string;
|
|
54
|
+
compute: string;
|
|
55
|
+
git_sha: string | null;
|
|
56
|
+
} | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get comprehensive server statistics.
|
|
59
|
+
* Fetches all available server information in parallel.
|
|
60
|
+
*
|
|
61
|
+
* @returns Object containing server status and available stats
|
|
62
|
+
*/
|
|
63
|
+
getServerStats(): Promise<{
|
|
64
|
+
isOnline: boolean;
|
|
65
|
+
version?: {
|
|
66
|
+
rhino: string;
|
|
67
|
+
compute: string;
|
|
68
|
+
git_sha: string | null;
|
|
69
|
+
};
|
|
70
|
+
activeChildren?: number;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Continuously monitor server stats at specified interval.
|
|
74
|
+
*
|
|
75
|
+
* @param callback - Function called with stats on each interval
|
|
76
|
+
* @param intervalMs - Milliseconds between checks (default: 5000)
|
|
77
|
+
* @returns Function to stop monitoring
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const stopMonitoring = stats.monitor((data) => {
|
|
82
|
+
* console.log('Server stats:', data);
|
|
83
|
+
* }, 3000);
|
|
84
|
+
*
|
|
85
|
+
* // Later...
|
|
86
|
+
* stopMonitoring();
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
monitor(callback: (stats: Awaited<ReturnType<typeof this.getServerStats>>) => void, intervalMs?: number): () => void;
|
|
90
|
+
/**
|
|
91
|
+
* Disposes of all resources and stops all active monitors.
|
|
92
|
+
* Call this when you're done using the stats instance.
|
|
93
|
+
*/
|
|
94
|
+
dispose(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Ensures the instance hasn't been disposed.
|
|
97
|
+
*/
|
|
98
|
+
private ensureNotDisposed;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Simplified error for Rhino Compute operations
|
|
103
|
+
*
|
|
104
|
+
* @public Use this for error handling with error codes and context.
|
|
105
|
+
*/
|
|
106
|
+
declare class RhinoComputeError extends Error {
|
|
107
|
+
readonly code: string;
|
|
108
|
+
readonly statusCode?: number;
|
|
109
|
+
readonly context?: Record<string, unknown>;
|
|
110
|
+
readonly originalError?: Error;
|
|
111
|
+
constructor(message: string, code?: string, options?: {
|
|
112
|
+
statusCode?: number;
|
|
113
|
+
context?: Record<string, unknown>;
|
|
114
|
+
originalError?: Error;
|
|
115
|
+
});
|
|
116
|
+
/**
|
|
117
|
+
* Create a generic validation error with custom reason
|
|
118
|
+
*/
|
|
119
|
+
static validation(inputName: string, reason: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
120
|
+
/**
|
|
121
|
+
* Create an error for missing/empty values
|
|
122
|
+
*/
|
|
123
|
+
static missingValues(inputName: string, expectedType?: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
124
|
+
/**
|
|
125
|
+
* Create an error for invalid default value in value list
|
|
126
|
+
*/
|
|
127
|
+
static invalidDefault(inputName: string, defaultValue: unknown, availableValues: unknown[], context?: Record<string, unknown>): RhinoComputeError;
|
|
128
|
+
/**
|
|
129
|
+
* Create an error for unknown parameter type
|
|
130
|
+
*/
|
|
131
|
+
static unknownParamType(paramType: string, paramName?: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
132
|
+
/**
|
|
133
|
+
* Create an error for invalid input structure
|
|
134
|
+
*/
|
|
135
|
+
static invalidStructure(inputName: string, expectedStructure: string, context?: Record<string, unknown>): RhinoComputeError;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { ComputeServerStats as C, RhinoComputeError as R };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkLNIUUPA5cjs = require('./chunk-LNIUUPA5.cjs');var _chunkIJZNCO5Xcjs = require('./chunk-IJZNCO5X.cjs');function L(t){let e=new WeakSet,r=n=>{if(n==null)return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?String(n):JSON.stringify(null);if(typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="bigint")return JSON.stringify(n.toString());if(n instanceof Uint8Array){let o=n.length>64?Array.from(n.slice(0,32)).concat(Array.from(n.slice(-32))):Array.from(n);return JSON.stringify({__u8:!0,len:n.length,sample:o})}return Array.isArray(n)?`[${n.map(r).join(",")}]`:typeof n=="object"?e.has(n)?JSON.stringify("[Circular]"):(e.add(n),`{${Object.keys(n).sort().map(a=>`${JSON.stringify(a)}:${r(n[a])}`).join(",")}}`):JSON.stringify(null)};return r(t)}function J(t){let e=2166136261;for(let r=0;r<t.length;r++)e^=t.charCodeAt(r),e=e+((e<<1)+(e<<4)+(e<<7)+(e<<8)+(e<<24))>>>0;return e.toString(16).padStart(8,"0")}function v(t,e){let r=typeof t=="string"?t:L({__u8:!0,len:t.length});return J(`${r}|${L(e)}`)}var h=class{constructor(e,r,n={}){_chunkIJZNCO5Xcjs.b.call(void 0, this,"executor");_chunkIJZNCO5Xcjs.b.call(void 0, this,"baseConfig");_chunkIJZNCO5Xcjs.b.call(void 0, this,"mode");_chunkIJZNCO5Xcjs.b.call(void 0, this,"maxConcurrent");_chunkIJZNCO5Xcjs.b.call(void 0, this,"timeoutMs");_chunkIJZNCO5Xcjs.b.call(void 0, this,"retry");_chunkIJZNCO5Xcjs.b.call(void 0, this,"cacheEnabled");_chunkIJZNCO5Xcjs.b.call(void 0, this,"cacheMax");_chunkIJZNCO5Xcjs.b.call(void 0, this,"cacheTtl");_chunkIJZNCO5Xcjs.b.call(void 0, this,"cache",new Map);_chunkIJZNCO5Xcjs.b.call(void 0, this,"onStart");_chunkIJZNCO5Xcjs.b.call(void 0, this,"onSettle");_chunkIJZNCO5Xcjs.b.call(void 0, this,"onSuperseded");_chunkIJZNCO5Xcjs.b.call(void 0, this,"subscribers",new Set);_chunkIJZNCO5Xcjs.b.call(void 0, this,"inFlight",new Set);_chunkIJZNCO5Xcjs.b.call(void 0, this,"pendingForLatestWins",null);_chunkIJZNCO5Xcjs.b.call(void 0, this,"fifoQueue",[]);_chunkIJZNCO5Xcjs.b.call(void 0, this,"_lastResult",null);_chunkIJZNCO5Xcjs.b.call(void 0, this,"_lastError",null);_chunkIJZNCO5Xcjs.b.call(void 0, this,"_lastDurationMs",null);_chunkIJZNCO5Xcjs.b.call(void 0, this,"disposed",!1);this.executor=e,this.baseConfig=r,this.mode=_nullishCoalesce(n.mode, () => ("latest-wins")),this.maxConcurrent=Math.max(1,_nullishCoalesce(n.maxConcurrent, () => ((this.mode==="parallel"?4:1)))),this.timeoutMs=n.timeoutMs,this.retry=n.retry;let o=n.cache;this.cacheEnabled=o!==void 0&&o!==!1;let s=typeof o=="object"?o:{};this.cacheMax=_nullishCoalesce(s.maxEntries, () => (50)),this.cacheTtl=_nullishCoalesce(s.ttlMs, () => (0)),this.onStart=n.onStart,this.onSettle=n.onSettle,this.onSuperseded=n.onSuperseded}get isSolving(){return this.inFlight.size>0}get hasPending(){return this.pendingForLatestWins!==null||this.fifoQueue.length>0}get inFlightCount(){return this.inFlight.size}get queueDepth(){return this.fifoQueue.length+(this.pendingForLatestWins?1:0)}get lastResult(){return this._lastResult}get lastError(){return this._lastError}get lastDurationMs(){return this._lastDurationMs}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}notify(){for(let e of this.subscribers)try{e()}catch(r){_chunkIJZNCO5Xcjs.e.call(void 0, ).error("[SolveScheduler] subscriber threw:",r)}}solve(e,r,n){if(this.disposed)return Promise.reject(new (0, _chunkIJZNCO5Xcjs.d)("SolveScheduler has been disposed and cannot be used",_chunkIJZNCO5Xcjs.c.INVALID_STATE));let o=v(e,r),s={key:o,enqueuedAt:Date.now(),startedAt:null};if(this.cacheEnabled){let a=this.readCache(o);if(a){let i={status:"success",response:a,durationMs:0,fromCache:!0};return this._lastResult=a,this._lastError=null,this._lastDurationMs=0,this.runHook(this.onStart,s),this.runHook(this.onSettle,s,i),this.notify(),Promise.resolve(a)}}return new Promise((a,i)=>{let u={definition:e,dataTree:r,ctx:s,resolve:a,reject:i,externalSignal:_optionalChain([n, 'optionalAccess', _2 => _2.signal])};if(_optionalChain([u, 'access', _3 => _3.externalSignal, 'optionalAccess', _4 => _4.aborted])){i(this.makeAbortError(s));return}this.enqueue(u)})}enqueue(e){switch(this.mode){case"latest-wins":{this.pendingForLatestWins&&(this.supersede(this.pendingForLatestWins),this.pendingForLatestWins=null);for(let r of this.inFlight)this.supersede(r),r.controller.abort();this.inFlight.size===0?this.execute(e):this.pendingForLatestWins=e;break}case"queue":{this.inFlight.size<this.maxConcurrent?this.execute(e):this.fifoQueue.push(e);break}case"parallel":{this.inFlight.size<this.maxConcurrent?this.execute(e):this.fifoQueue.push(e);break}}this.notify()}async execute(e){let r=new AbortController,n={...e,controller:r};this.inFlight.add(n),e.ctx.startedAt=Date.now();let o=()=>r.abort();_optionalChain([e, 'access', _5 => _5.externalSignal, 'optionalAccess', _6 => _6.addEventListener, 'call', _7 => _7("abort",o,{once:!0})]),this.runHook(this.onStart,e.ctx),this.notify();let s=performance.now();try{let a={...this.baseConfig,signal:r.signal,...this.timeoutMs!==void 0&&{timeoutMs:this.timeoutMs},...this.retry!==void 0&&{retry:this.retry}},i=await this.executor(e.definition,e.dataTree,a),u=performance.now()-s;this.cacheEnabled&&this.writeCache(e.ctx.key,i),this._lastResult=i,this._lastError=null,this._lastDurationMs=u,e.resolve(i),this.runHook(this.onSettle,e.ctx,{status:"success",response:i,durationMs:u,fromCache:!1})}catch(a){let i=performance.now()-s,u=a instanceof _chunkIJZNCO5Xcjs.d?a:new (0, _chunkIJZNCO5Xcjs.d)(a instanceof Error?a.message:String(a),_chunkIJZNCO5Xcjs.c.UNKNOWN_ERROR,{originalError:a instanceof Error?a:new Error(String(a))});this._lastError=u,this._lastDurationMs=i,e.reject(u),this.runHook(this.onSettle,e.ctx,{status:"error",error:u,durationMs:i})}finally{_optionalChain([e, 'access', _8 => _8.externalSignal, 'optionalAccess', _9 => _9.removeEventListener, 'call', _10 => _10("abort",o)]),this.inFlight.delete(n),this.drainNext(),this.notify()}}drainNext(){if(!this.disposed){if(this.mode==="latest-wins"){if(this.pendingForLatestWins&&this.inFlight.size===0){let e=this.pendingForLatestWins;this.pendingForLatestWins=null,this.execute(e)}return}for(;this.fifoQueue.length>0&&this.inFlight.size<this.maxConcurrent;){let e=this.fifoQueue.shift();this.execute(e)}}}supersede(e){let r=new (0, _chunkIJZNCO5Xcjs.d)("Superseded by newer solve",_chunkIJZNCO5Xcjs.c.UNKNOWN_ERROR,{context:{key:e.ctx.key,enqueuedAt:e.ctx.enqueuedAt}});e.reject(r),this.runHook(this.onSuperseded,e.ctx)}makeAbortError(e){return new (0, _chunkIJZNCO5Xcjs.d)("Request aborted by caller",_chunkIJZNCO5Xcjs.c.UNKNOWN_ERROR,{context:{key:e.key,enqueuedAt:e.enqueuedAt}})}cancelAll(){for(this.pendingForLatestWins&&(this.pendingForLatestWins.reject(this.makeAbortError(this.pendingForLatestWins.ctx)),this.pendingForLatestWins=null);this.fifoQueue.length>0;){let e=this.fifoQueue.shift();e.reject(this.makeAbortError(e.ctx))}for(let e of this.inFlight)e.controller.abort();this.notify()}readCache(e){if(!this.cacheEnabled)return null;let r=this.cache.get(e);return r?this.cacheTtl>0&&Date.now()-r.insertedAt>this.cacheTtl?(this.cache.delete(e),null):(this.cache.delete(e),this.cache.set(e,r),r.response):null}writeCache(e,r){if(this.cacheEnabled)for(this.cache.set(e,{response:r,insertedAt:Date.now()});this.cache.size>this.cacheMax;){let n=this.cache.keys().next().value;if(n===void 0)break;this.cache.delete(n)}}clearCache(){this.cache.clear()}dispose(){this.disposed||(this.disposed=!0,this.cancelAll(),this.subscribers.clear(),this.cache.clear())}runHook(e,...r){if(e)try{e(...r)}catch(n){_chunkIJZNCO5Xcjs.e.call(void 0, ).error("[SolveScheduler] hook threw:",n)}}};var T=class t{constructor(e){_chunkIJZNCO5Xcjs.b.call(void 0, this,"config");_chunkIJZNCO5Xcjs.b.call(void 0, this,"serverStats");_chunkIJZNCO5Xcjs.b.call(void 0, this,"disposed",!1);this.config=this.normalizeComputeConfig(e),this.serverStats=new (0, _chunkIJZNCO5Xcjs.i)(this.config.serverUrl,this.config.apiKey)}static async create(e){let r=new t(e);if(!await r.serverStats.isServerOnline())throw new (0, _chunkIJZNCO5Xcjs.d)("Rhino Compute server is not online",_chunkIJZNCO5Xcjs.c.NETWORK_ERROR,{context:{serverUrl:r.config.serverUrl}});return r}getConfig(){return this.ensureNotDisposed(),{...this.config}}async getIO(e){return this.ensureNotDisposed(),R(e,this.config)}async getRawIO(e){return this.ensureNotDisposed(),S(e,this.config)}async solve(e,r,n){this.ensureNotDisposed();try{if(typeof e=="string"&&!_optionalChain([e, 'optionalAccess', _11 => _11.trim, 'call', _12 => _12()]))throw new (0, _chunkIJZNCO5Xcjs.d)("Definition URL/content is required",_chunkIJZNCO5Xcjs.c.INVALID_INPUT,{context:{receivedUrl:e}});if(e instanceof Uint8Array&&e.length===0)throw new (0, _chunkIJZNCO5Xcjs.d)("Definition content is empty",_chunkIJZNCO5Xcjs.c.INVALID_INPUT);let o={...this.config,..._optionalChain([n, 'optionalAccess', _13 => _13.signal])!==void 0&&{signal:n.signal},..._optionalChain([n, 'optionalAccess', _14 => _14.timeoutMs])!==void 0&&{timeoutMs:n.timeoutMs},..._optionalChain([n, 'optionalAccess', _15 => _15.retry])!==void 0&&{retry:n.retry}},s=await x(r,e,o);if(s&&typeof s=="object"&&"message"in s&&!("fileData"in s))throw new (0, _chunkIJZNCO5Xcjs.d)(s.message||"Computation failed",_chunkIJZNCO5Xcjs.c.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:r}});return s}catch(o){throw this.config.debug&&_chunkIJZNCO5Xcjs.e.call(void 0, ).error("Compute failed:",o),o instanceof _chunkIJZNCO5Xcjs.d?o:new (0, _chunkIJZNCO5Xcjs.d)(o instanceof Error?o.message:String(o),_chunkIJZNCO5Xcjs.c.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:r},originalError:o instanceof Error?o:new Error(String(o))})}}createScheduler(e){this.ensureNotDisposed();let r=(n,o,s)=>x(o,n,s);return new h(r,this.config,e)}async dispose(){this.disposed||(this.disposed=!0,"dispose"in this.serverStats&&typeof this.serverStats.dispose=="function"&&await this.serverStats.dispose())}ensureNotDisposed(){if(this.disposed)throw new (0, _chunkIJZNCO5Xcjs.d)("GrasshopperClient has been disposed and cannot be used",_chunkIJZNCO5Xcjs.c.INVALID_STATE)}normalizeComputeConfig(e){if(!_optionalChain([e, 'access', _16 => _16.serverUrl, 'optionalAccess', _17 => _17.trim, 'call', _18 => _18()]))throw new (0, _chunkIJZNCO5Xcjs.d)("serverUrl is required",_chunkIJZNCO5Xcjs.c.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});try{new URL(e.serverUrl)}catch (e2){throw new (0, _chunkIJZNCO5Xcjs.d)("serverUrl must be a valid URL",_chunkIJZNCO5Xcjs.c.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}})}if(e.serverUrl===""||e.serverUrl==="https://compute.rhino3d.com/")throw new (0, _chunkIJZNCO5Xcjs.d)("serverUrl must be set to your Compute server URL. The default public endpoint is not allowed.",_chunkIJZNCO5Xcjs.c.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});return{...e,serverUrl:e.serverUrl.replace(/\/+$/,""),apiKey:e.apiKey,authToken:e.authToken,debug:_nullishCoalesce(e.debug, () => (!1)),suppressClientSideWarning:e.suppressClientSideWarning}}};var M=async(t,e=null)=>{try{return await K(t,e)}catch(r){throw new (0, _chunkIJZNCO5Xcjs.d)("Failed to extract files from compute response",_chunkIJZNCO5Xcjs.c.INVALID_STATE,{context:{originalError:r instanceof Error?r.message:String(r)},originalError:r instanceof Error?r:void 0})}},P= exports.e =async(t,e,r=null)=>{if(typeof document>"u"||typeof Blob>"u")throw new (0, _chunkIJZNCO5Xcjs.d)("File download functionality is only available in browser environments. This function requires the DOM API (document, Blob).",_chunkIJZNCO5Xcjs.c.BROWSER_ONLY,{context:{environment:typeof window<"u"?"browser (SSR)":"Node.js",documentAvailable:typeof document<"u",blobAvailable:typeof Blob<"u"}});try{let n=await K(t,r);await ae(n,e)}catch(n){throw n instanceof _chunkIJZNCO5Xcjs.d?n:new (0, _chunkIJZNCO5Xcjs.d)("Failed to download files from compute response",_chunkIJZNCO5Xcjs.c.INVALID_STATE,{context:{originalError:n instanceof Error?n.message:String(n)},originalError:n instanceof Error?n:void 0})}},K=async(t,e)=>{let r=[];if(t.forEach(n=>{let o=`${n.fileName}${n.fileType}`;if(n.subFolder&&n.subFolder.trim()!==""&&(o=`${n.subFolder}/${o}`),n.isBase64Encoded===!0&&n.data){let s=_chunkLNIUUPA5cjs.c.call(void 0, n.data);r.push({fileName:`${n.fileName}${n.fileType}`,content:new Uint8Array(s.buffer),path:o})}else n.isBase64Encoded===!1&&n.data&&r.push({fileName:`${n.fileName}${n.fileType}`,content:n.data,path:o})}),e){let n=Array.isArray(e)?e:[e],o=await Promise.all(n.map(async s=>{try{let a=await fetch(s.filePath);if(!a.ok)return _chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Failed to fetch additional file from URL: ${s.filePath}`),null;let u=await(await a.blob()).arrayBuffer();return{fileName:s.fileName,content:new Uint8Array(u),path:s.fileName}}catch(a){return _chunkIJZNCO5Xcjs.e.call(void 0, ).error(`Error fetching additional file from URL: ${s.filePath}`,a),null}}));r.push(...o.filter(s=>s!==null))}return r};async function ae(t,e){let{zipSync:r,strToU8:n}=await Promise.resolve().then(() => _interopRequireWildcard(require("fflate"))),o={};t.forEach(i=>{o[i.path]=typeof i.content=="string"?n(i.content):i.content});let s=r(o,{level:6}),a=new Blob([s],{type:"application/zip"});ie(a,`${e}.zip`)}function ie(t,e){if(typeof document>"u")throw new (0, _chunkIJZNCO5Xcjs.d)("saveFile requires a browser environment with DOM API access.",_chunkIJZNCO5Xcjs.c.BROWSER_ONLY,{context:{function:"saveFile",requiredAPI:"document"}});let r=document.createElement("a");r.href=URL.createObjectURL(t),r.download=e,r.click(),URL.revokeObjectURL(r.href)}var A=new Map;function H(t,e){A.set(t,e)}H("Rhino.Geometry.Point3d",(t,e)=>{let r=e;return!r||typeof r.X!="number"?null:new t.Point([r.X,r.Y,r.Z])});H("Rhino.Geometry.Line",(t,e)=>{let r=e;return!r||!r.From||!r.To?null:new t.Line([r.From.X,r.From.Y,r.From.Z],[r.To.X,r.To.Y,r.To.Z])});function ue(t){if(A.has(t))return A.get(t);for(let[e,r]of A)if(t.startsWith(e))return r}function le(t){return!t||typeof t!="object"?null:_nullishCoalesce(_nullishCoalesce(t.data, () => (t.value)), () => (null))}function Y(t,e,r){let n=ue(e);if(n)try{return n(r,t)}catch(o){_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Failed to decode Rhino type ${e}:`,o)}try{let o=le(t);if(o)return r.CommonObject.decode(o)}catch(o){return _chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Failed to decode ${e} with CommonObject:`,o),{__decodeError:!0,type:e,raw:t}}return t}var C={STRING:"System.String",INT:"System.Int32",DOUBLE:"System.Double",BOOL:"System.Boolean"},pe="Rhino.Geometry.",ce=["WebDisplay"],fe="FileData";function me(t){return ce.some(e=>t.includes(e))}function Q(t){if(typeof t!="string")return t;let e=t.trim();if(!(e.startsWith("{")||e.startsWith("[")||e.startsWith('"')))return t;try{let n=JSON.parse(e);if(typeof n=="string")try{return JSON.parse(n)}catch (e3){return n}return n}catch (e4){return t}}function de(t,e,r){switch(e){case C.STRING:return typeof t!="string"?t:t.replace(/^"(.*)"$/,"$1");case C.INT:return Number.parseInt(t,10);case C.DOUBLE:return Number.parseFloat(t);case C.BOOL:return String(t).toLowerCase()==="true";default:return r&&e.startsWith(pe)?Y(t,e,r):t}}function X(t,e,r,n){if(me(e))return null;if(typeof t!="string")return t;let o=r?Q(t):t;return de(o,e,n)}function E(t,e){for(let r of Object.values(t))if(Array.isArray(r))for(let n of r)e(n)}function Z(t,e=!1,r={}){let{parseValues:n=!0,rhino:o,stringOnly:s=!1}=r,a={};for(let i of t.values)E(i.InnerTree,u=>{if(s&&u.type!==C.STRING)return;let c=e?u.id:i.ParamName;if(!c)return;let d=X(u.data,u.type,n,o);a[c]===void 0?a[c]=d:Array.isArray(a[c])?a[c].push(d):a[c]=[a[c],d]});return{values:a}}function ee(t){let e=[];for(let r of t.values)E(r.InnerTree,n=>{if(!n.type.includes(fe))return;let o=Q(n.data);o&&o.fileName&&o.fileType&&"data"in o&&typeof o.isBase64Encoded=="boolean"&&typeof o.subFolder=="string"&&e.push(o)});return e}function k(t,e,r={}){let{parseValues:n=!0,rhino:o,stringOnly:s=!1}=r,a;if("byName"in e?a=t.values.find(u=>u.ParamName===e.byName):a=t.values.find(u=>{let c=!1;return E(u.InnerTree,d=>{d.id===e.byId&&(c=!0)}),c}),!a)return;let i=[];if(E(a.InnerTree,u=>{if("byId"in e&&u.id!==e.byId||s&&u.type!==C.STRING)return;let c=X(u.data,u.type,n,o);i.push(c)}),i.length!==0)return i.length===1?i[0]:i}var I=class{constructor(e,r=!1){this.response=e;this.debug=r}getValues(e=!1,r={}){return Z(this.response,e,r)}getValueByParamName(e,r){return k(this.response,{byName:e},r)}getValueByParamId(e,r){return k(this.response,{byId:e},r)}async extractMeshesFromResponse(e){let r={debug:this.debug,...e},n;try{({getThreeMeshesFromComputeResponse:n}=await Promise.resolve().then(() => _interopRequireWildcard(require("./visualization.cjs"))))}catch(o){throw new (0, _chunkIJZNCO5Xcjs.d)("Failed to load three.js visualization module. Ensure three.js is installed as a peer dependency.",_chunkIJZNCO5Xcjs.c.INVALID_STATE,{context:{originalError:o instanceof Error?o.message:String(o)}})}return n(this.response,r)}getFileData(){return ee(this.response)}getAndDownloadFiles(e,r){let n=this.getFileData();P(n,e,r)}};function V(t,e){e||typeof window<"u"&&_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Warning: ${t} is running on the client side. For better performance and security, consider running this on the server side.`)}async function x(t,e,r){r.debug&&V("solveGrasshopperDefinition",r.suppressClientSideWarning);let n=B(e,t);he(n,r);let o=await _chunkIJZNCO5Xcjs.h.call(void 0, "grasshopper",n,r);return"pointer"in o&&delete o.pointer,o}function B(t,e){let r={algo:null,pointer:null,values:e};return t instanceof Uint8Array?r.algo=_chunkLNIUUPA5cjs.d.call(void 0, t):/^https?:\/\//i.test(t)?r.pointer=t:_chunkLNIUUPA5cjs.b.call(void 0, t)?r.algo=t:r.algo=_chunkLNIUUPA5cjs.a.call(void 0, t),r}function he(t,e){e.cachesolve!=null&&(t.cachesolve=e.cachesolve),e.modelunits!=null&&(t.modelunits=e.modelunits),e.angletolerance!=null&&(t.angletolerance=e.angletolerance),e.absolutetolerance!=null&&(t.absolutetolerance=e.absolutetolerance),e.dataversion!=null&&(t.dataversion=e.dataversion)}function te(t){if(typeof t.default!="object"||t.default===null)return;if(!("innerTree"in t.default)){_chunkIJZNCO5Xcjs.e.call(void 0, ).warn("Unexpected structure in input.default:",t.default),t.default=null;return}let e=t.default.innerTree;if(Object.keys(e).length===0){t.default=void 0;return}if(t.treeAccess||t.atMost&&t.atMost>1){let n={};for(let[o,s]of Object.entries(e))n[o]=s.map(a=>{if(typeof a.data=="string"){if(a.type==="System.Double"||a.type==="System.Int32"){let i=Number(a.data);return Number.isNaN(i)?a.data:i}if(a.type==="System.Boolean")return a.data.toLowerCase()==="true";if(a.type.startsWith("Rhino.Geometry")||a.type==="System.String")try{return JSON.parse(a.data)}catch (e5){return a.data}}return a.data});t.default=n;return}let r=[];for(let n of Object.values(e))Array.isArray(n)&&n.forEach(o=>{o&&typeof o=="object"&&"data"in o&&r.push(o.data)});r.length===0?t.default=void 0:r.length===1?t.default=r[0]:t.default=r}function O(t,e){let{transform:r,setUndefinedOnEmpty:n=!0}=e;if(!(t.default===void 0||t.default===null))if(Array.isArray(t.default)){let o=t.default.map(r).filter(s=>s!==null);t.default=o.length>0?o:void 0}else{let o=r(t.default);o!==null?t.default=o:n&&(t.default=void 0)}}function ye(){return t=>{if(typeof t=="number")return t;if(typeof t=="string"){let e=Number(t.trim());return Number.isNaN(e)?null:e}return null}}function ge(){return t=>{if(typeof t=="boolean")return t;if(typeof t=="string"){let e=t.toLowerCase();if(e==="true")return!0;if(e==="false")return!1;throw new Error(`Invalid boolean string: "${t}"`)}return null}}function be(){return t=>typeof t=="string"?t.startsWith('"')&&t.endsWith('"')||t.startsWith('"')?t.slice(1,-1):t:null}function Te(){return t=>{if(typeof t=="string"){let e=t.trim();return e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1).trim()),e}return null}}function xe(t){O(t,{transform:Te(),setUndefinedOnEmpty:!1})}function Se(t="unknown"){return e=>{if(typeof e=="object"&&e!==null)return e;if(typeof e=="string"&&e.trim()!=="")try{let r=JSON.parse(e);return typeof r=="object"&&r!==null?r:(_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Parsed value for input ${t} is not an object`),null)}catch(r){return _chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Failed to parse object value "${e}" for input ${t}`,r),null}return null}}function re(t,e,r){let n=Number(t.toFixed(e));return Math.abs(t-n)<r?n:t}function Ce(t,e=1e-8){if(!Number.isFinite(t)||t===0)return .1;let r=Math.abs(t);if(r>=1){let y=String(t).split(".")[1];if(y&&y.length>0){let g=Math.min(y.length,12),b=Math.pow(10,-g),U=Number(b.toFixed(g));return Math.abs(U-b)<e?U:b}return 1}let n=String(t),o=n.toLowerCase().match(/e(-?\d+)/);if(o){let G=Number(o[1]);if(G<0||n.toLowerCase().includes("e-")){let y=Math.abs(G),g=Math.pow(10,-y),b=Number(g.toFixed(y));return Math.abs(b-g)<e?b:g}return .1}let s=12,i=r.toFixed(s).replace(/0+$/,""),u=Math.min((i.split(".")[1]||"").length,s);if(u===0)return .1;let c=Math.pow(10,-u),d=Number(c.toFixed(u));return Math.abs(d-c)<e?d:c}function ne(t,e=1e-8){let r=t.paramType==="Integer";if(O(t,{transform:ye()}),r){Array.isArray(t.default)?t.default=t.default.map(s=>typeof s=="number"?Math.round(s):s):typeof t.default=="number"&&(t.default=Math.round(t.default)),t.stepSize=1;return}let n=Array.isArray(t.default)?t.default[0]:t.default,o;if(typeof n=="number"&&Number.isFinite(n)&&n!==0?o=n:typeof t.minimum=="number"&&Number.isFinite(t.minimum)&&t.minimum!==0?o=t.minimum:typeof t.maximum=="number"&&Number.isFinite(t.maximum)&&t.maximum!==0&&(o=t.maximum),o!==void 0?t.stepSize=Ce(o,e):t.stepSize=.1,typeof t.stepSize=="number"){let s=0,a=String(t.stepSize),i=a.toLowerCase().match(/e(-?\d+)/);if(i?s=Math.abs(Number(i[1])):s=_nullishCoalesce(_optionalChain([a, 'access', _19 => _19.split, 'call', _20 => _20("."), 'access', _21 => _21[1], 'optionalAccess', _22 => _22.length]), () => (0)),s===0&&typeof n=="number"&&n!==0&&Math.abs(n)<1){let u=Math.ceil(-Math.log10(Math.abs(n)));Number.isFinite(u)&&u>0&&(s=u)}s=Math.min(Math.max(s,0),12),Array.isArray(t.default)?t.default=t.default.map(u=>typeof u=="number"?re(u,s,e):u):typeof t.default=="number"&&(t.default=re(t.default,s,e))}}function Ie(t){try{O(t,{transform:ge(),setUndefinedOnEmpty:!1})}catch(e){throw e instanceof Error?new (0, _chunkIJZNCO5Xcjs.d)(e.message):e}}function De(t){O(t,{transform:be(),setUndefinedOnEmpty:!1})}function oe(t){O(t,{transform:Se(t.nickname||"unnamed"),setUndefinedOnEmpty:!0})}function ve(t){if(!t.values||typeof t.values!="object"||Object.keys(t.values).length===0)throw _chunkIJZNCO5Xcjs.d.missingValues(t.nickname||"unnamed","ValueList");if(t.default!==void 0&&t.default!==null){let e=String(t.default).toLowerCase();Object.keys(t.values).some(n=>n.toLowerCase()===e)||_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`ValueList input "${t.nickname||"unnamed"}" default value "${t.default}" is not in available values`)}}var se={Number:ne,Integer:ne,Boolean:Ie,Text:De,ValueList:ve,Geometry:oe,File:oe,Color:xe};function Re(t,e){let r=(_nullishCoalesce(t.atMost, () => (1)))>1;switch(t.paramType){case"Number":case"Integer":return{...e,paramType:t.paramType,minimum:t.minimum,maximum:t.maximum,atLeast:t.atLeast,atMost:t.atMost,default:r?[0]:0};case"Boolean":return{...e,paramType:"Boolean",default:r?[!1]:!1};case"Text":return{...e,paramType:"Text",default:r?[""]:""};case"ValueList":return{...e,paramType:"ValueList",values:_nullishCoalesce(t.values, () => ({})),default:r?[t.default]:t.default};case"File":return{...e,paramType:"File",default:r?[null]:null};case"Color":return{...e,paramType:"Color",default:r?["0, 0, 0"]:"0, 0, 0"};default:return{...e,paramType:"Geometry",default:r?[null]:null}}}function F(t){let e={description:t.description,name:t.name,nickname:t.nickname,treeAccess:t.treeAccess,groupName:_nullishCoalesce(t.groupName, () => ("")),id:t.id};try{te(t);let r=se[t.paramType];if(!r)throw _chunkIJZNCO5Xcjs.d.unknownParamType(t.paramType,t.name);switch(r(t),t.paramType){case"Number":case"Integer":return{...e,paramType:t.paramType,minimum:t.minimum,maximum:t.maximum,atLeast:t.atLeast,atMost:t.atMost,stepSize:t.stepSize,default:t.default};case"Boolean":return{...e,paramType:"Boolean",default:t.default};case"Text":return{...e,paramType:"Text",default:t.default};case"ValueList":return{...e,paramType:"ValueList",values:t.values,default:t.default};case"Geometry":return{...e,paramType:t.paramType,default:t.default};case"File":return{...e,paramType:t.paramType,acceptedFormats:t.acceptedFormats,default:t.default};case"Color":return{...e,paramType:"Color",default:t.default};default:throw _chunkIJZNCO5Xcjs.d.unknownParamType(t.paramType,t.name)}}catch(r){if(r instanceof _chunkIJZNCO5Xcjs.d)return _chunkIJZNCO5Xcjs.e.call(void 0, ).error(`Validation error for input ${t.name||"unknown"}:`,r.message),Re(t,e);throw new (0, _chunkIJZNCO5Xcjs.d)(r instanceof Error?r.message:String(r),"VALIDATION_ERROR",{context:{paramName:t.name,paramType:t.paramType},originalError:r instanceof Error?r:new Error(String(r))})}}function D(t){return t.map(e=>F(e))}async function S(t,e){let r=B(t,[]),n={};if(r.algo&&(n.algo=r.algo),r.pointer&&(n.pointer=r.pointer),!n.algo&&!n.pointer)throw new (0, _chunkIJZNCO5Xcjs.d)("Definition must resolve to either a URL pointer or base64 algo",_chunkIJZNCO5Xcjs.c.INVALID_INPUT,{context:{definition:t}});let o=await _chunkIJZNCO5Xcjs.h.call(void 0, "io",n,e);if(!o||typeof o!="object")throw new (0, _chunkIJZNCO5Xcjs.d)("Invalid IO response structure",_chunkIJZNCO5Xcjs.c.INVALID_INPUT,{context:{response:o,definition:t}});let s=_chunkIJZNCO5Xcjs.k.call(void 0, o,{deep:!0});return{inputs:s.inputs,outputs:s.outputs}}async function R(t,e){V("fetchParsedDefinitionIO",e.suppressClientSideWarning);let{inputs:r,outputs:n}=await S(t,e);return{inputs:D(r),outputs:n}}var w=class t{constructor(e){_chunkIJZNCO5Xcjs.b.call(void 0, this,"innerTree");_chunkIJZNCO5Xcjs.b.call(void 0, this,"paramName");this.paramName=e,this.innerTree={}}append(e,r){let n=t.formatPathString(e);this.innerTree[n]||(this.innerTree[n]=[]);let o=r.map(s=>({data:t.serializeValue(s)}));return this.innerTree[n].push(...o),this}appendSingle(e,r){return this.append(e,[r])}fromDataTreeDefault(e){this.innerTree={};for(let[r,n]of Object.entries(e)){if(!Array.isArray(n))continue;let o=t.parsePathString(r);this.append(o,n)}return this}appendFlat(e){let r=Array.isArray(e)?e:[e];return this.append([0],r)}flatten(){let e=[];for(let r of Object.values(this.innerTree))if(Array.isArray(r))for(let n of r)e.push(t.deserializeValue(n.data));return e}getPaths(){return Object.keys(this.innerTree)}getPath(e){let r=t.formatPathString(e),n=this.innerTree[r];if(n)return n.map(o=>t.deserializeValue(o.data))}toComputeFormat(){return{ParamName:this.paramName,InnerTree:this.innerTree}}getInnerTree(){return this.innerTree}getParamName(){return this.paramName}static fromInputParams(e){return e.filter(r=>t.hasValidValue(r.default)).map(r=>{let n=new t(r.nickname||"unnamed"),o=r.default;if(r.treeAccess&&t.isDataTreeStructure(o))n.fromDataTreeDefault(o),t.isNumericInput(r)&&n.applyNumericConstraints(r.minimum,r.maximum,r.nickname||"unnamed");else{let s=Array.isArray(o)?o:[o],a=t.processValues(s,r);n.appendFlat(a)}return n.toComputeFormat()})}static fromInputParam(e){return t.hasValidValue(e.default)?t.fromInputParams([e])[0]:void 0}static replaceTreeValue(e,r,n){if(e.length>0&&e[0]instanceof t){let s=e,a=s.findIndex(u=>u.getParamName()===r),i=new t(r);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&t.isDataTreeStructure(n)?i.fromDataTreeDefault(n):(Array.isArray(n),i.appendFlat(n)),a!==-1?s[a]=i:s.push(i),s}else{let s=e,a=s.findIndex(c=>c.ParamName===r),i=new t(r);typeof n=="object"&&n!==null&&!Array.isArray(n)&&t.isDataTreeStructure(n)?i.fromDataTreeDefault(n):(Array.isArray(n),i.appendFlat(n));let u=i.toComputeFormat();return a!==-1?s[a]=u:s.push(u),s}}static getTreeValue(e,r){if(e.length>0&&e[0]instanceof t){let s=e.find(i=>i.getParamName()===r);if(!s)return null;let a=s.flatten();return a.length===0?null:a.length===1?a[0]:a}else{let s=e.find(c=>c.ParamName===r);if(!s)return null;let a=s.InnerTree;if(!a)return null;let i=Object.keys(a)[0];if(!i)return null;let u=a[i];if(Array.isArray(u)){if(u.length===1){let c=_optionalChain([u, 'access', _23 => _23[0], 'optionalAccess', _24 => _24.data]);return c!==void 0?t.deserializeValue(c):null}return u.map(c=>_optionalChain([c, 'optionalAccess', _25 => _25.data])!==void 0?t.deserializeValue(c.data):null).filter(c=>c!==null)}return _optionalChain([u, 'optionalAccess', _26 => _26.data])!==void 0?t.deserializeValue(u.data):u}}static parsePathString(e){let r=e.match(/^\{([\d;]*)\}$/);return r?r[1]===""?[]:r[1].split(";").map(Number):(_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`Invalid TreeBuilder path format: ${e}, using [0]`),[0])}static formatPathString(e){return`{${e.join(";")}}`}applyNumericConstraints(e,r,n){for(let o of Object.values(this.innerTree))if(Array.isArray(o))for(let s of o){let a=t.deserializeValue(s.data);if(typeof a=="number"){let i=t.clampValue(a,e,r,n);s.data=t.serializeValue(i)}}}static serializeValue(e){return typeof e=="boolean"||typeof e=="number"||typeof e=="string"?e:typeof e=="object"&&e!==null?JSON.stringify(e):String(e)}static deserializeValue(e){if(typeof e=="boolean"||typeof e=="number"||typeof e!="string")return e;if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch (e6){return e}return isNaN(Number(e))?e==="true"?!0:e==="false"?!1:e:Number(e)}static hasValidValue(e){return e==null?!1:typeof e=="string"?!0:!(Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0)}static isDataTreeStructure(e){return typeof e!="object"||e===null||Array.isArray(e)?!1:Object.entries(e).every(([r,n])=>typeof r=="string"&&/^\{[\d;]+\}$/.test(r)&&Array.isArray(n))}static isNumericInput(e){return e.paramType==="Number"||e.paramType==="Integer"}static processValues(e,r){return e.map(n=>t.isNumericInput(r)&&typeof n=="number"?t.clampValue(n,r.minimum,r.maximum,r.nickname||"unnamed"):n).filter(n=>n!=null)}static clampValue(e,r,n,o){let s=e;return r!=null&&s<r&&(_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`${o}: ${e} below min ${r}, clamping`),s=r),n!=null&&s>n&&(_chunkIJZNCO5Xcjs.e.call(void 0, ).warn(`${o}: ${e} above max ${n}, clamping`),s=n),s}};exports.a = v; exports.b = h; exports.c = T; exports.d = M; exports.e = P; exports.f = I; exports.g = x; exports.h = F; exports.i = D; exports.j = S; exports.k = R; exports.l = w;
|
|
2
|
+
//# sourceMappingURL=chunk-FRSLCR7G.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Coding\\selva-compute\\dist\\chunk-FRSLCR7G.cjs"],"names":[],"mappings":"AAAA,2/BAA6D,wDAAmF,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAA","file":"D:\\Coding\\selva-compute\\dist\\chunk-FRSLCR7G.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var S=Object.defineProperty;var $=(e,r,t)=>r in e?S(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var W=(e,r)=>{for(var t in r)S(e,t,{get:r[t],enumerable:!0})};var R=(e,r,t)=>$(e,typeof r!="symbol"?r+"":r,t);var a={NETWORK_ERROR:"NETWORK_ERROR",AUTH_ERROR:"AUTH_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",COMPUTATION_ERROR:"COMPUTATION_ERROR",TIMEOUT_ERROR:"TIMEOUT_ERROR",CORS_ERROR:"CORS_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR",INVALID_STATE:"INVALID_STATE",INVALID_INPUT:"INVALID_INPUT",INVALID_CONFIG:"INVALID_CONFIG",BROWSER_ONLY:"BROWSER_ONLY",ENVIRONMENT_ERROR:"ENVIRONMENT_ERROR",ENCODING_ERROR:"ENCODING_ERROR"};var d=class e extends Error{constructor(t,n="UNKNOWN_ERROR",s){super(t);R(this,"code");R(this,"statusCode");R(this,"context");R(this,"originalError");this.name="RhinoComputeError",this.code=n,this.statusCode=_optionalChain([s, 'optionalAccess', _2 => _2.statusCode]),this.context=_optionalChain([s, 'optionalAccess', _3 => _3.context]),this.originalError=_optionalChain([s, 'optionalAccess', _4 => _4.originalError]),"cause"in Error.prototype&&Object.defineProperty(this,"cause",{value:_optionalChain([s, 'optionalAccess', _5 => _5.originalError]),enumerable:!0})}static validation(t,n,s){return new e(`Input "${t}": ${n}`,a.VALIDATION_ERROR,{context:{inputName:t,reason:n,...s}})}static missingValues(t,n,s){return new e(`Input "${t}" has no values defined${n?` (expected ${n})`:""}`,a.INVALID_INPUT,{context:{inputName:t,expectedType:n,...s}})}static invalidDefault(t,n,s,i){return new e(`ValueList input "${t}" default value "${n}" is not in available values`,a.VALIDATION_ERROR,{context:{inputName:t,defaultValue:n,availableValues:s,...i}})}static unknownParamType(t,n,s){return new e(`Unknown paramType: ${t}`,a.VALIDATION_ERROR,{context:{receivedParamType:t,paramName:n,...s}})}static invalidStructure(t,n,s){return new e(`Invalid input structure for "${t}" (expected ${n})`,a.INVALID_INPUT,{context:{inputName:t,expectedStructure:n,...s}})}};var v=class{debug(){}info(){}warn(){}error(){}},O=class{debug(r,...t){console.debug(r,...t)}info(r,...t){console.info(r,...t)}warn(r,...t){console.warn(r,...t)}error(r,...t){console.error(r,...t)}},b=new v;function p(){return b}function N(e){e===null?b=new v:"debug"in e&&"info"in e&&"warn"in e&&"error"in e?b=e:b=new O}function _(){N(new O)}var y={attempts:0,baseDelayMs:500,maxDelayMs:3e4,retryOn429:!0},I=new Set([502,503,504]);function k(e){return e?{attempts:_nullishCoalesce(e.attempts, () => (y.attempts)),baseDelayMs:_nullishCoalesce(e.baseDelayMs, () => (y.baseDelayMs)),maxDelayMs:_nullishCoalesce(e.maxDelayMs, () => (y.maxDelayMs)),retryOn429:_nullishCoalesce(e.retryOn429, () => (y.retryOn429))}:y}function M(e){if(!e)return null;let r=Number(e);if(Number.isFinite(r)&&r>=0)return r*1e3;let t=Date.parse(e);if(Number.isFinite(t)){let n=t-Date.now();return n>0?n:0}return null}function w(e,r){let t=r.baseDelayMs*Math.pow(2,e),n=Math.random()*r.baseDelayMs;return Math.min(t+n,r.maxDelayMs)}function x(e,r){return new Promise((t,n)=>{if(_optionalChain([r, 'optionalAccess', _6 => _6.aborted])){n(new DOMException("Aborted","AbortError"));return}let s=setTimeout(()=>{_optionalChain([r, 'optionalAccess', _7 => _7.removeEventListener, 'call', _8 => _8("abort",i)]),t()},e),i=()=>{clearTimeout(s),n(new DOMException("Aborted","AbortError"))};_optionalChain([r, 'optionalAccess', _9 => _9.addEventListener, 'call', _10 => _10("abort",i,{once:!0})])})}function L(e,r,t,n,s,i){let{status:c,statusText:o}=e,l={url:r,requestId:t,method:"POST",requestSize:n,serverUrl:s},u=i?` \u2014 ${i.slice(0,200)}`:"",m={401:{message:`HTTP ${c}: ${o}${u}`,code:a.AUTH_ERROR},403:{message:`HTTP ${c}: ${o}${u}`,code:a.AUTH_ERROR},404:{message:`Endpoint not found: ${r}`,code:a.NETWORK_ERROR},413:{message:`Request too large: ${(n/1024).toFixed(2)}KB`,code:a.VALIDATION_ERROR},429:{message:"Rate limit exceeded",code:a.NETWORK_ERROR},500:{message:`Server error: ${i||o}`,code:a.COMPUTATION_ERROR},502:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR},503:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR},504:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR}}[c]||{message:`HTTP ${c}: ${o}`,code:a.UNKNOWN_ERROR};throw new d(m.message,m.code,{statusCode:c,context:l})}function D(e,r){let t=r.replace(/\/+$/,""),n=e.replace(/^\/+/,"");return`${t}/${n}`}function U(e){try{let r=new URL(e).host;return/^(localhost|127\.0\.0\.1|::1)(:\d+)?$/i.test(r)}catch (e2){return/(localhost|127\.0\.0\.1)/i.test(e)}}function q(e,r){let t={"X-Request-ID":e,"Content-Type":"application/json",...r.authToken&&{Authorization:r.authToken},...r.apiKey&&{RhinoComputeKey:r.apiKey}};return!r.apiKey&&!U(r.serverUrl)&&p().warn(`\u26A0\uFE0F [Rhino Compute] Request [${e}] targets remote server (${r.serverUrl}) but no API key is configured. Requests may fail or be rate-limited.`),t}function K(){return`${Date.now()}-${Math.random().toString(36).substring(2,11)}`}function f(e,r){r&&p().debug(e)}function P(e,r){let t=[],n=()=>{};if(e&&t.push(e),r&&r>0)if(typeof AbortSignal<"u"&&typeof AbortSignal.timeout=="function")t.push(AbortSignal.timeout(r));else{let o=new AbortController,l=setTimeout(()=>o.abort(),r);n=()=>clearTimeout(l),t.push(o.signal)}if(t.length===0)return{signal:void 0,cleanup:n};if(t.length===1)return{signal:t[0],cleanup:n};if(typeof AbortSignal<"u"&&typeof AbortSignal.any=="function")return{signal:AbortSignal.any(t),cleanup:n};let s=new AbortController,i=()=>s.abort();for(let o of t){if(o.aborted){s.abort();break}o.addEventListener("abort",i,{once:!0})}let c=n;return n=()=>{c();for(let o of t)o.removeEventListener("abort",i)},{signal:s.signal,cleanup:n}}async function F(e,r,t,n,s,i,c){let o=Math.round(performance.now()-i);if(!e.ok){let l=await e.text();if(c&&(f(`\u274C Request [${t}] failed with HTTP ${e.status} in ${o}ms`,!0),f(` URL: ${r}`,!0),f(` Status: ${e.status} ${e.statusText}`,!0),l&&f(` Response body: ${l.substring(0,500)}${l.length>500?"...":""}`,!0)),e.status===500)try{let u=JSON.parse(l);if(_optionalChain([u, 'optionalAccess', _11 => _11.values])&&(u.errors||u.warnings))return c&&(f(`\u26A0\uFE0F Request [${t}] completed with Grasshopper errors in ${o}ms`,!0),_optionalChain([u, 'access', _12 => _12.errors, 'optionalAccess', _13 => _13.length])>0&&f(` Errors: ${JSON.stringify(u.errors,null,2)}`,!0),_optionalChain([u, 'access', _14 => _14.warnings, 'optionalAccess', _15 => _15.length])>0&&f(` Warnings: ${JSON.stringify(u.warnings,null,2)}`,!0)),u;_optionalChain([u, 'optionalAccess', _16 => _16.Message])?l=`${u.ExceptionType?u.ExceptionType+": ":""}${u.Message}
|
|
2
|
+
${u.StackTrace||""}`:_optionalChain([u, 'optionalAccess', _17 => _17.error])&&(l=typeof u.error=="string"?u.error:JSON.stringify(u.error,null,2))}catch(u){c&&f(` Failed to parse error body as JSON: ${u}`,!0)}L(e,r,t,n,s,l)}f(`\u2705 Request [${t}] completed in ${o}ms`,c);try{return await e.json()}catch(l){throw new d("Failed to parse JSON response",a.NETWORK_ERROR,{statusCode:e.status,context:{url:r,requestId:t},originalError:l instanceof Error?l:new Error(String(l))})}}async function H(e,r,t,n){let{signal:s,cleanup:i}=P(e.config.signal,e.config.timeoutMs),c=performance.now();try{let o=await fetch(e.fullUrl,{method:"POST",body:e.body,headers:e.headers,signal:s});if((I.has(o.status)||r.retryOn429&&o.status===429)&&t<n-1){let m=_nullishCoalesce(M(o.headers.get("Retry-After")), () => (w(t,r)));return await o.text().catch(()=>{}),{ok:!1,retry:!0,delayMs:m,cause:new d(`HTTP ${o.status} ${o.statusText} (will retry)`,a.NETWORK_ERROR,{statusCode:o.status,context:{requestId:e.requestId}})}}return{ok:!0,value:await F(o,e.fullUrl,e.requestId,e.requestSize,e.config.serverUrl,c,e.config.debug)}}catch(o){if(o instanceof Error&&(o.name==="AbortError"||o.name==="TimeoutError")){if(_optionalChain([e, 'access', _18 => _18.config, 'access', _19 => _19.signal, 'optionalAccess', _20 => _20.aborted])===!0)return{ok:!1,retry:!1,cause:new d("Request aborted by caller",a.UNKNOWN_ERROR,{context:{endpoint:e.endpoint,requestId:e.requestId,requestSize:e.requestSize},originalError:o})};let u=new d(`Request timed out after ${e.config.timeoutMs}ms`,a.TIMEOUT_ERROR,{context:{serverUrl:e.config.serverUrl,timeoutMs:e.config.timeoutMs,url:e.fullUrl,requestId:e.requestId,endpoint:e.endpoint,requestSize:e.requestSize}});return t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:u}:{ok:!1,retry:!1,cause:u}}if(o instanceof TypeError){let l=new d(`Network error: ${o.message}`,a.NETWORK_ERROR,{context:{serverUrl:e.config.serverUrl,url:e.fullUrl,requestId:e.requestId,endpoint:e.endpoint,requestSize:e.requestSize},originalError:o});return t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:l}:{ok:!1,retry:!1,cause:l}}if(o instanceof d){let l=o.statusCode;return l!==void 0&&(I.has(l)||r.retryOn429&&l===429)&&t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:o}:{ok:!1,retry:!1,cause:o}}return{ok:!1,retry:!1,cause:new d(o instanceof Error?o.message:String(o),a.UNKNOWN_ERROR,{context:{endpoint:e.endpoint,requestId:e.requestId},originalError:o instanceof Error?o:new Error(String(o))})}}finally{i()}}async function V(e,r,t){let n=K(),s=JSON.stringify(r),i=s.length,c=D(e,t.serverUrl),o=q(n,t),l=k(t.retry),u=l.attempts+1;if(t.debug){let h=(i/1024).toFixed(2),g=i>1e5?"\u26A0\uFE0F":"\u{1F680}";f(`${g} Starting compute request [${n}]: ${e} (${h}KB)`,!0)}let T={endpoint:e,body:s,requestSize:i,fullUrl:c,requestId:n,headers:o,config:t},m=null;for(let h=0;h<u;h++){let g=await H(T,l,h,u);if(g.ok)return g.value;if(!g.retry)throw g.cause;m=g.cause,t.debug&&f(`\u{1F501} Request [${n}] retrying after ${g.delayMs}ms (attempt ${h+2}/${u}): ${g.cause.message}`,!0);try{await x(g.delayMs,t.signal)}catch (e3){throw new d("Request aborted by caller",a.UNKNOWN_ERROR,{context:{endpoint:e,requestId:n,requestSize:i},originalError:m})}}throw _nullishCoalesce(m, () => (new d("Unknown error after retries",a.UNKNOWN_ERROR,{context:{endpoint:e,requestId:n,requestSize:i}})))}var E=class{constructor(r,t){R(this,"serverUrl");R(this,"apiKey");R(this,"disposed",!1);R(this,"activeMonitors",new Set);R(this,"activeTimeouts",new Set);if(!_optionalChain([r, 'optionalAccess', _21 => _21.trim, 'call', _22 => _22()]))throw new d("serverUrl is required",a.INVALID_CONFIG,{context:{serverUrl:r}});if(!r.match(/^https?:\/\//))throw new d(`Invalid serverUrl: "${r}". Must start with "http://" or "https://". For example: "http://localhost:5000" or "https://example.com"`,a.INVALID_CONFIG,{context:{serverUrl:r}});try{new URL(r)}catch(n){throw new d(`Invalid serverUrl: "${r}". Must be a valid URL. Received error: ${n instanceof Error?n.message:String(n)}`,a.INVALID_CONFIG,{context:{serverUrl:r},originalError:n instanceof Error?n:void 0})}this.apiKey=t,this.serverUrl=r.replace(/\/+$/,"")}buildHeaders(){let r={"Content-Type":"application/json"};return this.apiKey&&(r.RhinoComputeKey=this.apiKey),r}async isServerOnline(){this.ensureNotDisposed();let r=`${this.serverUrl}/healthcheck`,t={headers:this.buildHeaders(),method:"GET"};try{return(await fetch(r,t)).ok}catch(n){return p().debug("[ComputeServerStats] Fetch error:",n),!1}}async getActiveChildren(){this.ensureNotDisposed();try{let r=await fetch(`${this.serverUrl}/activechildren`,{headers:this.buildHeaders()});if(!r.ok)return p().warn("[ComputeServerStats] Failed to fetch active children:",r.status),null;let t=await r.text(),n=parseInt(t.trim(),10);return isNaN(n)?(p().warn("[ComputeServerStats] Invalid active children response:",t),null):n}catch(r){return p().warn("[ComputeServerStats] Error fetching active children:",r),null}}async getVersion(){this.ensureNotDisposed();try{let r=await fetch(`${this.serverUrl}/version`,{headers:this.buildHeaders()});if(!r.ok)return p().warn("[ComputeServerStats] Failed to fetch version:",r.status),null;try{let t=await r.json();return{rhino:_nullishCoalesce(t.rhino, () => ("")),compute:_nullishCoalesce(t.compute, () => ("")),git_sha:_nullishCoalesce(t.git_sha, () => (null))}}catch (e4){return{rhino:await r.text(),compute:"",git_sha:null}}}catch(r){return p().warn("[ComputeServerStats] Error fetching version:",r),null}}async getServerStats(){if(this.ensureNotDisposed(),!await this.isServerOnline())return{isOnline:!1};let[t,n]=await Promise.all([this.getVersion(),this.getActiveChildren()]);return{isOnline:!0,...t&&{version:t},...n!==null&&{activeChildren:n}}}monitor(r,t=5e3){this.ensureNotDisposed();let n=!0,s=null;p().info(`\u{1F504} Starting server stats monitoring every ${t}ms`);let i=async()=>{if(s!==null&&(this.activeTimeouts.delete(s),s=null),!(!n||this.disposed)){try{let o=await this.getServerStats();if(!n||this.disposed)return;try{r(o)}catch(l){p().error("[ComputeServerStats] Monitor callback threw:",l)}}catch(o){p().error("[ComputeServerStats] Failed to fetch stats during monitor:",o)}n&&!this.disposed&&(s=setTimeout(()=>{i()},t),this.activeTimeouts.add(s))}},c=()=>{n=!1,s!==null&&(clearTimeout(s),this.activeTimeouts.delete(s),s=null),this.activeMonitors.delete(c)};return this.activeMonitors.add(c),i(),c}async dispose(){if(!this.disposed){this.disposed=!0;for(let r of this.activeMonitors)r();this.activeMonitors.clear();for(let r of this.activeTimeouts)clearTimeout(r);this.activeTimeouts.clear()}}ensureNotDisposed(){if(this.disposed)throw new d("ComputeServerStats has been disposed and cannot be used",a.INVALID_STATE,{context:{disposed:this.disposed}})}};function A(e,r={}){let{preserveSpaces:t=!1}=r,n=e.trim();return t?(n=n.charAt(0).toLowerCase()+n.slice(1).replace(/[-_](.)/g,(s,i)=>i?i.toUpperCase():""),n):(n=n.replace(/^[A-Z]/,s=>s.toLowerCase()).replace(/[\s-_]+(.)?/g,(s,i)=>i?i.toUpperCase():""),n)}function C(e,r={}){return!e||typeof e!="object"?e:Array.isArray(e)?r.deep?e.map(t=>C(t,r)):e:Object.keys(e).reduce((t,n)=>{let s=A(n,{preserveSpaces:r.preserveSpaces}),i=e[n];return t[s]=r.deep?C(i,r):i,t},{})}exports.a = W; exports.b = R; exports.c = a; exports.d = d; exports.e = p; exports.f = N; exports.g = _; exports.h = V; exports.i = E; exports.j = A; exports.k = C;
|
|
3
|
+
//# sourceMappingURL=chunk-IJZNCO5X.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Coding\\selva-compute\\dist\\chunk-IJZNCO5X.cjs"],"names":[],"mappings":"AAAA,qrBAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,eAAe,CAAC,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,cAAc,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,iBAAC,CAAC,6BAAE,YAAU,CAAC,IAAI,CAAC,OAAO,iBAAC,CAAC,6BAAE,SAAO,CAAC,IAAI,CAAC,aAAa,iBAAC,CAAC,6BAAE,eAAa,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,iBAAC,CAAC,6BAAE,eAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;AACA","file":"D:\\Coding\\selva-compute\\dist\\chunk-IJZNCO5X.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkIJZNCO5Xcjs = require('./chunk-IJZNCO5X.cjs');function v(r){return Buffer.from(r,"utf-8").toString("base64")}function T(r){return!r||r.length<2||r.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(r)}function S(r){if(typeof globalThis.Buffer=="function"){let e=globalThis.Buffer.from(r,"base64");return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}if(typeof globalThis.atob=="function"){let e=globalThis.atob(r),n=new Uint8Array(e.length);for(let a=0;a<e.length;a++)n[a]=e.charCodeAt(a)&255;return n}throw new (0, _chunkIJZNCO5Xcjs.d)("Base64 decoding not supported in this environment.",_chunkIJZNCO5Xcjs.c.INVALID_STATE,{context:{environmentInfo:"atob or Buffer not available"}})}function C(r){if(r==null)throw new (0, _chunkIJZNCO5Xcjs.d)("Input bytes must not be null or undefined",_chunkIJZNCO5Xcjs.c.INVALID_INPUT,{context:{receivedValue:r}});let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=r;n.length>=3&&n[0]===239&&n[1]===187&&n[2]===191&&(n=n.slice(3));let a=n.byteLength,y=a%3,u=a-y,b="",o,i,c,l,d;for(let t=0;t<u;t+=3){let f=n[t]!==void 0?n[t]:0,h=n[t+1]!==void 0?n[t+1]:0,g=n[t+2]!==void 0?n[t+2]:0,s=f<<16|h<<8|g;if(o=(s&16515072)>>18,i=(s&258048)>>12,c=(s&4032)>>6,l=s&63,typeof e!="string")throw new Error("encodings must be a string");if(typeof o!="number"||o<0||o>=e.length)throw new Error("Invalid index a");if(typeof i!="number"||i<0||i>=e.length)throw new Error("Invalid index b");if(typeof c!="number"||c<0||c>=e.length)throw new Error("Invalid index c");if(typeof l!="number"||l<0||l>=e.length)throw new Error("Invalid index d");let w=e[o],B=e[i],x=e[c],I=e[l];if(w===void 0||B===void 0||x===void 0||I===void 0)throw new Error("Invalid encoding index");b+=w+B+x+I}if(y===1){if(d=n[u],d===void 0)throw new Error("'chunk' must not be undefined");o=(d&252)>>2,i=(d&3)<<4;let t=e[o],f=e[i];if(t===void 0||f===void 0)throw new Error("Invalid encoding index");b+=`${t+f}==`}else if(y===2){let t=_nullishCoalesce(n[u], () => (0)),f=n[u+1]!==void 0?n[u+1]:0;if(typeof t!="number"||t<0||t>255||typeof f!="number"||f<0||f>255)throw new Error("Invalid byte1");d=t<<8|f,o=(d&64512)>>10,i=(d&1008)>>4,c=(d&15)<<2;let h=e[o],g=e[i],s=e[c];if(h===void 0||g===void 0||s===void 0)throw new Error("Invalid encoding index");b+=`${h+g+s}=`}return b}exports.a = v; exports.b = T; exports.c = S; exports.d = C;
|
|
2
|
+
//# sourceMappingURL=chunk-LNIUUPA5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Coding\\selva-compute\\dist\\chunk-LNIUUPA5.cjs"],"names":[],"mappings":"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","file":"D:\\Coding\\selva-compute\\dist\\chunk-LNIUUPA5.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as p,d as m}from"./chunk-VK2TSW7S.js";function v(r){return Buffer.from(r,"utf-8").toString("base64")}function T(r){return!r||r.length<2||r.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(r)}function S(r){if(typeof globalThis.Buffer=="function"){let e=globalThis.Buffer.from(r,"base64");return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}if(typeof globalThis.atob=="function"){let e=globalThis.atob(r),n=new Uint8Array(e.length);for(let a=0;a<e.length;a++)n[a]=e.charCodeAt(a)&255;return n}throw new m("Base64 decoding not supported in this environment.",p.INVALID_STATE,{context:{environmentInfo:"atob or Buffer not available"}})}function C(r){if(r==null)throw new m("Input bytes must not be null or undefined",p.INVALID_INPUT,{context:{receivedValue:r}});let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=r;n.length>=3&&n[0]===239&&n[1]===187&&n[2]===191&&(n=n.slice(3));let a=n.byteLength,y=a%3,u=a-y,b="",o,i,c,l,d;for(let t=0;t<u;t+=3){let f=n[t]!==void 0?n[t]:0,h=n[t+1]!==void 0?n[t+1]:0,g=n[t+2]!==void 0?n[t+2]:0,s=f<<16|h<<8|g;if(o=(s&16515072)>>18,i=(s&258048)>>12,c=(s&4032)>>6,l=s&63,typeof e!="string")throw new Error("encodings must be a string");if(typeof o!="number"||o<0||o>=e.length)throw new Error("Invalid index a");if(typeof i!="number"||i<0||i>=e.length)throw new Error("Invalid index b");if(typeof c!="number"||c<0||c>=e.length)throw new Error("Invalid index c");if(typeof l!="number"||l<0||l>=e.length)throw new Error("Invalid index d");let w=e[o],B=e[i],x=e[c],I=e[l];if(w===void 0||B===void 0||x===void 0||I===void 0)throw new Error("Invalid encoding index");b+=w+B+x+I}if(y===1){if(d=n[u],d===void 0)throw new Error("'chunk' must not be undefined");o=(d&252)>>2,i=(d&3)<<4;let t=e[o],f=e[i];if(t===void 0||f===void 0)throw new Error("Invalid encoding index");b+=`${t+f}==`}else if(y===2){let t=n[u]??0,f=n[u+1]!==void 0?n[u+1]:0;if(typeof t!="number"||t<0||t>255||typeof f!="number"||f<0||f>255)throw new Error("Invalid byte1");d=t<<8|f,o=(d&64512)>>10,i=(d&1008)>>4,c=(d&15)<<2;let h=e[o],g=e[i],s=e[c];if(h===void 0||g===void 0||s===void 0)throw new Error("Invalid encoding index");b+=`${h+g+s}=`}return b}export{v as a,T as b,S as c,C as d};
|
|
2
|
+
//# sourceMappingURL=chunk-PZ4HZLFJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/utils/encoding.ts"],"sourcesContent":["import { RhinoComputeError } from '../errors/base';\nimport { ErrorCodes } from '../errors/error-codes';\nimport { getLogger } from './logger';\n\n/**\n * Encodes a string to base64 (Node 20+ safe)\n *\n * @internal Internal encoding helper — kept internal to `@selvajs/compute`.\n *\n * @param str - String to encode\n * @returns Base64 encoded string\n */\nexport function encodeStringToBase64(str: string): string {\n\treturn Buffer.from(str, 'utf-8').toString('base64');\n}\n\n/**\n * Decodes a base64 string to a UTF-8 string (Node 20+ safe)\n *\n * @internal Internal encoding helper — kept internal to `@selvajs/compute`.\n *\n * @param base64Str - Base64 encoded string\n * @returns Decoded UTF-8 string\n */\nexport function decodeBase64ToString(base64Str: string): string {\n\treturn Buffer.from(base64Str, 'base64').toString('utf-8');\n}\n\n/**\n * Checks if a string is valid base64\n *\n * @internal Internal encoding helper — kept internal to `@selvajs/compute`.\n *\n * @param str - String to check\n * @returns True if the string is valid base64\n */\nexport function isBase64(str: string): boolean {\n\tif (!str || str.length < 2) return false;\n\t// Length must be a multiple of 4, only alphabet chars + at most 2 trailing '='\n\tif (str.length % 4 !== 0) return false;\n\treturn /^[A-Za-z0-9+/]+={0,2}$/.test(str);\n}\n\n/**\n * Decodes a base64 string to binary data (Uint8Array)\n *\n * @internal Internal encoding helper — kept internal to `@selvajs/compute`.\n *\n * @param base64File - Base64 encoded string\n * @returns Decoded binary data as Uint8Array\n * @throws {RhinoComputeError} If base64 decoding is not supported in this environment.\n */\nexport function decodeBase64ToBinary(base64File: string): Uint8Array {\n\t// Prefer Buffer in Node — it's faster and avoids the latin-1 string detour\n\t// that atob + charCodeAt requires.\n\tif (typeof (globalThis as any).Buffer === 'function') {\n\t\tconst buf = (globalThis as any).Buffer.from(base64File, 'base64');\n\t\treturn new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n\t}\n\tif (typeof globalThis.atob === 'function') {\n\t\tconst binary = globalThis.atob(base64File);\n\t\tconst bytes = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbytes[i] = binary.charCodeAt(i) & 0xff;\n\t\t}\n\t\treturn bytes;\n\t}\n\n\tthrow new RhinoComputeError(\n\t\t'Base64 decoding not supported in this environment.',\n\t\tErrorCodes.INVALID_STATE,\n\t\t{ context: { environmentInfo: 'atob or Buffer not available' } }\n\t);\n}\n\n/**\n * Encodes binary data (Uint8Array) to base64 string\n *\n * @internal Internal encoding helper — kept internal to `@selvajs/compute`.\n *\n * Source: https://github.com/mcneel/compute.rhino3d.appserver/blob/92c95a3b1d076a4d4a5360214ffd27c46425ff03/src/examples/convert/scriptjs\n * https://gist.github.com/jonleighton/958841\n *\n * MIT LICENSE\n * Copyright 2011 Jon Leighton\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nexport function base64ByteArray(bytes: Uint8Array | null | undefined): string {\n\tif (bytes === null || bytes === undefined) {\n\t\tthrow new RhinoComputeError(\n\t\t\t'Input bytes must not be null or undefined',\n\t\t\tErrorCodes.INVALID_INPUT,\n\t\t\t{ context: { receivedValue: bytes } }\n\t\t);\n\t}\n\n\tconst encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\tlet inputBytes = bytes;\n\n\t// strip bom (Byte Order Mark)\n\tif (\n\t\tinputBytes.length >= 3 &&\n\t\tinputBytes[0] === 239 &&\n\t\tinputBytes[1] === 187 &&\n\t\tinputBytes[2] === 191\n\t) {\n\t\tinputBytes = inputBytes.slice(3);\n\t}\n\n\tconst byteLength = inputBytes.byteLength;\n\tconst byteRemainder = byteLength % 3;\n\tconst mainLength = byteLength - byteRemainder;\n\n\tlet base64 = '';\n\tlet a, b, c, d;\n\tlet chunk;\n\n\t// Main loop deals with bytes in chunks of 3\n\tfor (let i = 0; i < mainLength; i += 3) {\n\t\t// Combine the three bytes into a single integer\n\n\t\tconst byte1 = inputBytes[i] !== undefined ? inputBytes[i] : 0;\n\t\tconst byte2 = inputBytes[i + 1] !== undefined ? inputBytes[i + 1] : 0;\n\t\tconst byte3 = inputBytes[i + 2] !== undefined ? inputBytes[i + 2] : 0;\n\n\t\tconst innerChunk = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t\t// Use bitmasks to extract 6-bit segments from the triplet\n\t\ta = (innerChunk & 16515072) >> 18;\n\t\tb = (innerChunk & 258048) >> 12;\n\t\tc = (innerChunk & 4032) >> 6;\n\t\td = innerChunk & 63;\n\n\t\t// Convert the raw binary segments to the appropriate ASCII encoding\n\t\tif (typeof encodings !== 'string') {\n\t\t\tthrow new Error('encodings must be a string');\n\t\t}\n\n\t\tif (typeof a !== 'number' || a < 0 || a >= encodings.length) {\n\t\t\tthrow new Error('Invalid index a');\n\t\t}\n\n\t\tif (typeof b !== 'number' || b < 0 || b >= encodings.length) {\n\t\t\tthrow new Error('Invalid index b');\n\t\t}\n\n\t\tif (typeof c !== 'number' || c < 0 || c >= encodings.length) {\n\t\t\tthrow new Error('Invalid index c');\n\t\t}\n\n\t\tif (typeof d !== 'number' || d < 0 || d >= encodings.length) {\n\t\t\tthrow new Error('Invalid index d');\n\t\t}\n\n\t\tconst charA = encodings[a];\n\t\tconst charB = encodings[b];\n\t\tconst charC = encodings[c];\n\t\tconst charD = encodings[d];\n\n\t\tif (charA === undefined || charB === undefined || charC === undefined || charD === undefined) {\n\t\t\tthrow new Error('Invalid encoding index');\n\t\t}\n\n\t\tbase64 += charA + charB + charC + charD;\n\t}\n\n\t// Deal with the remaining bytes and padding\n\tif (byteRemainder === 1) {\n\t\tchunk = inputBytes[mainLength];\n\n\t\tif (chunk === undefined) {\n\t\t\tthrow new Error(\"'chunk' must not be undefined\");\n\t\t}\n\n\t\ta = (chunk & 252) >> 2;\n\t\tb = (chunk & 3) << 4;\n\n\t\tconst charA = encodings[a];\n\t\tconst charB = encodings[b];\n\n\t\tif (charA === undefined || charB === undefined) {\n\t\t\tthrow new Error('Invalid encoding index');\n\t\t}\n\n\t\tbase64 += `${charA + charB}==`;\n\t} else if (byteRemainder === 2) {\n\t\tconst byte1 = inputBytes[mainLength] ?? 0;\n\t\tconst byte2 = inputBytes[mainLength + 1] !== undefined ? inputBytes[mainLength + 1] : 0;\n\n\t\tif (\n\t\t\ttypeof byte1 !== 'number' ||\n\t\t\tbyte1 < 0 ||\n\t\t\tbyte1 > 255 ||\n\t\t\ttypeof byte2 !== 'number' ||\n\t\t\tbyte2 < 0 ||\n\t\t\tbyte2 > 255\n\t\t) {\n\t\t\tthrow new Error('Invalid byte1');\n\t\t}\n\n\t\tchunk = (byte1 << 8) | byte2;\n\n\t\ta = (chunk & 64512) >> 10;\n\t\tb = (chunk & 1008) >> 4;\n\t\tc = (chunk & 15) << 2;\n\n\t\tconst charA = encodings[a];\n\t\tconst charB = encodings[b];\n\t\tconst charC = encodings[c];\n\n\t\tif (charA === undefined || charB === undefined || charC === undefined) {\n\t\t\tthrow new Error('Invalid encoding index');\n\t\t}\n\n\t\tbase64 += `${charA + charB + charC}=`;\n\t}\n\n\treturn base64;\n}\n\n/**\n * Convert base64 string to rhino object\n *\n * @internal Internal helper for decoding Rhino objects — not public API.\n *\n * Source: https://github.com/mcneel/compute.rhino3d.appserver/blob/92c95a3b1d076a4d4a5360214ffd27c46425ff03/src/examples/convert/scriptjs\n * @param rhino is the rhino module form rhino3dm. Since not properly typed its not used here.\n * @param item\n * @returns\n */\nexport function base64ToRhinoObject(\n\trhino: any,\n\titem: {\n\t\ttype: string;\n\t\tdata: string;\n\t}\n) {\n\t//Make a type definition for this?\n\tlet decodata: null | object = null;\n\ttry {\n\t\tdecodata = JSON.parse(item.data);\n\t} catch (error) {\n\t\tdecodata = item;\n\t\tgetLogger().warn('Failed to parse JSON, returning original data:', error, item);\n\t}\n\tif (item.type === 'System.String') {\n\t\ttry {\n\t\t\treturn rhino.DracoCompression.decompressBase64String(decodata);\n\t\t} catch (error) {\n\t\t\tgetLogger().error('Failed to decompress Draco base64 string:', error);\n\t\t}\n\t} else if (\n\t\ttypeof decodata === 'object' &&\n\t\tObject.prototype.hasOwnProperty.call(decodata, 'opennurbs')\n\t) {\n\t\treturn rhino.CommonObject.decode(decodata);\n\t} else if (typeof decodata === 'object') {\n\t\ttry {\n\t\t\treturn rhino.CommonObject.decode(decodata);\n\t\t} catch (error) {\n\t\t\tgetLogger().error('Failed to decode Rhino object:', error);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["encodeStringToBase64","str","isBase64","str","decodeBase64ToBinary","base64File","buf","binary","bytes","i","RhinoComputeError","ErrorCodes","base64ByteArray","encodings","inputBytes","byteLength","byteRemainder","mainLength","base64","a","b","d","chunk","byte1","byte2","byte3","innerChunk","charA","charB","charC","charD"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var S=Object.defineProperty;var $=(e,r,t)=>r in e?S(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var W=(e,r)=>{for(var t in r)S(e,t,{get:r[t],enumerable:!0})};var R=(e,r,t)=>$(e,typeof r!="symbol"?r+"":r,t);var a={NETWORK_ERROR:"NETWORK_ERROR",AUTH_ERROR:"AUTH_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",COMPUTATION_ERROR:"COMPUTATION_ERROR",TIMEOUT_ERROR:"TIMEOUT_ERROR",CORS_ERROR:"CORS_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR",INVALID_STATE:"INVALID_STATE",INVALID_INPUT:"INVALID_INPUT",INVALID_CONFIG:"INVALID_CONFIG",BROWSER_ONLY:"BROWSER_ONLY",ENVIRONMENT_ERROR:"ENVIRONMENT_ERROR",ENCODING_ERROR:"ENCODING_ERROR"};var d=class e extends Error{constructor(t,n="UNKNOWN_ERROR",s){super(t);R(this,"code");R(this,"statusCode");R(this,"context");R(this,"originalError");this.name="RhinoComputeError",this.code=n,this.statusCode=s?.statusCode,this.context=s?.context,this.originalError=s?.originalError,"cause"in Error.prototype&&Object.defineProperty(this,"cause",{value:s?.originalError,enumerable:!0})}static validation(t,n,s){return new e(`Input "${t}": ${n}`,a.VALIDATION_ERROR,{context:{inputName:t,reason:n,...s}})}static missingValues(t,n,s){return new e(`Input "${t}" has no values defined${n?` (expected ${n})`:""}`,a.INVALID_INPUT,{context:{inputName:t,expectedType:n,...s}})}static invalidDefault(t,n,s,i){return new e(`ValueList input "${t}" default value "${n}" is not in available values`,a.VALIDATION_ERROR,{context:{inputName:t,defaultValue:n,availableValues:s,...i}})}static unknownParamType(t,n,s){return new e(`Unknown paramType: ${t}`,a.VALIDATION_ERROR,{context:{receivedParamType:t,paramName:n,...s}})}static invalidStructure(t,n,s){return new e(`Invalid input structure for "${t}" (expected ${n})`,a.INVALID_INPUT,{context:{inputName:t,expectedStructure:n,...s}})}};var v=class{debug(){}info(){}warn(){}error(){}},O=class{debug(r,...t){console.debug(r,...t)}info(r,...t){console.info(r,...t)}warn(r,...t){console.warn(r,...t)}error(r,...t){console.error(r,...t)}},b=new v;function p(){return b}function N(e){e===null?b=new v:"debug"in e&&"info"in e&&"warn"in e&&"error"in e?b=e:b=new O}function _(){N(new O)}var y={attempts:0,baseDelayMs:500,maxDelayMs:3e4,retryOn429:!0},I=new Set([502,503,504]);function k(e){return e?{attempts:e.attempts??y.attempts,baseDelayMs:e.baseDelayMs??y.baseDelayMs,maxDelayMs:e.maxDelayMs??y.maxDelayMs,retryOn429:e.retryOn429??y.retryOn429}:y}function M(e){if(!e)return null;let r=Number(e);if(Number.isFinite(r)&&r>=0)return r*1e3;let t=Date.parse(e);if(Number.isFinite(t)){let n=t-Date.now();return n>0?n:0}return null}function w(e,r){let t=r.baseDelayMs*Math.pow(2,e),n=Math.random()*r.baseDelayMs;return Math.min(t+n,r.maxDelayMs)}function x(e,r){return new Promise((t,n)=>{if(r?.aborted){n(new DOMException("Aborted","AbortError"));return}let s=setTimeout(()=>{r?.removeEventListener("abort",i),t()},e),i=()=>{clearTimeout(s),n(new DOMException("Aborted","AbortError"))};r?.addEventListener("abort",i,{once:!0})})}function L(e,r,t,n,s,i){let{status:c,statusText:o}=e,l={url:r,requestId:t,method:"POST",requestSize:n,serverUrl:s},u=i?` \u2014 ${i.slice(0,200)}`:"",m={401:{message:`HTTP ${c}: ${o}${u}`,code:a.AUTH_ERROR},403:{message:`HTTP ${c}: ${o}${u}`,code:a.AUTH_ERROR},404:{message:`Endpoint not found: ${r}`,code:a.NETWORK_ERROR},413:{message:`Request too large: ${(n/1024).toFixed(2)}KB`,code:a.VALIDATION_ERROR},429:{message:"Rate limit exceeded",code:a.NETWORK_ERROR},500:{message:`Server error: ${i||o}`,code:a.COMPUTATION_ERROR},502:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR},503:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR},504:{message:`Service unavailable: ${o}`,code:a.NETWORK_ERROR}}[c]||{message:`HTTP ${c}: ${o}`,code:a.UNKNOWN_ERROR};throw new d(m.message,m.code,{statusCode:c,context:l})}function D(e,r){let t=r.replace(/\/+$/,""),n=e.replace(/^\/+/,"");return`${t}/${n}`}function U(e){try{let r=new URL(e).host;return/^(localhost|127\.0\.0\.1|::1)(:\d+)?$/i.test(r)}catch{return/(localhost|127\.0\.0\.1)/i.test(e)}}function q(e,r){let t={"X-Request-ID":e,"Content-Type":"application/json",...r.authToken&&{Authorization:r.authToken},...r.apiKey&&{RhinoComputeKey:r.apiKey}};return!r.apiKey&&!U(r.serverUrl)&&p().warn(`\u26A0\uFE0F [Rhino Compute] Request [${e}] targets remote server (${r.serverUrl}) but no API key is configured. Requests may fail or be rate-limited.`),t}function K(){return`${Date.now()}-${Math.random().toString(36).substring(2,11)}`}function f(e,r){r&&p().debug(e)}function P(e,r){let t=[],n=()=>{};if(e&&t.push(e),r&&r>0)if(typeof AbortSignal<"u"&&typeof AbortSignal.timeout=="function")t.push(AbortSignal.timeout(r));else{let o=new AbortController,l=setTimeout(()=>o.abort(),r);n=()=>clearTimeout(l),t.push(o.signal)}if(t.length===0)return{signal:void 0,cleanup:n};if(t.length===1)return{signal:t[0],cleanup:n};if(typeof AbortSignal<"u"&&typeof AbortSignal.any=="function")return{signal:AbortSignal.any(t),cleanup:n};let s=new AbortController,i=()=>s.abort();for(let o of t){if(o.aborted){s.abort();break}o.addEventListener("abort",i,{once:!0})}let c=n;return n=()=>{c();for(let o of t)o.removeEventListener("abort",i)},{signal:s.signal,cleanup:n}}async function F(e,r,t,n,s,i,c){let o=Math.round(performance.now()-i);if(!e.ok){let l=await e.text();if(c&&(f(`\u274C Request [${t}] failed with HTTP ${e.status} in ${o}ms`,!0),f(` URL: ${r}`,!0),f(` Status: ${e.status} ${e.statusText}`,!0),l&&f(` Response body: ${l.substring(0,500)}${l.length>500?"...":""}`,!0)),e.status===500)try{let u=JSON.parse(l);if(u?.values&&(u.errors||u.warnings))return c&&(f(`\u26A0\uFE0F Request [${t}] completed with Grasshopper errors in ${o}ms`,!0),u.errors?.length>0&&f(` Errors: ${JSON.stringify(u.errors,null,2)}`,!0),u.warnings?.length>0&&f(` Warnings: ${JSON.stringify(u.warnings,null,2)}`,!0)),u;u?.Message?l=`${u.ExceptionType?u.ExceptionType+": ":""}${u.Message}
|
|
2
|
+
${u.StackTrace||""}`:u?.error&&(l=typeof u.error=="string"?u.error:JSON.stringify(u.error,null,2))}catch(u){c&&f(` Failed to parse error body as JSON: ${u}`,!0)}L(e,r,t,n,s,l)}f(`\u2705 Request [${t}] completed in ${o}ms`,c);try{return await e.json()}catch(l){throw new d("Failed to parse JSON response",a.NETWORK_ERROR,{statusCode:e.status,context:{url:r,requestId:t},originalError:l instanceof Error?l:new Error(String(l))})}}async function H(e,r,t,n){let{signal:s,cleanup:i}=P(e.config.signal,e.config.timeoutMs),c=performance.now();try{let o=await fetch(e.fullUrl,{method:"POST",body:e.body,headers:e.headers,signal:s});if((I.has(o.status)||r.retryOn429&&o.status===429)&&t<n-1){let m=M(o.headers.get("Retry-After"))??w(t,r);return await o.text().catch(()=>{}),{ok:!1,retry:!0,delayMs:m,cause:new d(`HTTP ${o.status} ${o.statusText} (will retry)`,a.NETWORK_ERROR,{statusCode:o.status,context:{requestId:e.requestId}})}}return{ok:!0,value:await F(o,e.fullUrl,e.requestId,e.requestSize,e.config.serverUrl,c,e.config.debug)}}catch(o){if(o instanceof Error&&(o.name==="AbortError"||o.name==="TimeoutError")){if(e.config.signal?.aborted===!0)return{ok:!1,retry:!1,cause:new d("Request aborted by caller",a.UNKNOWN_ERROR,{context:{endpoint:e.endpoint,requestId:e.requestId,requestSize:e.requestSize},originalError:o})};let u=new d(`Request timed out after ${e.config.timeoutMs}ms`,a.TIMEOUT_ERROR,{context:{serverUrl:e.config.serverUrl,timeoutMs:e.config.timeoutMs,url:e.fullUrl,requestId:e.requestId,endpoint:e.endpoint,requestSize:e.requestSize}});return t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:u}:{ok:!1,retry:!1,cause:u}}if(o instanceof TypeError){let l=new d(`Network error: ${o.message}`,a.NETWORK_ERROR,{context:{serverUrl:e.config.serverUrl,url:e.fullUrl,requestId:e.requestId,endpoint:e.endpoint,requestSize:e.requestSize},originalError:o});return t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:l}:{ok:!1,retry:!1,cause:l}}if(o instanceof d){let l=o.statusCode;return l!==void 0&&(I.has(l)||r.retryOn429&&l===429)&&t<n-1?{ok:!1,retry:!0,delayMs:w(t,r),cause:o}:{ok:!1,retry:!1,cause:o}}return{ok:!1,retry:!1,cause:new d(o instanceof Error?o.message:String(o),a.UNKNOWN_ERROR,{context:{endpoint:e.endpoint,requestId:e.requestId},originalError:o instanceof Error?o:new Error(String(o))})}}finally{i()}}async function V(e,r,t){let n=K(),s=JSON.stringify(r),i=s.length,c=D(e,t.serverUrl),o=q(n,t),l=k(t.retry),u=l.attempts+1;if(t.debug){let h=(i/1024).toFixed(2),g=i>1e5?"\u26A0\uFE0F":"\u{1F680}";f(`${g} Starting compute request [${n}]: ${e} (${h}KB)`,!0)}let T={endpoint:e,body:s,requestSize:i,fullUrl:c,requestId:n,headers:o,config:t},m=null;for(let h=0;h<u;h++){let g=await H(T,l,h,u);if(g.ok)return g.value;if(!g.retry)throw g.cause;m=g.cause,t.debug&&f(`\u{1F501} Request [${n}] retrying after ${g.delayMs}ms (attempt ${h+2}/${u}): ${g.cause.message}`,!0);try{await x(g.delayMs,t.signal)}catch{throw new d("Request aborted by caller",a.UNKNOWN_ERROR,{context:{endpoint:e,requestId:n,requestSize:i},originalError:m})}}throw m??new d("Unknown error after retries",a.UNKNOWN_ERROR,{context:{endpoint:e,requestId:n,requestSize:i}})}var E=class{constructor(r,t){R(this,"serverUrl");R(this,"apiKey");R(this,"disposed",!1);R(this,"activeMonitors",new Set);R(this,"activeTimeouts",new Set);if(!r?.trim())throw new d("serverUrl is required",a.INVALID_CONFIG,{context:{serverUrl:r}});if(!r.match(/^https?:\/\//))throw new d(`Invalid serverUrl: "${r}". Must start with "http://" or "https://". For example: "http://localhost:5000" or "https://example.com"`,a.INVALID_CONFIG,{context:{serverUrl:r}});try{new URL(r)}catch(n){throw new d(`Invalid serverUrl: "${r}". Must be a valid URL. Received error: ${n instanceof Error?n.message:String(n)}`,a.INVALID_CONFIG,{context:{serverUrl:r},originalError:n instanceof Error?n:void 0})}this.apiKey=t,this.serverUrl=r.replace(/\/+$/,"")}buildHeaders(){let r={"Content-Type":"application/json"};return this.apiKey&&(r.RhinoComputeKey=this.apiKey),r}async isServerOnline(){this.ensureNotDisposed();let r=`${this.serverUrl}/healthcheck`,t={headers:this.buildHeaders(),method:"GET"};try{return(await fetch(r,t)).ok}catch(n){return p().debug("[ComputeServerStats] Fetch error:",n),!1}}async getActiveChildren(){this.ensureNotDisposed();try{let r=await fetch(`${this.serverUrl}/activechildren`,{headers:this.buildHeaders()});if(!r.ok)return p().warn("[ComputeServerStats] Failed to fetch active children:",r.status),null;let t=await r.text(),n=parseInt(t.trim(),10);return isNaN(n)?(p().warn("[ComputeServerStats] Invalid active children response:",t),null):n}catch(r){return p().warn("[ComputeServerStats] Error fetching active children:",r),null}}async getVersion(){this.ensureNotDisposed();try{let r=await fetch(`${this.serverUrl}/version`,{headers:this.buildHeaders()});if(!r.ok)return p().warn("[ComputeServerStats] Failed to fetch version:",r.status),null;try{let t=await r.json();return{rhino:t.rhino??"",compute:t.compute??"",git_sha:t.git_sha??null}}catch{return{rhino:await r.text(),compute:"",git_sha:null}}}catch(r){return p().warn("[ComputeServerStats] Error fetching version:",r),null}}async getServerStats(){if(this.ensureNotDisposed(),!await this.isServerOnline())return{isOnline:!1};let[t,n]=await Promise.all([this.getVersion(),this.getActiveChildren()]);return{isOnline:!0,...t&&{version:t},...n!==null&&{activeChildren:n}}}monitor(r,t=5e3){this.ensureNotDisposed();let n=!0,s=null;p().info(`\u{1F504} Starting server stats monitoring every ${t}ms`);let i=async()=>{if(s!==null&&(this.activeTimeouts.delete(s),s=null),!(!n||this.disposed)){try{let o=await this.getServerStats();if(!n||this.disposed)return;try{r(o)}catch(l){p().error("[ComputeServerStats] Monitor callback threw:",l)}}catch(o){p().error("[ComputeServerStats] Failed to fetch stats during monitor:",o)}n&&!this.disposed&&(s=setTimeout(()=>{i()},t),this.activeTimeouts.add(s))}},c=()=>{n=!1,s!==null&&(clearTimeout(s),this.activeTimeouts.delete(s),s=null),this.activeMonitors.delete(c)};return this.activeMonitors.add(c),i(),c}async dispose(){if(!this.disposed){this.disposed=!0;for(let r of this.activeMonitors)r();this.activeMonitors.clear();for(let r of this.activeTimeouts)clearTimeout(r);this.activeTimeouts.clear()}}ensureNotDisposed(){if(this.disposed)throw new d("ComputeServerStats has been disposed and cannot be used",a.INVALID_STATE,{context:{disposed:this.disposed}})}};function A(e,r={}){let{preserveSpaces:t=!1}=r,n=e.trim();return t?(n=n.charAt(0).toLowerCase()+n.slice(1).replace(/[-_](.)/g,(s,i)=>i?i.toUpperCase():""),n):(n=n.replace(/^[A-Z]/,s=>s.toLowerCase()).replace(/[\s-_]+(.)?/g,(s,i)=>i?i.toUpperCase():""),n)}function C(e,r={}){return!e||typeof e!="object"?e:Array.isArray(e)?r.deep?e.map(t=>C(t,r)):e:Object.keys(e).reduce((t,n)=>{let s=A(n,{preserveSpaces:r.preserveSpaces}),i=e[n];return t[s]=r.deep?C(i,r):i,t},{})}export{W as a,R as b,a as c,d,p as e,N as f,_ as g,V as h,E as i,A as j,C as k};
|
|
3
|
+
//# sourceMappingURL=chunk-VK2TSW7S.js.map
|