@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.
Files changed (52) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/client.js +2 -8
  3. package/dist/client.js.map +1 -1
  4. package/dist/generated/operations.generated.d.ts +7 -6
  5. package/dist/generated/operations.generated.d.ts.map +1 -1
  6. package/dist/protocol/connection.d.ts +2 -1
  7. package/dist/protocol/connection.d.ts.map +1 -1
  8. package/dist/protocol/connection.js +45 -14
  9. package/dist/protocol/connection.js.map +1 -1
  10. package/dist/protocol/frame.d.ts +22 -14
  11. package/dist/protocol/frame.d.ts.map +1 -1
  12. package/dist/protocol/frame.js +116 -37
  13. package/dist/protocol/frame.js.map +1 -1
  14. package/dist/protocol/lz4.d.ts +15 -0
  15. package/dist/protocol/lz4.d.ts.map +1 -0
  16. package/dist/protocol/lz4.js +154 -0
  17. package/dist/protocol/lz4.js.map +1 -0
  18. package/dist/server/lines.d.ts +4 -0
  19. package/dist/server/lines.d.ts.map +1 -1
  20. package/dist/server/lines.js +11 -2
  21. package/dist/server/lines.js.map +1 -1
  22. package/dist/server/server.d.ts.map +1 -1
  23. package/dist/server/server.js +2 -0
  24. package/dist/server/server.js.map +1 -1
  25. package/dist/server/start.d.ts +6 -0
  26. package/dist/server/start.d.ts.map +1 -1
  27. package/dist/server/start.js +17 -2
  28. package/dist/server/start.js.map +1 -1
  29. package/dist/session/handshake.d.ts +4 -2
  30. package/dist/session/handshake.d.ts.map +1 -1
  31. package/dist/session/handshake.js +3 -3
  32. package/dist/session/handshake.js.map +1 -1
  33. package/dist/spec/identity.d.ts +5 -4
  34. package/dist/spec/identity.d.ts.map +1 -1
  35. package/dist/spec/identity.js +5 -4
  36. package/dist/spec/identity.js.map +1 -1
  37. package/dist/spec/operations/chats.d.ts +5 -5
  38. package/dist/spec/operations/chats.d.ts.map +1 -1
  39. package/dist/spec/operations/chats.js +7 -5
  40. package/dist/spec/operations/chats.js.map +1 -1
  41. package/dist/spec/operations/session.d.ts +5 -4
  42. package/dist/spec/operations/session.d.ts.map +1 -1
  43. package/dist/spec/operations/session.js +7 -6
  44. package/dist/spec/operations/session.js.map +1 -1
  45. package/dist/spec/scalars.js +2 -2
  46. package/dist/testing/mock-max.d.ts +5 -1
  47. package/dist/testing/mock-max.d.ts.map +1 -1
  48. package/dist/testing/mock-max.js +6 -3
  49. package/dist/testing/mock-max.js.map +1 -1
  50. package/dist/version.d.ts +1 -1
  51. package/dist/version.js +1 -1
  52. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
- /** The protocol version the web client pins. Confirmed in tsmax, maxrs and max-api-docs. */
2
- export declare const PROTOCOL_VERSION = 11;
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 only in the answer to MAX's ping, which the web client sends with no payload at all. */
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 | null;
25
+ seq: number;
22
26
  opcode: number;
23
27
  payload: Payload | null;
24
28
  }
