@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.
- package/dist/cjs/forthic/decorators/schemaUtils.d.ts +70 -0
- package/dist/cjs/forthic/decorators/schemaUtils.js +77 -0
- package/dist/cjs/forthic/decorators/schemaUtils.js.map +1 -0
- package/dist/cjs/forthic/decorators/stackEffect.d.ts +63 -0
- package/dist/cjs/forthic/decorators/stackEffect.js +179 -0
- package/dist/cjs/forthic/decorators/stackEffect.js.map +1 -0
- package/dist/cjs/forthic/interpreter.d.ts +21 -0
- package/dist/cjs/forthic/interpreter.js +76 -1
- package/dist/cjs/forthic/interpreter.js.map +1 -1
- package/dist/cjs/forthic/module.d.ts +2 -0
- package/dist/cjs/forthic/module.js +4 -0
- package/dist/cjs/forthic/module.js.map +1 -1
- 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/esm/forthic/decorators/schemaUtils.d.ts +70 -0
- package/dist/esm/forthic/decorators/schemaUtils.js +72 -0
- package/dist/esm/forthic/decorators/schemaUtils.js.map +1 -0
- package/dist/esm/forthic/decorators/stackEffect.d.ts +63 -0
- package/dist/esm/forthic/decorators/stackEffect.js +174 -0
- package/dist/esm/forthic/decorators/stackEffect.js.map +1 -0
- package/dist/esm/forthic/interpreter.d.ts +21 -0
- package/dist/esm/forthic/interpreter.js +74 -1
- package/dist/esm/forthic/interpreter.js.map +1 -1
- package/dist/esm/forthic/module.d.ts +2 -0
- package/dist/esm/forthic/module.js +4 -0
- package/dist/esm/forthic/module.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/grpc/server.test.d.ts +0 -1
- package/dist/cjs/grpc/server.test.js +0 -156
- package/dist/cjs/grpc/server.test.js.map +0 -1
- package/dist/cjs/grpc/temporal_utils.d.ts +0 -36
- package/dist/cjs/grpc/temporal_utils.js +0 -80
- package/dist/cjs/grpc/temporal_utils.js.map +0 -1
- package/dist/cjs/websocket/action_cable_client.d.ts +0 -106
- package/dist/cjs/websocket/action_cable_client.js +0 -269
- package/dist/cjs/websocket/action_cable_client.js.map +0 -1
- package/dist/cjs/websocket/client.d.ts +0 -103
- package/dist/cjs/websocket/client.js +0 -266
- package/dist/cjs/websocket/client.js.map +0 -1
- package/dist/cjs/websocket/remote_module.d.ts +0 -68
- package/dist/cjs/websocket/remote_module.js +0 -107
- package/dist/cjs/websocket/remote_module.js.map +0 -1
- package/dist/cjs/websocket/remote_word.d.ts +0 -53
- package/dist/cjs/websocket/remote_word.js +0 -93
- package/dist/cjs/websocket/remote_word.js.map +0 -1
- package/dist/cjs/websocket/runtime_manager.d.ts +0 -69
- package/dist/cjs/websocket/runtime_manager.js +0 -112
- package/dist/cjs/websocket/runtime_manager.js.map +0 -1
- package/dist/esm/grpc/server.test.d.ts +0 -1
- package/dist/esm/grpc/server.test.js +0 -121
- package/dist/esm/grpc/server.test.js.map +0 -1
- package/dist/esm/grpc/temporal_utils.d.ts +0 -36
- package/dist/esm/grpc/temporal_utils.js +0 -72
- package/dist/esm/grpc/temporal_utils.js.map +0 -1
- package/dist/esm/websocket/action_cable_client.d.ts +0 -106
- package/dist/esm/websocket/action_cable_client.js +0 -265
- package/dist/esm/websocket/action_cable_client.js.map +0 -1
- package/dist/esm/websocket/client.d.ts +0 -103
- package/dist/esm/websocket/client.js +0 -262
- package/dist/esm/websocket/client.js.map +0 -1
- package/dist/esm/websocket/remote_module.d.ts +0 -68
- package/dist/esm/websocket/remote_module.js +0 -103
- package/dist/esm/websocket/remote_module.js.map +0 -1
- package/dist/esm/websocket/remote_word.d.ts +0 -53
- package/dist/esm/websocket/remote_word.js +0 -89
- package/dist/esm/websocket/remote_word.js.map +0 -1
- package/dist/esm/websocket/runtime_manager.d.ts +0 -69
- package/dist/esm/websocket/runtime_manager.js +0 -108
- package/dist/esm/websocket/runtime_manager.js.map +0 -1
|
@@ -1,112 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 11.1: Basic server tests
|
|
3
|
-
* Verify that the TypeScript gRPC server can start and listen on port 50052
|
|
4
|
-
*/
|
|
5
|
-
import { serve } from './server';
|
|
6
|
-
import * as grpc from '@grpc/grpc-js';
|
|
7
|
-
import * as protoLoader from '@grpc/proto-loader';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
describe('TypeScript gRPC Server', () => {
|
|
10
|
-
let server = null;
|
|
11
|
-
const TEST_PORT = 50053; // Use different port to avoid conflicts
|
|
12
|
-
afterEach(async () => {
|
|
13
|
-
// Clean up server if running
|
|
14
|
-
if (server) {
|
|
15
|
-
await new Promise((resolve) => {
|
|
16
|
-
server.tryShutdown(() => {
|
|
17
|
-
resolve();
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
server = null;
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
test('server starts and listens on specified port', async () => {
|
|
24
|
-
// Start server in background (don't await)
|
|
25
|
-
const serverPromise = serve(TEST_PORT);
|
|
26
|
-
// Give server time to start
|
|
27
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
28
|
-
// Try to connect with a client
|
|
29
|
-
const possiblePaths = [
|
|
30
|
-
path.join(__dirname, '../../../../forthic/protos/forthic_runtime.proto'),
|
|
31
|
-
path.join(__dirname, '../../../forthic/protos/forthic_runtime.proto'),
|
|
32
|
-
path.join(process.cwd(), '../forthic/protos/forthic_runtime.proto'),
|
|
33
|
-
];
|
|
34
|
-
let PROTO_PATH = possiblePaths[0];
|
|
35
|
-
const fs = require('fs');
|
|
36
|
-
for (const tryPath of possiblePaths) {
|
|
37
|
-
if (fs.existsSync(tryPath)) {
|
|
38
|
-
PROTO_PATH = tryPath;
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
|
|
43
|
-
keepCase: true,
|
|
44
|
-
longs: Number,
|
|
45
|
-
enums: String,
|
|
46
|
-
defaults: true,
|
|
47
|
-
oneofs: true,
|
|
48
|
-
});
|
|
49
|
-
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
|
|
50
|
-
const forthicProto = protoDescriptor.forthic;
|
|
51
|
-
// Create client
|
|
52
|
-
const client = new forthicProto.ForthicRuntime(`localhost:${TEST_PORT}`, grpc.credentials.createInsecure());
|
|
53
|
-
// Test that we can connect by calling ListModules
|
|
54
|
-
const response = await new Promise((resolve, reject) => {
|
|
55
|
-
client.ListModules({}, (error, response) => {
|
|
56
|
-
if (error) {
|
|
57
|
-
reject(error);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
resolve(response);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
// Should succeed with empty module list (no TS-specific modules yet)
|
|
65
|
-
expect(response).toBeDefined();
|
|
66
|
-
expect(response.modules).toBeDefined();
|
|
67
|
-
expect(Array.isArray(response.modules)).toBe(true);
|
|
68
|
-
// Clean up client
|
|
69
|
-
grpc.closeClient(client);
|
|
70
|
-
}, 10000); // 10 second timeout
|
|
71
|
-
test('server can execute simple stdlib word', async () => {
|
|
72
|
-
// Start server
|
|
73
|
-
const serverPromise = serve(TEST_PORT);
|
|
74
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
75
|
-
// Load proto
|
|
76
|
-
const possiblePaths = [
|
|
77
|
-
path.join(__dirname, '../../../../forthic/protos/forthic_runtime.proto'),
|
|
78
|
-
path.join(__dirname, '../../../forthic/protos/forthic_runtime.proto'),
|
|
79
|
-
path.join(process.cwd(), '../forthic/protos/forthic_runtime.proto'),
|
|
80
|
-
];
|
|
81
|
-
let PROTO_PATH = possiblePaths[0];
|
|
82
|
-
const fs = require('fs');
|
|
83
|
-
for (const tryPath of possiblePaths) {
|
|
84
|
-
if (fs.existsSync(tryPath)) {
|
|
85
|
-
PROTO_PATH = tryPath;
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
|
|
90
|
-
keepCase: true,
|
|
91
|
-
longs: Number,
|
|
92
|
-
enums: String,
|
|
93
|
-
defaults: true,
|
|
94
|
-
oneofs: true,
|
|
95
|
-
});
|
|
96
|
-
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
|
|
97
|
-
const forthicProto = protoDescriptor.forthic;
|
|
98
|
-
const client = new forthicProto.ForthicRuntime(`localhost:${TEST_PORT}`, grpc.credentials.createInsecure());
|
|
99
|
-
// Execute DUP word (duplicates top stack item)
|
|
100
|
-
const response = await new Promise((resolve, reject) => {
|
|
101
|
-
client.ExecuteWord({
|
|
102
|
-
word_name: 'DUP',
|
|
103
|
-
stack: [{ int_value: 42 }],
|
|
104
|
-
}, (error, response) => {
|
|
105
|
-
if (error) {
|
|
106
|
-
reject(error);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
resolve(response);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
// Should have [42, 42] on stack
|
|
114
|
-
expect(response.result_stack).toBeDefined();
|
|
115
|
-
expect(response.result_stack.length).toBe(2);
|
|
116
|
-
expect(response.result_stack[0].int_value).toBe(42);
|
|
117
|
-
expect(response.result_stack[1].int_value).toBe(42);
|
|
118
|
-
grpc.closeClient(client);
|
|
119
|
-
}, 10000);
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=server.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/grpc/server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
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;
|
|
@@ -1,72 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"temporal_utils.js","sourceRoot":"","sources":["../../../src/grpc/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"}
|
|
@@ -1,106 +0,0 @@
|
|
|
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
|
-
}
|