@naanlang/naan 1.5.0 → 1.6.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 (44) hide show
  1. package/LICENSE.md +2 -2
  2. package/README.md +2 -2
  3. package/bin/index.js +7 -3
  4. package/dist/env_web.js +162 -20
  5. package/dist/naan.min.js +5 -5
  6. package/frameworks/browser/https_request.nlg +2 -2
  7. package/frameworks/browser/sworker.js +28 -26
  8. package/frameworks/browser/terminals.nlg +329 -693
  9. package/frameworks/browser/worker.nlg +255 -0
  10. package/frameworks/browser/workers.nlg +5 -5
  11. package/frameworks/browser/ws_client.nlg +15 -10
  12. package/frameworks/client/apiclient.nlg +181 -9
  13. package/frameworks/client/relaycon.nlg +87 -161
  14. package/frameworks/common/events.nlg +101 -0
  15. package/frameworks/common/repltools.nlg +80 -1
  16. package/frameworks/node/apiserver.nlg +39 -246
  17. package/frameworks/node/filesystem.nlg +31 -6
  18. package/frameworks/node/http_request.nlg +34 -13
  19. package/frameworks/node/https_request.nlg +8 -3
  20. package/frameworks/node/node.nlg +2 -0
  21. package/frameworks/node/pty.nlg +346 -0
  22. package/frameworks/node/worker.nlg +409 -539
  23. package/frameworks/node/ws_client.nlg +2 -2
  24. package/frameworks/project/build.nlg +1 -1
  25. package/frameworks/project/projects.nlg +1 -1
  26. package/frameworks/running/debugnub.nlg +17 -4
  27. package/frameworks/running/executors.nlg +27 -274
  28. package/frameworks/running/instances.nlg +393 -0
  29. package/frameworks/running/remote_req.nlg +143 -0
  30. package/frameworks/running/remote_res.nlg +89 -0
  31. package/frameworks/running/taskexec.nlg +2 -2
  32. package/frameworks/service/imp.nlg +736 -0
  33. package/frameworks/service/model.nlg +71 -0
  34. package/frameworks/service/nubnode.nlg +105 -0
  35. package/frameworks/service/nubweb.nlg +106 -0
  36. package/frameworks/service/service.nlg +28 -0
  37. package/lib/browser/env_web.js +169 -27
  38. package/lib/browser/env_webworker.js +91 -4
  39. package/lib/core/naanlib.js +5 -5
  40. package/lib/env_node.js +184 -8
  41. package/lib/env_nodeworker.js +74 -1
  42. package/package.json +1 -1
  43. package/plugins/serviceNexara/speechrec.nlg +10 -6
  44. package/test/test_02_context.nlg +24 -1
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
- **NaaN for NPM** version **1.5.0+1** is released under the MIT License:
1
+ **NaaN for NPM** version **1.6.0+1** is released under the MIT License:
2
2
 
3
- Copyright (c) 2017-2025 Zulch Laboratories, Inc.
3
+ Copyright (c) 2017-2026 Zulch Laboratories, Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
  NaaN is an async-first software platform for rapid development.
5
5
 
6
6
  #### Release:
7
-      **NaaN for NPM** version **1.5.0+1**
8
-      Copyright (c) 2017-2025 Zulch Laboratories, Inc.
7
+      **NaaN for NPM** version **1.6.0+1**
8
+      Copyright (c) 2017-2026 Zulch Laboratories, Inc.
9
9
 
10
10
  #### Features
11
11
  - **NaaN** runs in NodeJS and web browsers using JavaScript
package/bin/index.js CHANGED
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * column positioning: // // !
9
9
  *
10
- * Copyright (c) 2021-2025 by Richard C. Zulch
10
+ * Copyright (c) 2021-2026 by Richard C. Zulch
11
11
  *
12
12
  */
13
13
 
@@ -40,6 +40,10 @@ var cmd_text = ""
40
40
  + `App.naanpath = '${ naanpath.replace(/\\/g, "\\\\") }';;\n` // path/to/our naan library
41
41
  + `App.rootpath = '${ rootpath.replace(/\\/g, "\\\\") }';;\n` // path/to/our package.json
42
42
  + "Naan.module.defineLoc('naanlib', App.naanpath);;\n" // defines "naanlib:" prefix for require
