# Moterm example application

`moterm_example_app` is an example application that embeds
[Moterm](../../apps/moterm), uses it to provide a prompt, and allows it to be
connected to other applications (which should provide the
`mojo.terminal.TerminalClient` service).

## Running

On Linux, run it in the usual way, e.g.:

    $ mojo/devtools/common/mojo_run --enable-multiprocess "mojo:window_manager mojo:moterm_example_app"

You'll probably need to click on the window to give it keyboard focus. You may
also want to resize the window (especially horizontally) to make it bigger.

At the `:)` prompt, you may enter the URL for any application providing the
`mojo.terminal.TerminalClient` service.

### Example 1: Dart netcat

An example of a terminal client application written in Dart is `dart_netcat`:

    :) mojo:dart_netcat

At this point, the terminal's input/output is transferred to the specified
application. In this case, it just outputs a help message and closes the
terminal, returning you to the `:)` prompt. You may also try:

    :) mojo:dart_netcat?localhost&port=80

In this case, `mojo:dart_netcat` will make a TCP connection to the specified
host/port. Assuming you have a web server running on your machine, you may try
entering:

    GET /

(It's probably a bug in `mojo:dart_netcat` that it doesn't close the terminal
"file". You can press Control-D to return to the `:)` prompt. The unhandled Dart
exception after you press Control-D is definitely a bug.)

### Example 2: Running native console applications

The `native_support` service supports running native (Linux) applications. The
`native_run_app` application provides a terminal client front-end:

    :) mojo:native_run_app

At its `>>>` prompt, you can enter name of a native application. E.g.:

    >>> bash
    $ echo hello linux
    hello linux
    $

### Example 3: JavaScript REPL

A terminal client application (written in JavaScript, using the JavaScript
content handler) that provides a JavaScript REPL:

    :) file:///path/to/src/examples/js/repl.js

At its `>` prompt, you can enter JavaScript expressions. E.g.:

    > function add(x, y) { return x + y; }
    undefined
    > add("hello ", 123)
    "hello 123"
    >

## See also

* [//apps/moterm](../../apps/moterm)
* [//examples/dart/netcat](../dart/netcat)
* [//examples/native_run_app](../native_run_app)
* [//examples/js/repl.js](../js/repl.js)
