94
};
95
}
97
>
export const enum RequestInitiator {
98
>
LocalSide = 0,
99
>
OtherSide = 1
100
>
}
101
>
102
>
export const enum ResponsiveState {
103
>
Responsive = 0,
104
>
Unresponsive = 1
105
>
}
106
>
107
>
export interface IRPCProtocolLogger {
108
>
logIncoming(msgLength: number, req: number, initiator: RequestInitiator, str: string, data?: any): void;
109
>
logOutgoing(msgLength: number, req: number, initiator: RequestInitiator, str: string, data?: any): void;
110
>
}
111
>
112
>
const noop = () => { };
113
>
114
>
const _RPCProtocolSymbol = Symbol.for('rpcProtocol');
115
>
const _RPCProxySymbol = Symbol.for('rpcProxy');
116
>
117
>
export class RPCProtocol extends Disposable implements IRPCProtocol {
118
>
119
>
[_RPCProtocolSymbol] = true;
120
>
121
>
private static readonly UNRESPONSIVE_TIME = 3 * 1000; // 3s
122
>
123
>
private readonly _onDidChangeResponsiveState: Emitter<ResponsiveState> = this._register(new Emitter<ResponsiveState>());
124
>
public readonly onDidChangeResponsiveState: Event<ResponsiveState> = this._onDidChangeResponsiveState.event;
125
>
126
>
private readonly _protocol: IMessagePassingProtocol;
127
>
private readonly _logger: IRPCProtocolLogger | null;
128
>
private readonly _uriTransformer: IURITransformer | null;
129
>
private readonly _uriReplacer: JSONStringifyReplacer | null;
130
>
private _isDisposed: boolean;
131
>
private readonly _locals: any[];
132
>
private readonly _proxies: any[];
133
>
private _lastMessageId: number;
134
>
private readonly _cancelInvokedHandlers: { [req: string]: () => void };
135
>
private readonly _pendingRPCReplies: { [msgId: string]: PendingRPCReply };
136
>
private _responsiveState: ResponsiveState;
137
>
private _unacknowledgedCount: number;
138
>
private _unresponsiveTime: number;
139
>
private _asyncCheckUresponsive: RunOnceScheduler;
140
>
141
>
constructor(protocol: IMessagePassingProtocol, logger: IRPCProtocolLogger | null = null, transformer: IURITransformer | null = null) {
142
super();
143
this._protocol = protocol;