Capability first · transport second

TerminalClient.js

Maps native terminal sessions and Arcane events into an EventTarget client.

SDK 0.5.18Runtime 0.8.12Protocol arcane/1
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

JavaScript
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

BindingFormDeclaration or signatureParameter syntax
TERMINAL_CLIENT_EVENT_TYPESvariable · valuevariable TERMINAL_CLIENT_EVENT_TYPES
TERMINAL_CLIENT_ERROR_CODESvariable · valuevariable TERMINAL_CLIENT_ERROR_CODES
TERMINAL_CLIENT_REASONSvariable · valuevariable TERMINAL_CLIENT_REASONS
defaultdefault · classclass TerminalClient extends EventTarget
MemberKindExact public declarationParameter syntax
TerminalClient.constructorconstructorconstructor(api=globalThis.Arcane?.terminal)api=globalThis.Arcane?.terminal
TerminalClient.addEventListenermethodaddEventListener(type,listener,options)type,listener,options
TerminalClient.removeEventListenermethodremoveEventListener(type,listener,options)type,listener,options
TerminalClient.onmethodon(type,listener,options)type,listener,options
TerminalClient.subscribemethodsubscribe(type,listener,options)type,listener,options
TerminalClient.dispatchEventmethoddispatchEvent(value)value
TerminalClient.availablegetget available()
TerminalClient.startasync methodasync start(options={})options={}
TerminalClient.writeasync methodasync write(id,data)id,data
TerminalClient.resizeasync methodasync resize(id,columns,rows)id,columns,rows
TerminalClient.signalasync methodasync signal(id,signal='interrupt')id,signal='interrupt'
TerminalClient.closeasync methodasync close(id)id
TerminalClient.receivemethodreceive(type,data={})type,data={}
TerminalClient.emitmethodemit(type,detail)type,detail
TerminalClient.destroymethoddestroy()
TerminalClient.disposemethoddispose()

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

JavaScript
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');