On this page
Overview
Maps native terminal sessions and Arcane events into an EventTarget client.
- Artifact
TerminalClient.js· esm - Classification
public first party - Availability
Native bridge - Normalization
Client events/state normalized; native result/error mixed.
Import and lifecycle
import * as module from '/arcane/modules/TerminalClient.js';
Construction subscribes to three Arcane event channels and tracks sessions. start/close mutate the in-memory session map around Core calls; destroy() invokes subscription disposers but does not close sessions.
Application-facing behavior: Event/error/reason constants; default TerminalClient; start/write/resize/signal/close/receive/destroy APIs and state-free EventTarget/on terminal compatibility.
Protocol and host implementation
Arcane.terminal host transport projected once through the per-realm globalThis.arcaneEvents authority This detail does not widen the application-facing API or grant authority.
Exports, signatures, parameters, and results
| Binding | Form | Declaration or signature | Parameter syntax |
|---|---|---|---|
TERMINAL_CLIENT_EVENT_TYPES | variable · value | variable TERMINAL_CLIENT_EVENT_TYPES | — |
TERMINAL_CLIENT_ERROR_CODES | variable · value | variable TERMINAL_CLIENT_ERROR_CODES | — |
TERMINAL_CLIENT_REASONS | variable · value | variable TERMINAL_CLIENT_REASONS | — |
default | default · class | class TerminalClient extends EventTarget | — |
| Member | Kind | Exact public declaration | Parameter syntax |
|---|---|---|---|
TerminalClient.constructor | constructor | constructor(api=globalThis.Arcane?.terminal) | api=globalThis.Arcane?.terminal |
TerminalClient.addEventListener | method | addEventListener(type,listener,options) | type,listener,options |
TerminalClient.removeEventListener | method | removeEventListener(type,listener,options) | type,listener,options |
TerminalClient.on | method | on(type,listener,options) | type,listener,options |
TerminalClient.subscribe | method | subscribe(type,listener,options) | type,listener,options |
TerminalClient.dispatchEvent | method | dispatchEvent(value) | value |
TerminalClient.available | get | get available() | — |
TerminalClient.start | async method | async start(options={}) | options={} |
TerminalClient.write | async method | async write(id,data) | id,data |
TerminalClient.resize | async method | async resize(id,columns,rows) | id,columns,rows |
TerminalClient.signal | async method | async signal(id,signal='interrupt') | id,signal='interrupt' |
TerminalClient.close | async method | async close(id) | id |
TerminalClient.receive | method | receive(type,data={}) | type,data={} |
TerminalClient.emit | method | emit(type,detail) | type,detail |
TerminalClient.destroy | method | destroy() | — |
TerminalClient.dispose | method | dispose() | — |
Parameter meanings and results
new TerminalClient(api=Arcane.terminal); available getter; start(options) resolves TerminalSession; write(id,data), resize(id,columns,rows), signal(id,signal='interrupt'), close(id) resolve provider results; receive(type,data) maps Core notifications; destroy().
Events, side effects, and errors
Source-literal CustomEvent dispatches
No source-literal CustomEvent dispatch is part of this artifact.
Lifecycle and event flow
- terminal-session with {session}
- terminal-output with data
- terminal-exit with {...data,session}
- terminal-error with data
Direct coded failures
This artifact directly assigns no stable coded failure.
Exported Error subclasses
This artifact exports no Error subclass.
Documented failure behavior
- Uncoded unavailable Error from start().
- TerminalSession validation errors.
- Core/provider rejections are preserved.
Availability and capabilities
Native bridge. Client events/state normalized; native result/error mixed.
The five client calls start/write/resize/signal/close require terminal.execute and are Terminal-app-only. Canonical Android projects six Core methods, adding terminal.list(), which this client does not wrap.
Contract example
import TerminalClient from '/arcane/modules/TerminalClient.js';
const terminal = new TerminalClient();
if (!terminal.available) throw new Error('Native terminal unavailable.');
terminal.addEventListener('terminal-output', event => console.log(event.detail.data));
const session = await terminal.start({shell:'auto',columns:100,rows:30});
await terminal.write(session.id,'node --version\n');