@forthix/forthic 0.9.0 → 0.11.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 (111) hide show
  1. package/dist/cjs/common/runtime_client.d.ts +30 -0
  2. package/dist/cjs/common/runtime_client.js +10 -0
  3. package/dist/cjs/common/runtime_client.js.map +1 -0
  4. package/dist/cjs/common/type_utils.d.ts +7 -1
  5. package/dist/cjs/common/type_utils.js +13 -2
  6. package/dist/cjs/common/type_utils.js.map +1 -1
  7. package/dist/cjs/forthic/errors.d.ts +7 -3
  8. package/dist/cjs/forthic/errors.js +16 -8
  9. package/dist/cjs/forthic/errors.js.map +1 -1
  10. package/dist/cjs/forthic/interpreter.d.ts +1 -1
  11. package/dist/cjs/forthic/interpreter.js +27 -14
  12. package/dist/cjs/forthic/interpreter.js.map +1 -1
  13. package/dist/cjs/forthic/module.js +6 -4
  14. package/dist/cjs/forthic/module.js.map +1 -1
  15. package/dist/cjs/forthic/modules/standard/classic/classic_module.d.ts +56 -0
  16. package/dist/cjs/forthic/modules/standard/classic/classic_module.js +616 -0
  17. package/dist/cjs/forthic/modules/standard/classic/classic_module.js.map +1 -0
  18. package/dist/cjs/forthic/modules/standard/core_module.js +1 -1
  19. package/dist/cjs/forthic/modules/standard/core_module.js.map +1 -1
  20. package/dist/cjs/grpc/config_loader.d.ts +3 -0
  21. package/dist/cjs/grpc/config_loader.js +5 -0
  22. package/dist/cjs/grpc/config_loader.js.map +1 -1
  23. package/dist/cjs/grpc/remote_module.d.ts +3 -3
  24. package/dist/cjs/grpc/remote_module.js +1 -1
  25. package/dist/cjs/grpc/remote_module.js.map +1 -1
  26. package/dist/cjs/grpc/remote_word.d.ts +3 -3
  27. package/dist/cjs/grpc/remote_word.js +1 -1
  28. package/dist/cjs/grpc/remote_word.js.map +1 -1
  29. package/dist/cjs/grpc/runtime_manager.d.ts +5 -4
  30. package/dist/cjs/grpc/runtime_manager.js +2 -2
  31. package/dist/cjs/grpc/runtime_manager.js.map +1 -1
  32. package/dist/cjs/grpc/serializer.d.ts +2 -2
  33. package/dist/cjs/grpc/serializer.js +11 -10
  34. package/dist/cjs/grpc/serializer.js.map +1 -1
  35. package/dist/cjs/jsonrpc/browser-stub.d.ts +8 -0
  36. package/dist/cjs/jsonrpc/browser-stub.js +18 -0
  37. package/dist/cjs/jsonrpc/browser-stub.js.map +1 -0
  38. package/dist/cjs/jsonrpc/client.d.ts +31 -0
  39. package/dist/cjs/jsonrpc/client.js +98 -0
  40. package/dist/cjs/jsonrpc/client.js.map +1 -0
  41. package/dist/cjs/jsonrpc/errors.d.ts +18 -0
  42. package/dist/cjs/jsonrpc/errors.js +23 -0
  43. package/dist/cjs/jsonrpc/errors.js.map +1 -0
  44. package/dist/cjs/jsonrpc/index.d.ts +16 -0
  45. package/dist/cjs/jsonrpc/index.js +26 -0
  46. package/dist/cjs/jsonrpc/index.js.map +1 -0
  47. package/dist/cjs/jsonrpc/serializer.d.ts +8 -0
  48. package/dist/cjs/jsonrpc/serializer.js +14 -0
  49. package/dist/cjs/jsonrpc/serializer.js.map +1 -0
  50. package/dist/cjs/jsonrpc/server.d.ts +15 -0
  51. package/dist/cjs/jsonrpc/server.js +386 -0
  52. package/dist/cjs/jsonrpc/server.js.map +1 -0
  53. package/dist/cjs/websocket/serializer.d.ts +4 -4
  54. package/dist/cjs/websocket/serializer.js +15 -14
  55. package/dist/cjs/websocket/serializer.js.map +1 -1
  56. package/dist/esm/common/runtime_client.d.ts +30 -0
  57. package/dist/esm/common/runtime_client.js +9 -0
  58. package/dist/esm/common/runtime_client.js.map +1 -0
  59. package/dist/esm/common/type_utils.d.ts +7 -1
  60. package/dist/esm/common/type_utils.js +12 -2
  61. package/dist/esm/common/type_utils.js.map +1 -1
  62. package/dist/esm/forthic/errors.d.ts +7 -3
  63. package/dist/esm/forthic/errors.js +16 -8
  64. package/dist/esm/forthic/errors.js.map +1 -1
  65. package/dist/esm/forthic/interpreter.d.ts +1 -1
  66. package/dist/esm/forthic/interpreter.js +27 -14
  67. package/dist/esm/forthic/interpreter.js.map +1 -1
  68. package/dist/esm/forthic/module.js +6 -4
  69. package/dist/esm/forthic/module.js.map +1 -1
  70. package/dist/esm/forthic/modules/standard/classic/classic_module.d.ts +56 -0
  71. package/dist/esm/forthic/modules/standard/classic/classic_module.js +500 -0
  72. package/dist/esm/forthic/modules/standard/classic/classic_module.js.map +1 -0
  73. package/dist/esm/forthic/modules/standard/core_module.js +1 -1
  74. package/dist/esm/forthic/modules/standard/core_module.js.map +1 -1
  75. package/dist/esm/grpc/config_loader.d.ts +3 -0
  76. package/dist/esm/grpc/config_loader.js +5 -0
  77. package/dist/esm/grpc/config_loader.js.map +1 -1
  78. package/dist/esm/grpc/remote_module.d.ts +3 -3
  79. package/dist/esm/grpc/remote_module.js +1 -1
  80. package/dist/esm/grpc/remote_module.js.map +1 -1
  81. package/dist/esm/grpc/remote_word.d.ts +3 -3
  82. package/dist/esm/grpc/remote_word.js +1 -1
  83. package/dist/esm/grpc/remote_word.js.map +1 -1
  84. package/dist/esm/grpc/runtime_manager.d.ts +5 -4
  85. package/dist/esm/grpc/runtime_manager.js +2 -2
  86. package/dist/esm/grpc/runtime_manager.js.map +1 -1
  87. package/dist/esm/grpc/serializer.d.ts +2 -2
  88. package/dist/esm/grpc/serializer.js +12 -11
  89. package/dist/esm/grpc/serializer.js.map +1 -1
  90. package/dist/esm/jsonrpc/browser-stub.d.ts +8 -0
  91. package/dist/esm/jsonrpc/browser-stub.js +12 -0
  92. package/dist/esm/jsonrpc/browser-stub.js.map +1 -0
  93. package/dist/esm/jsonrpc/client.d.ts +31 -0
  94. package/dist/esm/jsonrpc/client.js +94 -0
  95. package/dist/esm/jsonrpc/client.js.map +1 -0
  96. package/dist/esm/jsonrpc/errors.d.ts +18 -0
  97. package/dist/esm/jsonrpc/errors.js +18 -0
  98. package/dist/esm/jsonrpc/errors.js.map +1 -0
  99. package/dist/esm/jsonrpc/index.d.ts +16 -0
  100. package/dist/esm/jsonrpc/index.js +16 -0
  101. package/dist/esm/jsonrpc/index.js.map +1 -0
  102. package/dist/esm/jsonrpc/serializer.d.ts +8 -0
  103. package/dist/esm/jsonrpc/serializer.js +9 -0
  104. package/dist/esm/jsonrpc/serializer.js.map +1 -0
  105. package/dist/esm/jsonrpc/server.d.ts +15 -0
  106. package/dist/esm/jsonrpc/server.js +349 -0
  107. package/dist/esm/jsonrpc/server.js.map +1 -0
  108. package/dist/esm/websocket/serializer.d.ts +4 -4
  109. package/dist/esm/websocket/serializer.js +16 -15
  110. package/dist/esm/websocket/serializer.js.map +1 -1
  111. package/package.json +15 -2
