@forthix/forthic 0.7.2 → 0.8.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.
Files changed (73) hide show
  1. package/dist/cjs/forthic/decorators/schemaUtils.d.ts +70 -0
  2. package/dist/cjs/forthic/decorators/schemaUtils.js +77 -0
  3. package/dist/cjs/forthic/decorators/schemaUtils.js.map +1 -0
  4. package/dist/cjs/forthic/decorators/stackEffect.d.ts +63 -0
  5. package/dist/cjs/forthic/decorators/stackEffect.js +179 -0
  6. package/dist/cjs/forthic/decorators/stackEffect.js.map +1 -0
  7. package/dist/cjs/forthic/interpreter.d.ts +21 -0
  8. package/dist/cjs/forthic/interpreter.js +76 -1
  9. package/dist/cjs/forthic/interpreter.js.map +1 -1
  10. package/dist/cjs/forthic/module.d.ts +2 -0
  11. package/dist/cjs/forthic/module.js +4 -0
  12. package/dist/cjs/forthic/module.js.map +1 -1
  13. package/dist/cjs/index.d.ts +1 -0
  14. package/dist/cjs/index.js +1 -0
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/esm/forthic/decorators/schemaUtils.d.ts +70 -0
  17. package/dist/esm/forthic/decorators/schemaUtils.js +72 -0
  18. package/dist/esm/forthic/decorators/schemaUtils.js.map +1 -0
  19. package/dist/esm/forthic/decorators/stackEffect.d.ts +63 -0
  20. package/dist/esm/forthic/decorators/stackEffect.js +174 -0
  21. package/dist/esm/forthic/decorators/stackEffect.js.map +1 -0
  22. package/dist/esm/forthic/interpreter.d.ts +21 -0
  23. package/dist/esm/forthic/interpreter.js +74 -1
  24. package/dist/esm/forthic/interpreter.js.map +1 -1
  25. package/dist/esm/forthic/module.d.ts +2 -0
  26. package/dist/esm/forthic/module.js +4 -0
  27. package/dist/esm/forthic/module.js.map +1 -1
  28. package/dist/esm/index.d.ts +1 -0
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/grpc/server.test.d.ts +0 -1
  33. package/dist/cjs/grpc/server.test.js +0 -156
  34. package/dist/cjs/grpc/server.test.js.map +0 -1
  35. package/dist/cjs/grpc/temporal_utils.d.ts +0 -36
  36. package/dist/cjs/grpc/temporal_utils.js +0 -80
  37. package/dist/cjs/grpc/temporal_utils.js.map +0 -1
  38. package/dist/cjs/websocket/action_cable_client.d.ts +0 -106
  39. package/dist/cjs/websocket/action_cable_client.js +0 -269
  40. package/dist/cjs/websocket/action_cable_client.js.map +0 -1
  41. package/dist/cjs/websocket/client.d.ts +0 -103
  42. package/dist/cjs/websocket/client.js +0 -266
  43. package/dist/cjs/websocket/client.js.map +0 -1
  44. package/dist/cjs/websocket/remote_module.d.ts +0 -68
  45. package/dist/cjs/websocket/remote_module.js +0 -107
  46. package/dist/cjs/websocket/remote_module.js.map +0 -1
  47. package/dist/cjs/websocket/remote_word.d.ts +0 -53
  48. package/dist/cjs/websocket/remote_word.js +0 -93
  49. package/dist/cjs/websocket/remote_word.js.map +0 -1
  50. package/dist/cjs/websocket/runtime_manager.d.ts +0 -69
  51. package/dist/cjs/websocket/runtime_manager.js +0 -112
  52. package/dist/cjs/websocket/runtime_manager.js.map +0 -1
  53. package/dist/esm/grpc/server.test.d.ts +0 -1
  54. package/dist/esm/grpc/server.test.js +0 -121
  55. package/dist/esm/grpc/server.test.js.map +0 -1
  56. package/dist/esm/grpc/temporal_utils.d.ts +0 -36
  57. package/dist/esm/grpc/temporal_utils.js +0 -72
  58. package/dist/esm/grpc/temporal_utils.js.map +0 -1
  59. package/dist/esm/websocket/action_cable_client.d.ts +0 -106
  60. package/dist/esm/websocket/action_cable_client.js +0 -265
  61. package/dist/esm/websocket/action_cable_client.js.map +0 -1
  62. package/dist/esm/websocket/client.d.ts +0 -103
  63. package/dist/esm/websocket/client.js +0 -262
  64. package/dist/esm/websocket/client.js.map +0 -1
  65. package/dist/esm/websocket/remote_module.d.ts +0 -68
  66. package/dist/esm/websocket/remote_module.js +0 -103
  67. package/dist/esm/websocket/remote_module.js.map +0 -1
  68. package/dist/esm/websocket/remote_word.d.ts +0 -53
  69. package/dist/esm/websocket/remote_word.js +0 -89
  70. package/dist/esm/websocket/remote_word.js.map +0 -1
  71. package/dist/esm/websocket/runtime_manager.d.ts +0 -69
  72. package/dist/esm/websocket/runtime_manager.js +0 -108
  73. package/dist/esm/websocket/runtime_manager.js.map +0 -1
