velocious 1.0.562 → 1.0.563
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/build/configuration-types.js +1 -0
- package/build/configuration.js +44 -3
- package/build/http-server/client/websocket-session.js +3 -3
- package/build/http-server/client-delivery-queue.js +168 -0
- package/build/http-server/server-client.js +9 -0
- package/build/http-server/websocket-events-host.js +42 -12
- package/build/http-server/worker-handler/in-process.js +53 -14
- package/build/http-server/worker-handler/index.js +88 -18
- package/build/http-server/worker-handler/worker-thread.js +2 -2
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +34 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +40 -4
- package/build/src/http-server/client/websocket-session.js +4 -4
- package/build/src/http-server/client-delivery-queue.d.ts +121 -0
- package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
- package/build/src/http-server/client-delivery-queue.js +152 -0
- package/build/src/http-server/server-client.d.ts +6 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +10 -1
- package/build/src/http-server/websocket-events-host.d.ts +15 -4
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +39 -13
- package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +50 -14
- package/build/src/http-server/worker-handler/index.d.ts +36 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +82 -18
- package/build/src/http-server/worker-handler/worker-thread.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/configuration-types.js +1 -0
- package/src/configuration.js +44 -3
- package/src/http-server/client/websocket-session.js +3 -3
- package/src/http-server/client-delivery-queue.js +168 -0
- package/src/http-server/server-client.js +9 -0
- package/src/http-server/websocket-events-host.js +42 -12
- package/src/http-server/worker-handler/in-process.js +53 -14
- package/src/http-server/worker-handler/index.js +88 -18
- package/src/http-server/worker-handler/worker-thread.js +2 -2
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export class ClientDeliveryQueueOverflowError extends Error {
|
|
2
|
+
/**
|
|
3
|
+
* Builds an outbound queue overflow error.
|
|
4
|
+
* @param {object} args - Overflow details.
|
|
5
|
+
* @param {number} args.clientCount - Client identifier.
|
|
6
|
+
* @param {number} args.maxBytes - Configured byte high-water mark.
|
|
7
|
+
* @param {number} args.maxFrames - Configured frame high-water mark.
|
|
8
|
+
* @param {number} args.pendingBytes - Bytes retained before rejecting the frame.
|
|
9
|
+
* @param {number} args.pendingFrames - Frames retained before rejecting the frame.
|
|
10
|
+
* @param {number} args.rejectedBytes - Rejected frame size.
|
|
11
|
+
*/
|
|
12
|
+
constructor({ clientCount, maxBytes, maxFrames, pendingBytes, pendingFrames, rejectedBytes }: {
|
|
13
|
+
clientCount: number;
|
|
14
|
+
maxBytes: number;
|
|
15
|
+
maxFrames: number;
|
|
16
|
+
pendingBytes: number;
|
|
17
|
+
pendingFrames: number;
|
|
18
|
+
rejectedBytes: number;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {object} DeliveryTask
|
|
23
|
+
* @property {number} byteLength - Retained complete-buffer bytes.
|
|
24
|
+
* @property {boolean} countedFrame - Whether this task is an outbound frame.
|
|
25
|
+
* @property {() => Promise<void>} delivery - Delivery operation.
|
|
26
|
+
* @property {(error?: Error) => void} settle - Settles the enqueue promise.
|
|
27
|
+
*/
|
|
28
|
+
export default class ClientDeliveryQueue {
|
|
29
|
+
/**
|
|
30
|
+
* Builds a per-client delivery queue.
|
|
31
|
+
* @param {object} args - Queue options.
|
|
32
|
+
* @param {number} args.clientCount - Client identifier.
|
|
33
|
+
* @param {number} args.maxBytes - Byte high-water mark.
|
|
34
|
+
* @param {number} args.maxFrames - Frame high-water mark.
|
|
35
|
+
* @param {(error: ClientDeliveryQueueOverflowError) => void} args.onOverflow - Overflow handler.
|
|
36
|
+
*/
|
|
37
|
+
constructor({ clientCount, maxBytes, maxFrames, onOverflow }: {
|
|
38
|
+
clientCount: number;
|
|
39
|
+
maxBytes: number;
|
|
40
|
+
maxFrames: number;
|
|
41
|
+
onOverflow: (error: ClientDeliveryQueueOverflowError) => void;
|
|
42
|
+
});
|
|
43
|
+
clientCount: number;
|
|
44
|
+
maxBytes: number;
|
|
45
|
+
maxFrames: number;
|
|
46
|
+
onOverflow: (error: ClientDeliveryQueueOverflowError) => void;
|
|
47
|
+
/** @type {DeliveryTask[]} */
|
|
48
|
+
tasks: DeliveryTask[];
|
|
49
|
+
/** @type {DeliveryTask | undefined} */
|
|
50
|
+
activeTask: DeliveryTask | undefined;
|
|
51
|
+
pendingBytes: number;
|
|
52
|
+
pendingFrames: number;
|
|
53
|
+
destroyed: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Enqueues one complete output buffer.
|
|
56
|
+
* @param {object} args - Delivery details.
|
|
57
|
+
* @param {number} args.byteLength - Exact buffer byte length.
|
|
58
|
+
* @param {() => Promise<void>} args.delivery - Delivery operation.
|
|
59
|
+
* @returns {Promise<void>} - Settles after delivery or teardown.
|
|
60
|
+
*/
|
|
61
|
+
enqueueFrame({ byteLength, delivery }: {
|
|
62
|
+
byteLength: number;
|
|
63
|
+
delivery: () => Promise<void>;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Enqueues an ordering-only operation that retains no complete output frame.
|
|
67
|
+
* @param {() => Promise<void>} delivery - Delivery operation.
|
|
68
|
+
* @returns {Promise<void>} - Settles after delivery or teardown.
|
|
69
|
+
*/
|
|
70
|
+
enqueueControl(delivery: () => Promise<void>): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Releases queued and active accounting during explicit client teardown.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
destroy(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Gets current retained-buffer accounting.
|
|
78
|
+
* @returns {{pendingBytes: number, pendingFrames: number}} - Current retained-buffer accounting.
|
|
79
|
+
*/
|
|
80
|
+
snapshot(): {
|
|
81
|
+
pendingBytes: number;
|
|
82
|
+
pendingFrames: number;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Enqueues a delivery task.
|
|
86
|
+
* @param {Omit<DeliveryTask, "settle">} task - Task to enqueue.
|
|
87
|
+
* @returns {Promise<void>} - Task completion.
|
|
88
|
+
*/
|
|
89
|
+
_enqueue(task: Omit<DeliveryTask, "settle">): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Starts the next task when idle.
|
|
92
|
+
* @returns {void} - No return value.
|
|
93
|
+
*/
|
|
94
|
+
_drain(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Finishes the active delivery task.
|
|
97
|
+
* @param {DeliveryTask} task - Completed task.
|
|
98
|
+
* @param {Error} [error] - Delivery error.
|
|
99
|
+
* @returns {void}
|
|
100
|
+
*/
|
|
101
|
+
_finish(task: DeliveryTask, error?: Error): void;
|
|
102
|
+
}
|
|
103
|
+
export type DeliveryTask = {
|
|
104
|
+
/**
|
|
105
|
+
* - Retained complete-buffer bytes.
|
|
106
|
+
*/
|
|
107
|
+
byteLength: number;
|
|
108
|
+
/**
|
|
109
|
+
* - Whether this task is an outbound frame.
|
|
110
|
+
*/
|
|
111
|
+
countedFrame: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* - Delivery operation.
|
|
114
|
+
*/
|
|
115
|
+
delivery: () => Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* - Settles the enqueue promise.
|
|
118
|
+
*/
|
|
119
|
+
settle: (error?: Error) => void;
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=client-delivery-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-delivery-queue.d.ts","sourceRoot":"","sources":["../../../src/http-server/client-delivery-queue.js"],"names":[],"mappings":"AAEA;IACE;;;;;;;;;OASG;IACH,8FAPG;QAAqB,WAAW,EAAxB,MAAM;QACO,QAAQ,EAArB,MAAM;QACO,SAAS,EAAtB,MAAM;QACO,YAAY,EAAzB,MAAM;QACO,aAAa,EAA1B,MAAM;QACO,aAAa,EAA1B,MAAM;KAChB,EAIA;CACF;AAED;;;;;;GAMG;AAEH;IACE;;;;;;;OAOG;IACH,8DALG;QAAqB,WAAW,EAAxB,MAAM;QACO,QAAQ,EAArB,MAAM;QACO,SAAS,EAAtB,MAAM;QACkD,UAAU,EAAlE,CAAC,KAAK,EAAE,gCAAgC,KAAK,IAAI;KAC3D,EAaA;IAXC,oBAA8B;IAC9B,iBAAwB;IACxB,kBAA0B;IAC1B,oBANiB,gCAAgC,KAAK,IAAI,CAM9B;IAC5B,6BAA6B;IAC7B,OADW,YAAY,EAAE,CACV;IACf,uCAAuC;IACvC,YADW,YAAY,GAAG,SAAS,CACR;IAC3B,qBAAqB;IACrB,sBAAsB;IACtB,mBAAsB;IAGxB;;;;;;OAMG;IACH,uCAJG;QAAqB,UAAU,EAAvB,MAAM;QACoB,QAAQ,EAAlC,MAAM,OAAO,CAAC,IAAI,CAAC;KAC3B,GAAU,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;OAIG;IACH,yBAHW,MAAM,OAAO,CAAC,IAAI,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,WAFa,IAAI,CAchB;IAED;;;OAGG;IACH,YAFa;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,CAIzD;IAED;;;;OAIG;IACH,eAHW,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;OAGG;IACH,UAFa,IAAI,CAahB;IAED;;;;;OAKG;IACH,cAJW,YAAY,UACZ,KAAK,GACH,IAAI,CAYhB;CACF;;;;;gBAlJa,MAAM;;;;kBACN,OAAO;;;;cACP,MAAM,OAAO,CAAC,IAAI,CAAC;;;;YACnB,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export class ClientDeliveryQueueOverflowError extends Error {
|
|
3
|
+
/**
|
|
4
|
+
* Builds an outbound queue overflow error.
|
|
5
|
+
* @param {object} args - Overflow details.
|
|
6
|
+
* @param {number} args.clientCount - Client identifier.
|
|
7
|
+
* @param {number} args.maxBytes - Configured byte high-water mark.
|
|
8
|
+
* @param {number} args.maxFrames - Configured frame high-water mark.
|
|
9
|
+
* @param {number} args.pendingBytes - Bytes retained before rejecting the frame.
|
|
10
|
+
* @param {number} args.pendingFrames - Frames retained before rejecting the frame.
|
|
11
|
+
* @param {number} args.rejectedBytes - Rejected frame size.
|
|
12
|
+
*/
|
|
13
|
+
constructor({ clientCount, maxBytes, maxFrames, pendingBytes, pendingFrames, rejectedBytes }) {
|
|
14
|
+
super(`WebSocket client ${clientCount} exceeded its outbound queue limit (${pendingFrames}/${maxFrames} frames, ${pendingBytes}/${maxBytes} bytes; rejected ${rejectedBytes} bytes)`);
|
|
15
|
+
this.name = "ClientDeliveryQueueOverflowError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {object} DeliveryTask
|
|
20
|
+
* @property {number} byteLength - Retained complete-buffer bytes.
|
|
21
|
+
* @property {boolean} countedFrame - Whether this task is an outbound frame.
|
|
22
|
+
* @property {() => Promise<void>} delivery - Delivery operation.
|
|
23
|
+
* @property {(error?: Error) => void} settle - Settles the enqueue promise.
|
|
24
|
+
*/
|
|
25
|
+
export default class ClientDeliveryQueue {
|
|
26
|
+
/**
|
|
27
|
+
* Builds a per-client delivery queue.
|
|
28
|
+
* @param {object} args - Queue options.
|
|
29
|
+
* @param {number} args.clientCount - Client identifier.
|
|
30
|
+
* @param {number} args.maxBytes - Byte high-water mark.
|
|
31
|
+
* @param {number} args.maxFrames - Frame high-water mark.
|
|
32
|
+
* @param {(error: ClientDeliveryQueueOverflowError) => void} args.onOverflow - Overflow handler.
|
|
33
|
+
*/
|
|
34
|
+
constructor({ clientCount, maxBytes, maxFrames, onOverflow }) {
|
|
35
|
+
this.clientCount = clientCount;
|
|
36
|
+
this.maxBytes = maxBytes;
|
|
37
|
+
this.maxFrames = maxFrames;
|
|
38
|
+
this.onOverflow = onOverflow;
|
|
39
|
+
/** @type {DeliveryTask[]} */
|
|
40
|
+
this.tasks = [];
|
|
41
|
+
/** @type {DeliveryTask | undefined} */
|
|
42
|
+
this.activeTask = undefined;
|
|
43
|
+
this.pendingBytes = 0;
|
|
44
|
+
this.pendingFrames = 0;
|
|
45
|
+
this.destroyed = false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Enqueues one complete output buffer.
|
|
49
|
+
* @param {object} args - Delivery details.
|
|
50
|
+
* @param {number} args.byteLength - Exact buffer byte length.
|
|
51
|
+
* @param {() => Promise<void>} args.delivery - Delivery operation.
|
|
52
|
+
* @returns {Promise<void>} - Settles after delivery or teardown.
|
|
53
|
+
*/
|
|
54
|
+
enqueueFrame({ byteLength, delivery }) {
|
|
55
|
+
if (this.destroyed)
|
|
56
|
+
return Promise.resolve();
|
|
57
|
+
if (this.pendingFrames + 1 > this.maxFrames || this.pendingBytes + byteLength > this.maxBytes) {
|
|
58
|
+
const error = new ClientDeliveryQueueOverflowError({
|
|
59
|
+
clientCount: this.clientCount,
|
|
60
|
+
maxBytes: this.maxBytes,
|
|
61
|
+
maxFrames: this.maxFrames,
|
|
62
|
+
pendingBytes: this.pendingBytes,
|
|
63
|
+
pendingFrames: this.pendingFrames,
|
|
64
|
+
rejectedBytes: byteLength
|
|
65
|
+
});
|
|
66
|
+
this.onOverflow(error);
|
|
67
|
+
return Promise.reject(error);
|
|
68
|
+
}
|
|
69
|
+
this.pendingFrames += 1;
|
|
70
|
+
this.pendingBytes += byteLength;
|
|
71
|
+
return this._enqueue({ byteLength, countedFrame: true, delivery });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Enqueues an ordering-only operation that retains no complete output frame.
|
|
75
|
+
* @param {() => Promise<void>} delivery - Delivery operation.
|
|
76
|
+
* @returns {Promise<void>} - Settles after delivery or teardown.
|
|
77
|
+
*/
|
|
78
|
+
enqueueControl(delivery) {
|
|
79
|
+
if (this.destroyed)
|
|
80
|
+
return Promise.resolve();
|
|
81
|
+
return this._enqueue({ byteLength: 0, countedFrame: false, delivery });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Releases queued and active accounting during explicit client teardown.
|
|
85
|
+
* @returns {void}
|
|
86
|
+
*/
|
|
87
|
+
destroy() {
|
|
88
|
+
if (this.destroyed)
|
|
89
|
+
return;
|
|
90
|
+
this.destroyed = true;
|
|
91
|
+
const tasks = this.activeTask ? [this.activeTask, ...this.tasks] : this.tasks;
|
|
92
|
+
this.activeTask = undefined;
|
|
93
|
+
this.tasks = [];
|
|
94
|
+
this.pendingBytes = 0;
|
|
95
|
+
this.pendingFrames = 0;
|
|
96
|
+
for (const task of tasks)
|
|
97
|
+
task.settle();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Gets current retained-buffer accounting.
|
|
101
|
+
* @returns {{pendingBytes: number, pendingFrames: number}} - Current retained-buffer accounting.
|
|
102
|
+
*/
|
|
103
|
+
snapshot() {
|
|
104
|
+
return { pendingBytes: this.pendingBytes, pendingFrames: this.pendingFrames };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Enqueues a delivery task.
|
|
108
|
+
* @param {Omit<DeliveryTask, "settle">} task - Task to enqueue.
|
|
109
|
+
* @returns {Promise<void>} - Task completion.
|
|
110
|
+
*/
|
|
111
|
+
_enqueue(task) {
|
|
112
|
+
const promise = new Promise((resolve, reject) => {
|
|
113
|
+
this.tasks.push({
|
|
114
|
+
...task,
|
|
115
|
+
settle: (error) => error ? reject(error) : resolve(undefined)
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
this._drain();
|
|
119
|
+
return promise;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Starts the next task when idle.
|
|
123
|
+
* @returns {void} - No return value.
|
|
124
|
+
*/
|
|
125
|
+
_drain() {
|
|
126
|
+
if (this.destroyed || this.activeTask)
|
|
127
|
+
return;
|
|
128
|
+
const task = this.tasks.shift();
|
|
129
|
+
if (!task)
|
|
130
|
+
return;
|
|
131
|
+
this.activeTask = task;
|
|
132
|
+
void task.delivery().then(() => this._finish(task), (error) => this._finish(task, error));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Finishes the active delivery task.
|
|
136
|
+
* @param {DeliveryTask} task - Completed task.
|
|
137
|
+
* @param {Error} [error] - Delivery error.
|
|
138
|
+
* @returns {void}
|
|
139
|
+
*/
|
|
140
|
+
_finish(task, error) {
|
|
141
|
+
if (this.destroyed || this.activeTask !== task)
|
|
142
|
+
return;
|
|
143
|
+
this.activeTask = undefined;
|
|
144
|
+
if (task.countedFrame) {
|
|
145
|
+
this.pendingBytes -= task.byteLength;
|
|
146
|
+
this.pendingFrames -= 1;
|
|
147
|
+
}
|
|
148
|
+
task.settle(error);
|
|
149
|
+
this._drain();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LWRlbGl2ZXJ5LXF1ZXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2h0dHAtc2VydmVyL2NsaWVudC1kZWxpdmVyeS1xdWV1ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxPQUFPLGdDQUFpQyxTQUFRLEtBQUs7SUFDekQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDO1FBQ3hGLEtBQUssQ0FBQyxvQkFBb0IsV0FBVyx1Q0FBdUMsYUFBYSxJQUFJLFNBQVMsWUFBWSxZQUFZLElBQUksUUFBUSxvQkFBb0IsYUFBYSxTQUFTLENBQUMsQ0FBQTtRQUNyTCxJQUFJLENBQUMsSUFBSSxHQUFHLGtDQUFrQyxDQUFBO0lBQ2hELENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sbUJBQW1CO0lBQ3RDOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtRQUNmLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQTtRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUss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QUFDLENBQUE7UUFFRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU07UUFFN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDdEIsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUN2QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUN4QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQ3JDLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSTtZQUFFLE9BQU07UUFFdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFBO1lBQ3BDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFBO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50RGVsaXZlcnlRdWV1ZU92ZXJmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gb3V0Ym91bmQgcXVldWUgb3ZlcmZsb3cgZXJyb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3ZlcmZsb3cgZGV0YWlscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY2xpZW50Q291bnQgLSBDbGllbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MubWF4Qnl0ZXMgLSBDb25maWd1cmVkIGJ5dGUgaGlnaC13YXRlciBtYXJrLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5tYXhGcmFtZXMgLSBDb25maWd1cmVkIGZyYW1lIGhpZ2gtd2F0ZXIgbWFyay5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MucGVuZGluZ0J5dGVzIC0gQnl0ZXMgcmV0YWluZWQgYmVmb3JlIHJlamVjdGluZyB0aGUgZnJhbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnBlbmRpbmdGcmFtZXMgLSBGcmFtZXMgcmV0YWluZWQgYmVmb3JlIHJlamVjdGluZyB0aGUgZnJhbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnJlamVjdGVkQnl0ZXMgLSBSZWplY3RlZCBmcmFtZSBzaXplLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudENvdW50LCBtYXhCeXRlcywgbWF4RnJhbWVzLCBwZW5kaW5nQnl0ZXMsIHBlbmRpbmdGcmFtZXMsIHJlamVjdGVkQnl0ZXN9KSB7XG4gICAgc3VwZXIoYFdlYlNvY2tldCBjbGllbnQgJHtjbGllbnRDb3VudH0gZXhjZWVkZWQgaXRzIG91dGJvdW5kIHF1ZXVlIGxpbWl0ICgke3BlbmRpbmdGcmFtZXN9LyR7bWF4RnJhbWVzfSBmcmFtZXMsICR7cGVuZGluZ0J5dGVzfS8ke21heEJ5dGVzfSBieXRlczsgcmVqZWN0ZWQgJHtyZWplY3RlZEJ5dGVzfSBieXRlcylgKVxuICAgIHRoaXMubmFtZSA9IFwiQ2xpZW50RGVsaXZlcnlRdWV1ZU92ZXJmbG93RXJyb3JcIlxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVsaXZlcnlUYXNrXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIFJldGFpbmVkIGNvbXBsZXRlLWJ1ZmZlciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY291bnRlZEZyYW1lIC0gV2hldGhlciB0aGlzIHRhc2sgaXMgYW4gb3V0Ym91bmQgZnJhbWUuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGRlbGl2ZXJ5IC0gRGVsaXZlcnkgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHsoZXJyb3I/OiBFcnJvcikgPT4gdm9pZH0gc2V0dGxlIC0gU2V0dGxlcyB0aGUgZW5xdWV1ZSBwcm9taXNlLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudERlbGl2ZXJ5UXVldWUge1xuICAvKipcbiAgICogQnVpbGRzIGEgcGVyLWNsaWVudCBkZWxpdmVyeSBxdWV1ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jbGllbnRDb3VudCAtIENsaWVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5tYXhCeXRlcyAtIEJ5dGUgaGlnaC13YXRlciBtYXJrLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5tYXhGcmFtZXMgLSBGcmFtZSBoaWdoLXdhdGVyIG1hcmsuXG4gICAqIEBwYXJhbSB7KGVycm9yOiBDbGllbnREZWxpdmVyeVF1ZXVlT3ZlcmZsb3dFcnJvcikgPT4gdm9pZH0gYXJncy5vbk92ZXJmbG93IC0gT3ZlcmZsb3cgaGFuZGxlci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnRDb3VudCwgbWF4Qnl0ZXMsIG1heEZyYW1lcywgb25PdmVyZmxvd30pIHtcbiAgICB0aGlzLmNsaWVudENvdW50ID0gY2xpZW50Q291bnRcbiAgICB0aGlzLm1heEJ5dGVzID0gbWF4Qnl0ZXNcbiAgICB0aGlzLm1heEZyYW1lcyA9IG1heEZyYW1lc1xuICAgIHRoaXMub25PdmVyZmxvdyA9IG9uT3ZlcmZsb3dcbiAgICAvKiogQHR5cGUge0RlbGl2ZXJ5VGFza1tdfSAqL1xuICAgIHRoaXMudGFza3MgPSBbXVxuICAgIC8qKiBAdHlwZSB7RGVsaXZlcnlUYXNrIHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuYWN0aXZlVGFzayA9IHVuZGVmaW5lZFxuICAgIHRoaXMucGVuZGluZ0J5dGVzID0gMFxuICAgIHRoaXMucGVuZGluZ0ZyYW1lcyA9IDBcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgb25lIGNvbXBsZXRlIG91dHB1dCBidWZmZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRGVsaXZlcnkgZGV0YWlscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnl0ZUxlbmd0aCAtIEV4YWN0IGJ1ZmZlciBieXRlIGxlbmd0aC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLmRlbGl2ZXJ5IC0gRGVsaXZlcnkgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTZXR0bGVzIGFmdGVyIGRlbGl2ZXJ5IG9yIHRlYXJkb3duLlxuICAgKi9cbiAgZW5xdWV1ZUZyYW1lKHtieXRlTGVuZ3RoLCBkZWxpdmVyeX0pIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZyYW1lcyArIDEgPiB0aGlzLm1heEZyYW1lcyB8fCB0aGlzLnBlbmRpbmdCeXRlcyArIGJ5dGVMZW5ndGggPiB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDbGllbnREZWxpdmVyeVF1ZXVlT3ZlcmZsb3dFcnJvcih7XG4gICAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LFxuICAgICAgICBtYXhCeXRlczogdGhpcy5tYXhCeXRlcyxcbiAgICAgICAgbWF4RnJhbWVzOiB0aGlzLm1heEZyYW1lcyxcbiAgICAgICAgcGVuZGluZ0J5dGVzOiB0aGlzLnBlbmRpbmdCeXRlcyxcbiAgICAgICAgcGVuZGluZ0ZyYW1lczogdGhpcy5wZW5kaW5nRnJhbWVzLFxuICAgICAgICByZWplY3RlZEJ5dGVzOiBieXRlTGVuZ3RoXG4gICAgICB9KVxuXG4gICAgICB0aGlzLm9uT3ZlcmZsb3coZXJyb3IpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nRnJhbWVzICs9IDFcbiAgICB0aGlzLnBlbmRpbmdCeXRlcyArPSBieXRlTGVuZ3RoXG4gICAgcmV0dXJuIHRoaXMuX2VucXVldWUoe2J5dGVMZW5ndGgsIGNvdW50ZWRGcmFtZTogdHJ1ZSwgZGVsaXZlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGFuIG9yZGVyaW5nLW9ubHkgb3BlcmF0aW9uIHRoYXQgcmV0YWlucyBubyBjb21wbGV0ZSBvdXRwdXQgZnJhbWUuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gZGVsaXZlcnkgLSBEZWxpdmVyeSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNldHRsZXMgYWZ0ZXIgZGVsaXZlcnkgb3IgdGVhcmRvd24uXG4gICAqL1xuICBlbnF1ZXVlQ29udHJvbChkZWxpdmVyeSkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZSh7Ynl0ZUxlbmd0aDogMCwgY291bnRlZEZyYW1lOiBmYWxzZSwgZGVsaXZlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIHF1ZXVlZCBhbmQgYWN0aXZlIGFjY291bnRpbmcgZHVyaW5nIGV4cGxpY2l0IGNsaWVudCB0ZWFyZG93bi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuXG5cbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICBjb25zdCB0YXNrcyA9IHRoaXMuYWN0aXZlVGFzayA/IFt0aGlzLmFjdGl2ZVRhc2ssIC4uLnRoaXMudGFza3NdIDogdGhpcy50YXNrc1xuXG4gICAgdGhpcy5hY3RpdmVUYXNrID0gdW5kZWZpbmVkXG4gICAgdGhpcy50YXNrcyA9IFtdXG4gICAgdGhpcy5wZW5kaW5nQnl0ZXMgPSAwXG4gICAgdGhpcy5wZW5kaW5nRnJhbWVzID0gMFxuXG4gICAgZm9yIChjb25zdCB0YXNrIG9mIHRhc2tzKSB0YXNrLnNldHRsZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjdXJyZW50IHJldGFpbmVkLWJ1ZmZlciBhY2NvdW50aW5nLlxuICAgKiBAcmV0dXJucyB7e3BlbmRpbmdCeXRlczogbnVtYmVyLCBwZW5kaW5nRnJhbWVzOiBudW1iZXJ9fSAtIEN1cnJlbnQgcmV0YWluZWQtYnVmZmVyIGFjY291bnRpbmcuXG4gICAqL1xuICBzbmFwc2hvdCgpIHtcbiAgICByZXR1cm4ge3BlbmRpbmdCeXRlczogdGhpcy5wZW5kaW5nQnl0ZXMsIHBlbmRpbmdGcmFtZXM6IHRoaXMucGVuZGluZ0ZyYW1lc31cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIGRlbGl2ZXJ5IHRhc2suXG4gICAqIEBwYXJhbSB7T21pdDxEZWxpdmVyeVRhc2ssIFwic2V0dGxlXCI+fSB0YXNrIC0gVGFzayB0byBlbnF1ZXVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBUYXNrIGNvbXBsZXRpb24uXG4gICAqL1xuICBfZW5xdWV1ZSh0YXNrKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMudGFza3MucHVzaCh7XG4gICAgICAgIC4uLnRhc2ssXG4gICAgICAgIHNldHRsZTogKGVycm9yKSA9PiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuX2RyYWluKClcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgbmV4dCB0YXNrIHdoZW4gaWRsZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX2RyYWluKCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLmFjdGl2ZVRhc2spIHJldHVyblxuXG4gICAgY29uc3QgdGFzayA9IHRoaXMudGFza3Muc2hpZnQoKVxuICAgIGlmICghdGFzaykgcmV0dXJuXG5cbiAgICB0aGlzLmFjdGl2ZVRhc2sgPSB0YXNrXG4gICAgdm9pZCB0YXNrLmRlbGl2ZXJ5KCkudGhlbihcbiAgICAgICgpID0+IHRoaXMuX2ZpbmlzaCh0YXNrKSxcbiAgICAgIChlcnJvcikgPT4gdGhpcy5fZmluaXNoKHRhc2ssIGVycm9yKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyB0aGUgYWN0aXZlIGRlbGl2ZXJ5IHRhc2suXG4gICAqIEBwYXJhbSB7RGVsaXZlcnlUYXNrfSB0YXNrIC0gQ29tcGxldGVkIHRhc2suXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJvcl0gLSBEZWxpdmVyeSBlcnJvci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluaXNoKHRhc2ssIGVycm9yKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8IHRoaXMuYWN0aXZlVGFzayAhPT0gdGFzaykgcmV0dXJuXG5cbiAgICB0aGlzLmFjdGl2ZVRhc2sgPSB1bmRlZmluZWRcbiAgICBpZiAodGFzay5jb3VudGVkRnJhbWUpIHtcbiAgICAgIHRoaXMucGVuZGluZ0J5dGVzIC09IHRhc2suYnl0ZUxlbmd0aFxuICAgICAgdGhpcy5wZW5kaW5nRnJhbWVzIC09IDFcbiAgICB9XG4gICAgdGFzay5zZXR0bGUoZXJyb3IpXG4gICAgdGhpcy5fZHJhaW4oKVxuICB9XG59XG4iXX0=
|
|
@@ -28,6 +28,12 @@ export default class ServerClient {
|
|
|
28
28
|
* @returns {Promise<void>} - Resolves when complete.
|
|
29
29
|
*/
|
|
30
30
|
end(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Immediately destroys the socket and all transport-owned write buffers.
|
|
33
|
+
* @param {Error} error - Destruction reason.
|
|
34
|
+
* @returns {void}
|
|
35
|
+
*/
|
|
36
|
+
destroy(error: Error): void;
|
|
31
37
|
/**
|
|
32
38
|
* On socket data.
|
|
33
39
|
* @param {Buffer} chunk - Chunk.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-client.d.ts","sourceRoot":"","sources":["../../../src/http-server/server-client.js"],"names":[],"mappings":"AAoBA;IAGE;;;;;;OAMG;IACH,oDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACV,MAAM,EAAjC,OAAO,KAAK,EAAE,MAAM;QACP,WAAW,EAAxB,MAAM;KAChB,EAiBA;IAzBD,mEAA2B;IAYzB,qDAAkC;IAClC,eAA8B;IAC9B,kCAAoB;IACpB,oBAA8B;IAC9B,kCAAyC;IACzC,sBAAyB;IAU3B;;;OAGG;IACH,UAFa,IAAI,CAUhB;IAED;;;OAGG;IACH,OAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,eAAgB,OAHL,MAGU,KAFR,IAAI,CAahB;IAED;;;OAGG;IACH,mBAFa,IAAI,CAKhB;IAED;;;OAGG;IACH,qBAFa,IAAI,CAKhB;IAED;;;OAGG;IACH,uBAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,sBAFa,IAAI,CAIhB;IAGD;;;;OAIG;IACH,gBAAiB,OAHN,KAGW,KAFT,IAAI,CAWhB;IAED;;;OAGG;IACH,aAFa,IAAI,CAOhB;IAED;;;;OAIG;IACH,WAHW,MAAM,GAAG,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCzB;IAED;;;;;OAKG;IACH,mBAJW,MAAM,aACN,OAAO,GACL,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAgC5C;IAED;;;;OAIG;IACH,sBAHW,MAAM,GAAG,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CAoD5B;IAED;;;;OAIG;IACH,qBAHW,OAAO,gBAAgB,EAAE,MAAM,GAC7B,IAAI,CAIhB;IADC,yDAAuB;CAE1B;
|
|
1
|
+
{"version":3,"file":"server-client.d.ts","sourceRoot":"","sources":["../../../src/http-server/server-client.js"],"names":[],"mappings":"AAoBA;IAGE;;;;;;OAMG;IACH,oDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACV,MAAM,EAAjC,OAAO,KAAK,EAAE,MAAM;QACP,WAAW,EAAxB,MAAM;KAChB,EAiBA;IAzBD,mEAA2B;IAYzB,qDAAkC;IAClC,eAA8B;IAC9B,kCAAoB;IACpB,oBAA8B;IAC9B,kCAAyC;IACzC,sBAAyB;IAU3B;;;OAGG;IACH,UAFa,IAAI,CAUhB;IAED;;;OAGG;IACH,OAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,eAHW,KAAK,GACH,IAAI,CAIhB;IAED;;;;OAIG;IACH,eAAgB,OAHL,MAGU,KAFR,IAAI,CAahB;IAED;;;OAGG;IACH,mBAFa,IAAI,CAKhB;IAED;;;OAGG;IACH,qBAFa,IAAI,CAKhB;IAED;;;OAGG;IACH,uBAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,sBAFa,IAAI,CAIhB;IAGD;;;;OAIG;IACH,gBAAiB,OAHN,KAGW,KAFT,IAAI,CAWhB;IAED;;;OAGG;IACH,aAFa,IAAI,CAOhB;IAED;;;;OAIG;IACH,WAHW,MAAM,GAAG,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCzB;IAED;;;;;OAKG;IACH,mBAJW,MAAM,aACN,OAAO,GACL,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAgC5C;IAED;;;;OAIG;IACH,sBAHW,MAAM,GAAG,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CAoD5B;IAED;;;;OAIG;IACH,qBAHW,OAAO,gBAAgB,EAAE,MAAM,GAC7B,IAAI,CAIhB;IADC,yDAAuB;CAE1B;mBA5TkB,cAAc"}
|
|
@@ -66,6 +66,15 @@ export default class ServerClient {
|
|
|
66
66
|
this.socket.end();
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Immediately destroys the socket and all transport-owned write buffers.
|
|
71
|
+
* @param {Error} error - Destruction reason.
|
|
72
|
+
* @returns {void}
|
|
73
|
+
*/
|
|
74
|
+
destroy(error) {
|
|
75
|
+
if (!this.socket.destroyed)
|
|
76
|
+
this.socket.destroy(error);
|
|
77
|
+
}
|
|
69
78
|
/**
|
|
70
79
|
* On socket data.
|
|
71
80
|
* @param {Buffer} chunk - Chunk.
|
|
@@ -279,4 +288,4 @@ export default class ServerClient {
|
|
|
279
288
|
this.worker = newWorker;
|
|
280
289
|
}
|
|
281
290
|
}
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci9zZXJ2ZXItY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBRWpDOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQUs7SUFDakMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUV4SCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUUzQjs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFdB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ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7Y3JlYXRlUmVhZFN0cmVhbX0gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcblxuLyoqXG4gKiBSdW5zIHN1bW1hcml6ZSBzb2NrZXQgY2h1bmsuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgLSBJbmNvbWluZyBzb2NrZXQgZGF0YS5cbiAqIEByZXR1cm5zIHtvYmplY3R9IC0gQ2h1bmsgZGVidWcgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZVNvY2tldENodW5rKGNodW5rKSB7XG4gIGNvbnN0IHByZXZpZXcgPSBjaHVuay50b1N0cmluZyhcImxhdGluMVwiLCAwLCBNYXRoLm1pbihjaHVuay5sZW5ndGgsIDE2MCkpLnJlcGxhY2VBbGwoXCJcXHJcIiwgXCJcXFxcclwiKS5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXFxcXG5cIilcblxuICByZXR1cm4ge1xuICAgIGxlbmd0aDogY2h1bmsubGVuZ3RoLFxuICAgIHByZXZpZXdcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXJDbGllbnQge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwibmV0XCIpLlNvY2tldH0gYXJncy5zb2NrZXQgLSBTb2NrZXQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50IC0gQ2xpZW50IGNvdW50LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHNvY2tldCwgY2xpZW50Q291bnR9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLmNsaWVudENvdW50ID0gY2xpZW50Q291bnRcbiAgICB0aGlzLnJlbW90ZUFkZHJlc3MgPSBzb2NrZXQucmVtb3RlQWRkcmVzc1xuICAgIHRoaXMuY2xvc2VFbWl0dGVkID0gZmFsc2VcblxuICAgIHNvY2tldC5vbihcImVuZFwiLCB0aGlzLm9uU29ja2V0RW5kKVxuICAgIHNvY2tldC5vbihcImVycm9yXCIsIHRoaXMub25Tb2NrZXRFcnJvcilcbiAgICBzb2NrZXQub24oXCJjbG9zZVwiLCB0aGlzLm9uU29ja2V0Q2xvc2UpXG4gICAgc29ja2V0Lm9uKFwidGltZW91dFwiLCB0aGlzLm9uU29ja2V0VGltZW91dClcbiAgICBzb2NrZXQub24oXCJkcmFpblwiLCB0aGlzLm9uU29ja2V0RHJhaW4pXG4gICAgc29ja2V0Lm9uKFwiZmluaXNoXCIsIHRoaXMub25Tb2NrZXRGaW5pc2gpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsaXN0ZW4uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGxpc3RlbigpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJTb2NrZXQgbGlzdGVuXCIsIHtcbiAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHJlbW90ZUZhbWlseTogdGhpcy5zb2NrZXQucmVtb3RlRmFtaWx5LFxuICAgICAgcmVtb3RlUG9ydDogdGhpcy5zb2NrZXQucmVtb3RlUG9ydFxuICAgIH1dKVxuICAgIHRoaXMuc29ja2V0Lm9uKFwiZGF0YVwiLCB0aGlzLm9uU29ja2V0RGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGVuZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNvY2tldC5kZXN0cm95ZWQgfHwgdGhpcy5zb2NrZXQud3JpdGFibGVFbmRlZCB8fCB0aGlzLnNvY2tldC53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbmNlKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQuZW5kKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgLSBDaHVuay5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXREYXRhID0gKGNodW5rKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgU29ja2V0ICR7dGhpcy5jbGllbnRDb3VudH06ICR7Y2h1bmt9YClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJTb2NrZXQgZGF0YSByZWNlaXZlZFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIC4uLnN1bW1hcml6ZVNvY2tldENodW5rKGNodW5rKX1dKVxuXG4gICAgaWYgKCF0aGlzLndvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gd29ya2VyXCIpXG5cbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICBjb21tYW5kOiBcImNsaWVudFdyaXRlXCIsXG4gICAgICBjaHVuayxcbiAgICAgIGNsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBzb2NrZXQgZW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNvY2tldEVuZCA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBTb2NrZXQgJHt0aGlzLmNsaWVudENvdW50fSBlbmRgKVxuICAgIHRoaXMuZW1pdENsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBzb2NrZXQgY2xvc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgU29ja2V0ICR7dGhpcy5jbGllbnRDb3VudH0gY2xvc2VgKVxuICAgIHRoaXMuZW1pdENsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBzb2NrZXQgdGltZW91dC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNvY2tldCB0aW1lb3V0XCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudH1dKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCBkcmFpbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXREcmFpbiA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJTb2NrZXQgZHJhaW5cIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50fV0pXG4gIH1cblxuICAvKipcbiAgICogT24gc29ja2V0IGZpbmlzaC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXRGaW5pc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiU29ja2V0IGZpbmlzaFwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCBlcnJvci5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBTb2NrZXQgZXJyb3IuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU29ja2V0RXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSAvKiogQHR5cGUge3tjb2RlPzogc3RyaW5nfX0gKi8gKGVycm9yKS5jb2RlXG5cbiAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFNvY2tldCAke3RoaXMuY2xpZW50Q291bnR9IGVycm9yYCwgZXJyb3JDb2RlIHx8IGVycm9yLm1lc3NhZ2VdKVxuICAgIHRoaXMuZW1pdENsb3NlKClcblxuICAgIGlmICghdGhpcy5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLnNvY2tldC5kZXN0cm95KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVtaXQgY2xvc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAodGhpcy5jbG9zZUVtaXR0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kKGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gYFNlbmQgJHtkYXRhfWApXG4gICAgICBpZiAodGhpcy5zb2NrZXQuZGVzdHJveWVkIHx8IHRoaXMuc29ja2V0LndyaXRhYmxlRW5kZWQgfHwgdGhpcy5zb2NrZXQud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gXCJTa2lwcGluZyBzZW5kIGJlY2F1c2Ugc29ja2V0IGlzIGNsb3NlZFwiKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBkb25lID0gZmFsc2VcblxuICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuXG5cbiAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgdGhpcy5zb2NrZXQub2ZmKFwiZXJyb3JcIiwgb25Xcml0ZUVycm9yKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uV3JpdGVFcnJvciA9ICgvKiogQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAvKiogQHR5cGUge3tjb2RlPzogc3RyaW5nfX0gKi8gKGVycm9yKS5jb2RlXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BTb2NrZXQgJHt0aGlzLmNsaWVudENvdW50fSB3cml0ZSBlcnJvcmAsIGVycm9yQ29kZSB8fCBlcnJvci5tZXNzYWdlXSlcbiAgICAgICAgZmluaXNoKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25jZShcImVycm9yXCIsIG9uV3JpdGVFcnJvcilcbiAgICAgIHRoaXMuc29ja2V0LndyaXRlKGRhdGEsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBvbldyaXRlRXJyb3IoZXJyb3IpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBmaW5pc2goKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbXMgYSBmaWxlIHRvIHRoZSBzb2NrZXQgd2hpbGUgcmVzcGVjdGluZyBzb2NrZXQgd3JpdGUgYmFja3ByZXNzdXJlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlbmRCb2R5XSAtIFdoZXRoZXIgdG8gcmVhZCBhbmQgc2VuZCB0aGUgZmlsZSBib2R5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCI+fSAtIFRyYW5zZmVyIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNlbmRGaWxlKGZpbGVQYXRoLCBzZW5kQm9keSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQuZGVzdHJveWVkIHx8IHRoaXMuc29ja2V0LndyaXRhYmxlRW5kZWQgfHwgdGhpcy5zb2NrZXQud3JpdGFibGUgPT09IGZhbHNlKSByZXR1cm4gXCJhYm9ydGVkXCJcbiAgICBpZiAoIXNlbmRCb2R5KSByZXR1cm4gXCJjb21wbGV0ZWRcIlxuXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IGNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpXG4gICAgbGV0IGFib3J0ZWQgPSBmYWxzZVxuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgYWJvcnRlZCA9IHRydWVcbiAgICAgIHJlYWRTdHJlYW0uZGVzdHJveSgpXG4gICAgfVxuXG4gICAgdGhpcy5zb2NrZXQub25jZShcImNsb3NlXCIsIGFib3J0KVxuICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJlcnJvclwiLCBhYm9ydClcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRTdHJlYW0pIHtcbiAgICAgICAgaWYgKGFib3J0ZWQgfHwgIWF3YWl0IHRoaXMud3JpdGVGaWxlQ2h1bmsoY2h1bmspKSByZXR1cm4gXCJhYm9ydGVkXCJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFib3J0ZWQgPyBcImFib3J0ZWRcIiA6IFwiY29tcGxldGVkXCJcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BTb2NrZXQgJHt0aGlzLmNsaWVudENvdW50fSBmaWxlIHJlc3BvbnNlIGZhaWxlZGAsIGZpbGVQYXRoLCBlcnJvcl0pXG4gICAgICBpZiAoIXRoaXMuc29ja2V0LmRlc3Ryb3llZCkgdGhpcy5zb2NrZXQuZGVzdHJveSgpXG5cbiAgICAgIHJldHVybiBcImFib3J0ZWRcIlxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNvY2tldC5vZmYoXCJjbG9zZVwiLCBhYm9ydClcbiAgICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIGFib3J0KVxuICAgICAgcmVhZFN0cmVhbS5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIG9uZSBmaWxlIGNodW5rIGFuZCB3YWl0cyBmb3IgYm90aCB3cml0ZSBhY2NlcHRhbmNlIGFuZCBkcmFpbiB3aGVuIHJlcXVpcmVkLlxuICAgKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXl9IGNodW5rIC0gRmlsZSBjaHVuay5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgY2h1bmsgd2FzIGFjY2VwdGVkIGJlZm9yZSB0aGUgc29ja2V0IGFib3J0ZWQuXG4gICAqL1xuICB3cml0ZUZpbGVDaHVuayhjaHVuaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IGNhbGxiYWNrQ29tcGxldGVkID0gZmFsc2VcbiAgICAgIGxldCBkcmFpbmVkID0gZmFsc2VcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQub2ZmKFwiY2xvc2VcIiwgb25BYm9ydClcbiAgICAgICAgdGhpcy5zb2NrZXQub2ZmKFwiZXJyb3JcIiwgb25BYm9ydClcbiAgICAgICAgdGhpcy5zb2NrZXQub2ZmKFwiZHJhaW5cIiwgb25EcmFpbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbmlzaCA9ICgvKiogQHR5cGUge2Jvb2xlYW59ICovIHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfVxuICAgICAgY29uc3QgZmluaXNoSWZSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNhbGxiYWNrQ29tcGxldGVkICYmIGRyYWluZWQpIGZpbmlzaCh0cnVlKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IGZpbmlzaChmYWxzZSlcbiAgICAgIGNvbnN0IG9uRHJhaW4gPSAoKSA9PiB7XG4gICAgICAgIGRyYWluZWQgPSB0cnVlXG4gICAgICAgIGZpbmlzaElmUmVhZHkoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbmNlKFwiY2xvc2VcIiwgb25BYm9ydClcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJlcnJvclwiLCBvbkFib3J0KVxuICAgICAgdGhpcy5zb2NrZXQub25jZShcImRyYWluXCIsIG9uRHJhaW4pXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gdGhpcy5zb2NrZXQud3JpdGUoY2h1bmssIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgZmluaXNoKGZhbHNlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FsbGJhY2tDb21wbGV0ZWQgPSB0cnVlXG4gICAgICAgICAgZmluaXNoSWZSZWFkeSgpXG4gICAgICAgIH0pXG5cbiAgICAgICAgZHJhaW5lZCA9IGFjY2VwdGVkXG4gICAgICAgIGlmIChhY2NlcHRlZCkgdGhpcy5zb2NrZXQub2ZmKFwiZHJhaW5cIiwgb25EcmFpbilcbiAgICAgICAgZmluaXNoSWZSZWFkeSgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFNvY2tldCAke3RoaXMuY2xpZW50Q291bnR9IGZpbGUgd3JpdGUgZmFpbGVkYCwgZXJyb3JdKVxuICAgICAgICBmaW5pc2goZmFsc2UpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCB3b3JrZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid29ya2VyX3RocmVhZHNcIikuV29ya2VyfSBuZXdXb3JrZXIgLSBOZXcgd29ya2VyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRXb3JrZXIobmV3V29ya2VyKSB7XG4gICAgdGhpcy53b3JrZXIgPSBuZXdXb3JrZXJcbiAgfVxufVxuIl19
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci9zZXJ2ZXItY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBRWpDOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQUs7SUFDakMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUV4SCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUUzQjs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFdB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LENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFNBQVM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IHtjcmVhdGVSZWFkU3RyZWFtfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuXG4vKipcbiAqIFJ1bnMgc3VtbWFyaXplIHNvY2tldCBjaHVuay5cbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayAtIEluY29taW5nIHNvY2tldCBkYXRhLlxuICogQHJldHVybnMge29iamVjdH0gLSBDaHVuayBkZWJ1ZyBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplU29ja2V0Q2h1bmsoY2h1bmspIHtcbiAgY29uc3QgcHJldmlldyA9IGNodW5rLnRvU3RyaW5nKFwibGF0aW4xXCIsIDAsIE1hdGgubWluKGNodW5rLmxlbmd0aCwgMTYwKSkucmVwbGFjZUFsbChcIlxcclwiLCBcIlxcXFxyXCIpLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcXFxcblwiKVxuXG4gIHJldHVybiB7XG4gICAgbGVuZ3RoOiBjaHVuay5sZW5ndGgsXG4gICAgcHJldmlld1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNsaWVudCB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJuZXRcIikuU29ja2V0fSBhcmdzLnNvY2tldCAtIFNvY2tldCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY2xpZW50Q291bnQgLSBDbGllbnQgY291bnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgc29ja2V0LCBjbGllbnRDb3VudH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMuY2xpZW50Q291bnQgPSBjbGllbnRDb3VudFxuICAgIHRoaXMucmVtb3RlQWRkcmVzcyA9IHNvY2tldC5yZW1vdGVBZGRyZXNzXG4gICAgdGhpcy5jbG9zZUVtaXR0ZWQgPSBmYWxzZVxuXG4gICAgc29ja2V0Lm9uKFwiZW5kXCIsIHRoaXMub25Tb2NrZXRFbmQpXG4gICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5vblNvY2tldEVycm9yKVxuICAgIHNvY2tldC5vbihcImNsb3NlXCIsIHRoaXMub25Tb2NrZXRDbG9zZSlcbiAgICBzb2NrZXQub24oXCJ0aW1lb3V0XCIsIHRoaXMub25Tb2NrZXRUaW1lb3V0KVxuICAgIHNvY2tldC5vbihcImRyYWluXCIsIHRoaXMub25Tb2NrZXREcmFpbilcbiAgICBzb2NrZXQub24oXCJmaW5pc2hcIiwgdGhpcy5vblNvY2tldEZpbmlzaClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxpc3Rlbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbGlzdGVuKCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNvY2tldCBsaXN0ZW5cIiwge1xuICAgICAgY2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLnNvY2tldC5yZW1vdGVBZGRyZXNzLFxuICAgICAgcmVtb3RlRmFtaWx5OiB0aGlzLnNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgICByZW1vdGVQb3J0OiB0aGlzLnNvY2tldC5yZW1vdGVQb3J0XG4gICAgfV0pXG4gICAgdGhpcy5zb2NrZXQub24oXCJkYXRhXCIsIHRoaXMub25Tb2NrZXREYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgZW5kKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCB8fCB0aGlzLnNvY2tldC53cml0YWJsZUVuZGVkIHx8IHRoaXMuc29ja2V0LndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldC5lbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlbHkgZGVzdHJveXMgdGhlIHNvY2tldCBhbmQgYWxsIHRyYW5zcG9ydC1vd25lZCB3cml0ZSBidWZmZXJzLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIERlc3RydWN0aW9uIHJlYXNvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZXN0cm95KGVycm9yKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldC5kZXN0cm95ZWQpIHRoaXMuc29ja2V0LmRlc3Ryb3koZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogT24gc29ja2V0IGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayAtIENodW5rLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNvY2tldERhdGEgPSAoY2h1bmspID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBTb2NrZXQgJHt0aGlzLmNsaWVudENvdW50fTogJHtjaHVua31gKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNvY2tldCBkYXRhIHJlY2VpdmVkXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgLi4uc3VtbWFyaXplU29ja2V0Q2h1bmsoY2h1bmspfV0pXG5cbiAgICBpZiAoIXRoaXMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB3b3JrZXJcIilcblxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgIGNvbW1hbmQ6IFwiY2xpZW50V3JpdGVcIixcbiAgICAgIGNodW5rLFxuICAgICAgY2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnRcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCBlbmQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU29ja2V0RW5kID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gYFNvY2tldCAke3RoaXMuY2xpZW50Q291bnR9IGVuZGApXG4gICAgdGhpcy5lbWl0Q2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCBjbG9zZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXRDbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBTb2NrZXQgJHt0aGlzLmNsaWVudENvdW50fSBjbG9zZWApXG4gICAgdGhpcy5lbWl0Q2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHNvY2tldCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNvY2tldFRpbWVvdXQgPSAoKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiU29ja2V0IHRpbWVvdXRcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50fV0pXG4gIH1cblxuICAvKipcbiAgICogT24gc29ja2V0IGRyYWluLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNvY2tldERyYWluID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNvY2tldCBkcmFpblwiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBzb2NrZXQgZmluaXNoLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvblNvY2tldEZpbmlzaCA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJTb2NrZXQgZmluaXNoXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudH1dKVxuICB9XG5cblxuICAvKipcbiAgICogT24gc29ja2V0IGVycm9yLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFNvY2tldCBlcnJvci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Tb2NrZXRFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IC8qKiBAdHlwZSB7e2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpLmNvZGVcblxuICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgU29ja2V0ICR7dGhpcy5jbGllbnRDb3VudH0gZXJyb3JgLCBlcnJvckNvZGUgfHwgZXJyb3IubWVzc2FnZV0pXG4gICAgdGhpcy5lbWl0Q2xvc2UoKVxuXG4gICAgaWYgKCF0aGlzLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmRlc3Ryb3koZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW1pdCBjbG9zZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZW1pdENsb3NlKCkge1xuICAgIGlmICh0aGlzLmNsb3NlRW1pdHRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIiwgdGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHNlbmQoZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgU2VuZCAke2RhdGF9YClcbiAgICAgIGlmICh0aGlzLnNvY2tldC5kZXN0cm95ZWQgfHwgdGhpcy5zb2NrZXQud3JpdGFibGVFbmRlZCB8fCB0aGlzLnNvY2tldC53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBcIlNraXBwaW5nIHNlbmQgYmVjYXVzZSBzb2NrZXQgaXMgY2xvc2VkXCIpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IGRvbmUgPSBmYWxzZVxuXG4gICAgICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm5cblxuICAgICAgICBkb25lID0gdHJ1ZVxuICAgICAgICB0aGlzLnNvY2tldC5vZmYoXCJlcnJvclwiLCBvbldyaXRlRXJyb3IpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25Xcml0ZUVycm9yID0gKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IC8qKiBAdHlwZSB7e2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpLmNvZGVcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFNvY2tldCAke3RoaXMuY2xpZW50Q291bnR9IHdyaXRlIGVycm9yYCwgZXJyb3JDb2RlIHx8IGVycm9yLm1lc3NhZ2VdKVxuICAgICAgICBmaW5pc2goKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbmNlKFwiZXJyb3JcIiwgb25Xcml0ZUVycm9yKVxuICAgICAgdGhpcy5zb2NrZXQud3JpdGUoZGF0YSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIG9uV3JpdGVFcnJvcihlcnJvcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZpbmlzaCgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtcyBhIGZpbGUgdG8gdGhlIHNvY2tldCB3aGlsZSByZXNwZWN0aW5nIHNvY2tldCB3cml0ZSBiYWNrcHJlc3N1cmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2VuZEJvZHldIC0gV2hldGhlciB0byByZWFkIGFuZCBzZW5kIHRoZSBmaWxlIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIj59IC0gVHJhbnNmZXIgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2VuZEZpbGUoZmlsZVBhdGgsIHNlbmRCb2R5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLnNvY2tldC5kZXN0cm95ZWQgfHwgdGhpcy5zb2NrZXQud3JpdGFibGVFbmRlZCB8fCB0aGlzLnNvY2tldC53cml0YWJsZSA9PT0gZmFsc2UpIHJldHVybiBcImFib3J0ZWRcIlxuICAgIGlmICghc2VuZEJvZHkpIHJldHVybiBcImNvbXBsZXRlZFwiXG5cbiAgICBjb25zdCByZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aClcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlXG4gICAgY29uc3QgYWJvcnQgPSAoKSA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZVxuICAgICAgcmVhZFN0cmVhbS5kZXN0cm95KClcbiAgICB9XG5cbiAgICB0aGlzLnNvY2tldC5vbmNlKFwiY2xvc2VcIiwgYWJvcnQpXG4gICAgdGhpcy5zb2NrZXQub25jZShcImVycm9yXCIsIGFib3J0KVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbSkge1xuICAgICAgICBpZiAoYWJvcnRlZCB8fCAhYXdhaXQgdGhpcy53cml0ZUZpbGVDaHVuayhjaHVuaykpIHJldHVybiBcImFib3J0ZWRcIlxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWJvcnRlZCA/IFwiYWJvcnRlZFwiIDogXCJjb21wbGV0ZWRcIlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFNvY2tldCAke3RoaXMuY2xpZW50Q291bnR9IGZpbGUgcmVzcG9uc2UgZmFpbGVkYCwgZmlsZVBhdGgsIGVycm9yXSlcbiAgICAgIGlmICghdGhpcy5zb2NrZXQuZGVzdHJveWVkKSB0aGlzLnNvY2tldC5kZXN0cm95KClcblxuICAgICAgcmV0dXJuIFwiYWJvcnRlZFwiXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIGFib3J0KVxuICAgICAgdGhpcy5zb2NrZXQub2ZmKFwiZXJyb3JcIiwgYWJvcnQpXG4gICAgICByZWFkU3RyZWFtLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIGZpbGUgY2h1bmsgYW5kIHdhaXRzIGZvciBib3RoIHdyaXRlIGFjY2VwdGFuY2UgYW5kIGRyYWluIHdoZW4gcmVxdWlyZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheX0gY2h1bmsgLSBGaWxlIGNodW5rLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjaHVuayB3YXMgYWNjZXB0ZWQgYmVmb3JlIHRoZSBzb2NrZXQgYWJvcnRlZC5cbiAgICovXG4gIHdyaXRlRmlsZUNodW5rKGNodW5rKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgY2FsbGJhY2tDb21wbGV0ZWQgPSBmYWxzZVxuICAgICAgbGV0IGRyYWluZWQgPSBmYWxzZVxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5vZmYoXCJjbG9zZVwiLCBvbkFib3J0KVxuICAgICAgICB0aGlzLnNvY2tldC5vZmYoXCJlcnJvclwiLCBvbkFib3J0KVxuICAgICAgICB0aGlzLnNvY2tldC5vZmYoXCJkcmFpblwiLCBvbkRyYWluKVxuICAgICAgfVxuICAgICAgY29uc3QgZmluaXNoID0gKC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8gcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9XG4gICAgICBjb25zdCBmaW5pc2hJZlJlYWR5ID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2tDb21wbGV0ZWQgJiYgZHJhaW5lZCkgZmluaXNoKHRydWUpXG4gICAgICB9XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gZmluaXNoKGZhbHNlKVxuICAgICAgY29uc3Qgb25EcmFpbiA9ICgpID0+IHtcbiAgICAgICAgZHJhaW5lZCA9IHRydWVcbiAgICAgICAgZmluaXNoSWZSZWFkeSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCBvbkFib3J0KVxuICAgICAgdGhpcy5zb2NrZXQub25jZShcImVycm9yXCIsIG9uQWJvcnQpXG4gICAgICB0aGlzLnNvY2tldC5vbmNlKFwiZHJhaW5cIiwgb25EcmFpbilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWNjZXB0ZWQgPSB0aGlzLnNvY2tldC53cml0ZShjaHVuaywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBmaW5pc2goZmFsc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWxsYmFja0NvbXBsZXRlZCA9IHRydWVcbiAgICAgICAgICBmaW5pc2hJZlJlYWR5KClcbiAgICAgICAgfSlcblxuICAgICAgICBkcmFpbmVkID0gYWNjZXB0ZWRcbiAgICAgICAgaWYgKGFjY2VwdGVkKSB0aGlzLnNvY2tldC5vZmYoXCJkcmFpblwiLCBvbkRyYWluKVxuICAgICAgICBmaW5pc2hJZlJlYWR5KClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgU29ja2V0ICR7dGhpcy5jbGllbnRDb3VudH0gZmlsZSB3cml0ZSBmYWlsZWRgLCBlcnJvcl0pXG4gICAgICAgIGZpbmlzaChmYWxzZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHdvcmtlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3b3JrZXJfdGhyZWFkc1wiKS5Xb3JrZXJ9IG5ld1dvcmtlciAtIE5ldyB3b3JrZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFdvcmtlcihuZXdXb3JrZXIpIHtcbiAgICB0aGlzLndvcmtlciA9IG5ld1dvcmtlclxuICB9XG59XG4iXX0=
|
|
@@ -3,6 +3,10 @@ export class VelociousHttpServerWebsocketEventsHost {
|
|
|
3
3
|
* Narrows the runtime value to the documented type.
|
|
4
4
|
* @type {Set<import("./worker-handler/index.js").default>} */
|
|
5
5
|
handlers: Set<import("./worker-handler/index.js").default>;
|
|
6
|
+
/**
|
|
7
|
+
* Broadcast handlers grouped by the configuration that owns them.
|
|
8
|
+
* @type {Map<import("../configuration.js").default, Set<import("./worker-handler/index.js").default>>} */
|
|
9
|
+
broadcastHandlersByConfiguration: Map<import("../configuration.js").default, Set<import("./worker-handler/index.js").default>>;
|
|
6
10
|
publishQueue: Promise<void>;
|
|
7
11
|
/**
|
|
8
12
|
* Returns a promise that resolves when all pending publish/broadcast
|
|
@@ -34,30 +38,35 @@ export class VelociousHttpServerWebsocketEventsHost {
|
|
|
34
38
|
* @param {string} args.channel - Channel name.
|
|
35
39
|
* @param {Record<string, ?>} args.broadcastParams - Routing filter params.
|
|
36
40
|
* @param {?} args.body - Message body.
|
|
41
|
+
* @param {import("../configuration.js").default} args.configuration - Originating configuration.
|
|
37
42
|
* @returns {void}
|
|
38
43
|
*/
|
|
39
|
-
broadcastV2({ body, broadcastParams, channel }: {
|
|
44
|
+
broadcastV2({ body, broadcastParams, channel, configuration }: {
|
|
40
45
|
channel: string;
|
|
41
46
|
broadcastParams: Record<string, unknown>;
|
|
42
47
|
body: unknown;
|
|
48
|
+
configuration: import("../configuration.js").default;
|
|
43
49
|
}): void;
|
|
44
50
|
/**
|
|
45
51
|
* Runs queue publish.
|
|
46
52
|
* @param {() => Promise<void>} callback - Publish work to run in order.
|
|
47
53
|
* @param {string} errorMessage - Message logged when publish work fails.
|
|
54
|
+
* @param {import("../configuration.js").default} [originatingConfiguration] - Configuration whose context owns the work.
|
|
48
55
|
* @returns {void}
|
|
49
56
|
*/
|
|
50
|
-
_queuePublish(callback: () => Promise<void>, errorMessage: string): void;
|
|
57
|
+
_queuePublish(callback: () => Promise<void>, errorMessage: string, originatingConfiguration?: import("../configuration.js").default): void;
|
|
51
58
|
/**
|
|
52
59
|
* Runs persist v2 event if needed.
|
|
53
60
|
* @param {object} args - Options.
|
|
54
61
|
* @param {?} args.body - Event body.
|
|
55
62
|
* @param {string} args.channel - Channel name.
|
|
63
|
+
* @param {import("../configuration.js").default} args.configuration - Originating configuration.
|
|
56
64
|
* @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata when storage is enabled.
|
|
57
65
|
*/
|
|
58
|
-
_persistV2EventIfNeeded({ body, channel }: {
|
|
66
|
+
_persistV2EventIfNeeded({ body, channel, configuration }: {
|
|
59
67
|
body: unknown;
|
|
60
68
|
channel: string;
|
|
69
|
+
configuration: import("../configuration.js").default;
|
|
61
70
|
}): Promise<{
|
|
62
71
|
createdAt: string;
|
|
63
72
|
id: string;
|
|
@@ -81,11 +90,13 @@ export class VelociousHttpServerWebsocketEventsHost {
|
|
|
81
90
|
* @param {object} args - Options object.
|
|
82
91
|
* @param {string} args.channel - Channel name.
|
|
83
92
|
* @param {?} args.payload - Payload data.
|
|
93
|
+
* @param {import("../configuration.js").default} [args.configuration] - Configuration owning the event store.
|
|
84
94
|
* @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata.
|
|
85
95
|
*/
|
|
86
|
-
_persistChannelEventIfNeeded({ channel, payload }: {
|
|
96
|
+
_persistChannelEventIfNeeded({ channel, payload, configuration }: {
|
|
87
97
|
channel: string;
|
|
88
98
|
payload: unknown;
|
|
99
|
+
configuration?: import("../configuration.js").default | undefined;
|
|
89
100
|
}): Promise<{
|
|
90
101
|
createdAt: string;
|
|
91
102
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-events-host.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-events-host.js"],"names":[],"mappings":"AAIA;IAEI;;kEAE8D;IAC9D,UADU,GAAG,CAAC,OAAO,2BAA2B,EAAE,OAAO,CAAC,CACjC;IACzB,4BAAqC;IAGvC;;;;;;;OAOG;IACH,0BAFa,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,kBAHW,OAAO,2BAA2B,EAAE,OAAO,GACzC,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"websocket-events-host.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-events-host.js"],"names":[],"mappings":"AAIA;IAEI;;kEAE8D;IAC9D,UADU,GAAG,CAAC,OAAO,2BAA2B,EAAE,OAAO,CAAC,CACjC;IACzB;;8GAE0G;IAC1G,kCADU,GAAG,CAAC,OAAO,qBAAqB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,2BAA2B,EAAE,OAAO,CAAC,CAAC,CACrD;IACjD,4BAAqC;IAGvC;;;;;;;OAOG;IACH,0BAFa,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,kBAHW,OAAO,2BAA2B,EAAE,OAAO,GACzC,MAAM,IAAI,CAqBtB;IAED;;;;;OAKG;IACH,uBAJW,MAAM,GAAG,MAAM,eACf,OAAC,GACC,IAAI,CAqBhB;IAED;;;;;;;;;;OAUG;IACH,+DANG;QAAqB,OAAO,EAApB,MAAM;QACkB,eAAe,EAAvC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;QACT,IAAI,EAAZ,OAAC;QAC2C,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;KAC7C,GAAU,IAAI,CA0BhB;IAED;;;;;;OAMG;IACH,wBALW,MAAM,OAAO,CAAC,IAAI,CAAC,gBACnB,MAAM,6BACN,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAkBhB;IAED;;;;;;;OAOG;IACH,0DALG;QAAgB,IAAI,EAAZ,OAAC;QACY,OAAO,EAApB,MAAM;QACsC,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;KAC7C,GAAU,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAI3D;IAED;;;;;;OAMG;IACH,4CAJG;QAAqB,OAAO,EAApB,MAAM;QACE,OAAO,EAAf,OAAC;KACT,GAAU,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAI3D;IAED;;;;;;;OAOG;IACH,kEALG;QAAqB,OAAO,EAApB,MAAM;QACE,OAAO,EAAf,OAAC;QAC4C,aAAa;KAClE,GAAU,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAmB3D;CACF;;AAED,0EAAwE"}
|