blob: 91742de8aab2046f4d0b5951ff119c4946abd027 [file] [view]
# JS Life cycle
The [hterm.js] code will initialize defaults for the various objects. You can
override them yourself before you instantiate anything.
An `hterm.Terminal` instance is created and initialization code attached to
`onTerminalReady`. That callback creates a new `hterm.Terminal.IO` object by
calling `this.io.push`, and then binding its callbacks. Finally the terminal
is attached to the DOM via a call to `decorate`. The terminal is now ready to
accept data.
In order for the terminal itself to handle keyboard shortcuts and such, a call
to `installKeyboard` is made. This binds all the relevant input callbacks to
be captured by hterm. It will handle things like pressing "X" and "Ctrl+X" and
sending the resulting data to the IO object.
At this point, all data runs through the IO object created earlier. When the
user inputs text (typing on the keyboard, pasting, etc...), the IO callbacks
are called such as `sendString` and `onVTKeystroke`. The data is then sent to
the remote process (via network socket/whatever). When new data is available
from the remote process, it is passed to the IO object via the `print` or
`println` functions. The logic to communicate with the remote process is left
entirely in the hands of the developer and is outside the scope of hterm.
Drilling down a bit, user input is processed first by `hterm.Keyboard`. It
looks up the keypress in `hterm.Keyboard.KeyMap` (for the default action), and
the keybindings in `hterm.Keyboard.Bindings` (for user/custom actions). The
resolved action is then performed. If it expands into text (as most do), it
is sent to the IO object callbacks (`sendString` and `onVTKeystroke`). Or it
might trigger an action in which case it is called.
When data is printed to the IO object, it is sent to the terminal's VT layer to
be interpreted (control sequences and such).
As new lines are generated in the VT layer, they're sent to `hterm.Terminal`
which adds to the active `hterm.Screen`, and any excess lines are moved to the
terminal's scrollback. When the user scrolls the output, `hterm.ScrollPort`
loads rows on the fly from `hterm.Terminal` (as a "RowProvider").
[hterm.js]: ../../js/hterm.js