@@ -1,266 +0,0 @@
1
- "use strict";
2
- /**
3
- * WebSocket Client for Forthic
4
- * Browser-compatible client that mirrors GrpcClient API
5
- * Connects to Rails ActionCable server and executes remote words
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.WebSocketClient = void 0;
9
- const serializer_js_1 = require("./serializer.js");
10
- const errors_js_1 = require("./errors.js");
11
- /**
12
- * WebSocket client for executing words in remote Forthic runtimes
13
- * Mirrors the GrpcClient API for compatibility
14
- */
15
- class WebSocketClient {
16
- ws;
17
- config;
18
- pendingRequests = new Map();
19
- messageId = 0;
20
- connected = false;
21
- connectionPromise;
22
- constructor(config) {
23
- this.config = {
24
- url: config.url,
25
- timezone: config.timezone || 'UTC',
26
- reconnect: config.reconnect ?? true,
27
- reconnectDelay: config.reconnectDelay || 3000,
28
- channel: config.channel || 'ForthicRuntimeChannel',
29
- };
30
- this.connect();
31
- }
32
- /**
33
- * Connect to the WebSocket server
34
- */
35
- connect() {
36
- if (this.connectionPromise) {
37
- return this.connectionPromise;
38
- }
39
- this.connectionPromise = new Promise((resolve, reject) => {
40
- try {
41
- this.ws = new WebSocket(this.config.url);
42
- this.ws.onopen = () => {
43
- this.connected = true;
44
- // Subscribe to ActionCable channel
45
- const subscribeMessage = {
46
- command: 'subscribe',
47
- identifier: JSON.stringify({
48
- channel: this.config.channel,
49
- timezone: this.config.timezone,
50
- }),
51
- };
52
- this.ws.send(JSON.stringify(subscribeMessage));
53
- resolve();
54
- };
55
- this.ws.onmessage = (event) => {
56
- this.handleMessage(event);
57
- };
58
- this.ws.onerror = (error) => {
59
- console.error('WebSocket error:', error);
60
- reject(new Error('WebSocket connection error'));
61
- };
62
- this.ws.onclose = () => {
63
- this.connected = false;
64
- this.connectionPromise = undefined;
65
- // Reject all pending requests
66
- for (const [id, pending] of this.pendingRequests.entries()) {
67
- pending.reject(new Error('WebSocket connection closed'));
68
- }
69
- this.pendingRequests.clear();
70
- // Attempt reconnect if enabled
71
- if (this.config.reconnect) {
72
- setTimeout(() => this.connect(), this.config.reconnectDelay);
73
- }
74
- };
75
- }
76
- catch (error) {
77
- reject(error);
78
- }
79
- });
80
- return this.connectionPromise;
81
- }
82
- /**
83
- * Handle incoming WebSocket messages
84
- */
85
- handleMessage(event) {
86
- try {
87
- const data = JSON.parse(event.data);
88
- // Handle ActionCable control messages
89
- if (data.type === 'welcome' || data.type === 'ping' || data.type === 'confirm_subscription') {
90
- return;
91
- }
92
- // Extract the actual message from ActionCable envelope
93
- const message = data.message || data;
94
- if (!message.id) {
95
- console.warn('Received message without ID:', message);
96
- return;
97
- }
98
- // Handle streaming progress updates
99
- if (message.type === 'streaming_progress') {
100
- const pending = this.pendingRequests.get(message.id);
101
- if (pending?.onProgress) {
102
- pending.onProgress(message.progress);
103
- }
104
- return;
105
- }
106
- // Handle final responses
107
- const pending = this.pendingRequests.get(message.id);
108
- if (!pending) {
109
- console.warn('Received response for unknown request:', message.id);
110
- return;
111
- }
112
- if (message.error) {
113
- pending.reject(new errors_js_1.RemoteRuntimeError(message.error));
114
- }
115
- else {
116
- pending.resolve(message.result);
117
- }
118
- this.pendingRequests.delete(message.id);
119
- }
120
- catch (error) {
121
- console.error('Error handling WebSocket message:', error);
122
- }
123
- }
124
- /**
125
- * Generate next message ID
126
- */
127
- nextMessageId() {
128
- return `msg-${++this.messageId}-${Date.now()}`;
129
- }
130
- /**
131
- * Send a request and wait for response
132
- */
133
- async sendRequest(message) {
134
- await this.ensureConnected();
135
- return new Promise((resolve, reject) => {
136
- this.pendingRequests.set(message.id, { resolve, reject });
137
- // Wrap message in ActionCable format
138
- const actionCableMessage = {
139
- command: 'message',
140
- identifier: JSON.stringify({
141
- channel: this.config.channel,
142
- }),
143
- data: JSON.stringify(message),
144
- };
145
- this.ws.send(JSON.stringify(actionCableMessage));
146
- });
147
- }
148
- /**
149
- * Send a streaming request with progress callbacks
150
- */
151
- async sendStreamingRequest(message, onProgress) {
152
- await this.ensureConnected();
153
- return new Promise((resolve, reject) => {
154
- this.pendingRequests.set(message.id, { resolve, reject, onProgress });
155
- // Wrap message in ActionCable format
156
- const actionCableMessage = {
157
- command: 'message',
158
- identifier: JSON.stringify({
159
- channel: this.config.channel,
160
- }),
161
- data: JSON.stringify(message),
162
- };
163
- this.ws.send(JSON.stringify(actionCableMessage));
164
- });
165
- }
166
- /**
167
- * Ensure WebSocket is connected
168
- */
169
- async ensureConnected() {
170
- if (!this.connected) {
171
- await this.connect();
172
- }
173
- }
174
- /**
175
- * Execute a word in the remote runtime
176
- * Mirrors GrpcClient.executeWord
177
- */
178
- async executeWord(word, stack) {
179
- const message = {
180
- type: 'execute_word',
181
- id: this.nextMessageId(),
182
- params: {
183
- word,
184
- stack: (0, serializer_js_1.serializeStack)(stack),
185
- },
186
- };
187
- const result = await this.sendRequest(message);
188
- return (0, serializer_js_1.deserializeStack)(result.stack);
189
- }
190
- /**
191
- * Execute a sequence of words (batched execution)
192
- * Mirrors GrpcClient.executeSequence
193
- */
194
- async executeSequence(words, stack) {
195
- const message = {
196
- type: 'execute_sequence',
197
- id: this.nextMessageId(),
198
- params: {
199
- words,
200
- stack: (0, serializer_js_1.serializeStack)(stack),
201
- },
202
- };
203
- const result = await this.sendRequest(message);
204
- return (0, serializer_js_1.deserializeStack)(result.stack);
205
- }
206
- /**
207
- * List available runtime-specific modules
208
- * Mirrors GrpcClient.listModules
209
- */
210
- async listModules() {
211
- const message = {
212
- type: 'list_modules',
213
- id: this.nextMessageId(),
214
- };
215
- const result = await this.sendRequest(message);
216
- return result.modules || [];
217
- }
218
- /**
219
- * Get detailed information about a specific module
220
- * Mirrors GrpcClient.getModuleInfo
221
- */
222
- async getModuleInfo(moduleName) {
223
- const message = {
224
- type: 'get_module_info',
225
- id: this.nextMessageId(),
226
- params: {
227
- module_name: moduleName,
228
- },
229
- };
230
- return await this.sendRequest(message);
231
- }
232
- /**
233
- * Execute code with streaming progress updates (NEW capability)
234
- */
235
- async streamingExecute(code, stack, onProgress) {
236
- const message = {
237
- type: 'streaming_execute',
238
- id: this.nextMessageId(),
239
- params: {
240
- code,
241
- stack: (0, serializer_js_1.serializeStack)(stack),
242
- },
243
- };
244
- const result = await this.sendStreamingRequest(message, onProgress);
245
- return (0, serializer_js_1.deserializeStack)(result.stack);
246
- }
247
- /**
248
- * Close the WebSocket connection
249
- */
250
- close() {
251
- if (this.ws) {
252
- this.config.reconnect = false; // Disable auto-reconnect
253
- this.ws.close();
254
- this.ws = undefined;
255
- this.connected = false;
256
- }
257
- }
258
- /**
259
- * Check if the client is connected
260
- */
261
- isConnected() {
262
- return this.connected;
263
- }
264
- }
265
- exports.WebSocketClient = WebSocketClient;
266
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/websocket/client.ts"],"names":[],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- /**
2
- * WebSocketRemoteModule - Module that wraps runtime-specific words from a remote runtime
3
- * Mirrors RemoteModule from gRPC implementation
4
- */
5
- import { Module } from '../forthic/module.js';
6
- import { Interpreter } from '../forthic/interpreter.js';
7
- import { ActionCableClient, type ModuleInfo } from './action_cable_client.js';
8
- /**
9
- * WebSocketRemoteModule - Module containing proxy words that execute in a remote runtime
10
- *
11
- * This module discovers words from a remote runtime (e.g., pandas module in Ruby)
12
- * and creates WebSocketRemoteWord proxies for each discovered word. When used in TypeScript
13
- * Forthic code, these words execute in the remote runtime via ActionCable.
14
- *
15
- * Example usage:
16
- * ```typescript
17
- * const client = new ActionCableClient({ url: 'ws://localhost:3000/cable' });
18
- * const pandasModule = new WebSocketRemoteModule('pandas', client, 'rails');
19
- * await pandasModule.initialize();
20
- * interp.register_module(pandasModule);
21
- * interp.use_modules(['pandas']);
22
- *
23
- * // Now pandas words execute in Rails runtime
24
- * await interp.run(`
25
- * [ [[.name "Alice"] [.age 30]] REC]
26
- * DF-FROM-RECORDS # Executes in Rails!
27
- * `);
28
- * ```
29
- */
30
- export declare class WebSocketRemoteModule extends Module {
31
- private client;
32
- private runtimeName;
33
- private initialized;
34
- private moduleInfo;
35
- /**
36
- * @param moduleName - Name of the module in the remote runtime (e.g., "pandas")
37
- * @param client - ActionCable client connected to the remote runtime
38
- * @param runtimeName - Name of the runtime (e.g., "rails") for debugging
39
- */
40
- constructor(moduleName: string, client: ActionCableClient, runtimeName?: string);
41
- /**
42
- * Initialize the module by discovering words from the remote runtime
43
- *
44
- * This must be called before the module is registered with an interpreter.
45
- * It fetches the module metadata and creates WebSocketRemoteWord proxies for each word.
46
- */
47
- initialize(): Promise<void>;
48
- /**
49
- * Override set_interp to ensure module is initialized
50
- */
51
- set_interp(interp: Interpreter): void;
52
- /**
53
- * Get the module metadata from the remote runtime
54
- */
55
- getModuleInfo(): ModuleInfo | null;
56
- /**
57
- * Get runtime name for debugging
58
- */
59
- getRuntimeName(): string;
60
- /**
61
- * Check if module is initialized
62
- */
63
- isInitialized(): boolean;
64
- /**
65
- * Get count of discovered words
66
- */
67
- getWordCount(): number;
68
- }
@@ -1,107 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebSocketRemoteModule = void 0;
4
- /**
5
- * WebSocketRemoteModule - Module that wraps runtime-specific words from a remote runtime
6
- * Mirrors RemoteModule from gRPC implementation
7
- */
8
- const module_js_1 = require("../forthic/module.js");
9
- const remote_word_js_1 = require("./remote_word.js");
10
- /**
11
- * WebSocketRemoteModule - Module containing proxy words that execute in a remote runtime
12
- *
13
- * This module discovers words from a remote runtime (e.g., pandas module in Ruby)
14
- * and creates WebSocketRemoteWord proxies for each discovered word. When used in TypeScript
15
- * Forthic code, these words execute in the remote runtime via ActionCable.
16
- *
17
- * Example usage:
18
- * ```typescript
19
- * const client = new ActionCableClient({ url: 'ws://localhost:3000/cable' });
20
- * const pandasModule = new WebSocketRemoteModule('pandas', client, 'rails');
21
- * await pandasModule.initialize();
22
- * interp.register_module(pandasModule);
23
- * interp.use_modules(['pandas']);
24
- *
25
- * // Now pandas words execute in Rails runtime
26
- * await interp.run(`
27
- * [ [[.name "Alice"] [.age 30]] REC]
28
- * DF-FROM-RECORDS # Executes in Rails!
29
- * `);
30
- * ```
31
- */
32
- class WebSocketRemoteModule extends module_js_1.Module {
33
- client;
34
- runtimeName;
35
- initialized = false;
36
- moduleInfo = null;
37
- /**
38
- * @param moduleName - Name of the module in the remote runtime (e.g., "pandas")
39
- * @param client - ActionCable client connected to the remote runtime
40
- * @param runtimeName - Name of the runtime (e.g., "rails") for debugging
41
- */
42
- constructor(moduleName, client, runtimeName = 'remote') {
43
- super(moduleName);
44
- this.client = client;
45
- this.runtimeName = runtimeName;
46
- }
47
- /**
48
- * Initialize the module by discovering words from the remote runtime
49
- *
50
- * This must be called before the module is registered with an interpreter.
51
- * It fetches the module metadata and creates WebSocketRemoteWord proxies for each word.
52
- */
53
- async initialize() {
54
- if (this.initialized) {
55
- return;
56
- }
57
- try {
58
- // Discover module info from remote runtime
59
- this.moduleInfo = await this.client.getModuleInfo(this.name);
60
- // Create WebSocketRemoteWord for each discovered word
61
- for (const wordInfo of this.moduleInfo.words) {
62
- const remoteWord = new remote_word_js_1.WebSocketRemoteWord(wordInfo.name, this.client, this.runtimeName, this.name, wordInfo.stack_effect, wordInfo.description);
63
- // Add as exportable word (visible when module is imported)
64
- this.add_exportable_word(remoteWord);
65
- }
66
- this.initialized = true;
67
- }
68
- catch (error) {
69
- throw new Error(`Failed to initialize remote module '${this.name}' from ${this.runtimeName} runtime: ${error.message}`);
70
- }
71
- }
72
- /**
73
- * Override set_interp to ensure module is initialized
74
- */
75
- set_interp(interp) {
76
- if (!this.initialized) {
77
- throw new Error(`WebSocketRemoteModule '${this.name}' must be initialized before being registered with an interpreter. Call await module.initialize() first.`);
78
- }
79
- super.set_interp(interp);
80
- }
81
- /**
82
- * Get the module metadata from the remote runtime
83
- */
84
- getModuleInfo() {
85
- return this.moduleInfo;
86
- }
87
- /**
88
- * Get runtime name for debugging
89
- */
90
- getRuntimeName() {
91
- return this.runtimeName;
92
- }
93
- /**
94
- * Check if module is initialized
95
- */
96
- isInitialized() {
97
- return this.initialized;
98
- }
99
- /**
100
- * Get count of discovered words
101
- */
102
- getWordCount() {
103
- return this.moduleInfo?.words?.length || 0;
104
- }
105
- }
106
- exports.WebSocketRemoteModule = WebSocketRemoteModule;
107
- //# sourceMappingURL=remote_module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote_module.js","sourceRoot":"","sources":["../../../src/websocket/remote_module.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,oDAA8C;AAG9C,qDAAuD;AAEvD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,qBAAsB,SAAQ,kBAAM;IACvC,MAAM,CAAoB;IAC1B,WAAW,CAAS;IACpB,WAAW,GAAY,KAAK,CAAC;IAC7B,UAAU,GAAsB,IAAI,CAAC;IAE7C;;;;OAIG;IACH,YAAY,UAAkB,EAAE,MAAyB,EAAE,cAAsB,QAAQ;QACvF,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,2CAA2C;YAC3C,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7D,sDAAsD;YACtD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,oCAAmB,CACxC,QAAQ,CAAC,IAAI,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,IAAI,EACT,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,WAAW,CACrB,CAAC;gBAEF,2DAA2D;gBAC3D,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,WAAW,aAAc,KAAe,CAAC,OAAO,EAAE,CAClH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAmB;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,IAAI,0GAA0G,CAC9I,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF;AA9FD,sDA8FC"}
@@ -1,53 +0,0 @@
1
- /**
2
- * WebSocketRemoteWord - Word that executes in a remote runtime via ActionCable
3
- * Mirrors RemoteWord from gRPC implementation
4
- */
5
- import { Word, RuntimeInfo } from '../forthic/module.js';
6
- import { Interpreter } from '../forthic/interpreter.js';
7
- import { ActionCableClient } from './action_cable_client.js';
8
- /**
9
- * WebSocketRemoteWord - Proxy word that delegates execution to a remote runtime
10
- *
11
- * When executed:
12
- * 1. Captures current interpreter stack
13
- * 2. Sends word name + stack to remote runtime via ActionCable
14
- * 3. Replaces local stack with result stack from remote execution
15
- *
16
- * This allows seamless integration of remote runtime words
17
- * into the local TypeScript interpreter.
18
- */
19
- export declare class WebSocketRemoteWord extends Word {
20
- private client;
21
- private runtimeName;
22
- private moduleName;
23
- stackEffect: string;
24
- description: string;
25
- /**
26
- * @param name - Word name (e.g., "DF_FROM_RECORDS")
27
- * @param client - ActionCable client connected to remote runtime
28
- * @param runtimeName - Name of remote runtime (e.g., "rails", "ruby")
29
- * @param moduleName - Module name (e.g., "pandas")
30
- * @param stackEffect - Stack notation (e.g., "( records:array -- df:DataFrame )")
31
- * @param description - Human-readable description
32
- */
33
- constructor(name: string, client: ActionCableClient, runtimeName: string, moduleName: string, stackEffect?: string, description?: string);
34
- /**
35
- * Execute word in remote runtime
36
- *
37
- * Captures entire stack, sends to remote runtime, and replaces stack with result.
38
- */
39
- execute(interp: Interpreter): Promise<void>;
40
- /**
41
- * Get runtime name for debugging/introspection
42
- */
43
- getRuntimeName(): string;
44
- /**
45
- * Get module name for debugging/introspection
46
- */
47
- getModuleName(): string;
48
- /**
49
- * Get runtime execution information
50
- * RemoteWords are runtime-specific and can only execute in their designated runtime
51
- */
52
- getRuntimeInfo(): RuntimeInfo;
53
- }
@@ -1,93 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote_word.js","sourceRoot":"","sources":["../../../src/websocket/remote_word.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,oDAAyD;AAIzD;;;;;;;;;;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"}
@@ -1,69 +0,0 @@
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 './action_cable_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
- }