25
- export declare const encodeFrame: (frame: OutboundFrame) => string;
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
- * **Never `JSON.parse`.** Message ids are 64-bit and past `Number.MAX_SAFE_INTEGER` — 18 digits,
28
- * measured — so the built-in parser rounds them and two different messages arrive as one id.
29
- * `lossless-json` hands back a bigint for any integer that would not survive, and every id leaves
30
- * this layer as a string.
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: (raw: string) => InboundFrame;
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":"AAEA,4FAA4F;AAC5F,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,kGAAkG;IAClG,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,GAAG,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;CACxB;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,aAAa,KAAG,MAOrC,CAAA;AAEd;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,YAczC,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"}
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"}
@@ -1,42 +1,89 @@
1
- import { isInteger, isSafeNumber, parse, stringify } from "lossless-json";
2
- /** The protocol version the web client pins. Confirmed in tsmax, maxrs and max-api-docs. */
3
- export const PROTOCOL_VERSION = 11;
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
- export const encodeFrame = (frame) => stringify({
11
- ver: PROTOCOL_VERSION,
12
- cmd: frame.cmd ?? Command.REQUEST,
13
- seq: frame.seq,
14
- opcode: frame.opcode,
15
- payload: frame.payload,
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
- * **Never `JSON.parse`.** Message ids are 64-bit and past `Number.MAX_SAFE_INTEGER` — 18 digits,
19
- * measured — so the built-in parser rounds them and two different messages arrive as one id.
20
- * `lossless-json` hands back a bigint for any integer that would not survive, and every id leaves
21
- * this layer as a string.
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 = (raw) => {
28
- const value = parse(raw, undefined, {
29
- parseNumber: (text) => (isInteger(text) && !isSafeNumber(text) ? BigInt(text) : Number(text)),
30
- });
31
- if (!isRecord(value))
32
- throw new FrameError("a frame that is not an object");
33
- return {
34
- ver: header(value.ver, "ver"),
35
- cmd: header(value.cmd ?? Command.RESPONSE, "cmd"),
36
- seq: value.seq === null || value.seq === undefined ? null : header(value.seq, "seq"),
37
- opcode: header(value.opcode, "opcode"),
38
- payload: isRecord(value.payload) ? value.payload : null,
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
- const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
61
- const header = (value, field) => {
62
- const asNumber = typeof value === "bigint" ? Number(value) : value;
63
- if (typeof asNumber !== "number" || !Number.isSafeInteger(asNumber)) {
64
- throw new FrameError(`a frame whose \`${field}\` is not a whole number`);
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 asNumber;
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":"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"}
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":"AAAA;;;;;;;GAOG;AAEH,MAAM,SAAS,GAAG,CAAC,CAAA;AACnB,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,uDAAuD;AACvD,MAAM,QAAQ,GAAG,EAAE,CAAA;AACnB,MAAM,UAAU,GAAG,MAAM,CAAA;AACzB,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,IAAY;QACtB,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAe,EAAc,EAAE;IAC3D,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,aAAa,CAAA;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,CAAC,GAAG,CAAC,CAAA;IAET,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAW,CAAA;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEf,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,UAAU,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvF,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACV,CAAC;QAED,IAAI,MAAM,GAAG,SAAS,CAAA;QACtB,OAAO,CAAC,GAAG,MAAM,GAAG,UAAU,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;YAAE,MAAM,IAAI,CAAC,CAAA;QAE1F,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,CAAA;QAClE,CAAC,IAAI,MAAM,CAAA;QACX,MAAM,GAAG,CAAC,CAAA;IACZ,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9C,OAAO,GAAG,CAAC,KAAK,EAAE,CAAA;AACpB,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAe,EAAE,SAAiB,EAAc,EAAE;IAChF,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7D,IAAI,CAAC,GAAG,CAAC,CAAA;IAET,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,CAAW,CAAA;QAEhC,IAAI,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAA;QACzB,IAAI,QAAQ,KAAK,EAAE;YAAE,QAAQ,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,uBAAuB,CAAC,CAAA;QAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;QACzC,CAAC,IAAI,QAAQ,CAAA;QACb,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAA;QAEjF,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM;YAAE,MAAK;QAE1B,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAA;QAC7E,MAAM,MAAM,GAAI,GAAG,CAAC,CAAC,CAAY,GAAG,CAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAY,IAAI,CAAC,CAAC,CAAA;QACjE,CAAC,IAAI,CAAC,CAAA;QACN,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,CAAA;QAE1F,IAAI,MAAM,GAAG,KAAK,GAAG,EAAE,CAAA;QACvB,IAAI,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,IAAI,SAAS,CAAA;QACnB,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAA;QAC1F,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,EAAE,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAU,EAAU,EAAE,CACvD,CAAE,KAAK,CAAC,EAAE,CAAY;IACpB,CAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAY,IAAI,CAAC,CAAC;IAChC,CAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAY,IAAI,EAAE,CAAC;IACjC,CAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAY,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAA;AAEH,MAAM,UAAU,GAAG,CAAC,GAAe,EAAE,IAAkB,EAAU,EAAE;IACjE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,IAAY,CAAA;IAChB,GAAG,CAAC;QACF,MAAM,EAAE,GAAG,IAAI,EAAE,CAAA;QACjB,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,gCAAgC,CAAC,CAAA;QAC1E,IAAI,GAAG,GAAG,CAAC,EAAE,CAAW,CAAA;QACxB,KAAK,IAAI,IAAI,CAAA;IACf,CAAC,QAAQ,IAAI,KAAK,GAAG,EAAC;IACtB,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,GAAa,EAAE,KAAa,EAAQ,EAAE;IACzD,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,OAAO,IAAI,IAAI,GAAG,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACb,IAAI,IAAI,GAAG,CAAA;IACb,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChB,CAAC,CAAA;AAED,sEAAsE;AACtE,MAAM,aAAa,GAAG,CAAC,GAAa,EAAE,QAAoB,EAAE,MAAc,EAAE,WAAmB,EAAQ,EAAE;IACvG,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACnD,MAAM,WAAW,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,EAAE,EAAE,CAAC,CAAA;IACjF,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;IAC5C,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACjE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpB,IAAI,WAAW,KAAK,CAAC;QAAE,OAAM;IAE7B,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACvB,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IACrB,IAAI,WAAW,GAAG,SAAS,IAAI,EAAE;QAAE,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,EAAE,CAAC,CAAA;AACnF,CAAC,CAAA;AAED,MAAM,QAAQ;IACZ,OAAO,CAAY;IACnB,MAAM,GAAG,CAAC,CAAA;IAEV,YAAY,QAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAA;IACpC,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;IAC7B,CAAC;IAED,oFAAoF;IACpF,QAAQ,CAAC,MAAc,EAAE,MAAc;QACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAW,CAAA;QACjG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;IACvB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QACtD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAA;QACnF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;CACF"}
@@ -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;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,MAAiC,CAAA;AAEzE,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAG/B,CAAA;AAE/B,6FAA6F;AAC7F,eAAO,MAAM,UAAU,GAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,MAE/C,MAAM,MAAM,GAAG,MAAM,SAU9B,CAAA"}
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"}
@@ -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, undefined, {
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 = "";
@@ -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;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAA;AAEzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA2B,EAAE,CAChE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE;IACrB,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,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
+ {"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;AAIvD,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;CA6PzC;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"}
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"}
@@ -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();