@leemour/max-cli 0.8.0 → 0.9.0
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/client.d.ts.map +1 -1
- package/dist/client.js +2 -8
- package/dist/client.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +7 -6
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/protocol/connection.d.ts +2 -1
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +45 -14
- package/dist/protocol/connection.js.map +1 -1
- package/dist/protocol/frame.d.ts +22 -14
- package/dist/protocol/frame.d.ts.map +1 -1
- package/dist/protocol/frame.js +116 -37
- package/dist/protocol/frame.js.map +1 -1
- package/dist/protocol/lz4.d.ts +15 -0
- package/dist/protocol/lz4.d.ts.map +1 -0
- package/dist/protocol/lz4.js +154 -0
- package/dist/protocol/lz4.js.map +1 -0
- package/dist/server/lines.d.ts +4 -0
- package/dist/server/lines.d.ts.map +1 -1
- package/dist/server/lines.js +11 -2
- package/dist/server/lines.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +2 -0
- package/dist/server/server.js.map +1 -1
- package/dist/server/start.d.ts +6 -0
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js +17 -2
- package/dist/server/start.js.map +1 -1
- package/dist/session/handshake.d.ts +4 -2
- package/dist/session/handshake.d.ts.map +1 -1
- package/dist/session/handshake.js +3 -3
- package/dist/session/handshake.js.map +1 -1
- package/dist/spec/identity.d.ts +5 -4
- package/dist/spec/identity.d.ts.map +1 -1
- package/dist/spec/identity.js +5 -4
- package/dist/spec/identity.js.map +1 -1
- package/dist/spec/operations/chats.d.ts +5 -5
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +7 -5
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/session.d.ts +5 -4
- package/dist/spec/operations/session.d.ts.map +1 -1
- package/dist/spec/operations/session.js +7 -6
- package/dist/spec/operations/session.js.map +1 -1
- package/dist/spec/scalars.js +2 -2
- package/dist/testing/mock-max.d.ts +5 -1
- package/dist/testing/mock-max.d.ts.map +1 -1
- package/dist/testing/mock-max.js +6 -3
- package/dist/testing/mock-max.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/frame.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The binary protocol web.max.ru speaks, captured from a live socket on 2026-09-25
|
|
3
|
+
* (`src/testing/fixtures/web-capture-2026-09-25.json`). JSON on protocol 11 was what we used to
|
|
4
|
+
* send, and nothing the web client sends looks like it.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PROTOCOL_VERSION = 10;
|
|
3
7
|
export declare const Command: {
|
|
4
8
|
readonly REQUEST: 0;
|
|
5
9
|
readonly RESPONSE: 1;
|
|
@@ -11,29 +15,33 @@ export type Payload = Record<string, unknown>;
|
|
|
11
15
|
export interface OutboundFrame {
|
|
12
16
|
seq: number;
|
|
13
17
|
opcode: number;
|
|
14
|
-
/** Absent
|
|
18
|
+
/** Absent, or empty, goes out as a zero-length body — as the web client's ping answer does. */
|
|
15
19
|
payload?: Payload;
|
|
16
20
|
cmd?: Command;
|
|
17
21
|
}
|
|
18
22
|
export interface InboundFrame {
|
|
19
23
|
ver: number;
|
|
20
24
|
cmd: number;
|
|
21
|
-
seq: number
|
|
25
|
+
seq: number;
|
|
22
26
|
opcode: number;
|
|
23
27
|
payload: Payload | null;
|
|
24
28
|
}
|
|
25
|
-
|
|
29
|
+
/** `ver` `cmd` `seq:u16` `opcode:u16` `flags:u8` `length:u24`, big-endian. */
|
|
30
|
+
export declare const HEADER_BYTES = 10;
|
|
31
|
+
export declare const SEQ_MODULO = 65536;
|
|
32
|
+
export declare const encodeFrame: (frame: OutboundFrame) => Uint8Array;
|
|
33
|
+
/** The header alone, so a body that cannot be read still says which request it answered. */
|
|
34
|
+
export declare const decodeHeader: (bytes: Uint8Array) => Omit<InboundFrame, "payload"> & {
|
|
35
|
+
flags: number;
|
|
36
|
+
length: number;
|
|
37
|
+
};
|
|
26
38
|
/**
|
|
27
|
-
* **
|
|
28
|
-
*
|
|
29
|
-
* `
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* ⚠ Measured 2026-09-19: **chat ids on the owner's account reach 14 digits, not 19**, and contact
|
|
33
|
-
* ids reach 9 — all comfortably inside a number. The hazard is real and it is the message ids that
|
|
34
|
-
* carry it; a 19-digit chat id is an illustration, not something seen.
|
|
39
|
+
* **Integers come back as `number` unless a number would lose digits.** MessagePack hands every
|
|
40
|
+
* 64-bit integer over as a `bigint`, and MAX sends times as 64-bit — a `bigint` timestamp breaks
|
|
41
|
+
* every `Date` and every subtraction above this layer. Message ids are 18 digits, past
|
|
42
|
+
* `Number.MAX_SAFE_INTEGER`, and stay `bigint`; every id leaves the domain mapper as a string.
|
|
35
43
|
*/
|
|
36
|
-
export declare const decodeFrame: (
|
|
44
|
+
export declare const decodeFrame: (bytes: Uint8Array) => InboundFrame;
|
|
37
45
|
export declare class FrameError extends Error {
|
|
38
46
|
constructor(what: string);
|
|
39
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/protocol/frame.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/protocol/frame.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,eAAO,MAAM,OAAO;;;;;CAKV,CAAA;AACV,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAA;AAE5D,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE7C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,+FAA+F;IAC/F,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;CACxB;AAED,8EAA8E;AAC9E,eAAO,MAAM,YAAY,KAAK,CAAA;AAS9B,eAAO,MAAM,UAAU,QAAW,CAAA;AAKlC,eAAO,MAAM,WAAW,GAAI,OAAO,aAAa,KAAG,UAwBlD,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,YAAY,GAAI,OAAO,UAAU,KAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAgB/G,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,UAAU,KAAG,YAW/C,CAAA;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,IAAI,EAAE,MAAM;CAIzB;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAK9C,CAAA"}
|
package/dist/protocol/frame.js
CHANGED
|
@@ -1,42 +1,89 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { decode, ExtData, ExtensionCodec, encode } from "@msgpack/msgpack";
|
|
2
|
+
import { compressBlock, decompressBlock } from "./lz4.js";
|
|
3
|
+
/**
|
|
4
|
+
* The binary protocol web.max.ru speaks, captured from a live socket on 2026-09-25
|
|
5
|
+
* (`src/testing/fixtures/web-capture-2026-09-25.json`). JSON on protocol 11 was what we used to
|
|
6
|
+
* send, and nothing the web client sends looks like it.
|
|
7
|
+
*/
|
|
8
|
+
export const PROTOCOL_VERSION = 10;
|
|
4
9
|
export const Command = {
|
|
5
10
|
REQUEST: 0,
|
|
6
11
|
RESPONSE: 1,
|
|
7
12
|
EVENT: 2,
|
|
8
13
|
ERROR: 3,
|
|
9
14
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/** `ver` `cmd` `seq:u16` `opcode:u16` `flags:u8` `length:u24`, big-endian. */
|
|
16
|
+
export const HEADER_BYTES = 10;
|
|
17
|
+
/** The web client sends 31 bytes plain and 37 compressed; where between them it switches was not seen. */
|
|
18
|
+
const COMPRESS_FROM = 32;
|
|
19
|
+
const ZSTD = 0xff;
|
|
20
|
+
const MAX_LZ4_FLAGS = 0x7f;
|
|
21
|
+
/** MAX wraps a number it means as a 64-bit id or time in extension type 1; so does the web client. */
|
|
22
|
+
const WRAPPED = 1;
|
|
23
|
+
export const SEQ_MODULO = 0x1_0000;
|
|
24
|
+
const wrapped = new ExtensionCodec();
|
|
25
|
+
wrapped.register({ type: WRAPPED, encode: () => null, decode: (data) => decodeBody(data) });
|
|
26
|
+
export const encodeFrame = (frame) => {
|
|
27
|
+
const raw = frame.payload && Object.keys(frame.payload).length > 0 ? encodeBody(frame.payload) : new Uint8Array(0);
|
|
28
|
+
let body = raw;
|
|
29
|
+
let flags = 0;
|
|
30
|
+
if (raw.length >= COMPRESS_FROM) {
|
|
31
|
+
const compressed = compressBlock(raw);
|
|
32
|
+
const factor = Math.ceil(raw.length / compressed.length);
|
|
33
|
+
if (factor <= MAX_LZ4_FLAGS) {
|
|
34
|
+
// Kept even when it came out larger: the web client does the same (47 bytes sent as 49).
|
|
35
|
+
body = compressed;
|
|
36
|
+
flags = factor;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const bytes = new Uint8Array(HEADER_BYTES + body.length);
|
|
40
|
+
const view = new DataView(bytes.buffer);
|
|
41
|
+
view.setUint8(0, PROTOCOL_VERSION);
|
|
42
|
+
view.setUint8(1, frame.cmd ?? Command.REQUEST);
|
|
43
|
+
view.setUint16(2, frame.seq % SEQ_MODULO);
|
|
44
|
+
view.setUint16(4, frame.opcode);
|
|
45
|
+
view.setUint32(6, ((flags << 24) | body.length) >>> 0);
|
|
46
|
+
bytes.set(body, HEADER_BYTES);
|
|
47
|
+
return bytes;
|
|
48
|
+
};
|
|
49
|
+
/** The header alone, so a body that cannot be read still says which request it answered. */
|
|
50
|
+
export const decodeHeader = (bytes) => {
|
|
51
|
+
if (bytes.length < HEADER_BYTES)
|
|
52
|
+
throw new FrameError(`a frame of ${bytes.length} bytes, shorter than its header`);
|
|
53
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
54
|
+
const packed = view.getUint32(6);
|
|
55
|
+
const header = {
|
|
56
|
+
ver: view.getUint8(0),
|
|
57
|
+
cmd: view.getUint8(1),
|
|
58
|
+
seq: view.getUint16(2),
|
|
59
|
+
opcode: view.getUint16(4),
|
|
60
|
+
flags: packed >>> 24,
|
|
61
|
+
length: packed & 0xff_ffff,
|
|
62
|
+
};
|
|
63
|
+
if (HEADER_BYTES + header.length > bytes.length) {
|
|
64
|
+
throw new FrameError(`a frame that claims ${header.length} bytes and carries ${bytes.length - HEADER_BYTES}`);
|
|
65
|
+
}
|
|
66
|
+
return header;
|
|
67
|
+
};
|
|
17
68
|
/**
|
|
18
|
-
* **
|
|
19
|
-
*
|
|
20
|
-
* `
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* ⚠ Measured 2026-09-19: **chat ids on the owner's account reach 14 digits, not 19**, and contact
|
|
24
|
-
* ids reach 9 — all comfortably inside a number. The hazard is real and it is the message ids that
|
|
25
|
-
* carry it; a 19-digit chat id is an illustration, not something seen.
|
|
69
|
+
* **Integers come back as `number` unless a number would lose digits.** MessagePack hands every
|
|
70
|
+
* 64-bit integer over as a `bigint`, and MAX sends times as 64-bit — a `bigint` timestamp breaks
|
|
71
|
+
* every `Date` and every subtraction above this layer. Message ids are 18 digits, past
|
|
72
|
+
* `Number.MAX_SAFE_INTEGER`, and stay `bigint`; every id leaves the domain mapper as a string.
|
|
26
73
|
*/
|
|
27
|
-
export const decodeFrame = (
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
};
|
|
74
|
+
export const decodeFrame = (bytes) => {
|
|
75
|
+
const { flags, length, ...header } = decodeHeader(bytes);
|
|
76
|
+
let body = bytes.subarray(HEADER_BYTES, HEADER_BYTES + length);
|
|
77
|
+
if (flags === ZSTD)
|
|
78
|
+
throw new FrameError("a zstd-compressed frame, which the web client was never seen receiving");
|
|
79
|
+
if (flags > MAX_LZ4_FLAGS)
|
|
80
|
+
throw new FrameError(`a frame with compression flags ${flags}`);
|
|
81
|
+
if (flags > 0)
|
|
82
|
+
body = decompressBlock(body, flags * length);
|
|
83
|
+
if (body.length === 0)
|
|
84
|
+
return { ...header, payload: null };
|
|
85
|
+
const value = decodeBody(body);
|
|
86
|
+
return { ...header, payload: isRecord(value) ? value : null };
|
|
40
87
|
};
|
|
41
88
|
export class FrameError extends Error {
|
|
42
89
|
constructor(what) {
|
|
@@ -57,12 +104,44 @@ export const asId = (value) => {
|
|
|
57
104
|
return value;
|
|
58
105
|
return undefined;
|
|
59
106
|
};
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
107
|
+
/** A `bigint` is an id we built from a string (`toWireId`), and goes out wrapped the way the web client wraps ids. */
|
|
108
|
+
const encodeBody = (payload) => encode(wrapBigints(payload), { extensionCodec: wrapped, useBigInt64: true, ignoreUndefined: true });
|
|
109
|
+
const decodeBody = (bytes) => narrow(decode(bytes, { extensionCodec: wrapped, useBigInt64: true, mapKeyConverter: asKey }));
|
|
110
|
+
/**
|
|
111
|
+
* ⚠ With `useBigInt64` the library writes every `number` past 32 bits as a **float64**, and MAX
|
|
112
|
+
* refuses a login whose time arrives as one (`proto.payload`, measured 2026-09-25). A whole number
|
|
113
|
+
* that wide goes out as a bare 64-bit integer instead, as the web client sends `from` and
|
|
114
|
+
* `contactsSync`; only a `bigint` — an id — is wrapped.
|
|
115
|
+
*/
|
|
116
|
+
const wrapBigints = (value) => {
|
|
117
|
+
if (typeof value === "bigint")
|
|
118
|
+
return new ExtData(WRAPPED, encode(value, { useBigInt64: true }));
|
|
119
|
+
if (typeof value === "number" && Number.isSafeInteger(value) && (value > 0xffff_ffff || value < -0x8000_0000))
|
|
120
|
+
return BigInt(value);
|
|
121
|
+
if (Array.isArray(value))
|
|
122
|
+
return value.map(wrapBigints);
|
|
123
|
+
if (isRecord(value))
|
|
124
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, wrapBigints(item)]));
|
|
125
|
+
return value;
|
|
126
|
+
};
|
|
127
|
+
const narrow = (value) => {
|
|
128
|
+
if (typeof value === "bigint")
|
|
129
|
+
return Number.MIN_SAFE_INTEGER <= value && value <= Number.MAX_SAFE_INTEGER ? Number(value) : value;
|
|
130
|
+
if (Array.isArray(value))
|
|
131
|
+
return value.map(narrow);
|
|
132
|
+
if (isRecord(value)) {
|
|
133
|
+
for (const key of Object.keys(value))
|
|
134
|
+
value[key] = narrow(value[key]);
|
|
65
135
|
}
|
|
66
|
-
return
|
|
136
|
+
return value;
|
|
137
|
+
};
|
|
138
|
+
/** Map keys are chat and message ids as often as names; ours are always strings. */
|
|
139
|
+
const asKey = (key) => {
|
|
140
|
+
if (typeof key === "string")
|
|
141
|
+
return key;
|
|
142
|
+
if (typeof key === "number" || typeof key === "bigint")
|
|
143
|
+
return String(key);
|
|
144
|
+
throw new FrameError(`a map key of type ${typeof key}`);
|
|
67
145
|
};
|
|
146
|
+
const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value) && !(value instanceof Uint8Array);
|
|
68
147
|
//# sourceMappingURL=frame.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/protocol/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/protocol/frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LZ4 *block* format — no frame header, no checksum — which is what MAX puts in a frame body.
|
|
3
|
+
*
|
|
4
|
+
* Hand-written because both directions are small and a native binding is what breaks under Bun
|
|
5
|
+
* (REQUIREMENTS §36). The decompressor mirrors the one that read all 73 frames of the 2026-09-25
|
|
6
|
+
* capture; the compressor keeps the format's end-of-block rules, which a lenient decoder such as
|
|
7
|
+
* ours would not notice being broken but MAX's might.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Lz4Error extends Error {
|
|
10
|
+
constructor(what: string);
|
|
11
|
+
}
|
|
12
|
+
export declare const compressBlock: (src: Uint8Array) => Uint8Array;
|
|
13
|
+
/** `maxOutput` bounds a hostile or corrupt block; the frame header gives the caller one. */
|
|
14
|
+
export declare const decompressBlock: (src: Uint8Array, maxOutput: number) => Uint8Array;
|
|
15
|
+
//# sourceMappingURL=lz4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lz4.d.ts","sourceRoot":"","sources":["../../src/protocol/lz4.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,qBAAa,QAAS,SAAQ,KAAK;gBACrB,IAAI,EAAE,MAAM;CAIzB;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,KAAG,UA4B/C,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,eAAe,GAAI,KAAK,UAAU,EAAE,WAAW,MAAM,KAAG,UA6BpE,CAAA"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LZ4 *block* format — no frame header, no checksum — which is what MAX puts in a frame body.
|
|
3
|
+
*
|
|
4
|
+
* Hand-written because both directions are small and a native binding is what breaks under Bun
|
|
5
|
+
* (REQUIREMENTS §36). The decompressor mirrors the one that read all 73 frames of the 2026-09-25
|
|
6
|
+
* capture; the compressor keeps the format's end-of-block rules, which a lenient decoder such as
|
|
7
|
+
* ours would not notice being broken but MAX's might.
|
|
8
|
+
*/
|
|
9
|
+
const MIN_MATCH = 4;
|
|
10
|
+
/** The last five bytes of a block are always literals. */
|
|
11
|
+
const LAST_LITERALS = 5;
|
|
12
|
+
/** No match may start within the last twelve bytes. */
|
|
13
|
+
const MF_LIMIT = 12;
|
|
14
|
+
const MAX_OFFSET = 0xffff;
|
|
15
|
+
const HASH_BITS = 12;
|
|
16
|
+
export class Lz4Error extends Error {
|
|
17
|
+
constructor(what) {
|
|
18
|
+
super(`MAX sent an LZ4 block that ${what}`);
|
|
19
|
+
this.name = "Lz4Error";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export const compressBlock = (src) => {
|
|
23
|
+
const out = new Growable(src.length + (src.length >> 8) + 16);
|
|
24
|
+
const table = new Int32Array(1 << HASH_BITS).fill(-1);
|
|
25
|
+
const matchLimit = src.length - LAST_LITERALS;
|
|
26
|
+
let anchor = 0;
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < src.length - MF_LIMIT) {
|
|
29
|
+
const sequence = read32(src, i);
|
|
30
|
+
const slot = Math.imul(sequence, 2654435761) >>> (32 - HASH_BITS);
|
|
31
|
+
const candidate = table[slot];
|
|
32
|
+
table[slot] = i;
|
|
33
|
+
if (candidate < 0 || i - candidate > MAX_OFFSET || read32(src, candidate) !== sequence) {
|
|
34
|
+
i += 1;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
let length = MIN_MATCH;
|
|
38
|
+
while (i + length < matchLimit && src[i + length] === src[candidate + length])
|
|
39
|
+
length += 1;
|
|
40
|
+
writeSequence(out, src.subarray(anchor, i), i - candidate, length);
|
|
41
|
+
i += length;
|
|
42
|
+
anchor = i;
|
|
43
|
+
}
|
|
44
|
+
writeSequence(out, src.subarray(anchor), 0, 0);
|
|
45
|
+
return out.bytes();
|
|
46
|
+
};
|
|
47
|
+
/** `maxOutput` bounds a hostile or corrupt block; the frame header gives the caller one. */
|
|
48
|
+
export const decompressBlock = (src, maxOutput) => {
|
|
49
|
+
const out = new Growable(Math.min(maxOutput, src.length * 4));
|
|
50
|
+
let p = 0;
|
|
51
|
+
while (p < src.length) {
|
|
52
|
+
const token = src[p++];
|
|
53
|
+
let literals = token >> 4;
|
|
54
|
+
if (literals === 15)
|
|
55
|
+
literals += readLength(src, () => p++);
|
|
56
|
+
if (p + literals > src.length)
|
|
57
|
+
throw new Lz4Error("runs past its own end");
|
|
58
|
+
out.append(src.subarray(p, p + literals));
|
|
59
|
+
p += literals;
|
|
60
|
+
if (out.length > maxOutput)
|
|
61
|
+
throw new Lz4Error("is larger than its frame allows");
|
|
62
|
+
if (p >= src.length)
|
|
63
|
+
break;
|
|
64
|
+
if (p + 2 > src.length)
|
|
65
|
+
throw new Lz4Error("ends in the middle of an offset");
|
|
66
|
+
const offset = src[p] | (src[p + 1] << 8);
|
|
67
|
+
p += 2;
|
|
68
|
+
if (offset === 0 || offset > out.length)
|
|
69
|
+
throw new Lz4Error("points before its own start");
|
|
70
|
+
let length = token & 15;
|
|
71
|
+
if (length === 15)
|
|
72
|
+
length += readLength(src, () => p++);
|
|
73
|
+
length += MIN_MATCH;
|
|
74
|
+
if (out.length + length > maxOutput)
|
|
75
|
+
throw new Lz4Error("is larger than its frame allows");
|
|
76
|
+
out.copyBack(offset, length);
|
|
77
|
+
}
|
|
78
|
+
return out.bytes();
|
|
79
|
+
};
|
|
80
|
+
const read32 = (bytes, at) => (bytes[at] |
|
|
81
|
+
(bytes[at + 1] << 8) |
|
|
82
|
+
(bytes[at + 2] << 16) |
|
|
83
|
+
(bytes[at + 3] << 24)) >>>
|
|
84
|
+
0;
|
|
85
|
+
const readLength = (src, next) => {
|
|
86
|
+
let total = 0;
|
|
87
|
+
let byte;
|
|
88
|
+
do {
|
|
89
|
+
const at = next();
|
|
90
|
+
if (at >= src.length)
|
|
91
|
+
throw new Lz4Error("ends in the middle of a length");
|
|
92
|
+
byte = src[at];
|
|
93
|
+
total += byte;
|
|
94
|
+
} while (byte === 255);
|
|
95
|
+
return total;
|
|
96
|
+
};
|
|
97
|
+
const writeLength = (out, value) => {
|
|
98
|
+
let rest = value;
|
|
99
|
+
while (rest >= 255) {
|
|
100
|
+
out.push(255);
|
|
101
|
+
rest -= 255;
|
|
102
|
+
}
|
|
103
|
+
out.push(rest);
|
|
104
|
+
};
|
|
105
|
+
/** A match length of zero means the final, literals-only sequence. */
|
|
106
|
+
const writeSequence = (out, literals, offset, matchLength) => {
|
|
107
|
+
const literalNibble = Math.min(literals.length, 15);
|
|
108
|
+
const matchNibble = matchLength === 0 ? 0 : Math.min(matchLength - MIN_MATCH, 15);
|
|
109
|
+
out.push((literalNibble << 4) | matchNibble);
|
|
110
|
+
if (literals.length >= 15)
|
|
111
|
+
writeLength(out, literals.length - 15);
|
|
112
|
+
out.append(literals);
|
|
113
|
+
if (matchLength === 0)
|
|
114
|
+
return;
|
|
115
|
+
out.push(offset & 0xff);
|
|
116
|
+
out.push(offset >> 8);
|
|
117
|
+
if (matchLength - MIN_MATCH >= 15)
|
|
118
|
+
writeLength(out, matchLength - MIN_MATCH - 15);
|
|
119
|
+
};
|
|
120
|
+
class Growable {
|
|
121
|
+
#buffer;
|
|
122
|
+
length = 0;
|
|
123
|
+
constructor(capacity) {
|
|
124
|
+
this.#buffer = new Uint8Array(Math.max(capacity, 16));
|
|
125
|
+
}
|
|
126
|
+
push(byte) {
|
|
127
|
+
this.#reserve(1);
|
|
128
|
+
this.#buffer[this.length++] = byte;
|
|
129
|
+
}
|
|
130
|
+
append(bytes) {
|
|
131
|
+
this.#reserve(bytes.length);
|
|
132
|
+
this.#buffer.set(bytes, this.length);
|
|
133
|
+
this.length += bytes.length;
|
|
134
|
+
}
|
|
135
|
+
/** Byte by byte on purpose: a match may overlap the bytes it is still producing. */
|
|
136
|
+
copyBack(offset, length) {
|
|
137
|
+
this.#reserve(length);
|
|
138
|
+
const from = this.length - offset;
|
|
139
|
+
for (let k = 0; k < length; k++)
|
|
140
|
+
this.#buffer[this.length + k] = this.#buffer[from + k];
|
|
141
|
+
this.length += length;
|
|
142
|
+
}
|
|
143
|
+
bytes() {
|
|
144
|
+
return this.#buffer.slice(0, this.length);
|
|
145
|
+
}
|
|
146
|
+
#reserve(extra) {
|
|
147
|
+
if (this.length + extra <= this.#buffer.length)
|
|
148
|
+
return;
|
|
149
|
+
const next = new Uint8Array(Math.max(this.#buffer.length * 2, this.length + extra));
|
|
150
|
+
next.set(this.#buffer.subarray(0, this.length));
|
|
151
|
+
this.#buffer = next;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=lz4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lz4.js","sourceRoot":"","sources":["../../src/protocol/lz4.ts"],"names":[],"mappings":"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"}
|
package/dist/server/lines.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* One JSON value per line, **losslessly**: a request or an answer passing through `max serve`
|
|
3
3
|
* carries MAX's 18-digit message ids, which `JSON` would round into somebody else's message.
|
|
4
|
+
*
|
|
5
|
+
* **A `bigint` crosses as a `bigint`, however small.** It is how the codec tells an id from a
|
|
6
|
+
* count — ids go to MAX wrapped in extension 1, as the web client sends them — and a plain number
|
|
7
|
+
* literal would come back a `number` for any id that fits one.
|
|
4
8
|
*/
|
|
5
9
|
export declare const toLine: (value: unknown) => string;
|
|
6
10
|
export declare const fromLine: (line: string) => Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,MACiE,CAAA;AAEzG,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAG/B,CAAA;AAU/B,6FAA6F;AAC7F,eAAO,MAAM,UAAU,GAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,MAE/C,MAAM,MAAM,GAAG,MAAM,SAU9B,CAAA"}
|
package/dist/server/lines.js
CHANGED
|
@@ -2,11 +2,20 @@ import { isInteger, isSafeNumber, parse, stringify } from "lossless-json";
|
|
|
2
2
|
/**
|
|
3
3
|
* One JSON value per line, **losslessly**: a request or an answer passing through `max serve`
|
|
4
4
|
* carries MAX's 18-digit message ids, which `JSON` would round into somebody else's message.
|
|
5
|
+
*
|
|
6
|
+
* **A `bigint` crosses as a `bigint`, however small.** It is how the codec tells an id from a
|
|
7
|
+
* count — ids go to MAX wrapped in extension 1, as the web client sends them — and a plain number
|
|
8
|
+
* literal would come back a `number` for any id that fits one.
|
|
5
9
|
*/
|
|
6
|
-
export const toLine = (value) => `${stringify(value)}\n`;
|
|
7
|
-
export const fromLine = (line) => parse(line,
|
|
10
|
+
export const toLine = (value) => `${stringify(value, (_, item) => (typeof item === "bigint" ? { [BIGINT]: item.toString() } : item))}\n`;
|
|
11
|
+
export const fromLine = (line) => parse(line, (_, item) => (isTagged(item) ? BigInt(item[BIGINT]) : item), {
|
|
8
12
|
parseNumber: (text) => (isInteger(text) && !isSafeNumber(text) ? BigInt(text) : Number(text)),
|
|
9
13
|
});
|
|
14
|
+
const BIGINT = "$bigint";
|
|
15
|
+
const isTagged = (item) => typeof item === "object" &&
|
|
16
|
+
item !== null &&
|
|
17
|
+
Object.keys(item).length === 1 &&
|
|
18
|
+
typeof item[BIGINT] === "string";
|
|
10
19
|
/** Calls `onLine` for each complete line `data` finishes, keeping the rest for next time. */
|
|
11
20
|
export const lineReader = (onLine) => {
|
|
12
21
|
let buffered = "";
|
package/dist/server/lines.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzE
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAC/C,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;AAEzG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA2B,EAAE,CAChE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;IACvE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAC9F,CAA4B,CAAA;AAE/B,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAgC,EAAE,CAC/D,OAAO,IAAI,KAAK,QAAQ;IACxB,IAAI,KAAK,IAAI;IACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;IAC9B,OAAQ,IAAgC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;AAE/D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAA8B,EAAE,EAAE;IAC3D,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,OAAO,CAAC,IAAqB,EAAE,EAAE;QAC/B,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACnC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAClC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAiB,MAAM,2BAA2B,CAAA;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAiB,MAAM,2BAA2B,CAAA;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAKvD,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GACzC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,UAAU,CAAA;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;CACpC;AAWD;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAS;;IAqBpB,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAEhB,OAAO,EAAE,gBAAgB;IAUrC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,2FAA2F;IACrF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CA8PzC;AAKD,mGAAmG;AACnG,eAAO,MAAM,YAAY,GAAI,OAAO,YAAY,KAAG,MAA0C,CAAA;AAE7F,yFAAyF;AACzF,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,CAQlD,CAAA"}
|
package/dist/server/server.js
CHANGED
|
@@ -5,6 +5,7 @@ import { CliError } from "@leemour/cli-core";
|
|
|
5
5
|
import { MaxClient } from "../client.js";
|
|
6
6
|
import { Opcode } from "../generated/opcodes.generated.js";
|
|
7
7
|
import { Connection, ProtocolError } from "../protocol/connection.js";
|
|
8
|
+
import { VERSION } from "../version.js";
|
|
8
9
|
import { fromLine, lineReader, toLine } from "./lines.js";
|
|
9
10
|
import { forwarded, stopServer } from "./server-connection.js";
|
|
10
11
|
/** The web client's keep-alive interval (web.max.ru bundle, 2026-09-24). A different one is a fingerprint. */
|
|
@@ -274,6 +275,7 @@ export class MaxServer {
|
|
|
274
275
|
at: new Date().toISOString(),
|
|
275
276
|
byHand: !this.#options.startedByCommand,
|
|
276
277
|
pid: process.pid,
|
|
278
|
+
version: VERSION,
|
|
277
279
|
};
|
|
278
280
|
const { id } = request;
|
|
279
281
|
this.#lastUse = Date.now();
|