stelar-time-real 3.3.3 → 3.3.5
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/package.json +1 -1
- package/src/protocol.js +1 -1
- package/src/protocol.ts +1 -1
- package/src/websocket.d.ts.map +1 -1
- package/src/websocket.js +4 -1
- package/src/websocket.ts +3 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stelar-time-real",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.5",
|
|
4
4
|
"description": "Zero-dependency production real-time library. Custom binary TCP + manual WebSocket. No ws package. Rate limiting (custom/per-event/per-client), hooks, custom IP tracker, custom health check, runtime config, rooms, ACKs, middleware, TLS/SSL.",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"types": "./src/index.d.ts",
|
package/src/protocol.js
CHANGED
|
@@ -13,7 +13,7 @@ export function validateEventName(event) {
|
|
|
13
13
|
throw new ProtocolError('Event name cannot be empty', 'EMPTY_EVENT');
|
|
14
14
|
if (event.length > MAX_EVENT_LENGTH)
|
|
15
15
|
throw new ProtocolError(`Event name exceeds ${MAX_EVENT_LENGTH} bytes`, 'EVENT_TOO_LONG');
|
|
16
|
-
if (!/^[a-zA-Z0-9\-./:]+$/.test(event))
|
|
16
|
+
if (!/^[a-zA-Z0-9\-./:_]+$/.test(event))
|
|
17
17
|
throw new ProtocolError('Event name contains invalid characters', 'INVALID_EVENT_CHARS');
|
|
18
18
|
if (['ping', 'pong', 'connect', 'disconnect', 'error'].includes(event))
|
|
19
19
|
throw new ProtocolError(`Event "${event}" is reserved`, 'RESERVED_EVENT');
|
package/src/protocol.ts
CHANGED
|
@@ -20,7 +20,7 @@ export function validateEventName(event: string): void {
|
|
|
20
20
|
if (typeof event !== 'string') throw new ProtocolError('Event name must be a string', 'INVALID_EVENT');
|
|
21
21
|
if (!event) throw new ProtocolError('Event name cannot be empty', 'EMPTY_EVENT');
|
|
22
22
|
if (event.length > MAX_EVENT_LENGTH) throw new ProtocolError(`Event name exceeds ${MAX_EVENT_LENGTH} bytes`, 'EVENT_TOO_LONG');
|
|
23
|
-
if (!/^[a-zA-Z0-9\-./:]+$/.test(event)) throw new ProtocolError('Event name contains invalid characters', 'INVALID_EVENT_CHARS');
|
|
23
|
+
if (!/^[a-zA-Z0-9\-./:_]+$/.test(event)) throw new ProtocolError('Event name contains invalid characters', 'INVALID_EVENT_CHARS');
|
|
24
24
|
if (['ping', 'pong', 'connect', 'disconnect', 'error'].includes(event)) throw new ProtocolError(`Event "${event}" is reserved`, 'RESERVED_EVENT');
|
|
25
25
|
}
|
|
26
26
|
|
package/src/websocket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["websocket.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAM7E,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D,eAAO,MAAM,eAAe,IAAM,EAAE,OAAO,IAAM,EAAE,SAAS,IAAM,EAChE,QAAQ,IAAM,EAAE,OAAO,IAAM,EAAE,OAAO,KAAM,CAAC;AAE/C,eAAO,MAAM,YAAY,OAAO,EAAE,gBAAgB,OAAO,EAAE,oBAAoB,OAAO,EACpF,iBAAiB,OAAO,EAAE,qBAAqB,OAAO,EAAE,sBAAsB,OAAO,EACrF,qBAAqB,OAAO,EAAE,oBAAoB,OAAO,CAAC;AAE5D,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,EAAE,MAAM,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,SAAuB;CACzD;AAED,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,WAA+D,CAAC;AAC5G,eAAO,MAAM,aAAa,cAA2C,CAAC;AACtE,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,OAA8E,CAAC;AAE3H,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAM5G;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGpF;AAED,MAAM,WAAW,OAAO;IAAG,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CAAE;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["websocket.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAM7E,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D,eAAO,MAAM,eAAe,IAAM,EAAE,OAAO,IAAM,EAAE,SAAS,IAAM,EAChE,QAAQ,IAAM,EAAE,OAAO,IAAM,EAAE,OAAO,KAAM,CAAC;AAE/C,eAAO,MAAM,YAAY,OAAO,EAAE,gBAAgB,OAAO,EAAE,oBAAoB,OAAO,EACpF,iBAAiB,OAAO,EAAE,qBAAqB,OAAO,EAAE,sBAAsB,OAAO,EACrF,qBAAqB,OAAO,EAAE,oBAAoB,OAAO,CAAC;AAE5D,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,EAAE,MAAM,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,SAAuB;CACzD;AAED,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,WAA+D,CAAC;AAC5G,eAAO,MAAM,aAAa,cAA2C,CAAC;AACtE,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,OAA8E,CAAC;AAE3H,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAM5G;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGpF;AAED,MAAM,WAAW,OAAO;IAAG,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CAAE;AAM3G,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAA4B,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAetH;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,UAAQ,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAqBhH;AAGD,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,kBAAgB,4BAAiD,CAAC;AACjH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,4BAAmC,CAAC;AACpF,eAAO,MAAM,kBAAkB,GAAI,aAAmB,EAAE,eAAW,4BAElE,CAAC;AACF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,4BAAoD,CAAC;AACpG,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,4BAAoD,CAAC;AAGpG,eAAO,MAAM,uBAAuB,GAAI,KAAK,MAAM,EAAE,kBAAgB,4BAAgD,CAAC;AACtH,eAAO,MAAM,yBAAyB,GAAI,MAAM,MAAM,4BAAyC,CAAC;AAChG,eAAO,MAAM,wBAAwB,GAAI,aAAmB,EAAE,eAAW,4BAExE,CAAC;AACF,eAAO,MAAM,uBAAuB,+BAAsD,CAAC;AAC3F,eAAO,MAAM,uBAAuB,+BAAsD,CAAC;AAE3F,0EAA0E;AAC1E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAK;gBAET,GAAG,SAA4B;IAE3C,OAAO,CAAC,QAAQ;IAOhB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAyB7B,KAAK;IACL,gBAAgB;CACjB"}
|
package/src/websocket.js
CHANGED
|
@@ -28,12 +28,15 @@ export function clientWantsCompression(extensionsHeader) {
|
|
|
28
28
|
return /permessage-deflate/.test(extensionsHeader);
|
|
29
29
|
}
|
|
30
30
|
const TAIL = Buffer.from([0x00, 0x00, 0xFF, 0xFF]);
|
|
31
|
+
let _TAIL = null;
|
|
32
|
+
function getTAIL() { if (!_TAIL)
|
|
33
|
+
_TAIL = Buffer.from([0x00, 0x00, 0xFF, 0xFF]); return _TAIL; }
|
|
31
34
|
export function wsCompress(data) {
|
|
32
35
|
const deflated = deflateRawSync(data);
|
|
33
36
|
return deflated.subarray(0, deflated.length - 4);
|
|
34
37
|
}
|
|
35
38
|
export function wsDecompress(data) {
|
|
36
|
-
return inflateRawSync(Buffer.concat([data,
|
|
39
|
+
return inflateRawSync(Buffer.concat([data, getTAIL()]));
|
|
37
40
|
}
|
|
38
41
|
export function parseWSFrame(buf, max = DEFAULT_MAX_WS_FRAME_SIZE) {
|
|
39
42
|
if (buf.length < 2)
|
package/src/websocket.ts
CHANGED
|
@@ -39,6 +39,8 @@ export function clientWantsCompression(extensionsHeader: string | undefined): bo
|
|
|
39
39
|
export interface WSFrame { fin: boolean; opcode: number; payload: Buffer; masked: boolean; rsv1: boolean; }
|
|
40
40
|
|
|
41
41
|
const TAIL = Buffer.from([0x00, 0x00, 0xFF, 0xFF]);
|
|
42
|
+
let _TAIL: Buffer | null = null;
|
|
43
|
+
function getTAIL(): Buffer { if (!_TAIL) _TAIL = Buffer.from([0x00, 0x00, 0xFF, 0xFF]); return _TAIL; }
|
|
42
44
|
|
|
43
45
|
export function wsCompress(data: Buffer): Buffer {
|
|
44
46
|
const deflated = deflateRawSync(data);
|
|
@@ -46,7 +48,7 @@ export function wsCompress(data: Buffer): Buffer {
|
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
export function wsDecompress(data: Buffer): Buffer {
|
|
49
|
-
return inflateRawSync(Buffer.concat([data,
|
|
51
|
+
return inflateRawSync(Buffer.concat([data, getTAIL()]));
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
export function parseWSFrame(buf: Buffer, max = DEFAULT_MAX_WS_FRAME_SIZE): { frame: WSFrame; consumed: number } | null {
|