@forthix/forthic 0.3.0 → 0.4.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/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 +12 -2
- package/dist/cjs/forthic/interpreter.js +95 -14
- package/dist/cjs/forthic/interpreter.js.map +1 -1
- package/dist/cjs/forthic/module.d.ts +28 -0
- package/dist/cjs/forthic/module.js +72 -8
- 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/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/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 +12 -2
- package/dist/esm/forthic/interpreter.js +95 -14
- package/dist/esm/forthic/interpreter.js.map +1 -1
- package/dist/esm/forthic/module.d.ts +28 -0
- package/dist/esm/forthic/module.js +72 -8
- 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/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,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketRemoteWord = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* WebSocketRemoteWord - Word that executes in a remote runtime via ActionCable
|
|
6
|
+
* Mirrors RemoteWord from gRPC implementation
|
|
7
|
+
*/
|
|
8
|
+
const module_js_1 = require("../../forthic/module.js");
|
|
9
|
+
/**
|
|
10
|
+
* WebSocketRemoteWord - Proxy word that delegates execution to a remote runtime
|
|
11
|
+
*
|
|
12
|
+
* When executed:
|
|
13
|
+
* 1. Captures current interpreter stack
|
|
14
|
+
* 2. Sends word name + stack to remote runtime via ActionCable
|
|
15
|
+
* 3. Replaces local stack with result stack from remote execution
|
|
16
|
+
*
|
|
17
|
+
* This allows seamless integration of remote runtime words
|
|
18
|
+
* into the local TypeScript interpreter.
|
|
19
|
+
*/
|
|
20
|
+
class WebSocketRemoteWord extends module_js_1.Word {
|
|
21
|
+
client;
|
|
22
|
+
runtimeName;
|
|
23
|
+
moduleName;
|
|
24
|
+
stackEffect;
|
|
25
|
+
description;
|
|
26
|
+
/**
|
|
27
|
+
* @param name - Word name (e.g., "DF_FROM_RECORDS")
|
|
28
|
+
* @param client - ActionCable client connected to remote runtime
|
|
29
|
+
* @param runtimeName - Name of remote runtime (e.g., "rails", "ruby")
|
|
30
|
+
* @param moduleName - Module name (e.g., "pandas")
|
|
31
|
+
* @param stackEffect - Stack notation (e.g., "( records:array -- df:DataFrame )")
|
|
32
|
+
* @param description - Human-readable description
|
|
33
|
+
*/
|
|
34
|
+
constructor(name, client, runtimeName, moduleName, stackEffect = '( -- )', description = '') {
|
|
35
|
+
super(name);
|
|
36
|
+
this.client = client;
|
|
37
|
+
this.runtimeName = runtimeName;
|
|
38
|
+
this.moduleName = moduleName;
|
|
39
|
+
this.stackEffect = stackEffect;
|
|
40
|
+
this.description = description;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Execute word in remote runtime
|
|
44
|
+
*
|
|
45
|
+
* Captures entire stack, sends to remote runtime, and replaces stack with result.
|
|
46
|
+
*/
|
|
47
|
+
async execute(interp) {
|
|
48
|
+
try {
|
|
49
|
+
// Capture current stack state
|
|
50
|
+
const stack = interp.get_stack();
|
|
51
|
+
const stackItems = stack.get_items();
|
|
52
|
+
// Execute word in remote runtime
|
|
53
|
+
const resultStack = await this.client.executeWord(this.name, stackItems);
|
|
54
|
+
// Clear local stack and replace with result
|
|
55
|
+
while (interp.get_stack().length > 0) {
|
|
56
|
+
interp.stack_pop();
|
|
57
|
+
}
|
|
58
|
+
// Push all result items
|
|
59
|
+
for (const item of resultStack) {
|
|
60
|
+
interp.stack_push(item);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`Error executing remote word ${this.moduleName}.${this.name} in ${this.runtimeName} runtime: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get runtime name for debugging/introspection
|
|
69
|
+
*/
|
|
70
|
+
getRuntimeName() {
|
|
71
|
+
return this.runtimeName;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get module name for debugging/introspection
|
|
75
|
+
*/
|
|
76
|
+
getModuleName() {
|
|
77
|
+
return this.moduleName;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get runtime execution information
|
|
81
|
+
* RemoteWords are runtime-specific and can only execute in their designated runtime
|
|
82
|
+
*/
|
|
83
|
+
getRuntimeInfo() {
|
|
84
|
+
return {
|
|
85
|
+
runtime: this.runtimeName,
|
|
86
|
+
isRemote: true,
|
|
87
|
+
isStandard: false,
|
|
88
|
+
availableIn: [this.runtimeName]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.WebSocketRemoteWord = WebSocketRemoteWord;
|
|
93
|
+
//# sourceMappingURL=remote_word.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote_word.js","sourceRoot":"","sources":["../../../../src/websocket/action_cable/remote_word.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uDAA4D;AAI5D;;;;;;;;;;GAUG;AACH,MAAa,mBAAoB,SAAQ,gBAAI;IACnC,MAAM,CAAoB;IAC1B,WAAW,CAAS;IACpB,UAAU,CAAS;IACpB,WAAW,CAAS;IACpB,WAAW,CAAS;IAE3B;;;;;;;OAOG;IACH,YACE,IAAY,EACZ,MAAyB,EACzB,WAAmB,EACnB,UAAkB,EAClB,cAAsB,QAAQ,EAC9B,cAAsB,EAAE;QAExB,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YAErC,iCAAiC;YACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAEzE,4CAA4C;YAC5C,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,aAAc,KAAe,CAAC,OAAO,EAAE,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;SAChC,CAAC;IACJ,CAAC;CACF;AAvFD,kDAuFC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocketRuntimeManager - Singleton for managing ActionCable connections to remote runtimes
|
|
3
|
+
*
|
|
4
|
+
* Provides centralized access to ActionCable clients for different runtimes
|
|
5
|
+
* Mirrors the gRPC RuntimeManager API for compatibility
|
|
6
|
+
*/
|
|
7
|
+
import { ActionCableClient, ActionCableClientConfig } from './client.js';
|
|
8
|
+
/**
|
|
9
|
+
* WebSocketRuntimeManager - Manages ActionCable connections to remote Forthic runtimes
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebSocketRuntimeManager {
|
|
12
|
+
private static instance;
|
|
13
|
+
private clients;
|
|
14
|
+
private constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Get the singleton instance
|
|
17
|
+
*/
|
|
18
|
+
static getInstance(): WebSocketRuntimeManager;
|
|
19
|
+
/**
|
|
20
|
+
* Connect to a runtime and register the client
|
|
21
|
+
*
|
|
22
|
+
* @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
|
|
23
|
+
* @param url - ActionCable URL (e.g., "ws://localhost:3000/cable")
|
|
24
|
+
* @param config - Optional additional configuration
|
|
25
|
+
* @returns ActionCableClient instance
|
|
26
|
+
*/
|
|
27
|
+
connectRuntime(runtimeName: string, url: string, config?: Partial<ActionCableClientConfig>): ActionCableClient;
|
|
28
|
+
/**
|
|
29
|
+
* Register an ActionCable client for a specific runtime
|
|
30
|
+
*
|
|
31
|
+
* @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
|
|
32
|
+
* @param client - ActionCableClient instance connected to that runtime
|
|
33
|
+
*/
|
|
34
|
+
registerClient(runtimeName: string, client: ActionCableClient): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get the ActionCable client for a specific runtime
|
|
37
|
+
*
|
|
38
|
+
* @param runtimeName - Name of the runtime
|
|
39
|
+
* @returns ActionCableClient instance or undefined if not registered
|
|
40
|
+
*/
|
|
41
|
+
getClient(runtimeName: string): ActionCableClient | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a runtime has a registered client
|
|
44
|
+
*
|
|
45
|
+
* @param runtimeName - Name of the runtime
|
|
46
|
+
* @returns True if client is registered
|
|
47
|
+
*/
|
|
48
|
+
hasClient(runtimeName: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get all registered runtime names
|
|
51
|
+
*
|
|
52
|
+
* @returns Array of runtime names
|
|
53
|
+
*/
|
|
54
|
+
getRegisteredRuntimes(): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Disconnect a specific runtime
|
|
57
|
+
*
|
|
58
|
+
* @param runtimeName - Name of the runtime to disconnect
|
|
59
|
+
*/
|
|
60
|
+
disconnectRuntime(runtimeName: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Clear all registered clients (useful for testing)
|
|
63
|
+
*/
|
|
64
|
+
clearAll(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Reset the singleton (useful for testing)
|
|
67
|
+
*/
|
|
68
|
+
static reset(): void;
|
|
69
|
+
}
|
|
@@ -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 client_js_1 = require("./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 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/action_cable/runtime_manager.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,2CAAyE;AAEzE;;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,6BAAiB,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,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ActionCable Client for Forthic
|
|
3
|
+
* Browser-compatible client that mirrors GrpcClient API
|
|
4
|
+
* Specifically designed for Rails ActionCable WebSocket protocol
|
|
5
|
+
*/
|
|
6
|
+
import { StackValue } from './serializer.js';
|
|
7
|
+
export interface ModuleSummary {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
word_count: number;
|
|
11
|
+
}
|
|
12
|
+
export interface WordInfo {
|
|
13
|
+
name: string;
|
|
14
|
+
stack_effect: string;
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ModuleInfo {
|
|
18
|
+
module_name: string;
|
|
19
|
+
words: WordInfo[];
|
|
20
|
+
}
|
|
21
|
+
export interface ProgressUpdate {
|
|
22
|
+
step: number;
|
|
23
|
+
total_steps: number;
|
|
24
|
+
current_word: string;
|
|
25
|
+
message?: string;
|
|
26
|
+
partial_stack?: StackValue[];
|
|
27
|
+
}
|
|
28
|
+
export interface ActionCableClientConfig {
|
|
29
|
+
url: string;
|
|
30
|
+
timezone?: string;
|
|
31
|
+
reconnect?: boolean;
|
|
32
|
+
reconnectDelay?: number;
|
|
33
|
+
channel?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* ActionCable client for executing words in remote Forthic runtimes
|
|
37
|
+
* Mirrors the GrpcClient API for compatibility
|
|
38
|
+
* Uses Rails ActionCable WebSocket protocol
|
|
39
|
+
*/
|
|
40
|
+
export declare class ActionCableClient {
|
|
41
|
+
private ws?;
|
|
42
|
+
private config;
|
|
43
|
+
private pendingRequests;
|
|
44
|
+
private messageId;
|
|
45
|
+
private connected;
|
|
46
|
+
private connectionPromise?;
|
|
47
|
+
constructor(config: ActionCableClientConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Connect to the WebSocket server
|
|
50
|
+
*/
|
|
51
|
+
private connect;
|
|
52
|
+
/**
|
|
53
|
+
* Handle incoming WebSocket messages
|
|
54
|
+
*/
|
|
55
|
+
private handleMessage;
|
|
56
|
+
/**
|
|
57
|
+
* Generate next message ID
|
|
58
|
+
*/
|
|
59
|
+
private nextMessageId;
|
|
60
|
+
/**
|
|
61
|
+
* Send a request and wait for response
|
|
62
|
+
* @template T The expected result type (the value of the `result` field)
|
|
63
|
+
*/
|
|
64
|
+
private sendRequest;
|
|
65
|
+
/**
|
|
66
|
+
* Send a streaming request with progress callbacks
|
|
67
|
+
* @template T The expected result type (the value of the `result` field)
|
|
68
|
+
*/
|
|
69
|
+
private sendStreamingRequest;
|
|
70
|
+
/**
|
|
71
|
+
* Ensure WebSocket is connected
|
|
72
|
+
*/
|
|
73
|
+
private ensureConnected;
|
|
74
|
+
/**
|
|
75
|
+
* Execute a word in the remote runtime
|
|
76
|
+
* Mirrors GrpcClient.executeWord
|
|
77
|
+
*/
|
|
78
|
+
executeWord(word: string, stack: any[]): Promise<any[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Execute a sequence of words (batched execution)
|
|
81
|
+
* Mirrors GrpcClient.executeSequence
|
|
82
|
+
*/
|
|
83
|
+
executeSequence(words: string[], stack: any[]): Promise<any[]>;
|
|
84
|
+
/**
|
|
85
|
+
* List available runtime-specific modules
|
|
86
|
+
* Mirrors GrpcClient.listModules
|
|
87
|
+
*/
|
|
88
|
+
listModules(): Promise<ModuleSummary[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Get detailed information about a specific module
|
|
91
|
+
* Mirrors GrpcClient.getModuleInfo
|
|
92
|
+
*/
|
|
93
|
+
getModuleInfo(moduleName: string): Promise<ModuleInfo>;
|
|
94
|
+
/**
|
|
95
|
+
* Execute code with streaming progress updates (NEW capability)
|
|
96
|
+
*/
|
|
97
|
+
streamingExecute(code: string, stack: any[], onProgress?: (progress: ProgressUpdate) => void): Promise<any[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Close the WebSocket connection
|
|
100
|
+
*/
|
|
101
|
+
close(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Check if the client is connected
|
|
104
|
+
*/
|
|
105
|
+
isConnected(): boolean;
|
|
106
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ActionCable Client for Forthic
|
|
4
|
+
* Browser-compatible client that mirrors GrpcClient API
|
|
5
|
+
* Specifically designed for Rails ActionCable WebSocket protocol
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ActionCableClient = void 0;
|
|
9
|
+
const serializer_js_1 = require("./serializer.js");
|
|
10
|
+
const errors_js_1 = require("./errors.js");
|
|
11
|
+
/**
|
|
12
|
+
* ActionCable client for executing words in remote Forthic runtimes
|
|
13
|
+
* Mirrors the GrpcClient API for compatibility
|
|
14
|
+
* Uses Rails ActionCable WebSocket protocol
|
|
15
|
+
*/
|
|
16
|
+
class ActionCableClient {
|
|
17
|
+
ws;
|
|
18
|
+
config;
|
|
19
|
+
pendingRequests = new Map();
|
|
20
|
+
messageId = 0;
|
|
21
|
+
connected = false;
|
|
22
|
+
connectionPromise;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = {
|
|
25
|
+
url: config.url,
|
|
26
|
+
timezone: config.timezone || 'UTC',
|
|
27
|
+
reconnect: config.reconnect ?? true,
|
|
28
|
+
reconnectDelay: config.reconnectDelay || 3000,
|
|
29
|
+
channel: config.channel || 'ForthicRuntimeChannel',
|
|
30
|
+
};
|
|
31
|
+
this.connect();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Connect to the WebSocket server
|
|
35
|
+
*/
|
|
36
|
+
connect() {
|
|
37
|
+
if (this.connectionPromise) {
|
|
38
|
+
return this.connectionPromise;
|
|
39
|
+
}
|
|
40
|
+
this.connectionPromise = new Promise((resolve, reject) => {
|
|
41
|
+
try {
|
|
42
|
+
this.ws = new WebSocket(this.config.url);
|
|
43
|
+
this.ws.onopen = () => {
|
|
44
|
+
this.connected = true;
|
|
45
|
+
// Subscribe to ActionCable channel
|
|
46
|
+
const subscribeMessage = {
|
|
47
|
+
command: 'subscribe',
|
|
48
|
+
identifier: JSON.stringify({
|
|
49
|
+
channel: this.config.channel,
|
|
50
|
+
timezone: this.config.timezone,
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
this.ws.send(JSON.stringify(subscribeMessage));
|
|
54
|
+
resolve();
|
|
55
|
+
};
|
|
56
|
+
this.ws.onmessage = (event) => {
|
|
57
|
+
this.handleMessage(event);
|
|
58
|
+
};
|
|
59
|
+
this.ws.onerror = (error) => {
|
|
60
|
+
console.error('WebSocket error:', error);
|
|
61
|
+
reject(new Error('WebSocket connection error'));
|
|
62
|
+
};
|
|
63
|
+
this.ws.onclose = () => {
|
|
64
|
+
this.connected = false;
|
|
65
|
+
this.connectionPromise = undefined;
|
|
66
|
+
// Reject all pending requests
|
|
67
|
+
for (const [id, pending] of this.pendingRequests.entries()) {
|
|
68
|
+
pending.reject(new Error('WebSocket connection closed'));
|
|
69
|
+
}
|
|
70
|
+
this.pendingRequests.clear();
|
|
71
|
+
// Attempt reconnect if enabled
|
|
72
|
+
if (this.config.reconnect) {
|
|
73
|
+
setTimeout(() => this.connect(), this.config.reconnectDelay);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
reject(error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return this.connectionPromise;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Handle incoming WebSocket messages
|
|
85
|
+
*/
|
|
86
|
+
handleMessage(event) {
|
|
87
|
+
try {
|
|
88
|
+
const data = JSON.parse(event.data);
|
|
89
|
+
// Handle ActionCable control messages
|
|
90
|
+
if (data.type === 'welcome' || data.type === 'ping' || data.type === 'confirm_subscription') {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Extract the actual message from ActionCable envelope
|
|
94
|
+
const message = data.message || data;
|
|
95
|
+
if (!message.id) {
|
|
96
|
+
console.warn('Received message without ID:', message);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Handle streaming progress updates
|
|
100
|
+
if (message.type === 'streaming_progress') {
|
|
101
|
+
const pending = this.pendingRequests.get(message.id);
|
|
102
|
+
if (pending?.onProgress) {
|
|
103
|
+
pending.onProgress(message.progress);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Handle final responses
|
|
108
|
+
const pending = this.pendingRequests.get(message.id);
|
|
109
|
+
if (!pending) {
|
|
110
|
+
console.warn('Received response for unknown request:', message.id);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (message.error) {
|
|
114
|
+
pending.reject(new errors_js_1.RemoteRuntimeError(message.error));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
pending.resolve(message.result);
|
|
118
|
+
}
|
|
119
|
+
this.pendingRequests.delete(message.id);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('Error handling WebSocket message:', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate next message ID
|
|
127
|
+
*/
|
|
128
|
+
nextMessageId() {
|
|
129
|
+
return `msg-${++this.messageId}-${Date.now()}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Send a request and wait for response
|
|
133
|
+
* @template T The expected result type (the value of the `result` field)
|
|
134
|
+
*/
|
|
135
|
+
async sendRequest(message) {
|
|
136
|
+
await this.ensureConnected();
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
this.pendingRequests.set(message.id, { resolve, reject });
|
|
139
|
+
// Wrap message in ActionCable format
|
|
140
|
+
const actionCableMessage = {
|
|
141
|
+
command: 'message',
|
|
142
|
+
identifier: JSON.stringify({
|
|
143
|
+
channel: this.config.channel,
|
|
144
|
+
}),
|
|
145
|
+
data: JSON.stringify(message),
|
|
146
|
+
};
|
|
147
|
+
this.ws.send(JSON.stringify(actionCableMessage));
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Send a streaming request with progress callbacks
|
|
152
|
+
* @template T The expected result type (the value of the `result` field)
|
|
153
|
+
*/
|
|
154
|
+
async sendStreamingRequest(message, onProgress) {
|
|
155
|
+
await this.ensureConnected();
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
this.pendingRequests.set(message.id, { resolve, reject, onProgress });
|
|
158
|
+
// Wrap message in ActionCable format
|
|
159
|
+
const actionCableMessage = {
|
|
160
|
+
command: 'message',
|
|
161
|
+
identifier: JSON.stringify({
|
|
162
|
+
channel: this.config.channel,
|
|
163
|
+
}),
|
|
164
|
+
data: JSON.stringify(message),
|
|
165
|
+
};
|
|
166
|
+
this.ws.send(JSON.stringify(actionCableMessage));
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Ensure WebSocket is connected
|
|
171
|
+
*/
|
|
172
|
+
async ensureConnected() {
|
|
173
|
+
if (!this.connected) {
|
|
174
|
+
await this.connect();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Execute a word in the remote runtime
|
|
179
|
+
* Mirrors GrpcClient.executeWord
|
|
180
|
+
*/
|
|
181
|
+
async executeWord(word, stack) {
|
|
182
|
+
const message = {
|
|
183
|
+
type: 'execute_word',
|
|
184
|
+
id: this.nextMessageId(),
|
|
185
|
+
params: {
|
|
186
|
+
word,
|
|
187
|
+
stack: (0, serializer_js_1.serializeStack)(stack),
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
const result = await this.sendRequest(message);
|
|
191
|
+
return (0, serializer_js_1.deserializeStack)(result.stack);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Execute a sequence of words (batched execution)
|
|
195
|
+
* Mirrors GrpcClient.executeSequence
|
|
196
|
+
*/
|
|
197
|
+
async executeSequence(words, stack) {
|
|
198
|
+
const message = {
|
|
199
|
+
type: 'execute_sequence',
|
|
200
|
+
id: this.nextMessageId(),
|
|
201
|
+
params: {
|
|
202
|
+
words,
|
|
203
|
+
stack: (0, serializer_js_1.serializeStack)(stack),
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
const result = await this.sendRequest(message);
|
|
207
|
+
return (0, serializer_js_1.deserializeStack)(result.stack);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* List available runtime-specific modules
|
|
211
|
+
* Mirrors GrpcClient.listModules
|
|
212
|
+
*/
|
|
213
|
+
async listModules() {
|
|
214
|
+
const message = {
|
|
215
|
+
type: 'list_modules',
|
|
216
|
+
id: this.nextMessageId(),
|
|
217
|
+
};
|
|
218
|
+
const result = await this.sendRequest(message);
|
|
219
|
+
return result.modules || [];
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get detailed information about a specific module
|
|
223
|
+
* Mirrors GrpcClient.getModuleInfo
|
|
224
|
+
*/
|
|
225
|
+
async getModuleInfo(moduleName) {
|
|
226
|
+
const message = {
|
|
227
|
+
type: 'get_module_info',
|
|
228
|
+
id: this.nextMessageId(),
|
|
229
|
+
params: {
|
|
230
|
+
module_name: moduleName,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
return await this.sendRequest(message);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Execute code with streaming progress updates (NEW capability)
|
|
237
|
+
*/
|
|
238
|
+
async streamingExecute(code, stack, onProgress) {
|
|
239
|
+
const message = {
|
|
240
|
+
type: 'streaming_execute',
|
|
241
|
+
id: this.nextMessageId(),
|
|
242
|
+
params: {
|
|
243
|
+
code,
|
|
244
|
+
stack: (0, serializer_js_1.serializeStack)(stack),
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
const result = await this.sendStreamingRequest(message, onProgress);
|
|
248
|
+
return (0, serializer_js_1.deserializeStack)(result.stack);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Close the WebSocket connection
|
|
252
|
+
*/
|
|
253
|
+
close() {
|
|
254
|
+
if (this.ws) {
|
|
255
|
+
this.config.reconnect = false; // Disable auto-reconnect
|
|
256
|
+
this.ws.close();
|
|
257
|
+
this.ws = undefined;
|
|
258
|
+
this.connected = false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Check if the client is connected
|
|
263
|
+
*/
|
|
264
|
+
isConnected() {
|
|
265
|
+
return this.connected;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
exports.ActionCableClient = ActionCableClient;
|
|
269
|
+
//# sourceMappingURL=action_cable_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action_cable_client.js","sourceRoot":"","sources":["../../../src/websocket/action_cable_client.ts"],"names":[],"mappings":"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"}
|