node-logy 0.1.2 → 0.1.4
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/dist/{logger.d.ts → index.d.ts} +19 -36
- package/dist/index.d.ts.map +1 -0
- package/dist/{logger.js → index.js} +36 -80
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +5 -186
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -357
- package/dist/protocol.js.map +1 -1
- package/dist/server.js +30 -12
- package/dist/server.js.map +1 -1
- package/dist/worker.d.ts +5 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +199 -0
- package/dist/worker.js.map +1 -0
- package/package.json +2 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
package/dist/protocol.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.VALID_LOG_LEVELS = exports.LOG_LEVEL = exports.VALID_METHODS = exports.METHOD = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Contains all methods a request / response can have
|
|
6
6
|
*/
|
|
@@ -55,360 +55,4 @@ exports.LOG_LEVEL = {
|
|
|
55
55
|
* Contains a set of valid log levels
|
|
56
56
|
*/
|
|
57
57
|
exports.VALID_LOG_LEVELS = new Set(Object.values(exports.LOG_LEVEL));
|
|
58
|
-
/**
|
|
59
|
-
* Error thrown when encoding/decoding fails
|
|
60
|
-
*/
|
|
61
|
-
class ProtocolError extends Error {
|
|
62
|
-
constructor(message) {
|
|
63
|
-
super(message);
|
|
64
|
-
this.name = "ProtocolError";
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
exports.ProtocolError = ProtocolError;
|
|
68
|
-
/**
|
|
69
|
-
* Used to encode the request messages to the buffer protocol encoding
|
|
70
|
-
*/
|
|
71
|
-
class RequestEncoder {
|
|
72
|
-
static HEADER_SIZE = 8;
|
|
73
|
-
static MAX_ID = 0xffffffff;
|
|
74
|
-
static MAX_PAYLOAD_LENGTH = 0xffff;
|
|
75
|
-
validMethods;
|
|
76
|
-
validLevels;
|
|
77
|
-
constructor(validMethods = exports.VALID_METHODS, validLevels = exports.VALID_LOG_LEVELS) {
|
|
78
|
-
this.validMethods = validMethods;
|
|
79
|
-
this.validLevels = validLevels;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Validates that a buffer contains a complete, valid request binary protocol
|
|
83
|
-
* without actually decoding the content. Checks:
|
|
84
|
-
* - Buffer has complete header (8 bytes)
|
|
85
|
-
* - Buffer has complete message (header + payload)
|
|
86
|
-
* - Payload length is within valid range (0 to 65535)
|
|
87
|
-
*
|
|
88
|
-
* @param buffer The buffer to validate
|
|
89
|
-
* @returns true if buffer is a valid complete request, false otherwise
|
|
90
|
-
*/
|
|
91
|
-
static isValid(buffer) {
|
|
92
|
-
// Check complete header exists
|
|
93
|
-
if (!RequestEncoder.hasCompleteHeader(buffer)) {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
// Check payload length is valid
|
|
97
|
-
const payloadLength = RequestEncoder.getPayloadLength(buffer);
|
|
98
|
-
// Check complete message exists
|
|
99
|
-
if (buffer.length !== RequestEncoder.HEADER_SIZE + payloadLength) {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Instance method to validate with method/level checking
|
|
106
|
-
* Validates that a buffer contains a complete, valid request with valid method and level values
|
|
107
|
-
*/
|
|
108
|
-
isValidInstance(buffer) {
|
|
109
|
-
// First do static validation
|
|
110
|
-
if (!RequestEncoder.isValid(buffer)) {
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
// Check method is valid
|
|
114
|
-
const method = RequestEncoder.getMethod(buffer);
|
|
115
|
-
if (!this.validMethods.has(method)) {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
// Check level is valid
|
|
119
|
-
const level = RequestEncoder.getLevel(buffer);
|
|
120
|
-
if (!this.validLevels.has(level)) {
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Get the ID from a buffer (4 bytes, uint32 at offset 0)
|
|
127
|
-
*/
|
|
128
|
-
static getId(buffer) {
|
|
129
|
-
return buffer.readUInt32BE(0);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Get the method from a buffer (1 byte at offset 4)
|
|
133
|
-
*/
|
|
134
|
-
static getMethod(buffer) {
|
|
135
|
-
return buffer[4];
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Get the level from a buffer (1 byte at offset 5)
|
|
139
|
-
*/
|
|
140
|
-
static getLevel(buffer) {
|
|
141
|
-
return buffer[5];
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Get the payload length from a buffer (2 bytes, uint16 at offset 6)
|
|
145
|
-
*/
|
|
146
|
-
static getPayloadLength(buffer) {
|
|
147
|
-
return buffer.readUInt16BE(6);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get the payload as a Buffer from a buffer (starting at offset 8)
|
|
151
|
-
*/
|
|
152
|
-
static getPayloadBuffer(buffer) {
|
|
153
|
-
const payloadLength = RequestEncoder.getPayloadLength(buffer);
|
|
154
|
-
return buffer.subarray(RequestEncoder.HEADER_SIZE, RequestEncoder.HEADER_SIZE + payloadLength);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get the payload as a UTF-8 string from a buffer
|
|
158
|
-
*/
|
|
159
|
-
static getPayloadString(buffer) {
|
|
160
|
-
return RequestEncoder.getPayloadBuffer(buffer).toString("utf-8");
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Check if buffer has complete header (8 bytes)
|
|
164
|
-
*/
|
|
165
|
-
static hasCompleteHeader(buffer) {
|
|
166
|
-
return buffer.length >= RequestEncoder.HEADER_SIZE;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Check if buffer has complete message (header + payload)
|
|
170
|
-
*/
|
|
171
|
-
static hasCompleteMessage(buffer) {
|
|
172
|
-
if (!RequestEncoder.hasCompleteHeader(buffer))
|
|
173
|
-
return false;
|
|
174
|
-
const payloadLength = RequestEncoder.getPayloadLength(buffer);
|
|
175
|
-
return buffer.length >= RequestEncoder.HEADER_SIZE + payloadLength;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Get total message size (header + payload)
|
|
179
|
-
*/
|
|
180
|
-
static getTotalMessageSize(buffer) {
|
|
181
|
-
if (!RequestEncoder.hasCompleteHeader(buffer))
|
|
182
|
-
return RequestEncoder.HEADER_SIZE;
|
|
183
|
-
return RequestEncoder.HEADER_SIZE + RequestEncoder.getPayloadLength(buffer);
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Encode a request to the binary protocol
|
|
187
|
-
*/
|
|
188
|
-
encode(request) {
|
|
189
|
-
if (!Number.isInteger(request.id) ||
|
|
190
|
-
request.id < 0 ||
|
|
191
|
-
request.id > RequestEncoder.MAX_ID) {
|
|
192
|
-
throw new ProtocolError(`Invalid ID: ${request.id}`);
|
|
193
|
-
}
|
|
194
|
-
if (!this.validMethods.has(request.method)) {
|
|
195
|
-
throw new ProtocolError(`Invalid method: ${request.method}`);
|
|
196
|
-
}
|
|
197
|
-
if (!this.validLevels.has(request.level)) {
|
|
198
|
-
throw new ProtocolError(`Invalid level: ${request.level}`);
|
|
199
|
-
}
|
|
200
|
-
const payloadBytes = Buffer.from(request.payload, "utf-8");
|
|
201
|
-
if (payloadBytes.length > RequestEncoder.MAX_PAYLOAD_LENGTH) {
|
|
202
|
-
throw new ProtocolError(`Payload too large: ${payloadBytes.length} bytes`);
|
|
203
|
-
}
|
|
204
|
-
const buffer = Buffer.allocUnsafe(RequestEncoder.HEADER_SIZE + payloadBytes.length);
|
|
205
|
-
buffer.writeUInt32BE(request.id, 0);
|
|
206
|
-
buffer[4] = request.method;
|
|
207
|
-
buffer[5] = request.level;
|
|
208
|
-
buffer.writeUInt16BE(payloadBytes.length, 6);
|
|
209
|
-
payloadBytes.copy(buffer, 8);
|
|
210
|
-
return buffer;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Decode a binary protocol buffer to a request object
|
|
214
|
-
*/
|
|
215
|
-
decode(buffer) {
|
|
216
|
-
if (!RequestEncoder.hasCompleteHeader(buffer)) {
|
|
217
|
-
throw new ProtocolError(`Buffer too small: ${buffer.length} bytes, minimum ${RequestEncoder.HEADER_SIZE} bytes required`);
|
|
218
|
-
}
|
|
219
|
-
const id = RequestEncoder.getId(buffer);
|
|
220
|
-
const method = RequestEncoder.getMethod(buffer);
|
|
221
|
-
const level = RequestEncoder.getLevel(buffer);
|
|
222
|
-
const payloadLength = RequestEncoder.getPayloadLength(buffer);
|
|
223
|
-
if (buffer.length !== RequestEncoder.HEADER_SIZE + payloadLength) {
|
|
224
|
-
throw new ProtocolError(`Buffer size mismatch: expected ${RequestEncoder.HEADER_SIZE + payloadLength} bytes, got ${buffer.length} bytes`);
|
|
225
|
-
}
|
|
226
|
-
if (!this.validMethods.has(method)) {
|
|
227
|
-
throw new ProtocolError(`Invalid method: ${method}`);
|
|
228
|
-
}
|
|
229
|
-
if (!this.validLevels.has(level)) {
|
|
230
|
-
throw new ProtocolError(`Invalid level: ${level}`);
|
|
231
|
-
}
|
|
232
|
-
const payload = RequestEncoder.getPayloadString(buffer);
|
|
233
|
-
return {
|
|
234
|
-
id,
|
|
235
|
-
method: method,
|
|
236
|
-
level: level,
|
|
237
|
-
payload,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
static getHeaderSize() {
|
|
241
|
-
return RequestEncoder.HEADER_SIZE;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
exports.RequestEncoder = RequestEncoder;
|
|
245
|
-
/**
|
|
246
|
-
* Used to encode the response messages to the buffer protocol encoding
|
|
247
|
-
*/
|
|
248
|
-
class ResponseEncoder {
|
|
249
|
-
static HEADER_SIZE = 8;
|
|
250
|
-
static MAX_ID = 0xffffffff;
|
|
251
|
-
validMethods;
|
|
252
|
-
validLevels;
|
|
253
|
-
constructor(validMethods = exports.VALID_METHODS, validLevels = exports.VALID_LOG_LEVELS) {
|
|
254
|
-
this.validMethods = validMethods;
|
|
255
|
-
this.validLevels = validLevels;
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Validates that a buffer contains a valid response binary protocol
|
|
259
|
-
* without actually decoding the content. Checks:
|
|
260
|
-
* - Buffer has complete header (8 bytes)
|
|
261
|
-
* - Reserved byte is 0x00
|
|
262
|
-
* - Success byte is 0 or 1
|
|
263
|
-
*
|
|
264
|
-
* @param buffer The buffer to validate
|
|
265
|
-
* @returns true if buffer is a valid response, false otherwise
|
|
266
|
-
*/
|
|
267
|
-
static isValid(buffer) {
|
|
268
|
-
// Check complete header exists (responses are fixed 8 bytes)
|
|
269
|
-
if (buffer.length !== ResponseEncoder.HEADER_SIZE) {
|
|
270
|
-
return false;
|
|
271
|
-
}
|
|
272
|
-
// Check reserved byte is 0x00
|
|
273
|
-
if (buffer[7] !== 0x00) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
// Check success byte is valid (0 or 1)
|
|
277
|
-
const successByte = buffer[6];
|
|
278
|
-
if (successByte !== 0 && successByte !== 1) {
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
return true;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Instance method to validate with method/level checking
|
|
285
|
-
* Validates that a buffer contains a valid response with valid method and level values
|
|
286
|
-
*/
|
|
287
|
-
isValidInstance(buffer) {
|
|
288
|
-
// First do static validation
|
|
289
|
-
if (!ResponseEncoder.isValid(buffer)) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
// Check method is valid
|
|
293
|
-
const method = ResponseEncoder.getMethod(buffer);
|
|
294
|
-
if (!this.validMethods.has(method)) {
|
|
295
|
-
return false;
|
|
296
|
-
}
|
|
297
|
-
// Check level is valid
|
|
298
|
-
const level = ResponseEncoder.getLevel(buffer);
|
|
299
|
-
if (!this.validLevels.has(level)) {
|
|
300
|
-
return false;
|
|
301
|
-
}
|
|
302
|
-
return true;
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Get the ID from a buffer (4 bytes, uint32 at offset 0)
|
|
306
|
-
*/
|
|
307
|
-
static getId(buffer) {
|
|
308
|
-
return buffer.readUInt32BE(0);
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Get the method from a buffer (1 byte at offset 4)
|
|
312
|
-
*/
|
|
313
|
-
static getMethod(buffer) {
|
|
314
|
-
return buffer[4];
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Get the level from a buffer (1 byte at offset 5)
|
|
318
|
-
*/
|
|
319
|
-
static getLevel(buffer) {
|
|
320
|
-
return buffer[5];
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Get the success flag from a buffer (1 byte at offset 6)
|
|
324
|
-
* @returns boolean indicating success
|
|
325
|
-
*/
|
|
326
|
-
static getSuccess(buffer) {
|
|
327
|
-
const successByte = buffer[6];
|
|
328
|
-
return successByte === 1;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Get the reserved byte from a buffer (1 byte at offset 7)
|
|
332
|
-
*/
|
|
333
|
-
static getReserved(buffer) {
|
|
334
|
-
return buffer[7];
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Check if buffer has complete header (8 bytes)
|
|
338
|
-
* For responses, this means the buffer is exactly 8 bytes
|
|
339
|
-
*/
|
|
340
|
-
static hasCompleteHeader(buffer) {
|
|
341
|
-
return buffer.length >= ResponseEncoder.HEADER_SIZE;
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Check if buffer is a complete response message (exactly 8 bytes)
|
|
345
|
-
*/
|
|
346
|
-
static hasCompleteMessage(buffer) {
|
|
347
|
-
return buffer.length === ResponseEncoder.HEADER_SIZE;
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Get total message size (always 8 bytes for responses)
|
|
351
|
-
*/
|
|
352
|
-
static getTotalMessageSize() {
|
|
353
|
-
return ResponseEncoder.HEADER_SIZE;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Encode a response to the binary protocol
|
|
357
|
-
* @param response The JSON response object
|
|
358
|
-
* @returns Binary protocol buffer (exactly 8 bytes)
|
|
359
|
-
*/
|
|
360
|
-
encode(response) {
|
|
361
|
-
if (!Number.isInteger(response.id) ||
|
|
362
|
-
response.id < 0 ||
|
|
363
|
-
response.id > ResponseEncoder.MAX_ID) {
|
|
364
|
-
throw new ProtocolError(`Invalid ID: ${response.id}`);
|
|
365
|
-
}
|
|
366
|
-
if (!this.validMethods.has(response.method)) {
|
|
367
|
-
throw new ProtocolError(`Invalid method: ${response.method}`);
|
|
368
|
-
}
|
|
369
|
-
if (!this.validLevels.has(response.level)) {
|
|
370
|
-
throw new ProtocolError(`Invalid level: ${response.level}`);
|
|
371
|
-
}
|
|
372
|
-
const buffer = Buffer.allocUnsafe(ResponseEncoder.HEADER_SIZE);
|
|
373
|
-
buffer.writeUInt32BE(response.id, 0);
|
|
374
|
-
buffer[4] = response.method;
|
|
375
|
-
buffer[5] = response.level;
|
|
376
|
-
buffer[6] = response.success ? 1 : 0;
|
|
377
|
-
buffer[7] = 0x00; // reserved padding
|
|
378
|
-
return buffer;
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Decode a binary protocol buffer to a response object
|
|
382
|
-
* @param buffer The binary protocol buffer
|
|
383
|
-
* @returns The decoded response object
|
|
384
|
-
*/
|
|
385
|
-
decode(buffer) {
|
|
386
|
-
if (buffer.length !== ResponseEncoder.HEADER_SIZE) {
|
|
387
|
-
throw new ProtocolError(`Invalid buffer size: expected ${ResponseEncoder.HEADER_SIZE} bytes, got ${buffer.length} bytes`);
|
|
388
|
-
}
|
|
389
|
-
const id = ResponseEncoder.getId(buffer);
|
|
390
|
-
const method = ResponseEncoder.getMethod(buffer);
|
|
391
|
-
const level = ResponseEncoder.getLevel(buffer);
|
|
392
|
-
const success = ResponseEncoder.getSuccess(buffer);
|
|
393
|
-
if (buffer[7] !== 0x00) {
|
|
394
|
-
throw new ProtocolError(`Invalid reserved byte: expected 0x00, got 0x${buffer[7]?.toString(16).padStart(2, "0")}`);
|
|
395
|
-
}
|
|
396
|
-
if (!this.validMethods.has(method)) {
|
|
397
|
-
throw new ProtocolError(`Invalid method: ${method}`);
|
|
398
|
-
}
|
|
399
|
-
if (!this.validLevels.has(level)) {
|
|
400
|
-
throw new ProtocolError(`Invalid level: ${level}`);
|
|
401
|
-
}
|
|
402
|
-
return {
|
|
403
|
-
id,
|
|
404
|
-
method: method,
|
|
405
|
-
level: level,
|
|
406
|
-
success,
|
|
407
|
-
};
|
|
408
|
-
}
|
|
409
|
-
static getHeaderSize() {
|
|
410
|
-
return ResponseEncoder.HEADER_SIZE;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
exports.ResponseEncoder = ResponseEncoder;
|
|
414
58
|
//# sourceMappingURL=protocol.js.map
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,MAAM,GAAG;IACpB;;OAEG;IACH,GAAG,EAAE,IAAI;IAET;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,MAAM,EAAE,IAAI;IAEZ;;OAEG;IACH,QAAQ,EAAE,IAAI;CACN,CAAC;AAEX;;GAEG;AACU,QAAA,aAAa,GAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAM,CAAC,CAAC,CAAC;AAOzE;;GAEG;AACU,QAAA,SAAS,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,KAAK,EAAE,IAAI;CACH,CAAC;AAEX;;GAEG;AACU,QAAA,gBAAgB,GAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAS,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,MAAM,GAAG;IACpB;;OAEG;IACH,GAAG,EAAE,IAAI;IAET;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,MAAM,EAAE,IAAI;IAEZ;;OAEG;IACH,QAAQ,EAAE,IAAI;CACN,CAAC;AAEX;;GAEG;AACU,QAAA,aAAa,GAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAM,CAAC,CAAC,CAAC;AAOzE;;GAEG;AACU,QAAA,SAAS,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,KAAK,EAAE,IAAI;IAEX;;OAEG;IACH,KAAK,EAAE,IAAI;CACH,CAAC;AAEX;;GAEG;AACU,QAAA,gBAAgB,GAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAS,CAAC,CAAC,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -33,10 +33,10 @@ let fileWriteBufferArray = [];
|
|
|
33
33
|
* How long we wait until we flush unless the buffer gets full
|
|
34
34
|
*/
|
|
35
35
|
const FLUSH_MS = 130;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
// Increased to 256 buffers or 4MB, whichever comes first
|
|
37
|
+
const FILE_WRITE_BUFFER_FLUSH_COUNT = 256;
|
|
38
|
+
const FILE_WRITE_BUFFER_MAX_SIZE = 4 * 1024 * 1024; // 4MB
|
|
39
|
+
let currentBufferSize = 0;
|
|
40
40
|
/**
|
|
41
41
|
* Holds the timeout for flush
|
|
42
42
|
*/
|
|
@@ -65,18 +65,29 @@ const flush = () => {
|
|
|
65
65
|
if (fileWriteBufferArray.length === 0 || !fileStream) {
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
NEWLINE_BUFFER
|
|
73
|
-
|
|
68
|
+
const count = fileWriteBufferArray.length;
|
|
69
|
+
// Calculate total size: sum of all buffers + newlines (1 per entry + 1 final)
|
|
70
|
+
let totalSize = NEWLINE_BUFFER.length; // Final newline
|
|
71
|
+
for (let i = 0; i < count; i++) {
|
|
72
|
+
totalSize += fileWriteBufferArray[i].length + NEWLINE_BUFFER.length;
|
|
73
|
+
}
|
|
74
|
+
// Allocate buffer once
|
|
75
|
+
const joinedBuffer = Buffer.allocUnsafe(totalSize);
|
|
76
|
+
let offset = 0;
|
|
77
|
+
for (let i = 0; i < count; i++) {
|
|
78
|
+
const buf = fileWriteBufferArray[i];
|
|
79
|
+
buf.copy(joinedBuffer, offset);
|
|
80
|
+
offset += buf.length;
|
|
81
|
+
NEWLINE_BUFFER.copy(joinedBuffer, offset);
|
|
82
|
+
offset += NEWLINE_BUFFER.length;
|
|
83
|
+
}
|
|
74
84
|
fileStream.write(joinedBuffer, (err) => {
|
|
75
85
|
if (err) {
|
|
76
86
|
console.error(`Write error: ${err.message}`);
|
|
77
87
|
}
|
|
78
88
|
});
|
|
79
89
|
fileWriteBufferArray = [];
|
|
90
|
+
currentBufferSize = 0;
|
|
80
91
|
clearFlushTimeout();
|
|
81
92
|
};
|
|
82
93
|
/**
|
|
@@ -109,7 +120,10 @@ const requestHandler = (request) => {
|
|
|
109
120
|
case protocol_1.METHOD.LOG: {
|
|
110
121
|
const payload = protocol_1.RequestEncoder.getPayloadBuffer(request);
|
|
111
122
|
fileWriteBufferArray.push(payload);
|
|
112
|
-
|
|
123
|
+
currentBufferSize += payload.length;
|
|
124
|
+
// Flush on count OR size threshold
|
|
125
|
+
if (fileWriteBufferArray.length >= FILE_WRITE_BUFFER_FLUSH_COUNT ||
|
|
126
|
+
currentBufferSize >= FILE_WRITE_BUFFER_MAX_SIZE) {
|
|
113
127
|
flush();
|
|
114
128
|
}
|
|
115
129
|
else {
|
|
@@ -220,7 +234,11 @@ const createStream = () => {
|
|
|
220
234
|
fileStream = null;
|
|
221
235
|
const fileName = getLogFileName();
|
|
222
236
|
const filePath = node_path_1.default.join(basePath, fileName);
|
|
223
|
-
|
|
237
|
+
// Use higher highWaterMark for better throughput
|
|
238
|
+
fileStream = node_fs_1.default.createWriteStream(filePath, {
|
|
239
|
+
flags: "a",
|
|
240
|
+
highWaterMark: 64 * 1024, // 64KB internal buffer
|
|
241
|
+
});
|
|
224
242
|
fileStream.on("error", (err) => {
|
|
225
243
|
console.error(`Stream error: ${err.message}`);
|
|
226
244
|
});
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAEH,0DAA6B;AAC7B,yCAOoB;AACpB,sDAAyB;AAEzB;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB;;GAEG;AACH,IAAI,UAAU,GAA0B,IAAI,CAAC;AAE7C;;GAEG;AACH,IAAI,QAAQ,GAAG,QAAQ,CAAC;AAExB;;GAEG;AACH,IAAI,WAAW,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1C;;GAEG;AACH,IAAI,oBAAoB,GAAa,EAAE,CAAC;AAExC;;GAEG;AACH,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|