velocious 1.0.130 → 1.0.132
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 +103 -0
- package/build/src/configuration.d.ts +8 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +13 -1
- package/build/src/database/drivers/base-table.d.ts +5 -0
- package/build/src/database/drivers/base-table.d.ts.map +1 -1
- package/build/src/database/drivers/base-table.js +11 -1
- package/build/src/database/drivers/base.d.ts +9 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +12 -1
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.js +7 -3
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +2 -1
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +2 -1
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +3 -2
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +11 -2
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +15 -2
- package/build/src/database/table-data/index.d.ts +24 -24
- package/build/src/database/table-data/index.d.ts.map +1 -1
- package/build/src/database/table-data/index.js +13 -13
- package/build/src/http-client/response.d.ts +4 -0
- package/build/src/http-client/response.d.ts.map +1 -1
- package/build/src/http-client/response.js +19 -17
- package/build/src/http-client/websocket-client.d.ts +105 -0
- package/build/src/http-client/websocket-client.d.ts.map +1 -0
- package/build/src/http-client/websocket-client.js +237 -0
- package/build/src/http-server/client/index.d.ts +14 -0
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +72 -1
- package/build/src/http-server/client/params-to-object.d.ts +7 -7
- package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
- package/build/src/http-server/client/params-to-object.js +4 -4
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts +21 -2
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/form-data-part.js +62 -4
- package/build/src/http-server/client/request-parser.js +2 -2
- package/build/src/http-server/client/request-runner.d.ts +4 -4
- package/build/src/http-server/client/request-runner.d.ts.map +1 -1
- package/build/src/http-server/client/request-runner.js +2 -2
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +21 -0
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -0
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +26 -0
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +21 -0
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -0
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +26 -0
- package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +29 -0
- package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -0
- package/build/src/http-server/client/uploaded-file/uploaded-file.js +34 -0
- package/build/src/http-server/client/websocket-request.d.ts +40 -0
- package/build/src/http-server/client/websocket-request.d.ts.map +1 -0
- package/build/src/http-server/client/websocket-request.js +88 -0
- package/build/src/http-server/client/websocket-session.d.ts +73 -0
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -0
- package/build/src/http-server/client/websocket-session.js +231 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +6 -3
- package/build/src/http-server/websocket-events-host.d.ts +22 -0
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -0
- package/build/src/http-server/websocket-events-host.js +29 -0
- package/build/src/http-server/websocket-events.d.ts +20 -0
- package/build/src/http-server/websocket-events.d.ts.map +1 -0
- package/build/src/http-server/websocket-events.js +23 -0
- package/build/src/http-server/worker-handler/index.d.ts +19 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +24 -3
- package/build/src/http-server/worker-handler/worker-thread.d.ts +18 -2
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +23 -2
- package/build/src/routes/resolver.d.ts +5 -0
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +28 -2
- package/package.json +1 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* A small websocket client that mirrors simple HTTP-style calls and channel subscriptions.
|
|
4
|
+
*/
|
|
5
|
+
export default class VelociousWebsocketClient {
|
|
6
|
+
/**
|
|
7
|
+
* @param {object} [args]
|
|
8
|
+
* @param {boolean} [args.debug]
|
|
9
|
+
* @param {string} [args.url] Full websocket URL (default: ws://127.0.0.1:3006/websocket)
|
|
10
|
+
*/
|
|
11
|
+
constructor({ debug = false, url } = {}) {
|
|
12
|
+
if (!globalThis.WebSocket)
|
|
13
|
+
throw new Error("WebSocket global is not available");
|
|
14
|
+
this.debug = debug;
|
|
15
|
+
this.pendingRequests = new Map();
|
|
16
|
+
this.subscribedChannels = new Set();
|
|
17
|
+
this.url = url || "ws://127.0.0.1:3006/websocket";
|
|
18
|
+
this.listeners = new Map();
|
|
19
|
+
this.nextID = 1;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ensure a websocket connection is open.
|
|
23
|
+
* @returns {Promise<void>}
|
|
24
|
+
*/
|
|
25
|
+
async connect() {
|
|
26
|
+
if (this.socket && this.socket.readyState === this.socket.OPEN)
|
|
27
|
+
return;
|
|
28
|
+
if (this.connectPromise)
|
|
29
|
+
return this.connectPromise;
|
|
30
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
31
|
+
this.socket = new WebSocket(this.url);
|
|
32
|
+
const cleanup = () => {
|
|
33
|
+
this.socket?.removeEventListener("open", onOpen);
|
|
34
|
+
this.socket?.removeEventListener("error", onError);
|
|
35
|
+
};
|
|
36
|
+
const onOpen = () => {
|
|
37
|
+
cleanup();
|
|
38
|
+
resolve();
|
|
39
|
+
};
|
|
40
|
+
const onError = (event) => {
|
|
41
|
+
cleanup();
|
|
42
|
+
const error = event?.error || new Error("Websocket connection error");
|
|
43
|
+
reject(error);
|
|
44
|
+
};
|
|
45
|
+
this.socket.addEventListener("open", onOpen);
|
|
46
|
+
this.socket.addEventListener("error", onError);
|
|
47
|
+
this.socket.addEventListener("message", this.onMessage);
|
|
48
|
+
this.socket.addEventListener("close", this.onClose);
|
|
49
|
+
});
|
|
50
|
+
return this.connectPromise;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Close the websocket and clear pending state.
|
|
54
|
+
* @returns {Promise<void>}
|
|
55
|
+
*/
|
|
56
|
+
async close() {
|
|
57
|
+
if (!this.socket)
|
|
58
|
+
return;
|
|
59
|
+
await new Promise((resolve) => {
|
|
60
|
+
this.socket?.addEventListener("close", () => resolve());
|
|
61
|
+
this.socket?.close();
|
|
62
|
+
});
|
|
63
|
+
this.socket = undefined;
|
|
64
|
+
this.connectPromise = undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Perform a POST request over the websocket.
|
|
68
|
+
* @param {string} path
|
|
69
|
+
* @param {any} [body]
|
|
70
|
+
* @param {{headers?: Record<string, string>}} [options]
|
|
71
|
+
* @returns {Promise<VelociousWebsocketResponse>}
|
|
72
|
+
*/
|
|
73
|
+
async post(path, body, options = {}) {
|
|
74
|
+
return await this.request("POST", path, { ...options, body });
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Perform a GET request over the websocket.
|
|
78
|
+
* @param {string} path
|
|
79
|
+
* @param {{headers?: Record<string, string>}} [options]
|
|
80
|
+
* @returns {Promise<VelociousWebsocketResponse>}
|
|
81
|
+
*/
|
|
82
|
+
async get(path, options = {}) {
|
|
83
|
+
return await this.request("GET", path, options);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Subscribe to a channel for server-sent events.
|
|
87
|
+
* @param {string} channel
|
|
88
|
+
* @param {(payload: any) => void} callback
|
|
89
|
+
* @returns {() => void} unsubscribe function
|
|
90
|
+
*/
|
|
91
|
+
on(channel, callback) {
|
|
92
|
+
if (!this.listeners.has(channel)) {
|
|
93
|
+
this.listeners.set(channel, new Set());
|
|
94
|
+
this.subscribedChannels.add(channel);
|
|
95
|
+
void this.connect().then(() => {
|
|
96
|
+
this._sendMessage({ channel, type: "subscribe" });
|
|
97
|
+
}).catch((error) => this._debug("Subscribe failed", error));
|
|
98
|
+
}
|
|
99
|
+
const channelListeners = this.listeners.get(channel);
|
|
100
|
+
if (!channelListeners)
|
|
101
|
+
throw new Error("Listeners map not initialized");
|
|
102
|
+
channelListeners.add(callback);
|
|
103
|
+
return () => {
|
|
104
|
+
channelListeners.delete(callback);
|
|
105
|
+
if (channelListeners.size === 0) {
|
|
106
|
+
this.listeners.delete(channel);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* @private
|
|
112
|
+
* @param {string} method
|
|
113
|
+
* @param {string} path
|
|
114
|
+
* @param {object} [options]
|
|
115
|
+
* @param {any} [options.body]
|
|
116
|
+
* @param {Record<string, string>} [options.headers]
|
|
117
|
+
* @returns {Promise<VelociousWebsocketResponse>}
|
|
118
|
+
*/
|
|
119
|
+
async request(method, path, { body, headers } = {}) {
|
|
120
|
+
await this.connect();
|
|
121
|
+
const id = `ws-${this.nextID++}`;
|
|
122
|
+
const payload = {
|
|
123
|
+
body,
|
|
124
|
+
headers,
|
|
125
|
+
id,
|
|
126
|
+
method,
|
|
127
|
+
path,
|
|
128
|
+
type: "request"
|
|
129
|
+
};
|
|
130
|
+
return await new Promise((resolve, reject) => {
|
|
131
|
+
this.pendingRequests.set(id, { resolve, reject });
|
|
132
|
+
this._sendMessage(payload);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @private
|
|
137
|
+
* @param {MessageEvent<any>} event
|
|
138
|
+
*/
|
|
139
|
+
onMessage = (event) => {
|
|
140
|
+
const raw = typeof event.data === "string" ? event.data : event.data?.toString?.();
|
|
141
|
+
if (!raw)
|
|
142
|
+
return;
|
|
143
|
+
let message;
|
|
144
|
+
try {
|
|
145
|
+
message = JSON.parse(raw);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
this._debug("Failed to parse websocket message", error);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const { type } = message;
|
|
152
|
+
if (type === "response") {
|
|
153
|
+
const { id } = message;
|
|
154
|
+
const pending = id ? this.pendingRequests.get(id) : undefined;
|
|
155
|
+
if (pending) {
|
|
156
|
+
this.pendingRequests.delete(id);
|
|
157
|
+
pending.resolve(new VelociousWebsocketResponse(message));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this._debug(`No pending request for response id ${id}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (type === "event") {
|
|
164
|
+
const { channel, payload } = message;
|
|
165
|
+
const callbacks = this.listeners.get(channel);
|
|
166
|
+
callbacks?.forEach((callback) => {
|
|
167
|
+
try {
|
|
168
|
+
callback(payload);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
this._debug("Listener error", error);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else if (type === "error" && message.id) {
|
|
176
|
+
const pending = this.pendingRequests.get(message.id);
|
|
177
|
+
if (pending) {
|
|
178
|
+
this.pendingRequests.delete(message.id);
|
|
179
|
+
pending.reject(new Error(message.error || "Unknown websocket error"));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* Reject all pending requests when the socket closes unexpectedly.
|
|
185
|
+
* @private
|
|
186
|
+
*/
|
|
187
|
+
onClose = () => {
|
|
188
|
+
for (const [id, { reject }] of this.pendingRequests.entries()) {
|
|
189
|
+
reject(new Error(`Websocket closed before response for ${id}`));
|
|
190
|
+
}
|
|
191
|
+
this.pendingRequests.clear();
|
|
192
|
+
this.connectPromise = undefined;
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* @private
|
|
196
|
+
* @param {Record<string, any>} payload
|
|
197
|
+
*/
|
|
198
|
+
_sendMessage(payload) {
|
|
199
|
+
if (!this.socket || this.socket.readyState !== this.socket.OPEN) {
|
|
200
|
+
throw new Error("Websocket is not open");
|
|
201
|
+
}
|
|
202
|
+
const json = JSON.stringify(payload);
|
|
203
|
+
this._debug("Sending", json);
|
|
204
|
+
this.socket.send(json);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* @private
|
|
208
|
+
* @param {...any} args
|
|
209
|
+
* @returns {void}
|
|
210
|
+
*/
|
|
211
|
+
_debug(...args) {
|
|
212
|
+
if (!this.debug)
|
|
213
|
+
return;
|
|
214
|
+
console.debug("[VelociousWebsocketClient]", ...args);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
class VelociousWebsocketResponse {
|
|
218
|
+
/**
|
|
219
|
+
* @param {object} message
|
|
220
|
+
*/
|
|
221
|
+
constructor(message) {
|
|
222
|
+
this.body = message.body;
|
|
223
|
+
this.headers = message.headers || {};
|
|
224
|
+
this.id = message.id;
|
|
225
|
+
this.statusCode = message.statusCode || 200;
|
|
226
|
+
this.statusMessage = message.statusMessage || "OK";
|
|
227
|
+
this.type = message.type;
|
|
228
|
+
}
|
|
229
|
+
/** @returns {any} */
|
|
230
|
+
json() {
|
|
231
|
+
if (typeof this.body !== "string") {
|
|
232
|
+
throw new Error("Response body is not a string");
|
|
233
|
+
}
|
|
234
|
+
return JSON.parse(this.body);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXdCO0lBQzNDOzs7O09BSUc7SUFDSCxZQUFZLEVBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUMsR0FBRyxFQUFFO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUUvRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksK0JBQStCLENBQUE7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7WUFBRSxPQUFNO1FBQ3RFLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUE7UUFFbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFD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QUFPLENBQUMsRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUE7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQTtRQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixJQUFJO1FBQ0YsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQ2xELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEEgc21hbGwgd2Vic29ja2V0IGNsaWVudCB0aGF0IG1pcnJvcnMgc2ltcGxlIEhUVFAtc3R5bGUgY2FsbHMgYW5kIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnVybF0gRnVsbCB3ZWJzb2NrZXQgVVJMIChkZWZhdWx0OiB3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWJ1ZyA9IGZhbHNlLCB1cmx9ID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuV2ViU29ja2V0KSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgZ2xvYmFsIGlzIG5vdCBhdmFpbGFibGVcIilcblxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5zdWJzY3JpYmVkQ2hhbm5lbHMgPSBuZXcgU2V0KClcbiAgICB0aGlzLnVybCA9IHVybCB8fCBcIndzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0XCJcbiAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBNYXAoKVxuICAgIHRoaXMubmV4dElEID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHdlYnNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikgcmV0dXJuXG4gICAgaWYgKHRoaXMuY29ubmVjdFByb21pc2UpIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uT3BlbiA9ICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgY29uc3QgZXJyb3IgPSBldmVudD8uZXJyb3IgfHwgbmV3IEVycm9yKFwiV2Vic29ja2V0IGNvbm5lY3Rpb24gZXJyb3JcIilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25NZXNzYWdlKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBjbGVhciBwZW5kaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5zb2NrZXQpIHJldHVyblxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIFBPU1QgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7YW55fSBbYm9keV1cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiUE9TVFwiLCBwYXRoLCB7Li4ub3B0aW9ucywgYm9keX0pXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIEdFVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJHRVRcIiwgcGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSkgPT4gdm9pZH0gY2FsbGJhY2tcbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbihjaGFubmVsLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGNoYW5uZWwpKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoY2hhbm5lbCwgbmV3IFNldCgpKVxuICAgICAgdGhpcy5zdWJzY3JpYmVkQ2hhbm5lbHMuYWRkKGNoYW5uZWwpXG5cbiAgICAgIHZvaWQgdGhpcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtjaGFubmVsLCB0eXBlOiBcInN1YnNjcmliZVwifSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gdGhpcy5fZGVidWcoXCJTdWJzY3JpYmUgZmFpbGVkXCIsIGVycm9yKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsTGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoIWNoYW5uZWxMaXN0ZW5lcnMpIHRocm93IG5ldyBFcnJvcihcIkxpc3RlbmVycyBtYXAgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjaGFubmVsTGlzdGVuZXJzLmFkZChjYWxsYmFjaylcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjaGFubmVsTGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFjaylcblxuICAgICAgaWYgKGNoYW5uZWxMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoY2hhbm5lbClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0aW9ucy5ib2R5XVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLmhlYWRlcnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn1cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXRoLCB7Ym9keSwgaGVhZGVyc30gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICBjb25zdCBpZCA9IGB3cy0ke3RoaXMubmV4dElEKyt9YFxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGlkLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHR5cGU6IFwicmVxdWVzdFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZShwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnQ8YW55Pn0gZXZlbnRcbiAgICovXG4gIG9uTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJhdyA9IHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRhdGE/LnRvU3RyaW5nPy4oKVxuXG4gICAgaWYgKCFyYXcpIHJldHVyblxuXG4gICAgbGV0IG1lc3NhZ2VcblxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyYXcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGV9ID0gbWVzc2FnZVxuXG4gICAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2VcIikge1xuICAgICAgY29uc3Qge2lkfSA9IG1lc3NhZ2VcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBpZCA/IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChpZCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGlkKVxuICAgICAgICBwZW5kaW5nLnJlc29sdmUobmV3IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKG1lc3NhZ2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVidWcoYE5vIHBlbmRpbmcgcmVxdWVzdCBmb3IgcmVzcG9uc2UgaWQgJHtpZH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmxpc3RlbmVycy5nZXQoY2hhbm5lbClcblxuICAgICAgY2FsbGJhY2tzPy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fZGVidWcoXCJMaXN0ZW5lciBlcnJvclwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZXJyb3JcIiAmJiBtZXNzYWdlLmlkKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UuaWQpXG5cbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShtZXNzYWdlLmlkKVxuICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIlVua25vd24gd2Vic29ja2V0IGVycm9yXCIpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB0aGUgc29ja2V0IGNsb3NlcyB1bmV4cGVjdGVkbHkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2lkLCB7cmVqZWN0fV0gb2YgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZW50cmllcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSByZXNwb25zZSBmb3IgJHtpZH1gKSlcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGF5bG9hZFxuICAgKi9cbiAgX3NlbmRNZXNzYWdlKHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0IHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYnNvY2tldCBpcyBub3Qgb3BlblwiKVxuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuXG4gICAgdGhpcy5fZGVidWcoXCJTZW5kaW5nXCIsIGpzb24pXG4gICAgdGhpcy5zb2NrZXQuc2VuZChqc29uKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG59XG5cbmNsYXNzIFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5ib2R5ID0gbWVzc2FnZS5ib2R5XG4gICAgdGhpcy5oZWFkZXJzID0gbWVzc2FnZS5oZWFkZXJzIHx8IHt9XG4gICAgdGhpcy5pZCA9IG1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBtZXNzYWdlLnN0YXR1c0NvZGUgfHwgMjAwXG4gICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gbWVzc2FnZS5zdGF0dXNNZXNzYWdlIHx8IFwiT0tcIlxuICAgIHRoaXMudHlwZSA9IG1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9ICovXG4gIGpzb24oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc3BvbnNlIGJvZHkgaXMgbm90IGEgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5ib2R5KVxuICB9XG59XG4iXX0=
|
|
@@ -18,6 +18,11 @@ export default class VeoliciousHttpServerClient {
|
|
|
18
18
|
remoteAddress: string;
|
|
19
19
|
/** @type {RequestRunner[]} */
|
|
20
20
|
requestRunners: RequestRunner[];
|
|
21
|
+
/**
|
|
22
|
+
* @param {string} message
|
|
23
|
+
* @returns {void}
|
|
24
|
+
*/
|
|
25
|
+
_sendBadUpgradeResponse(message: string): void;
|
|
21
26
|
executeCurrentRequest: () => void;
|
|
22
27
|
/**
|
|
23
28
|
* @param {Buffer} data
|
|
@@ -25,6 +30,14 @@ export default class VeoliciousHttpServerClient {
|
|
|
25
30
|
*/
|
|
26
31
|
onWrite(data: Buffer): void;
|
|
27
32
|
currentRequest: Request;
|
|
33
|
+
/**
|
|
34
|
+
* @param {import("./request.js").default} request
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
_isWebsocketUpgrade(request: import("./request.js").default): boolean;
|
|
38
|
+
/** @returns {void} */
|
|
39
|
+
_upgradeToWebsocket(): void;
|
|
40
|
+
websocketSession: WebsocketSession;
|
|
28
41
|
requestDone: () => void;
|
|
29
42
|
sendDoneRequests(): void;
|
|
30
43
|
/**
|
|
@@ -37,4 +50,5 @@ import { EventEmitter } from "events";
|
|
|
37
50
|
import { Logger } from "../../logger.js";
|
|
38
51
|
import RequestRunner from "./request-runner.js";
|
|
39
52
|
import Request from "./request.js";
|
|
53
|
+
import WebsocketSession from "./websocket-session.js";
|
|
40
54
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAUA;IAIE;;;;;OAKG;IACH,2DAJG;QAAqB,WAAW,EAAxB,MAAM;QACyC,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC1B,aAAa,GAA3B,MAAM;KAAsB,EAYtC;IAnBD,8BAA2B;IAC3B,cAAiB;IAWf,eAA8B;IAC9B,oBAA8B;IAC9B,wDAAkC;IAClC,sBAAkC;IAElC,8BAA8B;IAC9B,gBADW,aAAa,EAAE,CACF;IAG1B;;;OAGG;IACH,iCAHW,MAAM,GACJ,IAAI,CAgBhB;IAED,kCAsBC;IAED;;;OAGG;IACH,cAHW,MAAM,GACJ,IAAI,CAoBhB;IAXG,wBAAoF;IAaxF;;;OAGG;IACH,6BAHW,OAAO,cAAc,EAAE,OAAO,GAC5B,OAAO,CAOnB;IAED,sBAAsB;IACtB,uBADc,IAAI,CAoCjB;IAXC,mCAGE;IAUJ,wBAEC;IAED,yBAqBC;IAED;;;OAGG;IACH,4BAHW,aAAa,GACX,IAAI,CAwChB;CACF;6BAvN0B,QAAQ;uBACd,iBAAiB;0BAEZ,qBAAqB;oBAD3B,cAAc;6BAEL,wBAAwB"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import crypto from "crypto";
|
|
2
3
|
import { digg } from "diggerize";
|
|
3
4
|
import { EventEmitter } from "events";
|
|
4
5
|
import { Logger } from "../../logger.js";
|
|
5
6
|
import Request from "./request.js";
|
|
6
7
|
import RequestRunner from "./request-runner.js";
|
|
8
|
+
import WebsocketSession from "./websocket-session.js";
|
|
7
9
|
export default class VeoliciousHttpServerClient {
|
|
8
10
|
events = new EventEmitter();
|
|
9
11
|
state = "initial";
|
|
@@ -23,10 +25,32 @@ export default class VeoliciousHttpServerClient {
|
|
|
23
25
|
/** @type {RequestRunner[]} */
|
|
24
26
|
this.requestRunners = [];
|
|
25
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} message
|
|
30
|
+
* @returns {void}
|
|
31
|
+
*/
|
|
32
|
+
_sendBadUpgradeResponse(message) {
|
|
33
|
+
const httpVersion = this.currentRequest?.httpVersion() || "1.1";
|
|
34
|
+
const body = `${message}\n`;
|
|
35
|
+
const headers = [
|
|
36
|
+
`HTTP/${httpVersion} 400 Bad Request`,
|
|
37
|
+
"Connection: Close",
|
|
38
|
+
"Content-Type: text/plain; charset=UTF-8",
|
|
39
|
+
`Content-Length: ${Buffer.byteLength(body, "utf8")}`,
|
|
40
|
+
"",
|
|
41
|
+
body
|
|
42
|
+
].join("\r\n");
|
|
43
|
+
this.events.emit("output", headers);
|
|
44
|
+
this.events.emit("close");
|
|
45
|
+
}
|
|
26
46
|
executeCurrentRequest = () => {
|
|
27
47
|
this.logger.debug("executeCurrentRequest");
|
|
28
48
|
if (!this.currentRequest)
|
|
29
49
|
throw new Error("No current request");
|
|
50
|
+
if (this._isWebsocketUpgrade(this.currentRequest)) {
|
|
51
|
+
this._upgradeToWebsocket();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
30
54
|
// We are done parsing the given request and can theoretically start parsing a new one, before the current request is done - so reset the state.
|
|
31
55
|
this.state = "initial";
|
|
32
56
|
const requestRunner = new RequestRunner({
|
|
@@ -42,6 +66,10 @@ export default class VeoliciousHttpServerClient {
|
|
|
42
66
|
* @returns {void}
|
|
43
67
|
*/
|
|
44
68
|
onWrite(data) {
|
|
69
|
+
if (this.websocketSession) {
|
|
70
|
+
this.websocketSession.onData(data);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
45
73
|
if (this.state == "initial") {
|
|
46
74
|
this.currentRequest = new Request({ client: this, configuration: this.configuration });
|
|
47
75
|
this.currentRequest.requestParser.events.on("done", this.executeCurrentRequest);
|
|
@@ -57,6 +85,49 @@ export default class VeoliciousHttpServerClient {
|
|
|
57
85
|
throw new Error(`Unknown state for client: ${this.state}`);
|
|
58
86
|
}
|
|
59
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* @param {import("./request.js").default} request
|
|
90
|
+
* @returns {boolean}
|
|
91
|
+
*/
|
|
92
|
+
_isWebsocketUpgrade(request) {
|
|
93
|
+
const upgradeHeader = request.header("upgrade")?.toLowerCase();
|
|
94
|
+
const connectionHeader = request.header("connection")?.toLowerCase();
|
|
95
|
+
return Boolean(upgradeHeader == "websocket" && connectionHeader?.includes("upgrade"));
|
|
96
|
+
}
|
|
97
|
+
/** @returns {void} */
|
|
98
|
+
_upgradeToWebsocket() {
|
|
99
|
+
if (!this.currentRequest)
|
|
100
|
+
throw new Error("No current request");
|
|
101
|
+
const secWebsocketKey = this.currentRequest.header("sec-websocket-key");
|
|
102
|
+
if (!secWebsocketKey) {
|
|
103
|
+
this._sendBadUpgradeResponse("Missing Sec-WebSocket-Key header");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const websocketAcceptKey = crypto.createHash("sha1")
|
|
107
|
+
.update(`${secWebsocketKey}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`, "binary")
|
|
108
|
+
.digest("base64");
|
|
109
|
+
const httpVersion = this.currentRequest.httpVersion() || "1.1";
|
|
110
|
+
const responseLines = [
|
|
111
|
+
`HTTP/${httpVersion} 101 Switching Protocols`,
|
|
112
|
+
"Upgrade: websocket",
|
|
113
|
+
"Connection: Upgrade",
|
|
114
|
+
`Sec-WebSocket-Accept: ${websocketAcceptKey}`,
|
|
115
|
+
"",
|
|
116
|
+
""
|
|
117
|
+
];
|
|
118
|
+
const response = responseLines.join("\r\n");
|
|
119
|
+
this.websocketSession = new WebsocketSession({
|
|
120
|
+
client: this,
|
|
121
|
+
configuration: this.configuration
|
|
122
|
+
});
|
|
123
|
+
this.websocketSession.events.on("close", () => {
|
|
124
|
+
this.websocketSession?.destroy();
|
|
125
|
+
this.websocketSession = undefined;
|
|
126
|
+
this.events.emit("close");
|
|
127
|
+
});
|
|
128
|
+
this.state = "websocket";
|
|
129
|
+
this.events.emit("output", response);
|
|
130
|
+
}
|
|
60
131
|
requestDone = () => {
|
|
61
132
|
this.sendDoneRequests();
|
|
62
133
|
};
|
|
@@ -116,4 +187,4 @@ export default class VeoliciousHttpServerClient {
|
|
|
116
187
|
this.events.emit("output", body);
|
|
117
188
|
}
|
|
118
189
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLGNBQWMsQ0FBQTtBQUNsQyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUUvQyxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3QyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixLQUFLLEdBQUcsU0FBUyxDQUFBO0lBRWpCOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBRTdELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFFbEMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxxQkFBcUIsR0FBRyxHQUFHLEVBQUU7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUUxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxNQUFNLElBQUksS0FBSyxD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QWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFM0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNuRCxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUM5QyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUV6QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFaEIsT0FBTyxJQUFJLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQTtRQUVySCxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sV0FBVyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsT0FBTyxJQUFJLEdBQUcsU0FBUyxLQUFLLFdBQVcsTUFBTSxDQUFBO1lBQy9DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQTtRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gXCJldmVudHNcIlxuaW1wb3J0IHtMb2dnZXJ9IGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3QgZnJvbSBcIi4vcmVxdWVzdC5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlb2xpY2lvdXNIdHRwU2VydmVyQ2xpZW50IHtcbiAgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIHN0YXRlID0gXCJpbml0aWFsXCJcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY2xpZW50Q291bnRcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucmVtb3RlQWRkcmVzc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnRDb3VudCwgY29uZmlndXJhdGlvbiwgcmVtb3RlQWRkcmVzc30pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuY2xpZW50Q291bnQgPSBjbGllbnRDb3VudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJlbW90ZUFkZHJlc3MgPSByZW1vdGVBZGRyZXNzXG5cbiAgICAvKiogQHR5cGUge1JlcXVlc3RSdW5uZXJbXX0gKi9cbiAgICB0aGlzLnJlcXVlc3RSdW5uZXJzID0gW11cbiAgfVxuXG4gIGV4ZWN1dGVDdXJyZW50UmVxdWVzdCA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcImV4ZWN1dGVDdXJyZW50UmVxdWVzdFwiKVxuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIC8vIFdlIGFyZSBkb25lIHBhcnNpbmcgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIGNhbiB0aGVvcmV0aWNhbGx5IHN0YXJ0IHBhcnNpbmcgYSBuZXcgb25lLCBiZWZvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBkb25lIC0gc28gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHRoaXMuc3RhdGUgPSBcImluaXRpYWxcIlxuXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3Q6IHRoaXMuY3VycmVudFJlcXVlc3RcbiAgICB9KVxuXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycy5wdXNoKHJlcXVlc3RSdW5uZXIpXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5yZXF1ZXN0RG9uZSlcbiAgICByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbldyaXRlKGRhdGEpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PSBcImluaXRpYWxcIikge1xuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHtjbGllbnQ6IHRoaXMsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbn0pXG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnJlcXVlc3RQYXJzZXIuZXZlbnRzLm9uKFwiZG9uZVwiLCB0aGlzLmV4ZWN1dGVDdXJyZW50UmVxdWVzdClcbiAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QuZmVlZChkYXRhKVxuICAgICAgdGhpcy5zdGF0ZSA9IFwicmVxdWVzdFN0YXJ0ZWRcIlxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcInJlcXVlc3RTdGFydGVkXCIpIHtcbiAgICAgIGlmICghdGhpcy5jdXJyZW50UmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY3VycmVudCByZXF1ZXN0XCIpXG5cbiAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QuZmVlZChkYXRhKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhdGUgZm9yIGNsaWVudDogJHt0aGlzLnN0YXRlfWApXG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdERvbmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZW5kRG9uZVJlcXVlc3RzKClcbiAgfVxuXG4gIHNlbmREb25lUmVxdWVzdHMoKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSB0aGlzLnJlcXVlc3RSdW5uZXJzWzBdXG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lcj8uZ2V0UmVxdWVzdCgpXG5cbiAgICAgIGlmIChyZXF1ZXN0UnVubmVyPy5nZXRTdGF0ZSgpID09IFwiZG9uZVwiKSB7XG4gICAgICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKVxuXG4gICAgICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMuc2hpZnQoKVxuICAgICAgICB0aGlzLnNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kRG9uZVJlcXVlc3RzXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259XSlcblxuICAgICAgICBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyICE9IFwia2VlcC1hbGl2ZVwiKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW2BDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgJHtodHRwVmVyc2lvbn0gYW5kIGNvbm5lY3Rpb24gaGVhZGVyICR7Y29ubmVjdGlvbkhlYWRlcn1gLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZXF1ZXN0UnVubmVyfSByZXF1ZXN0UnVubmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2VuZFJlc3BvbnNlKHJlcXVlc3RSdW5uZXIpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWdnKHJlcXVlc3RSdW5uZXIsIFwicmVzcG9uc2VcIilcbiAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lci5nZXRSZXF1ZXN0KClcbiAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXIoXCJjb25uZWN0aW9uXCIpPy50b0xvd2VyQ2FzZSgpPy50cmltKClcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHJlcXVlc3QuaHR0cFZlcnNpb24oKVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJzZW5kUmVzcG9uc2VcIiwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50LCBjb25uZWN0aW9uSGVhZGVyLCBodHRwVmVyc2lvbn0pXG5cbiAgICBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyID09IFwia2VlcC1hbGl2ZVwiKSB7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb25uZWN0aW9uXCIsIFwiS2VlcC1BbGl2ZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb25uZWN0aW9uXCIsIFwiQ2xvc2VcIilcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGJvZHkpLmxlbmd0aFxuXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiwgY29udGVudExlbmd0aClcbiAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJEYXRlXCIsIGRhdGUudG9VVENTdHJpbmcoKSlcbiAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJTZXJ2ZXJcIiwgXCJWZWxvY2lvdXNcIilcblxuICAgIGxldCBoZWFkZXJzID0gXCJcIlxuXG4gICAgaGVhZGVycyArPSBgSFRUUC8ke3RoaXMuY3VycmVudFJlcXVlc3QuaHR0cFZlcnNpb24oKX0gJHtyZXNwb25zZS5nZXRTdGF0dXNDb2RlKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpfVxcclxcbmBcblxuICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyVmFsdWUgb2YgcmVzcG9uc2UuaGVhZGVyc1toZWFkZXJLZXldKSB7XG4gICAgICAgIGhlYWRlcnMgKz0gYCR7aGVhZGVyS2V5fTogJHtoZWFkZXJWYWx1ZX1cXHJcXG5gXG4gICAgICB9XG4gICAgfVxuXG4gICAgaGVhZGVycyArPSBcIlxcclxcblwiXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGhlYWRlcnMpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBib2R5KVxuICB9XG59XG4iXX0=
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUN0QyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3QyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixLQUFLLEdBQUcsU0FBUyxDQUFBO0lBRWpCOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBRTdELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFFbEMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsQ0FBQyxPQUFPO1FBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxj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QUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tIFwiZXZlbnRzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0IGZyb20gXCIuL3JlcXVlc3QuanNcIlxuaW1wb3J0IFJlcXVlc3RSdW5uZXIgZnJvbSBcIi4vcmVxdWVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldFNlc3Npb24gZnJvbSBcIi4vd2Vic29ja2V0LXNlc3Npb24uanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZW9saWNpb3VzSHR0cFNlcnZlckNsaWVudCB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdGF0ZSA9IFwiaW5pdGlhbFwiXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZUFkZHJlc3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50Q291bnQsIGNvbmZpZ3VyYXRpb24sIHJlbW90ZUFkZHJlc3N9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNsaWVudENvdW50ID0gY2xpZW50Q291bnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZW1vdGVBZGRyZXNzID0gcmVtb3RlQWRkcmVzc1xuXG4gICAgLyoqIEB0eXBlIHtSZXF1ZXN0UnVubmVyW119ICovXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2VuZEJhZFVwZ3JhZGVSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSB0aGlzLmN1cnJlbnRSZXF1ZXN0Py5odHRwVmVyc2lvbigpIHx8IFwiMS4xXCJcbiAgICBjb25zdCBib2R5ID0gYCR7bWVzc2FnZX1cXG5gXG4gICAgY29uc3QgaGVhZGVycyA9IFtcbiAgICAgIGBIVFRQLyR7aHR0cFZlcnNpb259IDQwMCBCYWQgUmVxdWVzdGAsXG4gICAgICBcIkNvbm5lY3Rpb246IENsb3NlXCIsXG4gICAgICBcIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFwiLFxuICAgICAgYENvbnRlbnQtTGVuZ3RoOiAke0J1ZmZlci5ieXRlTGVuZ3RoKGJvZHksIFwidXRmOFwiKX1gLFxuICAgICAgXCJcIixcbiAgICAgIGJvZHlcbiAgICBdLmpvaW4oXCJcXHJcXG5cIilcblxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgaGVhZGVycylcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIGV4ZWN1dGVDdXJyZW50UmVxdWVzdCA9ICgpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcImV4ZWN1dGVDdXJyZW50UmVxdWVzdFwiKVxuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGlmICh0aGlzLl9pc1dlYnNvY2tldFVwZ3JhZGUodGhpcy5jdXJyZW50UmVxdWVzdCkpIHtcbiAgICAgIHRoaXMuX3VwZ3JhZGVUb1dlYnNvY2tldCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgZG9uZSBwYXJzaW5nIHRoZSBnaXZlbiByZXF1ZXN0IGFuZCBjYW4gdGhlb3JldGljYWxseSBzdGFydCBwYXJzaW5nIGEgbmV3IG9uZSwgYmVmb3JlIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgZG9uZSAtIHNvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB0aGlzLnN0YXRlID0gXCJpbml0aWFsXCJcblxuICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSBuZXcgUmVxdWVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0OiB0aGlzLmN1cnJlbnRSZXF1ZXN0XG4gICAgfSlcblxuICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMucHVzaChyZXF1ZXN0UnVubmVyKVxuXG4gICAgcmVxdWVzdFJ1bm5lci5ldmVudHMub24oXCJkb25lXCIsIHRoaXMucmVxdWVzdERvbmUpXG4gICAgcmVxdWVzdFJ1bm5lci5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Xcml0ZShkYXRhKSB7XG4gICAgaWYgKHRoaXMud2Vic29ja2V0U2Vzc2lvbikge1xuICAgICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uLm9uRGF0YShkYXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT0gXCJpbml0aWFsXCIpIHtcbiAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBuZXcgUmVxdWVzdCh7Y2xpZW50OiB0aGlzLCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5yZXF1ZXN0UGFyc2VyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5leGVjdXRlQ3VycmVudFJlcXVlc3QpXG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LmZlZWQoZGF0YSlcbiAgICAgIHRoaXMuc3RhdGUgPSBcInJlcXVlc3RTdGFydGVkXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJyZXF1ZXN0U3RhcnRlZFwiKSB7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LmZlZWQoZGF0YSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlIGZvciBjbGllbnQ6ICR7dGhpcy5zdGF0ZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgX2lzV2Vic29ja2V0VXBncmFkZShyZXF1ZXN0KSB7XG4gICAgY29uc3QgdXBncmFkZUhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwidXBncmFkZVwiKT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHVwZ3JhZGVIZWFkZXIgPT0gXCJ3ZWJzb2NrZXRcIiAmJiBjb25uZWN0aW9uSGVhZGVyPy5pbmNsdWRlcyhcInVwZ3JhZGVcIikpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF91cGdyYWRlVG9XZWJzb2NrZXQoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHNlY1dlYnNvY2tldEtleSA9IHRoaXMuY3VycmVudFJlcXVlc3QuaGVhZGVyKFwic2VjLXdlYnNvY2tldC1rZXlcIilcblxuICAgIGlmICghc2VjV2Vic29ja2V0S2V5KSB7XG4gICAgICB0aGlzLl9zZW5kQmFkVXBncmFkZVJlc3BvbnNlKFwiTWlzc2luZyBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXJcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldEFjY2VwdEtleSA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKVxuICAgICAgLnVwZGF0ZShgJHtzZWNXZWJzb2NrZXRLZXl9MjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExYCwgXCJiaW5hcnlcIilcbiAgICAgIC5kaWdlc3QoXCJiYXNlNjRcIilcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3QuaHR0cFZlcnNpb24oKSB8fCBcIjEuMVwiXG4gICAgY29uc3QgcmVzcG9uc2VMaW5lcyA9IFtcbiAgICAgIGBIVFRQLyR7aHR0cFZlcnNpb259IDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzYCxcbiAgICAgIFwiVXBncmFkZTogd2Vic29ja2V0XCIsXG4gICAgICBcIkNvbm5lY3Rpb246IFVwZ3JhZGVcIixcbiAgICAgIGBTZWMtV2ViU29ja2V0LUFjY2VwdDogJHt3ZWJzb2NrZXRBY2NlcHRLZXl9YCxcbiAgICAgIFwiXCIsXG4gICAgICBcIlwiXG4gICAgXVxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VMaW5lcy5qb2luKFwiXFxyXFxuXCIpXG5cbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24gPSBuZXcgV2Vic29ja2V0U2Vzc2lvbih7XG4gICAgICBjbGllbnQ6IHRoaXMsXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb25cbiAgICB9KVxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5ldmVudHMub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLndlYnNvY2tldFNlc3Npb24/LmRlc3Ryb3koKVxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICB9KVxuICAgIHRoaXMuc3RhdGUgPSBcIndlYnNvY2tldFwiXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCByZXNwb25zZSlcbiAgfVxuXG4gIHJlcXVlc3REb25lID0gKCkgPT4ge1xuICAgIHRoaXMuc2VuZERvbmVSZXF1ZXN0cygpXG4gIH1cblxuICBzZW5kRG9uZVJlcXVlc3RzKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gdGhpcy5yZXF1ZXN0UnVubmVyc1swXVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RSdW5uZXI/LmdldFJlcXVlc3QoKVxuXG4gICAgICBpZiAocmVxdWVzdFJ1bm5lcj8uZ2V0U3RhdGUoKSA9PSBcImRvbmVcIikge1xuICAgICAgICBjb25zdCBodHRwVmVyc2lvbiA9IHJlcXVlc3QuaHR0cFZlcnNpb24oKVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXIoXCJjb25uZWN0aW9uXCIpPy50b0xvd2VyQ2FzZSgpPy50cmltKClcblxuICAgICAgICB0aGlzLnJlcXVlc3RSdW5uZXJzLnNoaWZ0KClcbiAgICAgICAgdGhpcy5zZW5kUmVzcG9uc2UocmVxdWVzdFJ1bm5lcilcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic2VuZERvbmVSZXF1ZXN0c1wiLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnQsIGNvbm5lY3Rpb25IZWFkZXIsIGh0dHBWZXJzaW9ufV0pXG5cbiAgICAgICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgY29ubmVjdGlvbkhlYWRlciAhPSBcImtlZXAtYWxpdmVcIikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtgQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlICR7aHR0cFZlcnNpb259IGFuZCBjb25uZWN0aW9uIGhlYWRlciAke2Nvbm5lY3Rpb25IZWFkZXJ9YCwge2NsaWVudENvdW50OiB0aGlzLmNsaWVudENvdW50fV0pXG4gICAgICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVxdWVzdFJ1bm5lcn0gcmVxdWVzdFJ1bm5lclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZGlnZyhyZXF1ZXN0UnVubmVyLCBcInJlc3BvbnNlXCIpXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RSdW5uZXIuZ2V0UmVxdWVzdCgpXG4gICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgY29ubmVjdGlvbkhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwiY29ubmVjdGlvblwiKT8udG9Mb3dlckNhc2UoKT8udHJpbSgpXG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSByZXF1ZXN0Lmh0dHBWZXJzaW9uKClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwic2VuZFJlc3BvbnNlXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259KVxuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgY29ubmVjdGlvbkhlYWRlciA9PSBcImtlZXAtYWxpdmVcIikge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIktlZXAtQWxpdmVcIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIkNsb3NlXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KS5sZW5ndGhcblxuICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIsIGNvbnRlbnRMZW5ndGgpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiRGF0ZVwiLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiU2VydmVyXCIsIFwiVmVsb2Npb3VzXCIpXG5cbiAgICBsZXQgaGVhZGVycyA9IFwiXCJcblxuICAgIGhlYWRlcnMgKz0gYEhUVFAvJHt0aGlzLmN1cnJlbnRSZXF1ZXN0Lmh0dHBWZXJzaW9uKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpfSAke3Jlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKX1cXHJcXG5gXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlclZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyS2V5XSkge1xuICAgICAgICBoZWFkZXJzICs9IGAke2hlYWRlcktleX06ICR7aGVhZGVyVmFsdWV9XFxyXFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWRlcnMgKz0gXCJcXHJcXG5cIlxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgYm9keSlcbiAgfVxufVxuIl19
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
export default class ParamsToObject {
|
|
2
2
|
/**
|
|
3
|
-
* @param {Record<string,
|
|
3
|
+
* @param {Record<string, any>} object
|
|
4
4
|
*/
|
|
5
|
-
constructor(object: Record<string,
|
|
6
|
-
object: Record<string,
|
|
5
|
+
constructor(object: Record<string, any>);
|
|
6
|
+
object: Record<string, any>;
|
|
7
7
|
/** @returns {Record<string, any>} */
|
|
8
8
|
toObject(): Record<string, any>;
|
|
9
9
|
/**
|
|
10
10
|
* @param {string} key
|
|
11
|
-
* @param {
|
|
11
|
+
* @param {any} value
|
|
12
12
|
* @param {Record<string, any> | any[]} result
|
|
13
13
|
* @returns {void}
|
|
14
14
|
*/
|
|
15
|
-
treatInitial(key: string, value:
|
|
15
|
+
treatInitial(key: string, value: any, result: Record<string, any> | any[]): void;
|
|
16
16
|
/**
|
|
17
|
-
* @param {
|
|
17
|
+
* @param {any} value
|
|
18
18
|
* @param {string} rest
|
|
19
19
|
* @param {Record<string, any> | any[]} result
|
|
20
20
|
* @returns {void}
|
|
21
21
|
*/
|
|
22
|
-
treatSecond(value:
|
|
22
|
+
treatSecond(value: any, rest: string, result: Record<string, any> | any[]): void;
|
|
23
23
|
}
|
|
24
24
|
//# sourceMappingURL=params-to-object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params-to-object.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/params-to-object.js"],"names":[],"mappings":"AAEA;IACE;;OAEG;IACH,oBAFW,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"params-to-object.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/params-to-object.js"],"names":[],"mappings":"AAEA;IACE;;OAEG;IACH,oBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAI7B;IADC,4BAAoB;IAGtB,qCAAqC;IACrC,YADc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAWhC;IAED;;;;;OAKG;IACH,kBALW,MAAM,SACN,GAAG,UACH,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GACzB,IAAI,CA0BhB;IAED;;;;;OAKG;IACH,mBALW,GAAG,QACH,MAAM,UACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GACzB,IAAI,CA8BhB;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
export default class ParamsToObject {
|
|
3
3
|
/**
|
|
4
|
-
* @param {Record<string,
|
|
4
|
+
* @param {Record<string, any>} object
|
|
5
5
|
*/
|
|
6
6
|
constructor(object) {
|
|
7
7
|
this.object = object;
|
|
@@ -17,7 +17,7 @@ export default class ParamsToObject {
|
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* @param {string} key
|
|
20
|
-
* @param {
|
|
20
|
+
* @param {any} value
|
|
21
21
|
* @param {Record<string, any> | any[]} result
|
|
22
22
|
* @returns {void}
|
|
23
23
|
*/
|
|
@@ -46,7 +46,7 @@ export default class ParamsToObject {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* @param {
|
|
49
|
+
* @param {any} value
|
|
50
50
|
* @param {string} rest
|
|
51
51
|
* @param {Record<string, any> | any[]} result
|
|
52
52
|
* @returns {void}
|
|
@@ -81,4 +81,4 @@ export default class ParamsToObject {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLXRvLW9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci9jbGllbnQvcGFyYW1zLXRvLW9iamVjdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFjO0lBQ2pDOztPQUVHO0lBQ0gsWUFBWSxNQUFNO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsUUFBUTtRQUNOLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUVqQixLQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRTlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN2QyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNO1FBQzdCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUVwRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUUxQiwrQ0FBK0M7WUFDL0MsSUFBSSxTQUFTLENBQUE7WUFFYixJQUFJLFNBQVMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMvQixDQUFDO2lCQUFNLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN4QixTQUFTLEdBQUcsRUFBRSxDQUFBO2dCQUNkLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUE7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsR0FBRyxFQUFFLENBQUE7Z0JBQ2QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtZQUMvQixDQUFDO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzFDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTTtRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFFdEQsSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBRXZFLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMxQixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFOUIsK0NBQStDO1FBQy9DLElBQUksU0FBUyxDQUFBO1FBRWIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQixDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUNyQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksT0FBTyxNQUFNLElBQUksUUFBUSxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDL0MsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUMzQixTQUFTLEdBQUcsRUFBRSxDQUFBO2dCQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUE7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsR0FBRyxFQUFFLENBQUE7Z0JBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtZQUN6QixDQUFDO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyYW1zVG9PYmplY3Qge1xuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9iamVjdCkge1xuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0XG4gIH1cblxuICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIHRvT2JqZWN0KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IoY29uc3Qga2V5IGluIHRoaXMub2JqZWN0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMub2JqZWN0W2tleV1cblxuICAgICAgdGhpcy50cmVhdEluaXRpYWwoa2V5LCB2YWx1ZSwgcmVzdWx0KVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXX0gcmVzdWx0XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdHJlYXRJbml0aWFsKGtleSwgdmFsdWUsIHJlc3VsdCkge1xuICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBrZXkubWF0Y2goL14oLis/KShcXFsoW1xcc1xcU10rJCkpLylcblxuICAgIGlmIChmaXJzdE1hdGNoKSB7XG4gICAgICBjb25zdCBpbnB1dE5hbWUgPSBmaXJzdE1hdGNoWzFdXG4gICAgICBjb25zdCByZXN0ID0gZmlyc3RNYXRjaFsyXVxuXG4gICAgICAvKiogQHR5cGUge0FycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgICAgbGV0IG5ld1Jlc3VsdFxuXG4gICAgICBpZiAoaW5wdXROYW1lIGluIHJlc3VsdCkge1xuICAgICAgICBuZXdSZXN1bHQgPSByZXN1bHRbaW5wdXROYW1lXVxuICAgICAgfSBlbHNlIGlmIChyZXN0ID09IFwiW11cIikge1xuICAgICAgICBuZXdSZXN1bHQgPSBbXVxuICAgICAgICByZXN1bHRbaW5wdXROYW1lXSA9IG5ld1Jlc3VsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UmVzdWx0ID0ge31cbiAgICAgICAgcmVzdWx0W2lucHV0TmFtZV0gPSBuZXdSZXN1bHRcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmVhdFNlY29uZCh2YWx1ZSwgcmVzdCwgbmV3UmVzdWx0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzdFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXX0gcmVzdWx0XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdHJlYXRTZWNvbmQodmFsdWUsIHJlc3QsIHJlc3VsdCkge1xuICAgIGNvbnN0IHNlY29uZE1hdGNoID0gcmVzdC5tYXRjaCgvXlxcWyguKj8pXFxdKFtcXHNcXFNdKikkLylcblxuICAgIGlmICghc2Vjb25kTWF0Y2gpIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHJlc3QgcGFydDogJHtyZXN0fWApXG5cbiAgICBjb25zdCBrZXkgPSBzZWNvbmRNYXRjaFsxXVxuICAgIGNvbnN0IG5ld1Jlc3QgPSBzZWNvbmRNYXRjaFsyXVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbmV3UmVzdWx0XG5cbiAgICBpZiAocmVzdCA9PSBcIltdXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICAgIH0gZWxzZSBpZiAobmV3UmVzdCA9PSBcIlwiKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09IFwib2JqZWN0XCIgJiYga2V5IGluIHJlc3VsdCkge1xuICAgICAgICBuZXdSZXN1bHQgPSByZXN1bHRba2V5XVxuICAgICAgfSBlbHNlIGlmIChuZXdSZXN0ID09IFwiW11cIikge1xuICAgICAgICBuZXdSZXN1bHQgPSBbXVxuICAgICAgICByZXN1bHRba2V5XSA9IG5ld1Jlc3VsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UmVzdWx0ID0ge31cbiAgICAgICAgcmVzdWx0W2tleV0gPSBuZXdSZXN1bHRcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmVhdFNlY29uZCh2YWx1ZSwgbmV3UmVzdCwgbmV3UmVzdWx0KVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -8,14 +8,33 @@ export default class FormDataPart {
|
|
|
8
8
|
*/
|
|
9
9
|
addHeader(header: import("./header.js").default): void;
|
|
10
10
|
name: string;
|
|
11
|
+
filename: string;
|
|
11
12
|
contentLength: number;
|
|
13
|
+
contentType: string;
|
|
12
14
|
finish(): void;
|
|
13
|
-
|
|
15
|
+
size: number;
|
|
16
|
+
value: string | MemoryUploadedFile | TemporaryUploadedFile;
|
|
17
|
+
buildUploadedFile(buffer: any): MemoryUploadedFile | TemporaryUploadedFile;
|
|
18
|
+
/**
|
|
19
|
+
* @param {Buffer} buffer
|
|
20
|
+
* @param {string} filename
|
|
21
|
+
* @returns {string}
|
|
22
|
+
*/
|
|
23
|
+
createTempFile(buffer: Buffer, filename: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Prevent path traversal/absolute paths from filenames coming from headers.
|
|
26
|
+
* @param {string | undefined} filename
|
|
27
|
+
* @returns {string}
|
|
28
|
+
*/
|
|
29
|
+
_sanitizeFilename(filename: string | undefined): string;
|
|
14
30
|
getName(): string;
|
|
15
|
-
getValue():
|
|
31
|
+
getValue(): string | MemoryUploadedFile | TemporaryUploadedFile;
|
|
32
|
+
isFile(): boolean;
|
|
16
33
|
/**
|
|
17
34
|
* @param {string} text
|
|
18
35
|
*/
|
|
19
36
|
removeFromBody(text: string): void;
|
|
20
37
|
}
|
|
38
|
+
import MemoryUploadedFile from "../uploaded-file/memory-uploaded-file.js";
|
|
39
|
+
import TemporaryUploadedFile from "../uploaded-file/temporary-uploaded-file.js";
|
|
21
40
|
//# sourceMappingURL=form-data-part.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-data-part.d.ts","sourceRoot":"","sources":["../../../../../src/http-server/client/request-buffer/form-data-part.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"form-data-part.d.ts","sourceRoot":"","sources":["../../../../../src/http-server/client/request-buffer/form-data-part.js"],"names":[],"mappings":"AAUA;IACE,4DAA4D;IAC5D,SADW,MAAM,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,OAAO,CAAC,CAC5C;IAEZ,uBAAuB;IACvB,MADW,MAAM,EAAE,CACV;IAET;;OAEG;IACH,kBAFW,OAAO,aAAa,EAAE,OAAO,QAqBvC;IAVK,aAAoB;IACpB,iBAAwB;IAK1B,sBAA2C;IAE3C,oBAA+B;IAInC,eAYC;IATC,aAAyB;IAGvB,2DAA2C;IAQ/C,2EAiBC;IAED;;;;OAIG;IACH,uBAJW,MAAM,YACN,MAAM,GACJ,MAAM,CASlB;IAED;;;;OAIG;IACH,4BAHW,MAAM,GAAG,SAAS,GAChB,MAAM,CAUlB;IAED,kBAIC;IAED,gEAIC;IAED,kBAA0C;IAE1C;;OAEG;IACH,qBAFW,MAAM,QAIhB;CACF;+BAtH8B,0CAA0C;kCACvC,6CAA6C"}
|