@@ -0,0 +1,349 @@
1
+ /**
2
+ * TypeScript JSON-RPC 2.0 Server for Forthic
3
+ *
4
+ * Mirrors the four methods of the gRPC server:
5
+ * executeWord, executeSequence, listModules, getModuleInfo
6
+ *
7
+ * Transport: HTTP POST /rpc with JSON-RPC 2.0 envelopes.
8
+ * Uses Node's built-in `http` module — zero new dependencies.
9
+ *
10
+ * `executeSequence` is a single JSON-RPC call with an array of words; it is
11
+ * NOT a JSON-RPC batch. Batch envelopes are rejected with code -32600.
12
+ */
13
+ import * as http from 'http';
14
+ import { StandardInterpreter } from '../forthic/interpreter.js';
15
+ import { serializeValue, deserializeValue } from '../grpc/serializer.js';
16
+ import { FsModule } from '../forthic/modules/typescript/fs_module.js';
17
+ import { JsonRpcErrorCode } from './errors.js';
18
+ class ForthicJsonRpcServicer {
19
+ runtimeModules;
20
+ constructor() {
21
+ this.runtimeModules = {
22
+ fs: new FsModule(),
23
+ };
24
+ }
25
+ async executeWord(params) {
26
+ const wordName = params?.word_name;
27
+ if (typeof wordName !== 'string') {
28
+ throw makeInvalidParams('executeWord requires string "word_name"');
29
+ }
30
+ const stackParam = params?.stack;
31
+ if (!Array.isArray(stackParam)) {
32
+ throw makeInvalidParams('executeWord requires array "stack"');
33
+ }
34
+ const stack = stackParam.map((sv) => deserializeValue(sv));
35
+ const resultStack = await this._executeWithStack(wordName, stack);
36
+ return { result_stack: resultStack.map((v) => serializeValue(v)) };
37
+ }
38
+ async executeSequence(params) {
39
+ const wordNames = params?.word_names;
40
+ if (!Array.isArray(wordNames) || !wordNames.every((w) => typeof w === 'string')) {
41
+ throw makeInvalidParams('executeSequence requires string[] "word_names"');
42
+ }
43
+ const stackParam = params?.stack;
44
+ if (!Array.isArray(stackParam)) {
45
+ throw makeInvalidParams('executeSequence requires array "stack"');
46
+ }
47
+ const stack = stackParam.map((sv) => deserializeValue(sv));
48
+ const resultStack = await this._executeSequenceWithStack(wordNames, stack);
49
+ return { result_stack: resultStack.map((v) => serializeValue(v)) };
50
+ }
51
+ async listModules(_params) {
52
+ const modules = [];
53
+ for (const [name, mod] of Object.entries(this.runtimeModules)) {
54
+ modules.push({
55
+ name,
56
+ description: `TypeScript-specific ${name} module`,
57
+ word_count: this._getModuleWordCount(mod),
58
+ runtime_specific: true,
59
+ });
60
+ }
61
+ return { modules };
62
+ }
63
+ async getModuleInfo(params) {
64
+ const moduleName = params?.module_name;
65
+ if (typeof moduleName !== 'string') {
66
+ throw makeInvalidParams('getModuleInfo requires string "module_name"');
67
+ }
68
+ if (!(moduleName in this.runtimeModules)) {
69
+ throw new JsonRpcMethodError(JsonRpcErrorCode.ModuleNotFound, `Module '${moduleName}' not found`);
70
+ }
71
+ const mod = this.runtimeModules[moduleName];
72
+ const words = [];
73
+ if (typeof mod.getWordDocs === 'function') {
74
+ for (const doc of mod.getWordDocs()) {
75
+ words.push({
76
+ name: doc.name,
77
+ stack_effect: doc.stackEffect,
78
+ description: doc.description,
79
+ });
80
+ }
81
+ }
82
+ else {
83
+ const exportedWords = mod.exportable || {};
84
+ for (const [name, _word] of Object.entries(exportedWords)) {
85
+ words.push({
86
+ name,
87
+ stack_effect: '( -- )',
88
+ description: `${name} word from ${moduleName} module`,
89
+ });
90
+ }
91
+ }
92
+ return {
93
+ name: moduleName,
94
+ description: `TypeScript-specific ${moduleName} module`,
95
+ words,
96
+ };
97
+ }
98
+ buildRuntimeError(exception, wordName = null, context = {}) {
99
+ const stackTrace = exception?.stack ? String(exception.stack).split('\n') : [];
100
+ const errorType = exception?.constructor?.name || 'Error';
101
+ const errorContext = {};
102
+ if (wordName)
103
+ errorContext['word_name'] = wordName;
104
+ Object.assign(errorContext, context);
105
+ const errorInfo = {
106
+ message: exception?.message ?? String(exception),
107
+ runtime: 'typescript',
108
+ stack_trace: stackTrace,
109
+ error_type: errorType,
110
+ context: errorContext,
111
+ };
112
+ if (stackTrace.length > 0) {
113
+ const m = stackTrace[0].match(/\((.*):(\d+):\d+\)/);
114
+ if (m)
115
+ errorInfo.word_location = `${m[1]}:${m[2]}`;
116
+ }
117
+ return errorInfo;
118
+ }
119
+ getRegisteredModuleNames() {
120
+ return Object.keys(this.runtimeModules);
121
+ }
122
+ async _executeWithStack(wordName, stack) {
123
+ const interp = new StandardInterpreter();
124
+ for (const [_n, m] of Object.entries(this.runtimeModules)) {
125
+ interp.register_module(m);
126
+ }
127
+ if (Object.keys(this.runtimeModules).length > 0) {
128
+ interp.use_modules(Object.keys(this.runtimeModules));
129
+ }
130
+ for (const item of stack)
131
+ interp.stack_push(item);
132
+ await interp.run(wordName);
133
+ return interp.get_stack().get_items();
134
+ }
135
+ async _executeSequenceWithStack(wordNames, stack) {
136
+ const interp = new StandardInterpreter();
137
+ for (const [_n, m] of Object.entries(this.runtimeModules)) {
138
+ interp.register_module(m);
139
+ }
140
+ if (Object.keys(this.runtimeModules).length > 0) {
141
+ interp.use_modules(Object.keys(this.runtimeModules));
142
+ }
143
+ for (const item of stack)
144
+ interp.stack_push(item);
145
+ for (const wordName of wordNames) {
146
+ await interp.run(wordName);
147
+ }
148
+ return interp.get_stack().get_items();
149
+ }
150
+ _getModuleWordCount(mod) {
151
+ if (typeof mod.getWordDocs === 'function')
152
+ return mod.getWordDocs().length;
153
+ if (mod.exportable)
154
+ return Object.keys(mod.exportable).length;
155
+ return 0;
156
+ }
157
+ }
158
+ class JsonRpcMethodError extends Error {
159
+ code;
160
+ data;
161
+ constructor(code, message, data) {
162
+ super(message);
163
+ this.code = code;
164
+ this.data = data;
165
+ this.name = 'JsonRpcMethodError';
166
+ }
167
+ }
168
+ function makeInvalidParams(message) {
169
+ return new JsonRpcMethodError(JsonRpcErrorCode.InvalidParams, message);
170
+ }
171
+ async function readBody(req) {
172
+ return new Promise((resolve, reject) => {
173
+ const chunks = [];
174
+ req.on('data', (c) => chunks.push(c));
175
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
176
+ req.on('error', reject);
177
+ });
178
+ }
179
+ function writeJsonRpc(res, status, payload) {
180
+ const body = JSON.stringify(payload);
181
+ res.writeHead(status, {
182
+ 'Content-Type': 'application/json',
183
+ 'Content-Length': Buffer.byteLength(body),
184
+ });
185
+ res.end(body);
186
+ }
187
+ async function dispatch(servicer, request) {
188
+ const id = request.id ?? null;
189
+ const method = request.method;
190
+ const params = request.params ?? {};
191
+ try {
192
+ let result;
193
+ switch (method) {
194
+ case 'executeWord':
195
+ try {
196
+ result = await servicer.executeWord(params);
197
+ }
198
+ catch (err) {
199
+ if (err instanceof JsonRpcMethodError)
200
+ throw err;
201
+ // Treat as Forthic runtime error with rich data
202
+ const data = servicer.buildRuntimeError(err, params?.word_name ?? null);
203
+ throw new JsonRpcMethodError(JsonRpcErrorCode.RuntimeError, data.message, data);
204
+ }
205
+ break;
206
+ case 'executeSequence':
207
+ try {
208
+ result = await servicer.executeSequence(params);
209
+ }
210
+ catch (err) {
211
+ if (err instanceof JsonRpcMethodError)
212
+ throw err;
213
+ const seqContext = Array.isArray(params?.word_names)
214
+ ? { word_sequence: params.word_names.join(', ') }
215
+ : {};
216
+ const data = servicer.buildRuntimeError(err, null, seqContext);
217
+ throw new JsonRpcMethodError(JsonRpcErrorCode.RuntimeError, data.message, data);
218
+ }
219
+ break;
220
+ case 'listModules':
221
+ result = await servicer.listModules(params);
222
+ break;
223
+ case 'getModuleInfo':
224
+ result = await servicer.getModuleInfo(params);
225
+ break;
226
+ default:
227
+ throw new JsonRpcMethodError(JsonRpcErrorCode.MethodNotFound, `Method not found: ${method}`);
228
+ }
229
+ return { jsonrpc: '2.0', id, result };
230
+ }
231
+ catch (err) {
232
+ if (err instanceof JsonRpcMethodError) {
233
+ const error = { code: err.code, message: err.message };
234
+ if (err.data !== undefined)
235
+ error.data = err.data;
236
+ return { jsonrpc: '2.0', id, error };
237
+ }
238
+ return {
239
+ jsonrpc: '2.0',
240
+ id,
241
+ error: {
242
+ code: JsonRpcErrorCode.InternalError,
243
+ message: err?.message ?? String(err),
244
+ },
245
+ };
246
+ }
247
+ }
248
+ export async function serve(port = 8765) {
249
+ const servicer = new ForthicJsonRpcServicer();
250
+ const server = http.createServer(async (req, res) => {
251
+ if (req.method !== 'POST') {
252
+ res.writeHead(405, { 'Content-Type': 'text/plain', Allow: 'POST' });
253
+ res.end('Method Not Allowed');
254
+ return;
255
+ }
256
+ if (req.url !== '/rpc' && req.url !== '/') {
257
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
258
+ res.end('Not Found');
259
+ return;
260
+ }
261
+ const ctype = (req.headers['content-type'] || '').toString().toLowerCase();
262
+ if (!ctype.includes('application/json')) {
263
+ res.writeHead(415, { 'Content-Type': 'text/plain' });
264
+ res.end('Unsupported Media Type');
265
+ return;
266
+ }
267
+ let raw;
268
+ try {
269
+ raw = await readBody(req);
270
+ }
271
+ catch {
272
+ writeJsonRpc(res, 200, {
273
+ jsonrpc: '2.0',
274
+ id: null,
275
+ error: { code: JsonRpcErrorCode.ParseError, message: 'Failed to read request body' },
276
+ });
277
+ return;
278
+ }
279
+ let parsed;
280
+ try {
281
+ parsed = JSON.parse(raw);
282
+ }
283
+ catch (err) {
284
+ writeJsonRpc(res, 200, {
285
+ jsonrpc: '2.0',
286
+ id: null,
287
+ error: { code: JsonRpcErrorCode.ParseError, message: `Parse error: ${err.message}` },
288
+ });
289
+ return;
290
+ }
291
+ if (Array.isArray(parsed)) {
292
+ writeJsonRpc(res, 200, {
293
+ jsonrpc: '2.0',
294
+ id: null,
295
+ error: {
296
+ code: JsonRpcErrorCode.InvalidRequest,
297
+ message: 'Batch requests are not supported',
298
+ },
299
+ });
300
+ return;
301
+ }
302
+ if (!parsed ||
303
+ parsed.jsonrpc !== '2.0' ||
304
+ typeof parsed.method !== 'string' ||
305
+ !('id' in parsed)) {
306
+ writeJsonRpc(res, 200, {
307
+ jsonrpc: '2.0',
308
+ id: parsed?.id ?? null,
309
+ error: {
310
+ code: JsonRpcErrorCode.InvalidRequest,
311
+ message: 'Invalid JSON-RPC 2.0 request',
312
+ },
313
+ });
314
+ return;
315
+ }
316
+ const response = await dispatch(servicer, parsed);
317
+ writeJsonRpc(res, 200, response);
318
+ });
319
+ return new Promise((resolve, reject) => {
320
+ server.once('error', reject);
321
+ server.listen(port, '0.0.0.0', () => {
322
+ const loaded = servicer.getRegisteredModuleNames();
323
+ if (loaded.length > 0) {
324
+ console.log(` - Available runtime modules: ${loaded.join(', ')}`);
325
+ }
326
+ else {
327
+ console.log(' - No runtime-specific modules loaded');
328
+ }
329
+ resolve(server);
330
+ });
331
+ });
332
+ }
333
+ export async function main() {
334
+ const args = process.argv.slice(2);
335
+ let port = 8765;
336
+ const portIndex = args.indexOf('--port');
337
+ if (portIndex !== -1 && args[portIndex + 1]) {
338
+ port = parseInt(args[portIndex + 1], 10);
339
+ }
340
+ await serve(port);
341
+ console.log(`Forthic JSON-RPC server listening on port ${port}`);
342
+ }
343
+ if (require.main === module) {
344
+ main().catch((error) => {
345
+ console.error('Fatal error:', error);
346
+ process.exit(1);
347
+ });
348
+ }
349
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/jsonrpc/server.ts"],"names":[],"mappings":"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"}
@@ -12,16 +12,16 @@ export interface StackValue {
12
12
  * Serialize a JavaScript value to a JSON StackValue
13
13
  * Uses shared type detection and maps to JSON format
14
14
  */
15
- export declare function serializeValue(value: any): StackValue;
15
+ export declare function serializeValue(value: any, path?: string): StackValue;
16
16
  /**
17
17
  * Deserialize a JSON StackValue to a JavaScript value
18
18
  */
19
- export declare function deserializeValue(stackValue: StackValue): any;
19
+ export declare function deserializeValue(stackValue: StackValue, path?: string): any;
20
20
  /**
21
21
  * Serialize an array of values (stack)
22
22
  */
23
- export declare function serializeStack(stack: any[]): StackValue[];
23
+ export declare function serializeStack(stack: any[], pathPrefix?: string): StackValue[];
24
24
  /**
25
25
  * Deserialize an array of StackValues (stack)
26
26
  */
27
- export declare function deserializeStack(stackValues: StackValue[]): any[];
27
+ export declare function deserializeStack(stackValues: StackValue[], pathPrefix?: string): any[];
@@ -4,13 +4,13 @@
4
4
  * Handles: int, float, string, bool, null, array, record, temporal types
5
5
  * Uses shared type detection from common/type_utils
6
6
  */
7
- import { getForthicType } from "../common/type_utils.js";
7
+ import { getForthicType, pathSegmentForKey } from "../common/type_utils.js";
8
8
  /**
9
9
  * Serialize a JavaScript value to a JSON StackValue
10
10
  * Uses shared type detection and maps to JSON format
11
11
  */
12
- export function serializeValue(value) {
13
- const type = getForthicType(value);
12
+ export function serializeValue(value, path = '') {
13
+ const type = getForthicType(value, path);
14
14
  switch (type) {
15
15
  case 'null':
16
16
  return { type: 'null', value: null };
@@ -25,17 +25,18 @@ export function serializeValue(value) {
25
25
  case 'array':
26
26
  return {
27
27
  type: 'array',
28
- value: value.map((item) => serializeValue(item)),
28
+ value: value.map((item, i) => serializeValue(item, `${path}[${i}]`)),
29
29
  };
30
- case 'record':
30
+ case 'record': {
31
31
  const fields = {};
32
32
  for (const [key, val] of Object.entries(value)) {
33
- fields[key] = serializeValue(val);
33
+ fields[key] = serializeValue(val, `${path}${pathSegmentForKey(key)}`);
34
34
  }
35
35
  return {
36
36
  type: 'record',
37
37
  value: fields,
38
38
  };
39
+ }
39
40
  case 'instant':
40
41
  return {
41
42
  type: 'instant',
@@ -52,13 +53,13 @@ export function serializeValue(value) {
52
53
  value: value.toString(),
53
54
  };
54
55
  default:
55
- throw new Error(`Unsupported Forthic type: ${type}`);
56
+ throw new Error(`Unsupported Forthic type: ${type}${path ? ` at path: ${path}` : ''}`);
56
57
  }
57
58
  }
58
59
  /**
59
60
  * Deserialize a JSON StackValue to a JavaScript value
60
61
  */
61
- export function deserializeValue(stackValue) {
62
+ export function deserializeValue(stackValue, path = '') {
62
63
  switch (stackValue.type) {
63
64
  case 'int':
64
65
  case 'float':
@@ -68,10 +69,10 @@ export function deserializeValue(stackValue) {
68
69
  case 'null':
69
70
  return null;
70
71
  case 'array':
71
- return stackValue.value.map((v) => deserializeValue(v));
72
+ return stackValue.value.map((v, i) => deserializeValue(v, `${path}[${i}]`));
72
73
  case 'record':
73
74
  return Object.entries(stackValue.value).reduce((acc, [k, v]) => {
74
- acc[k] = deserializeValue(v);
75
+ acc[k] = deserializeValue(v, `${path}${pathSegmentForKey(k)}`);
75
76
  return acc;
76
77
  }, {});
77
78
  case 'instant':
@@ -81,19 +82,19 @@ export function deserializeValue(stackValue) {
81
82
  case 'zoned_datetime':
82
83
  return Temporal.ZonedDateTime.from(stackValue.value);
83
84
  default:
84
- throw new Error(`Unknown stack value type: ${stackValue.type}`);
85
+ throw new Error(`Unknown stack value type: ${stackValue.type}${path ? ` at path: ${path}` : ''}`);
85
86
  }
86
87
  }
87
88
  /**
88
89
  * Serialize an array of values (stack)
89
90
  */
90
- export function serializeStack(stack) {
91
- return stack.map((value) => serializeValue(value));
91
+ export function serializeStack(stack, pathPrefix = '') {
92
+ return stack.map((value, i) => serializeValue(value, `${pathPrefix}[${i}]`));
92
93
  }
93
94
  /**
94
95
  * Deserialize an array of StackValues (stack)
95
96
  */
96
- export function deserializeStack(stackValues) {
97
- return stackValues.map((value) => deserializeValue(value));
97
+ export function deserializeStack(stackValues, pathPrefix = '') {
98
+ return stackValues.map((value, i) => deserializeValue(value, `${pathPrefix}[${i}]`));
98
99
  }
99
100
  //# sourceMappingURL=serializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/websocket/serializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/websocket/serializer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forthix/forthic",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Stack-based, concatenative language for composable transformations - TypeScript/JavaScript runtime",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -32,6 +32,18 @@
32
32
  "import": "./dist/esm/grpc/browser-stub.js",
33
33
  "require": "./dist/cjs/grpc/browser-stub.js"
34
34
  }
35
+ },
36
+ "./jsonrpc": {
37
+ "node": {
38
+ "import": "./dist/esm/jsonrpc/index.js",
39
+ "require": "./dist/cjs/jsonrpc/index.js",
40
+ "types": "./dist/cjs/jsonrpc/index.d.ts"
41
+ },
42
+ "default": {
43
+ "types": "./dist/cjs/jsonrpc/browser-stub.d.ts",
44
+ "import": "./dist/esm/jsonrpc/browser-stub.js",
45
+ "require": "./dist/cjs/jsonrpc/browser-stub.js"
46
+ }
35
47
  }
36
48
  },
37
49
  "files": [
@@ -54,7 +66,8 @@
54
66
  "test:integration": "jest --testPathIgnorePatterns=[]",
55
67
  "test:watch": "jest --watch",
56
68
  "docs:build": "tsx scripts/generate-docs.ts",
57
- "grpc:server": "node dist/cjs/grpc/server.js"
69
+ "grpc:server": "node dist/cjs/grpc/server.js",
70
+ "jsonrpc:server": "node dist/cjs/jsonrpc/server.js"
58
71
  },
59
72
  "keywords": [
60
73
  "forthic",