-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathClientRequest.ts
90 lines (80 loc) · 2.26 KB
/
ClientRequest.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import Log from './Log';
import { Task } from "./Task";
import Client from "./Client";
const logger = Log.logger(__filename);
export default class ClientRequest {
private promise: Task<any>|undefined;
cancelRequested: boolean;
uid: string;
client: Client|undefined;
finalStatus: any;
constructor(uid:string, fromClient:Client) {
this.promise = undefined;
this.cancelRequested = false;
this.uid = uid;
this.client = fromClient;
this.client.attachRequest(this);
// What was sent when promise terminated
this.finalStatus = {
type: 'requestEnd',
uid: uid,
status: 'error',
message: 'internal error'
};
}
private logContext(): object {
return {uid: this.uid, clientUid: this.client?.uid};
}
// Dettach request from client
dettach() {
this.client = undefined;
}
dispatch(content:any) {
if (this.client === undefined) {
return;
}
this.client.reply(content);
}
onError(err:any) {
if (err == undefined) {
err = null;
} else {
err = err.stack || '' + err;
}
logger.warn('Request error', this.logContext(), err);
this.promise = undefined;
this.finalStatus = {
type: 'requestEnd',
uid: this.uid,
status: 'error',
message: err
};
this.dispatch(this.finalStatus);
this.dettach();
}
success (rslt:any) {
if (rslt == undefined) rslt = null;
logger.info('Request success', this.logContext());
logger.debug('Request result', {...this.logContext, rslt});
this.promise = undefined;
this.finalStatus = {
type: 'requestEnd',
uid: this.uid,
status: 'done',
result: rslt
};
this.dispatch(this.finalStatus);
this.dettach();
}
onCancel() {
logger.info('Request canceled', this.logContext());
this.promise = undefined;
this.finalStatus = {
type: 'requestEnd',
uid: this.uid,
status: 'canceled'
};
this.dispatch(this.finalStatus);
this.dettach();
}
}