Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@rushstack/rush-daemon-protocol",
"comment": "Add request-scoped stdin, raw-mode control, and terminal fallback contracts.",
"type": "minor"
}
],
"packageName": "@rushstack/rush-daemon-protocol",
"email": "mojazayeri@users.noreply.github.com"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@rushstack/rush-daemon-transport",
"comment": "Serialize and backpressure asynchronous incoming frame handlers.",
"type": "minor"
}
],
"packageName": "@rushstack/rush-daemon-transport",
"email": "mojazayeri@users.noreply.github.com"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@rushstack/rush-daemon",
"comment": "Route request-scoped interactive input and signal PTY-only in-process fallback.",
"type": "minor"
}
],
"packageName": "@rushstack/rush-daemon",
"email": "mojazayeri@users.noreply.github.com"
}
83 changes: 81 additions & 2 deletions common/reviews/api/rush-daemon-protocol.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ export const DAEMON_CONTROL_MESSAGE_KINDS: readonly [
'unsubscribe',
'ping',
'pong',
'error'
'error',
'setRawMode',
'rawModeChanged',
'terminalPolicy'
];

// @beta
Expand All @@ -43,14 +46,17 @@ export const DAEMON_EVENT_TYPES: readonly [
'extension'
];

// @beta
export const DAEMON_INTERACTIVE_IO_PROTOCOL_MINOR: number;

// @beta
export const DAEMON_PROTOCOL_VERSION: IDaemonProtocolVersion;

// @beta
export type DaemonCommandOutcome = 'success' | 'success-with-warning' | 'failure' | 'aborted';

// @beta
export type DaemonControlMessage = IDaemonHelloMessage | IDaemonHelloAckMessage | IDaemonSubscribeMessage | IDaemonUnsubscribeMessage | IDaemonPingMessage | IDaemonPongMessage | IDaemonErrorMessage;
export type DaemonControlMessage = IDaemonHelloMessage | IDaemonHelloAckMessage | IDaemonSubscribeMessage | IDaemonUnsubscribeMessage | IDaemonPingMessage | IDaemonPongMessage | IDaemonErrorMessage | IDaemonSetRawModeMessage | IDaemonRawModeChangedMessage | IDaemonTerminalPolicyMessage;

// @beta
export type DaemonControlMessageKind = (typeof DAEMON_CONTROL_MESSAGE_KINDS)[number];
Expand Down Expand Up @@ -115,6 +121,15 @@ export class DaemonProtocolError extends Error {
// @beta
export type DaemonProtocolErrorCode = 'frameTooLarge' | 'unknownFrameType' | 'malformedPayload' | 'malformedControlMessage' | 'protocolVersionMismatch';

// @beta
export type DaemonTerminalPolicyDecision = 'runInDaemon' | 'requiresInProcess';

// @beta
export type DaemonTerminalPolicyReason = 'controllingTerminalRequired';

// @beta
export type DaemonTerminalRequirement = 'none' | 'interactiveInput' | 'controllingTerminal';

// @beta
export type DaemonVerbosity = 'quiet' | 'normal' | 'verbose' | 'debug';

Expand All @@ -127,6 +142,9 @@ export function decodeDaemonEventFrame(payload: Uint8Array): IDaemonEventEnvelop
// @beta
export function decodeDaemonLogChunk(payload: Uint8Array): IDaemonLogChunk;

// @beta
export function decodeDaemonStdinChunk(payload: Uint8Array): IDaemonStdinChunk;

// @beta
export const DEFAULT_MAX_PAYLOAD_BYTES: number;

Expand All @@ -145,6 +163,9 @@ export function encodeDaemonFrames(frames: readonly IDaemonFrame[]): Uint8Array[
// @beta
export function encodeDaemonLogChunk(log: IDaemonLogChunk): Uint8Array;

// @beta
export function encodeDaemonStdinChunk(input: IDaemonStdinChunk): Uint8Array;

// @beta
export const FRAME_HEADER_BYTES: number;

Expand All @@ -159,6 +180,7 @@ export interface IDaemonClientCaps {
readonly colorLevel?: number;
readonly columns?: number;
readonly isTTY: boolean;
readonly supportsInteractiveIO?: boolean;
readonly verbosity?: DaemonVerbosity;
}

Expand Down Expand Up @@ -314,11 +336,13 @@ export interface IDaemonPhasedOperationSelection {

// @beta
export interface IDaemonPhasedRequest {
readonly acceptsStdin?: boolean;
readonly commandName: string;
readonly engineShape: IDaemonPhasedEngineShape;
readonly environment: Readonly<Record<string, string>>;
readonly operationSelection: ReadonlyArray<IDaemonPhasedOperationSelection>;
readonly requestId: string;
readonly terminalRequirement?: DaemonTerminalRequirement;
}

// @beta
Expand Down Expand Up @@ -359,6 +383,34 @@ export interface IDaemonProtocolVersion {
readonly minor: number;
}

// @beta
export interface IDaemonRawModeChangedMessage {
// (undocumented)
readonly kind: 'rawModeChanged';
// (undocumented)
readonly payload: {
readonly enabled: boolean;
readonly requestId: string;
};
}

// @beta
export interface IDaemonSetRawModeMessage {
// (undocumented)
readonly kind: 'setRawMode';
// (undocumented)
readonly payload: {
readonly enabled: boolean;
readonly requestId: string;
};
}

// @beta
export interface IDaemonStdinChunk {
readonly chunk: Uint8Array;
readonly requestId: string;
}

// @beta
export interface IDaemonSubscribeMessage {
// (undocumented)
Expand All @@ -367,6 +419,24 @@ export interface IDaemonSubscribeMessage {
readonly payload: IDaemonClientCaps;
}

// @beta
export interface IDaemonTerminalPolicyMessage {
// (undocumented)
readonly kind: 'terminalPolicy';
// (undocumented)
readonly payload: IDaemonTerminalPolicyResult;
}

// @beta
export interface IDaemonTerminalPolicyResult {
// (undocumented)
readonly decision: DaemonTerminalPolicyDecision;
// (undocumented)
readonly reason?: DaemonTerminalPolicyReason;
// (undocumented)
readonly requestId: string;
}

// @beta
export interface IDaemonUnsubscribeMessage {
// (undocumented)
Expand Down Expand Up @@ -411,6 +481,9 @@ export const LENGTH_FIELD_OFFSET: number;
// @beta
export const MAX_OPERATION_ID_BYTES: number;

// @beta
export const MAX_REQUEST_ID_BYTES: number;

// @beta
export function negotiateDaemonHello(hello: IDaemonHelloMessage, localVersion: IDaemonProtocolVersion, sessionId: string): DaemonHandshakeOutcome;

Expand All @@ -430,6 +503,12 @@ export class ProtocolVersionMismatchError extends DaemonProtocolError {
readonly expectedMajor: number;
}

// @beta
export const REQUEST_ID_LENGTH_BYTES: number;

// @beta
export const REQUEST_ID_LENGTH_OFFSET: number;

// @beta
export const RUSHD_EXTENSION_NAMESPACE: 'rushd';

Expand Down
2 changes: 1 addition & 1 deletion common/reviews/api/rush-daemon-transport.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class DaemonFrameConnection {
constructor(socket: net.Socket);
closeAsync(): Promise<void>;
onClosed(handler: (error: Error | undefined) => void): void;
onFrame(handler: (frame: IDaemonFrame) => void): void;
onFrame(handler: (frame: IDaemonFrame) => void | Promise<void>): void;
sendFrameAsync(frame: IDaemonFrame): Promise<void>;
// @internal
get socket(): net.Socket;
Expand Down
Loading