43
+ + "App.imp = require('naanlib:frameworks/service/imp.nlg').Imp({\n" // create an initial IMP, even if not useful
44
+ + " name: 'NaaN'\n"
45
+ + " type: 'cli-tool'\n"
46
+ + "});;\n"
43
47
  + "nodeparse('lib/node_repl_init.nlg');;\n" // REPL utility functions
44
48
  + "App.shell = require('naanlib:frameworks/node/shell.nlg').ShellConnect({ cwd: js.d });;\n";
45
49
 
@@ -69,11 +73,11 @@ process.argv.every((val, index) => {
69
73
  return (true);
70
74
  }
71
75
  if (val == "--version") {
72
- console.log("1.5.0");
76
+ console.log("1.6.0");
73
77
  process.exit(0);
74
78
  }
75
79
  if (val == "--buildno") {
76
- console.log("1.5.0+1");
80
+ console.log("1.6.0+1");
77
81
  process.exit(0);
78
82
  }
79
83
  if (val.substring(0,1) == "-") {
package/dist/env_web.js CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * column positioning: // // !
8
8
  *
9
- * Copyright (c) 2017-2024 by Richard C. Zulch
9
+ * Copyright (c) 2017-2026 by Richard C. Zulch
10
10
  *
11
11
  */
12
12
 
@@ -69,6 +69,7 @@ exports.NaanControllerWeb = function() {
69
69
 
70
70
  var naanlib = new exports.Naanlib();
71
71
  var dontSaveUntilWorking; // true when state loaded, must be reset to save state again
72
+ var dontSave; // true to avoid saving, i.e. in debugger
72
73
  var contSelf = this; // this is us, for access within nested functions
73
74
  exports.naancon = this; // access to this instance
74
75
  contSelf.anaan = naanlib.js.n;
@@ -93,8 +94,8 @@ exports.NaanControllerWeb = function() {
93
94
  function termTextOut(text, level) {
94
95
  if (!text)
95
96
  return;
96
- if (termlist.length === 0) {
97
- console.log(text); // make sure we can see early errors
97
+ if (termlist.length === 0) { // make sure we can see early errors
98
+ console.log(text.replace(/(?:\x1B[@-Z\\-_]|\x1B\[[0-?]*[ -/]*[@-~])/g, ''));
98
99
  if (!replqueue)
99
100
  replqueue = [];
100
101
  replqueue.push({text:text, level:level});
@@ -137,7 +138,7 @@ exports.NaanControllerWeb = function() {
137
138
 
138
139
 
139
140
  //==========================================================================
140
- // New Terminal Interface
141
+ // Direct Terminal Interface
141
142
  //--------------------------------------------------------------------------
142
143
 
143
144
  //
@@ -170,6 +171,7 @@ exports.NaanControllerWeb = function() {
170
171
  if (repdex < 0)
171
172
  termlist.push(terminal);
172
173
  takePending(); // output all pending terminal messages
174
+ this.ioctl_event("term-attach", "");
173
175
  };
174
176
 
175
177
  //
@@ -184,6 +186,7 @@ exports.NaanControllerWeb = function() {
184
186
  termlist.splice(repdex, 1);
185
187
  if (termlist.length === 0)
186
188
  replstate = terminal.StateSave(); // save ultimate repl state
189
+ this.ioctl_event("term-detach", "");
187
190
  };
188
191
 
189
192
  //
@@ -339,13 +342,14 @@ exports.NaanControllerWeb = function() {
339
342
  function ConsoleDebugTerminal() {
340
343
  var termSelf = this;
341
344
  //
342
- // OnMessageOut
345
+ // OnMessage
343
346
  //
344
347
  this.OnMessage = function OnMessage(msg) {
348
+ var text = msg.text.replace(/(?:\x1B[@-Z\\-_]|\x1B\[[0-?]*[ -/]*[@-~])/g, '');
345
349
  if (msg.id == "debugtext")
346
- console.log("dbug-" + msg.level + " " + msg.text);
350
+ console.log("dbug-" + msg.level + " " + text);
347
351
  else if (msg.id == "textout")
348
- console.log(msg.text);
352
+ console.log(text);
349
353
  };
350
354
  //
351
355
  // cmd
@@ -391,25 +395,31 @@ exports.NaanControllerWeb = function() {
391
395
  exports.debug = debug;
392
396
 
393
397
  //==========================================================================
394
- // Clone Debug Interface
398
+ // MessageTerminal
395
399
  //--------------------------------------------------------------------------
396
400
 
397
- function CloneDebugTerminal()
401
+ function MessageTerminal(windest, origin)
398
402
  {
399
403
  var termSelf = this;
400
404
  //
401
405
  // listen for messages
402
406
  //
403
407
  window.addEventListener("message", function (event) {
404
- if (event.origin !== window.origin)
408
+ if (origin && event.origin !== origin)
405
409
  return; // only talk with our peers
406
410
  var msg = event.data;
411
+ if (msg.scope != "naan-env-web")
412
+ return;
407
413
  if (msg.id == "interrupt")
408
414
  contSelf.Interrupt();
409
415
  else if (msg.id == "keyline")
410
416
  contSelf.Return(msg.text, termSelf); // keyboard text from terminal
411
- else if (msg.id == "start")
412
- contSelf.Attach(term); // opener is ready
417
+ else if (msg.id == "typed")
418
+ echoTyped(msg.text);
419
+ else if (msg.id == "attached")
420
+ contSelf.Attach(messageTerm); // start using the terminal
421
+ else if (msg.id == "detached")
422
+ contSelf.Detach(messageTerm); // done using the terminal
413
423
  else if (msg.id == "import")
414
424
  { // for workers
415
425
  }
@@ -423,13 +433,16 @@ exports.NaanControllerWeb = function() {
423
433
  if (debugListener)
424
434
  debugListener(msg.data); // target received a message
425
435
  }
436
+ else if (msg.id == "ioctl-event")
437
+ contSelf.ioctl_event(msg.msg, msg.arg);
426
438
  });
427
439
 
428
440
  //
429
441
  // report messages back to opener
430
442
  //
431
443
  termSelf.OnMessage = function OnMessage(msg) {
432
- window.opener.postMessage(msg, window.origin);
444
+ msg.scope = "naan-env-web";
445
+ windest.postMessage(msg, origin);
433
446
  return (msg);
434
447
  };
435
448
 
@@ -437,7 +450,7 @@ exports.NaanControllerWeb = function() {
437
450
  // report messages back to opener
438
451
  //
439
452
  termSelf.OnMessageOut = function OnMessageOut(data) {
440
- var msg = { // target is sending debug data
453
+ var msg = { // target is sending debug data
441
454
  id: "targetout",
442
455
  data: data
443
456
  };
@@ -448,7 +461,7 @@ exports.NaanControllerWeb = function() {
448
461
  // report debug messages back to opener
449
462
  //
450
463
  termSelf.OnDebugOut = function OnDebugOut(data) {
451
- var msg = { // target is sending debug data
464
+ var msg = { // target is sending debug data
452
465
  id: "debugout",
453
466
  data: data
454
467
  };
@@ -459,14 +472,129 @@ exports.NaanControllerWeb = function() {
459
472
  // report status back to opener
460
473
  //
461
474
  termSelf.OnStatus = function OnStatus(status) {
462
- var msg = { // target is sending debug data
475
+ var msg = { // target is sending debug data
463
476
  id: "status",
464
477
  status: status
465
478
  };
466
479
  return (termSelf.OnMessage(msg));
467
480
  };
481
+
482
+ //
483
+ // stub to ignore call
484
+ //
485
+ termSelf.StateSave = function StateSave() {
486
+ return (false);
487
+ };
488
+
489
+ //
490
+ // send ioctl back to terminal
491
+ //
492
+ termSelf.ioctl = function ioctl(op, arg) {
493
+ var msg = {
494
+ id: "ioctl",
495
+ op: op,
496
+ arg: arg
497
+ };
498
+ return (termSelf.OnMessage(msg));
499
+ };
500
+
501
+ listen_all.push(function(imsg, arg) {
502
+ var msg = { // target is sending ioctl event
503
+ id: "ioctl_event",
504
+ msg: imsg,
505
+ arg: arg
506
+ };
507
+ return (termSelf.OnMessage(msg));
508
+ });
468
509
  }
469
510
 
511
+ //==========================================================================
512
+ // ioctl terminal control
513
+ //--------------------------------------------------------------------------
514
+
515
+ var listen_all = [];
516
+ var listeners = { };
517
+ var ioctl_callback;
518
+
519
+ //
520
+ // ioctl_open
521
+ //
522
+ // A terminal controller is now open on our instance.
523
+ //
524
+
525
+ this.ioctl_open = function ioctl_open(callback) {
526
+ ioctl_callback = callback;
527
+ return (true);
528
+ };
529
+
530
+ //
531
+ // ioctl_close
532
+ //
533
+ // The terminal controller is no longer open on our instance.
534
+ //
535
+
536
+ this.ioctl_close = function ioctl_close() {
537
+ ioctl_callback = false;
538
+ return (true);
539
+ };
540
+
541
+ //
542
+ // ioctl_event
543
+ //
544
+ // Events incoming from terminal.
545
+ //
546
+
547
+ this.ioctl_event = function ioctl_event(msg, arg) {
548
+ listen_all.forEach(function(proc) {
549
+ proc(msg, arg);
550
+ });
551
+ if (listeners[msg])
552
+ listeners[msg].forEach(function(proc) {
553
+ proc(msg, arg);
554
+ });
555
+ };
556
+
557
+ //
558
+ // ioctl_add_listener
559
+ // ioctl_remove_listener
560
+ //
561
+ // Add a listener for a terminal event.
562
+ //
563
+
564
+ this.ioctl_add_listener = function ioctl_add_listener(msg, proc) {
565
+ if (typeof(msg) != "string" || typeof(proc) != "function")
566
+ return (false);
567
+ this.ioctl_remove_listener(msg, proc);
568
+ if (!listeners[msg])
569
+ listeners[msg] = [];
570
+ listeners[msg].push(proc);
571
+ return (true);
572
+ };
573
+
574
+ this.ioctl_remove_listener = function ioctl_remove_listener(msg, proc) {
575
+ if (typeof(msg) != "string" || typeof(proc) != "function")
576
+ return (false);
577
+ if (listeners[msg]) {
578
+ var index = listeners[msg].indexOf(proc);
579
+ if (index >= 0)
580
+ listeners[msg].splice(index, 1);
581
+ }
582
+ return (true);
583
+ };
584
+
585
+ //
586
+ // ioctl
587
+ //
588
+ // Control of terminals (and their controller.)
589
+ //
590
+
591
+ this.ioctl = function ioctl(op, arg) {
592
+ if (ioctl_callback)
593
+ ioctl_callback(op, arg);
594
+ messageTerm.ioctl(op, arg);
595
+ return (true);
596
+ };
597
+
470
598
  //==========================================================================
471
599
  // Host Environment
472
600
  //--------------------------------------------------------------------------
@@ -501,6 +629,16 @@ exports.NaanControllerWeb = function() {
501
629
  dontSaveUntilWorking = false;
502
630
  };
503
631
 
632
+ //
633
+ // Saving
634
+ //
635
+ // Turn state saving on or off; on by default.
636
+ //
637
+
638
+ this.Saving = function Saving(onOff) {
639
+ dontSave = !onOff;
640
+ };
641
+
504
642
  window.document.addEventListener("visibilitychange", function (e) {
505
643
  virtualVisibilityChange();
506
644
  if (window.document.visibilityState == "hidden") {
@@ -550,8 +688,12 @@ exports.NaanControllerWeb = function() {
550
688
  localStorage.removeItem("NaanState_Hosted");
551
689
  return (false);
552
690
  }
691
+ if (dontSave)
692
+ return (false); // not saving right now
553
693
  if ("nosave" in querystrings)
554
694
  return (false);
695
+ if (window.opener)
696
+ return (false); // don't save running under NaanIDE
555
697
  var statedoc = makeState();
556
698
  var statestr = JSON.stringify(statedoc);
557
699
  try {
@@ -655,11 +797,11 @@ exports.NaanControllerWeb = function() {
655
797
 
656
798
  if (window.opener) {
657
799
  virtualOpen();
658
- var term = new CloneDebugTerminal();
659
- term.OnMessage({
660
- id: "loaded"
661
- });
662
800
  }
801
+ var messageTerm = new MessageTerminal(window, window.origin);
802
+ messageTerm.OnMessage({
803
+ id: "loaded"
804
+ });
663
805
  };
664
806
 
665
807
  /*jshint sub:true */