@forthix/forthic 0.3.0 → 0.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/README.md +63 -73
- package/dist/cjs/common/temporal_utils.d.ts +36 -0
- package/dist/cjs/common/temporal_utils.js +80 -0
- package/dist/cjs/common/temporal_utils.js.map +1 -0
- package/dist/cjs/common/type_utils.d.ts +31 -0
- package/dist/cjs/common/type_utils.js +79 -0
- package/dist/cjs/common/type_utils.js.map +1 -0
- package/dist/cjs/forthic/decorators/word.d.ts +15 -7
- package/dist/cjs/forthic/decorators/word.js +52 -21
- package/dist/cjs/forthic/decorators/word.js.map +1 -1
- package/dist/cjs/forthic/errors.d.ts +2 -0
- package/dist/cjs/forthic/errors.js +13 -2
- package/dist/cjs/forthic/errors.js.map +1 -1
- package/dist/cjs/forthic/execution_planner.d.ts +76 -0
- package/dist/cjs/forthic/execution_planner.js +125 -0
- package/dist/cjs/forthic/execution_planner.js.map +1 -0
- package/dist/cjs/forthic/interpreter.d.ts +13 -3
- package/dist/cjs/forthic/interpreter.js +114 -16
- package/dist/cjs/forthic/interpreter.js.map +1 -1
- package/dist/cjs/forthic/literals.d.ts +6 -1
- package/dist/cjs/forthic/literals.js +13 -2
- package/dist/cjs/forthic/literals.js.map +1 -1
- package/dist/cjs/forthic/module.d.ts +51 -1
- package/dist/cjs/forthic/module.js +135 -11
- package/dist/cjs/forthic/module.js.map +1 -1
- package/dist/cjs/forthic/modules/{array_module.d.ts → standard/array_module.d.ts} +2 -2
- package/dist/cjs/forthic/modules/{array_module.js → standard/array_module.js} +32 -32
- package/dist/cjs/forthic/modules/standard/array_module.js.map +1 -0
- package/dist/{esm/forthic/modules → cjs/forthic/modules/standard}/boolean_module.d.ts +2 -2
- package/dist/cjs/forthic/modules/{boolean_module.js → standard/boolean_module.js} +17 -17
- package/dist/cjs/forthic/modules/standard/boolean_module.js.map +1 -0
- package/dist/cjs/forthic/modules/{core_module.d.ts → standard/core_module.d.ts} +2 -2
- package/dist/cjs/forthic/modules/{core_module.js → standard/core_module.js} +32 -32
- package/dist/cjs/forthic/modules/standard/core_module.js.map +1 -0
- package/dist/{esm/forthic/modules → cjs/forthic/modules/standard}/datetime_module.d.ts +2 -2
- package/dist/cjs/forthic/modules/{datetime_module.js → standard/datetime_module.js} +17 -17
- package/dist/cjs/forthic/modules/standard/datetime_module.js.map +1 -0
- package/dist/cjs/forthic/modules/{json_module.d.ts → standard/json_module.d.ts} +1 -1
- package/dist/cjs/forthic/modules/{json_module.js → standard/json_module.js} +4 -4
- package/dist/cjs/forthic/modules/standard/json_module.js.map +1 -0
- package/dist/cjs/forthic/modules/{math_module.d.ts → standard/math_module.d.ts} +2 -2
- package/dist/cjs/forthic/modules/{math_module.js → standard/math_module.js} +26 -26
- package/dist/cjs/forthic/modules/standard/math_module.js.map +1 -0
- package/dist/cjs/forthic/modules/{record_module.d.ts → standard/record_module.d.ts} +1 -1
- package/dist/cjs/forthic/modules/{record_module.js → standard/record_module.js} +11 -11
- package/dist/cjs/forthic/modules/standard/record_module.js.map +1 -0
- package/dist/cjs/forthic/modules/{string_module.d.ts → standard/string_module.d.ts} +2 -2
- package/dist/cjs/forthic/modules/{string_module.js → standard/string_module.js} +19 -19
- package/dist/cjs/forthic/modules/standard/string_module.js.map +1 -0
- package/dist/cjs/forthic/modules/typescript/fs_module.d.ts +17 -0
- package/dist/cjs/forthic/modules/typescript/fs_module.js +169 -0
- package/dist/cjs/forthic/modules/typescript/fs_module.js.map +1 -0
- package/dist/cjs/forthic/tokenizer.js +28 -3
- package/dist/cjs/forthic/tokenizer.js.map +1 -1
- package/dist/cjs/grpc/browser-stub.d.ts +26 -0
- package/dist/cjs/grpc/browser-stub.js +45 -0
- package/dist/cjs/grpc/browser-stub.js.map +1 -0
- package/dist/cjs/grpc/client.d.ts +53 -0
- package/dist/cjs/grpc/client.js +186 -0
- package/dist/cjs/grpc/client.js.map +1 -0
- package/dist/cjs/grpc/config_loader.d.ts +72 -0
- package/dist/cjs/grpc/config_loader.js +198 -0
- package/dist/cjs/grpc/config_loader.js.map +1 -0
- package/dist/cjs/grpc/errors.d.ts +55 -0
- package/dist/cjs/grpc/errors.js +126 -0
- package/dist/cjs/grpc/errors.js.map +1 -0
- package/dist/cjs/grpc/index.d.ts +15 -0
- package/dist/cjs/grpc/index.js +23 -0
- package/dist/cjs/grpc/index.js.map +1 -0
- package/dist/cjs/grpc/remote_module.d.ts +66 -0
- package/dist/cjs/grpc/remote_module.js +105 -0
- package/dist/cjs/grpc/remote_module.js.map +1 -0
- package/dist/cjs/grpc/remote_runtime_module.d.ts +33 -0
- package/dist/cjs/grpc/remote_runtime_module.js +171 -0
- package/dist/cjs/grpc/remote_runtime_module.js.map +1 -0
- package/dist/cjs/grpc/remote_word.d.ts +53 -0
- package/dist/cjs/grpc/remote_word.js +94 -0
- package/dist/cjs/grpc/remote_word.js.map +1 -0
- package/dist/cjs/grpc/runtime_manager.d.ts +63 -0
- package/dist/cjs/grpc/runtime_manager.js +100 -0
- package/dist/cjs/grpc/runtime_manager.js.map +1 -0
- package/dist/cjs/grpc/serializer.d.ts +45 -0
- package/dist/cjs/grpc/serializer.js +105 -0
- package/dist/cjs/grpc/serializer.js.map +1 -0
- package/dist/cjs/grpc/server.d.ts +14 -0
- package/dist/cjs/grpc/server.js +362 -0
- package/dist/cjs/grpc/server.js.map +1 -0
- package/dist/cjs/grpc/server.test.d.ts +1 -0
- package/dist/cjs/grpc/server.test.js +156 -0
- package/dist/cjs/grpc/server.test.js.map +1 -0
- package/dist/cjs/grpc/temporal_utils.d.ts +36 -0
- package/dist/cjs/grpc/temporal_utils.js +80 -0
- package/dist/cjs/grpc/temporal_utils.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/websocket/action_cable/client.d.ts +106 -0
- package/dist/cjs/websocket/action_cable/client.js +269 -0
- package/dist/cjs/websocket/action_cable/client.js.map +1 -0
- package/dist/cjs/websocket/action_cable/index.d.ts +8 -0
- package/dist/cjs/websocket/action_cable/index.js +16 -0
- package/dist/cjs/websocket/action_cable/index.js.map +1 -0
- package/dist/cjs/websocket/action_cable/remote_module.d.ts +68 -0
- package/dist/cjs/websocket/action_cable/remote_module.js +107 -0
- package/dist/cjs/websocket/action_cable/remote_module.js.map +1 -0
- package/dist/cjs/websocket/action_cable/remote_word.d.ts +53 -0
- package/dist/cjs/websocket/action_cable/remote_word.js +93 -0
- package/dist/cjs/websocket/action_cable/remote_word.js.map +1 -0
- package/dist/cjs/websocket/action_cable/runtime_manager.d.ts +69 -0
- package/dist/cjs/websocket/action_cable/runtime_manager.js +112 -0
- package/dist/cjs/websocket/action_cable/runtime_manager.js.map +1 -0
- package/dist/cjs/websocket/action_cable_client.d.ts +106 -0
- package/dist/cjs/websocket/action_cable_client.js +269 -0
- package/dist/cjs/websocket/action_cable_client.js.map +1 -0
- package/dist/cjs/websocket/client.d.ts +103 -0
- package/dist/cjs/websocket/client.js +266 -0
- package/dist/cjs/websocket/client.js.map +1 -0
- package/dist/cjs/websocket/errors.d.ts +45 -0
- package/dist/cjs/websocket/errors.js +98 -0
- package/dist/cjs/websocket/errors.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +13 -0
- package/dist/cjs/websocket/index.js +28 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/cjs/websocket/remote_module.d.ts +68 -0
- package/dist/cjs/websocket/remote_module.js +107 -0
- package/dist/cjs/websocket/remote_module.js.map +1 -0
- package/dist/cjs/websocket/remote_word.d.ts +53 -0
- package/dist/cjs/websocket/remote_word.js +93 -0
- package/dist/cjs/websocket/remote_word.js.map +1 -0
- package/dist/cjs/websocket/runtime_manager.d.ts +69 -0
- package/dist/cjs/websocket/runtime_manager.js +112 -0
- package/dist/cjs/websocket/runtime_manager.js.map +1 -0
- package/dist/cjs/websocket/serializer.d.ts +27 -0
- package/dist/cjs/websocket/serializer.js +106 -0
- package/dist/cjs/websocket/serializer.js.map +1 -0
- package/dist/esm/common/temporal_utils.d.ts +36 -0
- package/dist/esm/common/temporal_utils.js +72 -0
- package/dist/esm/common/temporal_utils.js.map +1 -0
- package/dist/esm/common/type_utils.d.ts +31 -0
- package/dist/esm/common/type_utils.js +73 -0
- package/dist/esm/common/type_utils.js.map +1 -0
- package/dist/esm/forthic/decorators/word.d.ts +15 -7
- package/dist/esm/forthic/decorators/word.js +51 -20
- package/dist/esm/forthic/decorators/word.js.map +1 -1
- package/dist/esm/forthic/errors.d.ts +2 -0
- package/dist/esm/forthic/errors.js +13 -2
- package/dist/esm/forthic/errors.js.map +1 -1
- package/dist/esm/forthic/execution_planner.d.ts +76 -0
- package/dist/esm/forthic/execution_planner.js +121 -0
- package/dist/esm/forthic/execution_planner.js.map +1 -0
- package/dist/esm/forthic/interpreter.d.ts +13 -3
- package/dist/esm/forthic/interpreter.js +115 -17
- package/dist/esm/forthic/interpreter.js.map +1 -1
- package/dist/esm/forthic/literals.d.ts +6 -1
- package/dist/esm/forthic/literals.js +13 -2
- package/dist/esm/forthic/literals.js.map +1 -1
- package/dist/esm/forthic/module.d.ts +51 -1
- package/dist/esm/forthic/module.js +134 -11
- package/dist/esm/forthic/module.js.map +1 -1
- package/dist/esm/forthic/modules/{array_module.d.ts → standard/array_module.d.ts} +2 -2
- package/dist/esm/forthic/modules/{array_module.js → standard/array_module.js} +32 -32
- package/dist/esm/forthic/modules/standard/array_module.js.map +1 -0
- package/dist/{cjs/forthic/modules → esm/forthic/modules/standard}/boolean_module.d.ts +2 -2
- package/dist/esm/forthic/modules/{boolean_module.js → standard/boolean_module.js} +16 -16
- package/dist/esm/forthic/modules/standard/boolean_module.js.map +1 -0
- package/dist/esm/forthic/modules/{core_module.d.ts → standard/core_module.d.ts} +2 -2
- package/dist/esm/forthic/modules/{core_module.js → standard/core_module.js} +32 -32
- package/dist/esm/forthic/modules/standard/core_module.js.map +1 -0
- package/dist/{cjs/forthic/modules → esm/forthic/modules/standard}/datetime_module.d.ts +2 -2
- package/dist/esm/forthic/modules/{datetime_module.js → standard/datetime_module.js} +16 -16
- package/dist/esm/forthic/modules/standard/datetime_module.js.map +1 -0
- package/dist/esm/forthic/modules/{json_module.d.ts → standard/json_module.d.ts} +1 -1
- package/dist/esm/forthic/modules/{json_module.js → standard/json_module.js} +4 -4
- package/dist/esm/forthic/modules/standard/json_module.js.map +1 -0
- package/dist/esm/forthic/modules/{math_module.d.ts → standard/math_module.d.ts} +2 -2
- package/dist/esm/forthic/modules/{math_module.js → standard/math_module.js} +25 -25
- package/dist/esm/forthic/modules/standard/math_module.js.map +1 -0
- package/dist/esm/forthic/modules/{record_module.d.ts → standard/record_module.d.ts} +1 -1
- package/dist/esm/forthic/modules/{record_module.js → standard/record_module.js} +11 -11
- package/dist/esm/forthic/modules/standard/record_module.js.map +1 -0
- package/dist/esm/forthic/modules/{string_module.d.ts → standard/string_module.d.ts} +2 -2
- package/dist/esm/forthic/modules/{string_module.js → standard/string_module.js} +18 -18
- package/dist/esm/forthic/modules/standard/string_module.js.map +1 -0
- package/dist/esm/forthic/modules/typescript/fs_module.d.ts +17 -0
- package/dist/esm/forthic/modules/typescript/fs_module.js +102 -0
- package/dist/esm/forthic/modules/typescript/fs_module.js.map +1 -0
- package/dist/esm/forthic/tokenizer.js +28 -3
- package/dist/esm/forthic/tokenizer.js.map +1 -1
- package/dist/esm/grpc/browser-stub.d.ts +26 -0
- package/dist/esm/grpc/browser-stub.js +36 -0
- package/dist/esm/grpc/browser-stub.js.map +1 -0
- package/dist/esm/grpc/client.d.ts +53 -0
- package/dist/esm/grpc/client.js +149 -0
- package/dist/esm/grpc/client.js.map +1 -0
- package/dist/esm/grpc/config_loader.d.ts +72 -0
- package/dist/esm/grpc/config_loader.js +158 -0
- package/dist/esm/grpc/config_loader.js.map +1 -0
- package/dist/esm/grpc/errors.d.ts +55 -0
- package/dist/esm/grpc/errors.js +121 -0
- package/dist/esm/grpc/errors.js.map +1 -0
- package/dist/esm/grpc/index.d.ts +15 -0
- package/dist/esm/grpc/index.js +14 -0
- package/dist/esm/grpc/index.js.map +1 -0
- package/dist/esm/grpc/remote_module.d.ts +66 -0
- package/dist/esm/grpc/remote_module.js +101 -0
- package/dist/esm/grpc/remote_module.js.map +1 -0
- package/dist/esm/grpc/remote_runtime_module.d.ts +33 -0
- package/dist/esm/grpc/remote_runtime_module.js +149 -0
- package/dist/esm/grpc/remote_runtime_module.js.map +1 -0
- package/dist/esm/grpc/remote_word.d.ts +53 -0
- package/dist/esm/grpc/remote_word.js +90 -0
- package/dist/esm/grpc/remote_word.js.map +1 -0
- package/dist/esm/grpc/runtime_manager.d.ts +63 -0
- package/dist/esm/grpc/runtime_manager.js +96 -0
- package/dist/esm/grpc/runtime_manager.js.map +1 -0
- package/dist/esm/grpc/serializer.d.ts +45 -0
- package/dist/esm/grpc/serializer.js +101 -0
- package/dist/esm/grpc/serializer.js.map +1 -0
- package/dist/esm/grpc/server.d.ts +14 -0
- package/dist/esm/grpc/server.js +325 -0
- package/dist/esm/grpc/server.js.map +1 -0
- package/dist/esm/grpc/server.test.d.ts +1 -0
- package/dist/esm/grpc/server.test.js +121 -0
- package/dist/esm/grpc/server.test.js.map +1 -0
- package/dist/esm/grpc/temporal_utils.d.ts +36 -0
- package/dist/esm/grpc/temporal_utils.js +72 -0
- package/dist/esm/grpc/temporal_utils.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/websocket/action_cable/client.d.ts +106 -0
- package/dist/esm/websocket/action_cable/client.js +265 -0
- package/dist/esm/websocket/action_cable/client.js.map +1 -0
- package/dist/esm/websocket/action_cable/index.d.ts +8 -0
- package/dist/esm/websocket/action_cable/index.js +9 -0
- package/dist/esm/websocket/action_cable/index.js.map +1 -0
- package/dist/esm/websocket/action_cable/remote_module.d.ts +68 -0
- package/dist/esm/websocket/action_cable/remote_module.js +103 -0
- package/dist/esm/websocket/action_cable/remote_module.js.map +1 -0
- package/dist/esm/websocket/action_cable/remote_word.d.ts +53 -0
- package/dist/esm/websocket/action_cable/remote_word.js +89 -0
- package/dist/esm/websocket/action_cable/remote_word.js.map +1 -0
- package/dist/esm/websocket/action_cable/runtime_manager.d.ts +69 -0
- package/dist/esm/websocket/action_cable/runtime_manager.js +108 -0
- package/dist/esm/websocket/action_cable/runtime_manager.js.map +1 -0
- package/dist/esm/websocket/action_cable_client.d.ts +106 -0
- package/dist/esm/websocket/action_cable_client.js +265 -0
- package/dist/esm/websocket/action_cable_client.js.map +1 -0
- package/dist/esm/websocket/client.d.ts +103 -0
- package/dist/esm/websocket/client.js +262 -0
- package/dist/esm/websocket/client.js.map +1 -0
- package/dist/esm/websocket/errors.d.ts +45 -0
- package/dist/esm/websocket/errors.js +94 -0
- package/dist/esm/websocket/errors.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +13 -0
- package/dist/esm/websocket/index.js +16 -0
- package/dist/esm/websocket/index.js.map +1 -0
- package/dist/esm/websocket/remote_module.d.ts +68 -0
- package/dist/esm/websocket/remote_module.js +103 -0
- package/dist/esm/websocket/remote_module.js.map +1 -0
- package/dist/esm/websocket/remote_word.d.ts +53 -0
- package/dist/esm/websocket/remote_word.js +89 -0
- package/dist/esm/websocket/remote_word.js.map +1 -0
- package/dist/esm/websocket/runtime_manager.d.ts +69 -0
- package/dist/esm/websocket/runtime_manager.js +108 -0
- package/dist/esm/websocket/runtime_manager.js.map +1 -0
- package/dist/esm/websocket/serializer.d.ts +27 -0
- package/dist/esm/websocket/serializer.js +100 -0
- package/dist/esm/websocket/serializer.js.map +1 -0
- package/package.json +37 -6
- package/protos/README.md +45 -0
- package/protos/v1/forthic_runtime.proto +200 -0
- package/dist/cjs/forthic/modules/array_module.js.map +0 -1
- package/dist/cjs/forthic/modules/boolean_module.js.map +0 -1
- package/dist/cjs/forthic/modules/core_module.js.map +0 -1
- package/dist/cjs/forthic/modules/datetime_module.js.map +0 -1
- package/dist/cjs/forthic/modules/json_module.js.map +0 -1
- package/dist/cjs/forthic/modules/math_module.js.map +0 -1
- package/dist/cjs/forthic/modules/record_module.js.map +0 -1
- package/dist/cjs/forthic/modules/string_module.js.map +0 -1
- package/dist/esm/forthic/modules/array_module.js.map +0 -1
- package/dist/esm/forthic/modules/boolean_module.js.map +0 -1
- package/dist/esm/forthic/modules/core_module.js.map +0 -1
- package/dist/esm/forthic/modules/datetime_module.js.map +0 -1
- package/dist/esm/forthic/modules/json_module.js.map +0 -1
- package/dist/esm/forthic/modules/math_module.js.map +0 -1
- package/dist/esm/forthic/modules/record_module.js.map +0 -1
- package/dist/esm/forthic/modules/string_module.js.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketRuntimeManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* WebSocketRuntimeManager - Singleton for managing ActionCable connections to remote runtimes
|
|
6
|
+
*
|
|
7
|
+
* Provides centralized access to ActionCable clients for different runtimes
|
|
8
|
+
* Mirrors the gRPC RuntimeManager API for compatibility
|
|
9
|
+
*/
|
|
10
|
+
const action_cable_client_js_1 = require("./action_cable_client.js");
|
|
11
|
+
/**
|
|
12
|
+
* WebSocketRuntimeManager - Manages ActionCable connections to remote Forthic runtimes
|
|
13
|
+
*/
|
|
14
|
+
class WebSocketRuntimeManager {
|
|
15
|
+
static instance = null;
|
|
16
|
+
clients;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.clients = new Map();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the singleton instance
|
|
22
|
+
*/
|
|
23
|
+
static getInstance() {
|
|
24
|
+
if (!WebSocketRuntimeManager.instance) {
|
|
25
|
+
WebSocketRuntimeManager.instance = new WebSocketRuntimeManager();
|
|
26
|
+
}
|
|
27
|
+
return WebSocketRuntimeManager.instance;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Connect to a runtime and register the client
|
|
31
|
+
*
|
|
32
|
+
* @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
|
|
33
|
+
* @param url - ActionCable URL (e.g., "ws://localhost:3000/cable")
|
|
34
|
+
* @param config - Optional additional configuration
|
|
35
|
+
* @returns ActionCableClient instance
|
|
36
|
+
*/
|
|
37
|
+
connectRuntime(runtimeName, url, config) {
|
|
38
|
+
// Create a new client for the runtime
|
|
39
|
+
const client = new action_cable_client_js_1.ActionCableClient({ url, ...config });
|
|
40
|
+
// Register it
|
|
41
|
+
this.clients.set(runtimeName, client);
|
|
42
|
+
return client;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Register an ActionCable client for a specific runtime
|
|
46
|
+
*
|
|
47
|
+
* @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
|
|
48
|
+
* @param client - ActionCableClient instance connected to that runtime
|
|
49
|
+
*/
|
|
50
|
+
registerClient(runtimeName, client) {
|
|
51
|
+
this.clients.set(runtimeName, client);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the ActionCable client for a specific runtime
|
|
55
|
+
*
|
|
56
|
+
* @param runtimeName - Name of the runtime
|
|
57
|
+
* @returns ActionCableClient instance or undefined if not registered
|
|
58
|
+
*/
|
|
59
|
+
getClient(runtimeName) {
|
|
60
|
+
return this.clients.get(runtimeName);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a runtime has a registered client
|
|
64
|
+
*
|
|
65
|
+
* @param runtimeName - Name of the runtime
|
|
66
|
+
* @returns True if client is registered
|
|
67
|
+
*/
|
|
68
|
+
hasClient(runtimeName) {
|
|
69
|
+
return this.clients.has(runtimeName);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get all registered runtime names
|
|
73
|
+
*
|
|
74
|
+
* @returns Array of runtime names
|
|
75
|
+
*/
|
|
76
|
+
getRegisteredRuntimes() {
|
|
77
|
+
return Array.from(this.clients.keys());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Disconnect a specific runtime
|
|
81
|
+
*
|
|
82
|
+
* @param runtimeName - Name of the runtime to disconnect
|
|
83
|
+
*/
|
|
84
|
+
disconnectRuntime(runtimeName) {
|
|
85
|
+
const client = this.clients.get(runtimeName);
|
|
86
|
+
if (client) {
|
|
87
|
+
client.close();
|
|
88
|
+
this.clients.delete(runtimeName);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Clear all registered clients (useful for testing)
|
|
93
|
+
*/
|
|
94
|
+
clearAll() {
|
|
95
|
+
// Close all clients
|
|
96
|
+
for (const client of this.clients.values()) {
|
|
97
|
+
client.close();
|
|
98
|
+
}
|
|
99
|
+
this.clients.clear();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reset the singleton (useful for testing)
|
|
103
|
+
*/
|
|
104
|
+
static reset() {
|
|
105
|
+
if (WebSocketRuntimeManager.instance) {
|
|
106
|
+
WebSocketRuntimeManager.instance.clearAll();
|
|
107
|
+
WebSocketRuntimeManager.instance = null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.WebSocketRuntimeManager = WebSocketRuntimeManager;
|
|
112
|
+
//# sourceMappingURL=runtime_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime_manager.js","sourceRoot":"","sources":["../../../src/websocket/runtime_manager.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,qEAAsF;AAEtF;;GAEG;AACH,MAAa,uBAAuB;IAC1B,MAAM,CAAC,QAAQ,GAAmC,IAAI,CAAC;IACvD,OAAO,CAAiC;IAEhD;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC;YACtC,uBAAuB,CAAC,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,uBAAuB,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CACZ,WAAmB,EACnB,GAAW,EACX,MAAyC;QAEzC,sCAAsC;QACtC,MAAM,MAAM,GAAG,IAAI,0CAAiB,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAEzD,cAAc;QACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,WAAmB,EAAE,MAAyB;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,qBAAqB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,WAAmB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,oBAAoB;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,uBAAuB,CAAC,QAAQ,EAAE,CAAC;YACrC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5C,uBAAuB,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;;AA/GH,0DAgHC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket JSON Serializer for Forthic
|
|
3
|
+
* Mirrors gRPC serializer but outputs JSON instead of protobuf
|
|
4
|
+
* Handles: int, float, string, bool, null, array, record, temporal types
|
|
5
|
+
* Uses shared type detection from common/type_utils
|
|
6
|
+
*/
|
|
7
|
+
export interface StackValue {
|
|
8
|
+
type: 'int' | 'float' | 'string' | 'bool' | 'null' | 'array' | 'record' | 'instant' | 'plain_date' | 'zoned_datetime';
|
|
9
|
+
value: any;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Serialize a JavaScript value to a JSON StackValue
|
|
13
|
+
* Uses shared type detection and maps to JSON format
|
|
14
|
+
*/
|
|
15
|
+
export declare function serializeValue(value: any): StackValue;
|
|
16
|
+
/**
|
|
17
|
+
* Deserialize a JSON StackValue to a JavaScript value
|
|
18
|
+
*/
|
|
19
|
+
export declare function deserializeValue(stackValue: StackValue): any;
|
|
20
|
+
/**
|
|
21
|
+
* Serialize an array of values (stack)
|
|
22
|
+
*/
|
|
23
|
+
export declare function serializeStack(stack: any[]): StackValue[];
|
|
24
|
+
/**
|
|
25
|
+
* Deserialize an array of StackValues (stack)
|
|
26
|
+
*/
|
|
27
|
+
export declare function deserializeStack(stackValues: StackValue[]): any[];
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket JSON Serializer for Forthic
|
|
4
|
+
* Mirrors gRPC serializer but outputs JSON instead of protobuf
|
|
5
|
+
* Handles: int, float, string, bool, null, array, record, temporal types
|
|
6
|
+
* Uses shared type detection from common/type_utils
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.serializeValue = serializeValue;
|
|
10
|
+
exports.deserializeValue = deserializeValue;
|
|
11
|
+
exports.serializeStack = serializeStack;
|
|
12
|
+
exports.deserializeStack = deserializeStack;
|
|
13
|
+
const temporal_polyfill_1 = require("temporal-polyfill");
|
|
14
|
+
const type_utils_js_1 = require("../common/type_utils.js");
|
|
15
|
+
/**
|
|
16
|
+
* Serialize a JavaScript value to a JSON StackValue
|
|
17
|
+
* Uses shared type detection and maps to JSON format
|
|
18
|
+
*/
|
|
19
|
+
function serializeValue(value) {
|
|
20
|
+
const type = (0, type_utils_js_1.getForthicType)(value);
|
|
21
|
+
switch (type) {
|
|
22
|
+
case 'null':
|
|
23
|
+
return { type: 'null', value: null };
|
|
24
|
+
case 'boolean':
|
|
25
|
+
return { type: 'bool', value };
|
|
26
|
+
case 'integer':
|
|
27
|
+
return { type: 'int', value };
|
|
28
|
+
case 'float':
|
|
29
|
+
return { type: 'float', value };
|
|
30
|
+
case 'string':
|
|
31
|
+
return { type: 'string', value };
|
|
32
|
+
case 'array':
|
|
33
|
+
return {
|
|
34
|
+
type: 'array',
|
|
35
|
+
value: value.map((item) => serializeValue(item)),
|
|
36
|
+
};
|
|
37
|
+
case 'record':
|
|
38
|
+
const fields = {};
|
|
39
|
+
for (const [key, val] of Object.entries(value)) {
|
|
40
|
+
fields[key] = serializeValue(val);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
type: 'record',
|
|
44
|
+
value: fields,
|
|
45
|
+
};
|
|
46
|
+
case 'instant':
|
|
47
|
+
return {
|
|
48
|
+
type: 'instant',
|
|
49
|
+
value: value.toString(),
|
|
50
|
+
};
|
|
51
|
+
case 'plain_date':
|
|
52
|
+
return {
|
|
53
|
+
type: 'plain_date',
|
|
54
|
+
value: value.toString(),
|
|
55
|
+
};
|
|
56
|
+
case 'zoned_datetime':
|
|
57
|
+
return {
|
|
58
|
+
type: 'zoned_datetime',
|
|
59
|
+
value: value.toString(),
|
|
60
|
+
};
|
|
61
|
+
default:
|
|
62
|
+
throw new Error(`Unsupported Forthic type: ${type}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Deserialize a JSON StackValue to a JavaScript value
|
|
67
|
+
*/
|
|
68
|
+
function deserializeValue(stackValue) {
|
|
69
|
+
switch (stackValue.type) {
|
|
70
|
+
case 'int':
|
|
71
|
+
case 'float':
|
|
72
|
+
case 'string':
|
|
73
|
+
case 'bool':
|
|
74
|
+
return stackValue.value;
|
|
75
|
+
case 'null':
|
|
76
|
+
return null;
|
|
77
|
+
case 'array':
|
|
78
|
+
return stackValue.value.map((v) => deserializeValue(v));
|
|
79
|
+
case 'record':
|
|
80
|
+
return Object.entries(stackValue.value).reduce((acc, [k, v]) => {
|
|
81
|
+
acc[k] = deserializeValue(v);
|
|
82
|
+
return acc;
|
|
83
|
+
}, {});
|
|
84
|
+
case 'instant':
|
|
85
|
+
return temporal_polyfill_1.Temporal.Instant.from(stackValue.value);
|
|
86
|
+
case 'plain_date':
|
|
87
|
+
return temporal_polyfill_1.Temporal.PlainDate.from(stackValue.value);
|
|
88
|
+
case 'zoned_datetime':
|
|
89
|
+
return temporal_polyfill_1.Temporal.ZonedDateTime.from(stackValue.value);
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Unknown stack value type: ${stackValue.type}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Serialize an array of values (stack)
|
|
96
|
+
*/
|
|
97
|
+
function serializeStack(stack) {
|
|
98
|
+
return stack.map((value) => serializeValue(value));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Deserialize an array of StackValues (stack)
|
|
102
|
+
*/
|
|
103
|
+
function deserializeStack(stackValues) {
|
|
104
|
+
return stackValues.map((value) => deserializeValue(value));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/websocket/serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Type Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides duck-typing helpers for checking Temporal types.
|
|
5
|
+
* Uses duck typing instead of instanceof to avoid issues with multiple
|
|
6
|
+
* instances of temporal-polyfill being loaded.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Check if a value is a Temporal.PlainDate
|
|
10
|
+
* PlainDate has year, month, day properties but no hour property
|
|
11
|
+
*/
|
|
12
|
+
export declare function isPlainDate(value: any): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a value is a Temporal.Instant
|
|
15
|
+
* Instant has epochNanoseconds property as a bigint
|
|
16
|
+
*/
|
|
17
|
+
export declare function isInstant(value: any): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a value is a Temporal.ZonedDateTime
|
|
20
|
+
* ZonedDateTime has a timeZoneId property
|
|
21
|
+
*/
|
|
22
|
+
export declare function isZonedDateTime(value: any): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a value is a Temporal.PlainTime
|
|
25
|
+
* PlainTime has hour and minute properties but no year
|
|
26
|
+
*/
|
|
27
|
+
export declare function isPlainTime(value: any): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a value is a Temporal.PlainDateTime
|
|
30
|
+
* PlainDateTime has year, month, day, hour properties but no timeZoneId
|
|
31
|
+
*/
|
|
32
|
+
export declare function isPlainDateTime(value: any): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a value is any Temporal type
|
|
35
|
+
*/
|
|
36
|
+
export declare function isTemporal(value: any): boolean;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Type Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides duck-typing helpers for checking Temporal types.
|
|
5
|
+
* Uses duck typing instead of instanceof to avoid issues with multiple
|
|
6
|
+
* instances of temporal-polyfill being loaded.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Check if a value is a Temporal.PlainDate
|
|
10
|
+
* PlainDate has year, month, day properties but no hour property
|
|
11
|
+
*/
|
|
12
|
+
export function isPlainDate(value) {
|
|
13
|
+
return value && typeof value === 'object' &&
|
|
14
|
+
typeof value.year === 'number' &&
|
|
15
|
+
typeof value.month === 'number' &&
|
|
16
|
+
typeof value.day === 'number' &&
|
|
17
|
+
typeof value.toString === 'function' &&
|
|
18
|
+
!value.hour; // PlainDate doesn't have hour
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a value is a Temporal.Instant
|
|
22
|
+
* Instant has epochNanoseconds property as a bigint
|
|
23
|
+
*/
|
|
24
|
+
export function isInstant(value) {
|
|
25
|
+
return value && typeof value === 'object' &&
|
|
26
|
+
typeof value.epochNanoseconds === 'bigint' &&
|
|
27
|
+
typeof value.toString === 'function';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a value is a Temporal.ZonedDateTime
|
|
31
|
+
* ZonedDateTime has a timeZoneId property
|
|
32
|
+
*/
|
|
33
|
+
export function isZonedDateTime(value) {
|
|
34
|
+
return value && typeof value === 'object' &&
|
|
35
|
+
typeof value.timeZoneId === 'string' &&
|
|
36
|
+
typeof value.toString === 'function';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a value is a Temporal.PlainTime
|
|
40
|
+
* PlainTime has hour and minute properties but no year
|
|
41
|
+
*/
|
|
42
|
+
export function isPlainTime(value) {
|
|
43
|
+
return value && typeof value === 'object' &&
|
|
44
|
+
typeof value.hour === 'number' &&
|
|
45
|
+
typeof value.minute === 'number' &&
|
|
46
|
+
typeof value.toString === 'function' &&
|
|
47
|
+
!value.year; // PlainTime doesn't have year
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a value is a Temporal.PlainDateTime
|
|
51
|
+
* PlainDateTime has year, month, day, hour properties but no timeZoneId
|
|
52
|
+
*/
|
|
53
|
+
export function isPlainDateTime(value) {
|
|
54
|
+
return value && typeof value === 'object' &&
|
|
55
|
+
typeof value.year === 'number' &&
|
|
56
|
+
typeof value.month === 'number' &&
|
|
57
|
+
typeof value.day === 'number' &&
|
|
58
|
+
typeof value.hour === 'number' &&
|
|
59
|
+
typeof value.toString === 'function' &&
|
|
60
|
+
!value.timeZoneId; // PlainDateTime doesn't have timeZoneId
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a value is any Temporal type
|
|
64
|
+
*/
|
|
65
|
+
export function isTemporal(value) {
|
|
66
|
+
return isPlainDate(value) ||
|
|
67
|
+
isInstant(value) ||
|
|
68
|
+
isZonedDateTime(value) ||
|
|
69
|
+
isPlainTime(value) ||
|
|
70
|
+
isPlainDateTime(value);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=temporal_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal_utils.js","sourceRoot":"","sources":["../../../src/common/temporal_utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,8BAA8B;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAU;IAClC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;QAC1C,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAU;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,8BAA8B;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAU;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAE,wCAAwC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAU;IACnC,OAAO,WAAW,CAAC,KAAK,CAAC;QAClB,SAAS,CAAC,KAAK,CAAC;QAChB,eAAe,CAAC,KAAK,CAAC;QACtB,WAAW,CAAC,KAAK,CAAC;QAClB,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type detection utilities for Forthic value serialization
|
|
3
|
+
* Used by both gRPC and WebSocket serializers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Forthic value types
|
|
7
|
+
*/
|
|
8
|
+
export type ForthicType = 'null' | 'boolean' | 'integer' | 'float' | 'string' | 'array' | 'record' | 'instant' | 'plain_date' | 'zoned_datetime';
|
|
9
|
+
/**
|
|
10
|
+
* Get the Forthic type of a JavaScript value
|
|
11
|
+
* Determines the correct serialization type for a value
|
|
12
|
+
*
|
|
13
|
+
* IMPORTANT: Order matters!
|
|
14
|
+
* - Check temporal types BEFORE primitives (they're objects)
|
|
15
|
+
* - Check ZonedDateTime BEFORE Instant (ZonedDateTime may match isInstant)
|
|
16
|
+
* - Check boolean BEFORE number (to avoid typeof confusion)
|
|
17
|
+
* - Check array BEFORE object (arrays are objects)
|
|
18
|
+
*/
|
|
19
|
+
export declare function getForthicType(value: any): ForthicType;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a value is a temporal type
|
|
22
|
+
*/
|
|
23
|
+
export declare function isTemporalType(value: any): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a value is a primitive type (not array or record)
|
|
26
|
+
*/
|
|
27
|
+
export declare function isPrimitive(value: any): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a value is a container type (array or record)
|
|
30
|
+
*/
|
|
31
|
+
export declare function isContainer(value: any): boolean;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type detection utilities for Forthic value serialization
|
|
3
|
+
* Used by both gRPC and WebSocket serializers
|
|
4
|
+
*/
|
|
5
|
+
import { isPlainDate, isInstant, isZonedDateTime } from './temporal_utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Get the Forthic type of a JavaScript value
|
|
8
|
+
* Determines the correct serialization type for a value
|
|
9
|
+
*
|
|
10
|
+
* IMPORTANT: Order matters!
|
|
11
|
+
* - Check temporal types BEFORE primitives (they're objects)
|
|
12
|
+
* - Check ZonedDateTime BEFORE Instant (ZonedDateTime may match isInstant)
|
|
13
|
+
* - Check boolean BEFORE number (to avoid typeof confusion)
|
|
14
|
+
* - Check array BEFORE object (arrays are objects)
|
|
15
|
+
*/
|
|
16
|
+
export function getForthicType(value) {
|
|
17
|
+
// Handle null/undefined
|
|
18
|
+
if (value === null || value === undefined) {
|
|
19
|
+
return 'null';
|
|
20
|
+
}
|
|
21
|
+
// Handle Temporal types (check ZonedDateTime BEFORE Instant)
|
|
22
|
+
if (isZonedDateTime(value)) {
|
|
23
|
+
return 'zoned_datetime';
|
|
24
|
+
}
|
|
25
|
+
if (isInstant(value)) {
|
|
26
|
+
return 'instant';
|
|
27
|
+
}
|
|
28
|
+
if (isPlainDate(value)) {
|
|
29
|
+
return 'plain_date';
|
|
30
|
+
}
|
|
31
|
+
// Handle boolean (check before number)
|
|
32
|
+
if (typeof value === 'boolean') {
|
|
33
|
+
return 'boolean';
|
|
34
|
+
}
|
|
35
|
+
// Handle number (distinguish integer vs float)
|
|
36
|
+
if (typeof value === 'number') {
|
|
37
|
+
return Number.isInteger(value) ? 'integer' : 'float';
|
|
38
|
+
}
|
|
39
|
+
// Handle string
|
|
40
|
+
if (typeof value === 'string') {
|
|
41
|
+
return 'string';
|
|
42
|
+
}
|
|
43
|
+
// Handle array (check before object)
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
return 'array';
|
|
46
|
+
}
|
|
47
|
+
// Handle object/record
|
|
48
|
+
if (typeof value === 'object') {
|
|
49
|
+
return 'record';
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Unsupported value type: ${typeof value}`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if a value is a temporal type
|
|
55
|
+
*/
|
|
56
|
+
export function isTemporalType(value) {
|
|
57
|
+
return isInstant(value) || isPlainDate(value) || isZonedDateTime(value);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a value is a primitive type (not array or record)
|
|
61
|
+
*/
|
|
62
|
+
export function isPrimitive(value) {
|
|
63
|
+
const type = getForthicType(value);
|
|
64
|
+
return type !== 'array' && type !== 'record';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a value is a container type (array or record)
|
|
68
|
+
*/
|
|
69
|
+
export function isContainer(value) {
|
|
70
|
+
const type = getForthicType(value);
|
|
71
|
+
return type === 'array' || type === 'record';
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=type_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type_utils.js","sourceRoot":"","sources":["../../../src/common/type_utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiB9E;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,KAAU;IACvC,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6DAA6D;IAC7D,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+CAA+C;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACvD,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAU;IACvC,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;AAC/C,CAAC"}
|
|
@@ -10,7 +10,7 @@ export interface ModuleMetadata {
|
|
|
10
10
|
examples: string[];
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* @
|
|
13
|
+
* @ForthicDirectWord Decorator
|
|
14
14
|
*
|
|
15
15
|
* Auto-registers word but does NOT handle stack marshalling.
|
|
16
16
|
* Use this for words that need direct interpreter access to manually manipulate the stack.
|
|
@@ -21,16 +21,16 @@ export interface ModuleMetadata {
|
|
|
21
21
|
* @param customWordName - Optional custom word name (defaults to method name)
|
|
22
22
|
*
|
|
23
23
|
* @example
|
|
24
|
-
* @
|
|
24
|
+
* @ForthicDirectWord("( item:any forthic:string num:number -- )", "Repeat execution num_times", "<REPEAT")
|
|
25
25
|
* async l_REPEAT(interp: Interpreter) {
|
|
26
26
|
* const num = interp.stack_pop();
|
|
27
27
|
* const forthic = interp.stack_pop();
|
|
28
28
|
* // ... manual stack manipulation
|
|
29
29
|
* }
|
|
30
30
|
*/
|
|
31
|
-
export declare function
|
|
31
|
+
export declare function ForthicDirectWord(stackEffect: string, description?: string, customWordName?: string): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
32
32
|
/**
|
|
33
|
-
* @
|
|
33
|
+
* @ForthicWord Decorator
|
|
34
34
|
*
|
|
35
35
|
* Auto-registers word and handles stack marshalling.
|
|
36
36
|
* Word name defaults to method name, but can be overridden.
|
|
@@ -40,18 +40,18 @@ export declare function DirectWord(stackEffect: string, description?: string, cu
|
|
|
40
40
|
* @param customWordName - Optional custom word name (defaults to method name)
|
|
41
41
|
*
|
|
42
42
|
* @example
|
|
43
|
-
* @
|
|
43
|
+
* @ForthicWord("( a:number b:number -- sum:number )", "Adds two numbers")
|
|
44
44
|
* async ADD(a: number, b: number) {
|
|
45
45
|
* return a + b;
|
|
46
46
|
* }
|
|
47
47
|
*
|
|
48
48
|
* @example
|
|
49
|
-
* @
|
|
49
|
+
* @ForthicWord("( rec:any field:any -- value:any )", "Get value from record", "REC@")
|
|
50
50
|
* async REC_at(rec: any, field: any) {
|
|
51
51
|
* // Word name will be "REC@" instead of "REC_at"
|
|
52
52
|
* }
|
|
53
53
|
*/
|
|
54
|
-
export declare function
|
|
54
|
+
export declare function ForthicWord(stackEffect: string, description?: string, customWordName?: string): (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => PropertyDescriptor;
|
|
55
55
|
/**
|
|
56
56
|
* Helper function to register module documentation
|
|
57
57
|
*
|
|
@@ -78,6 +78,14 @@ export declare class DecoratedModule extends Module {
|
|
|
78
78
|
constructor(name: string);
|
|
79
79
|
set_interp(interp: Interpreter): void;
|
|
80
80
|
private registerDecoratedWords;
|
|
81
|
+
/**
|
|
82
|
+
* Add a standard library word that can execute in any runtime
|
|
83
|
+
*
|
|
84
|
+
* This creates a word marked with isStandard=true, allowing it to be
|
|
85
|
+
* included in batched remote execution (e.g., +, MAP, REVERSE can execute
|
|
86
|
+
* in Python runtime along with Python-specific words).
|
|
87
|
+
*/
|
|
88
|
+
private add_standard_word;
|
|
81
89
|
/**
|
|
82
90
|
* Get documentation for all words in this module
|
|
83
91
|
*
|