@mt-tl/server 0.1.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/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/auth/handshake.d.ts +35 -0
- package/dist/auth/handshake.d.ts.map +1 -0
- package/dist/auth/handshake.js +208 -0
- package/dist/auth/handshake.js.map +1 -0
- package/dist/auth/nonce-store.d.ts +22 -0
- package/dist/auth/nonce-store.d.ts.map +1 -0
- package/dist/auth/nonce-store.js +23 -0
- package/dist/auth/nonce-store.js.map +1 -0
- package/dist/bootstrap.d.ts +36 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +82 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/config.d.ts +103 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/core/context.d.ts +57 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +27 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/errors.d.ts +33 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +47 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/rpc.d.ts +83 -0
- package/dist/core/rpc.d.ts.map +1 -0
- package/dist/core/rpc.js +102 -0
- package/dist/core/rpc.js.map +1 -0
- package/dist/core/updates.d.ts +56 -0
- package/dist/core/updates.d.ts.map +1 -0
- package/dist/core/updates.js +34 -0
- package/dist/core/updates.js.map +1 -0
- package/dist/create-server.d.ts +89 -0
- package/dist/create-server.d.ts.map +1 -0
- package/dist/create-server.js +109 -0
- package/dist/create-server.js.map +1 -0
- package/dist/crypto/aes-ige.d.ts +3 -0
- package/dist/crypto/aes-ige.d.ts.map +1 -0
- package/dist/crypto/aes-ige.js +55 -0
- package/dist/crypto/aes-ige.js.map +1 -0
- package/dist/crypto/dh.d.ts +21 -0
- package/dist/crypto/dh.d.ts.map +1 -0
- package/dist/crypto/dh.js +99 -0
- package/dist/crypto/dh.js.map +1 -0
- package/dist/crypto/hashes.d.ts +6 -0
- package/dist/crypto/hashes.d.ts.map +1 -0
- package/dist/crypto/hashes.js +14 -0
- package/dist/crypto/hashes.js.map +1 -0
- package/dist/crypto/msg-key.d.ts +15 -0
- package/dist/crypto/msg-key.d.ts.map +1 -0
- package/dist/crypto/msg-key.js +24 -0
- package/dist/crypto/msg-key.js.map +1 -0
- package/dist/crypto/rsa.d.ts +27 -0
- package/dist/crypto/rsa.d.ts.map +1 -0
- package/dist/crypto/rsa.js +50 -0
- package/dist/crypto/rsa.js.map +1 -0
- package/dist/dispatch/dispatcher.d.ts +72 -0
- package/dist/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/dispatch/dispatcher.js +503 -0
- package/dist/dispatch/dispatcher.js.map +1 -0
- package/dist/dispatch/forwarders/in-process.d.ts +12 -0
- package/dist/dispatch/forwarders/in-process.d.ts.map +1 -0
- package/dist/dispatch/forwarders/in-process.js +15 -0
- package/dist/dispatch/forwarders/in-process.js.map +1 -0
- package/dist/dispatch/forwarders/print.d.ts +14 -0
- package/dist/dispatch/forwarders/print.d.ts.map +1 -0
- package/dist/dispatch/forwarders/print.js +23 -0
- package/dist/dispatch/forwarders/print.js.map +1 -0
- package/dist/dispatch/rpc-forwarder.d.ts +14 -0
- package/dist/dispatch/rpc-forwarder.d.ts.map +1 -0
- package/dist/dispatch/rpc-forwarder.js +2 -0
- package/dist/dispatch/rpc-forwarder.js.map +1 -0
- package/dist/dispatch/types.d.ts +32 -0
- package/dist/dispatch/types.d.ts.map +1 -0
- package/dist/dispatch/types.js +23 -0
- package/dist/dispatch/types.js.map +1 -0
- package/dist/gateway.d.ts +57 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +150 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +12 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +13 -0
- package/dist/lib.js.map +1 -0
- package/dist/server/message-pipeline.d.ts +57 -0
- package/dist/server/message-pipeline.d.ts.map +1 -0
- package/dist/server/message-pipeline.js +199 -0
- package/dist/server/message-pipeline.js.map +1 -0
- package/dist/session/inbound-tracker.d.ts +118 -0
- package/dist/session/inbound-tracker.d.ts.map +1 -0
- package/dist/session/inbound-tracker.js +170 -0
- package/dist/session/inbound-tracker.js.map +1 -0
- package/dist/session/message-id.d.ts +19 -0
- package/dist/session/message-id.d.ts.map +1 -0
- package/dist/session/message-id.js +30 -0
- package/dist/session/message-id.js.map +1 -0
- package/dist/session/salts.d.ts +51 -0
- package/dist/session/salts.d.ts.map +1 -0
- package/dist/session/salts.js +132 -0
- package/dist/session/salts.js.map +1 -0
- package/dist/session/session-manager.d.ts +18 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +43 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +16 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory.d.ts +3 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +91 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/mongo.d.ts +3 -0
- package/dist/storage/mongo.d.ts.map +1 -0
- package/dist/storage/mongo.js +175 -0
- package/dist/storage/mongo.js.map +1 -0
- package/dist/storage/types.d.ts +85 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +3 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testkit.d.ts +11 -0
- package/dist/testkit.d.ts.map +1 -0
- package/dist/testkit.js +17 -0
- package/dist/testkit.js.map +1 -0
- package/dist/tl/codec.d.ts +37 -0
- package/dist/tl/codec.d.ts.map +1 -0
- package/dist/tl/codec.js +297 -0
- package/dist/tl/codec.js.map +1 -0
- package/dist/tl/layered-registry.d.ts +29 -0
- package/dist/tl/layered-registry.d.ts.map +1 -0
- package/dist/tl/layered-registry.js +118 -0
- package/dist/tl/layered-registry.js.map +1 -0
- package/dist/tl/protocol.d.ts +126 -0
- package/dist/tl/protocol.d.ts.map +1 -0
- package/dist/tl/protocol.js +22 -0
- package/dist/tl/protocol.js.map +1 -0
- package/dist/tl/reader.d.ts +30 -0
- package/dist/tl/reader.d.ts.map +1 -0
- package/dist/tl/reader.js +87 -0
- package/dist/tl/reader.js.map +1 -0
- package/dist/tl/registry.d.ts +39 -0
- package/dist/tl/registry.d.ts.map +1 -0
- package/dist/tl/registry.js +52 -0
- package/dist/tl/registry.js.map +1 -0
- package/dist/tl/writer.d.ts +24 -0
- package/dist/tl/writer.d.ts.map +1 -0
- package/dist/tl/writer.js +95 -0
- package/dist/tl/writer.js.map +1 -0
- package/dist/transport/connection-registry.d.ts +31 -0
- package/dist/transport/connection-registry.d.ts.map +1 -0
- package/dist/transport/connection-registry.js +84 -0
- package/dist/transport/connection-registry.js.map +1 -0
- package/dist/transport/connection.d.ts +62 -0
- package/dist/transport/connection.d.ts.map +1 -0
- package/dist/transport/connection.js +77 -0
- package/dist/transport/connection.js.map +1 -0
- package/dist/transport/framing.d.ts +39 -0
- package/dist/transport/framing.d.ts.map +1 -0
- package/dist/transport/framing.js +212 -0
- package/dist/transport/framing.js.map +1 -0
- package/dist/transport/proxy-protocol.d.ts +23 -0
- package/dist/transport/proxy-protocol.d.ts.map +1 -0
- package/dist/transport/proxy-protocol.js +108 -0
- package/dist/transport/proxy-protocol.js.map +1 -0
- package/dist/transport/server-common.d.ts +27 -0
- package/dist/transport/server-common.d.ts.map +1 -0
- package/dist/transport/server-common.js +27 -0
- package/dist/transport/server-common.js.map +1 -0
- package/dist/transport/tcp-server.d.ts +26 -0
- package/dist/transport/tcp-server.d.ts.map +1 -0
- package/dist/transport/tcp-server.js +91 -0
- package/dist/transport/tcp-server.js.map +1 -0
- package/dist/transport/ws-server.d.ts +19 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +78 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/update-publisher.d.ts +34 -0
- package/dist/update-publisher.d.ts.map +1 -0
- package/dist/update-publisher.js +29 -0
- package/dist/update-publisher.js.map +1 -0
- package/dist/updates/mongo-update-log.d.ts +13 -0
- package/dist/updates/mongo-update-log.d.ts.map +1 -0
- package/dist/updates/mongo-update-log.js +39 -0
- package/dist/updates/mongo-update-log.js.map +1 -0
- package/dist/updates/presence-binder.d.ts +29 -0
- package/dist/updates/presence-binder.d.ts.map +1 -0
- package/dist/updates/presence-binder.js +36 -0
- package/dist/updates/presence-binder.js.map +1 -0
- package/dist/updates/presence.d.ts +31 -0
- package/dist/updates/presence.d.ts.map +1 -0
- package/dist/updates/presence.js +44 -0
- package/dist/updates/presence.js.map +1 -0
- package/dist/updates/push.d.ts +25 -0
- package/dist/updates/push.d.ts.map +1 -0
- package/dist/updates/push.js +72 -0
- package/dist/updates/push.js.map +1 -0
- package/dist/updates/redis-bus.d.ts +45 -0
- package/dist/updates/redis-bus.d.ts.map +1 -0
- package/dist/updates/redis-bus.js +59 -0
- package/dist/updates/redis-bus.js.map +1 -0
- package/dist/updates/redis-presence.d.ts +43 -0
- package/dist/updates/redis-presence.d.ts.map +1 -0
- package/dist/updates/redis-presence.js +65 -0
- package/dist/updates/redis-presence.js.map +1 -0
- package/dist/updates/render.d.ts +16 -0
- package/dist/updates/render.d.ts.map +1 -0
- package/dist/updates/render.js +46 -0
- package/dist/updates/render.js.map +1 -0
- package/dist/updates/router.d.ts +27 -0
- package/dist/updates/router.d.ts.map +1 -0
- package/dist/updates/router.js +36 -0
- package/dist/updates/router.js.map +1 -0
- package/dist/updates/types.d.ts +23 -0
- package/dist/updates/types.d.ts.map +1 -0
- package/dist/updates/types.js +2 -0
- package/dist/updates/types.js.map +1 -0
- package/dist/updates/update-bus.d.ts +29 -0
- package/dist/updates/update-bus.d.ts.map +1 -0
- package/dist/updates/update-bus.js +24 -0
- package/dist/updates/update-bus.js.map +1 -0
- package/dist/util/bytes.d.ts +12 -0
- package/dist/util/bytes.d.ts.map +1 -0
- package/dist/util/bytes.js +46 -0
- package/dist/util/bytes.js.map +1 -0
- package/package.json +84 -0
- package/src/auth/handshake.ts +262 -0
- package/src/auth/nonce-store.ts +39 -0
- package/src/bootstrap.ts +114 -0
- package/src/config.ts +103 -0
- package/src/core/context.ts +94 -0
- package/src/core/errors.ts +52 -0
- package/src/core/index.ts +4 -0
- package/src/core/rpc.ts +165 -0
- package/src/core/updates.ts +69 -0
- package/src/create-server.ts +181 -0
- package/src/crypto/aes-ige.ts +57 -0
- package/src/crypto/dh.ts +101 -0
- package/src/crypto/hashes.ts +17 -0
- package/src/crypto/msg-key.ts +29 -0
- package/src/crypto/rsa.ts +70 -0
- package/src/dispatch/dispatcher.ts +586 -0
- package/src/dispatch/forwarders/in-process.ts +14 -0
- package/src/dispatch/forwarders/print.ts +22 -0
- package/src/dispatch/rpc-forwarder.ts +15 -0
- package/src/dispatch/types.ts +60 -0
- package/src/gateway.ts +214 -0
- package/src/index.ts +53 -0
- package/src/lib.ts +24 -0
- package/src/server/message-pipeline.ts +256 -0
- package/src/session/inbound-tracker.ts +221 -0
- package/src/session/message-id.ts +43 -0
- package/src/session/salts.ts +162 -0
- package/src/session/session-manager.ts +66 -0
- package/src/storage/index.ts +26 -0
- package/src/storage/memory.ts +101 -0
- package/src/storage/mongo.ts +215 -0
- package/src/storage/types.ts +92 -0
- package/src/testkit.ts +19 -0
- package/src/tl/codec.ts +292 -0
- package/src/tl/layered-registry.ts +132 -0
- package/src/tl/protocol.ts +146 -0
- package/src/tl/reader.ts +99 -0
- package/src/tl/registry.ts +78 -0
- package/src/tl/writer.ts +104 -0
- package/src/transport/connection-registry.ts +91 -0
- package/src/transport/connection.ts +113 -0
- package/src/transport/framing.ts +223 -0
- package/src/transport/proxy-protocol.ts +109 -0
- package/src/transport/server-common.ts +49 -0
- package/src/transport/tcp-server.ts +102 -0
- package/src/transport/ws-server.ts +94 -0
- package/src/update-publisher.ts +47 -0
- package/src/updates/mongo-update-log.ts +49 -0
- package/src/updates/presence-binder.ts +51 -0
- package/src/updates/presence.ts +61 -0
- package/src/updates/push.ts +90 -0
- package/src/updates/redis-bus.ts +86 -0
- package/src/updates/redis-presence.ts +87 -0
- package/src/updates/render.ts +53 -0
- package/src/updates/router.ts +52 -0
- package/src/updates/types.ts +24 -0
- package/src/updates/update-bus.ts +49 -0
- package/src/util/bytes.ts +49 -0
package/dist/tl/codec.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { TlReader, BOOL_TRUE_ID, BOOL_FALSE_ID, VECTOR_ID } from './reader.js';
|
|
2
|
+
import { TlWriter } from './writer.js';
|
|
3
|
+
/**
|
|
4
|
+
* IR-driven (de)serializer for arbitrary TL values. Constructed types are tagged
|
|
5
|
+
* objects `{ _: name, ...fields }`. Hand-written protocol codecs (registered on
|
|
6
|
+
* the registry) take precedence for their ids; everything else routes here.
|
|
7
|
+
*
|
|
8
|
+
* When a {@link LayeredRegistry} is supplied, `encode(value, layer)` writes each
|
|
9
|
+
* type with the constructor id/fields valid at the client's layer (decoding
|
|
10
|
+
* stays global by id). Without a layer, the merged registry is used.
|
|
11
|
+
*/
|
|
12
|
+
export class TlCodec {
|
|
13
|
+
registry;
|
|
14
|
+
layered;
|
|
15
|
+
/** Set transiently during a single `encode(value, layer)` call. */
|
|
16
|
+
encodeLayer;
|
|
17
|
+
constructor(registry, layered) {
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
this.layered = layered;
|
|
20
|
+
}
|
|
21
|
+
encode(value, layer) {
|
|
22
|
+
this.encodeLayer = this.layered && layer !== undefined ? layer : undefined;
|
|
23
|
+
try {
|
|
24
|
+
const w = new TlWriter();
|
|
25
|
+
this.writeObject(w, value);
|
|
26
|
+
return w.toBuffer();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
this.encodeLayer = undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
decode(buf) {
|
|
33
|
+
return this.readObject(new TlReader(buf));
|
|
34
|
+
}
|
|
35
|
+
/** Resolve the def to serialize a name with, honoring the active encode layer. */
|
|
36
|
+
defForWrite(name) {
|
|
37
|
+
if (this.layered && this.encodeLayer !== undefined) {
|
|
38
|
+
const layerDef = this.layered.resolve(name, this.encodeLayer);
|
|
39
|
+
if (layerDef)
|
|
40
|
+
return layerDef;
|
|
41
|
+
}
|
|
42
|
+
return this.registry.getByName(name);
|
|
43
|
+
}
|
|
44
|
+
// --- boxed object (with constructor id) ---------------------------------
|
|
45
|
+
writeObject(w, value) {
|
|
46
|
+
if (typeof value === 'boolean') {
|
|
47
|
+
w.writeBool(value);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
w.writeUInt32(VECTOR_ID);
|
|
52
|
+
w.writeUInt32(value.length);
|
|
53
|
+
for (const el of value)
|
|
54
|
+
this.writeObject(w, el);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (value && typeof value === 'object' && '_' in value) {
|
|
58
|
+
const obj = value;
|
|
59
|
+
const codec = this.protocolCodecByName(obj._);
|
|
60
|
+
if (codec) {
|
|
61
|
+
codec.write(w, obj);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const def = this.defForWrite(obj._);
|
|
65
|
+
if (!def)
|
|
66
|
+
throw new Error(`Cannot serialize unknown TL type: ${obj._}`);
|
|
67
|
+
w.writeUInt32(def.idNum);
|
|
68
|
+
this.writeFields(w, def.params, obj);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`Cannot serialize value as boxed object: ${String(value)}`);
|
|
72
|
+
}
|
|
73
|
+
readObject(r) {
|
|
74
|
+
const id = r.readUInt32();
|
|
75
|
+
if (id === BOOL_TRUE_ID)
|
|
76
|
+
return true;
|
|
77
|
+
if (id === BOOL_FALSE_ID)
|
|
78
|
+
return false;
|
|
79
|
+
if (id === VECTOR_ID) {
|
|
80
|
+
const count = r.readUInt32();
|
|
81
|
+
const out = [];
|
|
82
|
+
for (let i = 0; i < count; i++)
|
|
83
|
+
out.push(this.readObject(r));
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
const protocolCodec = this.registry.getProtocolCodec(id);
|
|
87
|
+
if (protocolCodec)
|
|
88
|
+
return protocolCodec.read(r);
|
|
89
|
+
const def = this.registry.getById(id);
|
|
90
|
+
if (!def) {
|
|
91
|
+
throw new Error(`Cannot read unknown TL id 0x${(id >>> 0).toString(16).padStart(8, '0')}`);
|
|
92
|
+
}
|
|
93
|
+
const obj = { _: def.name };
|
|
94
|
+
this.readFields(r, def.params, obj);
|
|
95
|
+
return obj;
|
|
96
|
+
}
|
|
97
|
+
// --- bare constructor (no id) -------------------------------------------
|
|
98
|
+
writeBare(w, name, value) {
|
|
99
|
+
const def = this.defForWrite(name);
|
|
100
|
+
if (!def)
|
|
101
|
+
throw new Error(`Cannot serialize unknown bare type: ${name}`);
|
|
102
|
+
this.writeFields(w, def.params, (value ?? { _: name }));
|
|
103
|
+
}
|
|
104
|
+
readBare(r, name) {
|
|
105
|
+
const def = this.registry.getByName(name);
|
|
106
|
+
if (!def)
|
|
107
|
+
throw new Error(`Cannot read unknown bare type: ${name}`);
|
|
108
|
+
const obj = { _: name };
|
|
109
|
+
this.readFields(r, def.params, obj);
|
|
110
|
+
return obj;
|
|
111
|
+
}
|
|
112
|
+
// --- fields (with flags handling) ---------------------------------------
|
|
113
|
+
writeFields(w, params, obj) {
|
|
114
|
+
const bitmaskFields = collectBitmaskFields(params);
|
|
115
|
+
const flags = {};
|
|
116
|
+
for (const p of params) {
|
|
117
|
+
if (p.type.kind !== 'flag')
|
|
118
|
+
continue;
|
|
119
|
+
const v = obj[p.name];
|
|
120
|
+
const present = p.type.inner.kind === 'true' ? v === true : v !== undefined && v !== null;
|
|
121
|
+
if (present)
|
|
122
|
+
flags[p.type.flagsField] = (flags[p.type.flagsField] ?? 0) | (1 << p.type.bit);
|
|
123
|
+
}
|
|
124
|
+
for (const p of params) {
|
|
125
|
+
const t = p.type;
|
|
126
|
+
if (bitmaskFields.has(p.name)) {
|
|
127
|
+
// Bitmask field (`flags:#` or `flags:int`): write the value computed
|
|
128
|
+
// from which conditional fields are present.
|
|
129
|
+
w.writeUInt32((flags[p.name] ?? 0) >>> 0);
|
|
130
|
+
}
|
|
131
|
+
else if (t.kind === 'flag') {
|
|
132
|
+
const set = ((flags[t.flagsField] ?? 0) >>> t.bit) & 1;
|
|
133
|
+
if (set && t.inner.kind !== 'true')
|
|
134
|
+
this.writeType(w, t.inner, obj[p.name]);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.writeType(w, t, obj[p.name]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
readFields(r, params, obj) {
|
|
142
|
+
const bitmaskFields = collectBitmaskFields(params);
|
|
143
|
+
const flags = {};
|
|
144
|
+
for (const p of params) {
|
|
145
|
+
const t = p.type;
|
|
146
|
+
if (bitmaskFields.has(p.name)) {
|
|
147
|
+
const v = r.readUInt32();
|
|
148
|
+
flags[p.name] = v;
|
|
149
|
+
obj[p.name] = v;
|
|
150
|
+
}
|
|
151
|
+
else if (t.kind === 'flag') {
|
|
152
|
+
const set = ((flags[t.flagsField] ?? 0) >>> t.bit) & 1;
|
|
153
|
+
if (set)
|
|
154
|
+
obj[p.name] = t.inner.kind === 'true' ? true : this.readType(r, t.inner);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
obj[p.name] = this.readType(r, t);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// --- single typed value --------------------------------------------------
|
|
162
|
+
writeType(w, t, value) {
|
|
163
|
+
switch (t.kind) {
|
|
164
|
+
case 'int':
|
|
165
|
+
w.writeInt32(Number(value ?? 0));
|
|
166
|
+
return;
|
|
167
|
+
case 'long':
|
|
168
|
+
w.writeLong(typeof value === 'bigint' ? value : BigInt(value ?? 0));
|
|
169
|
+
return;
|
|
170
|
+
case 'double':
|
|
171
|
+
w.writeDouble(Number(value ?? 0));
|
|
172
|
+
return;
|
|
173
|
+
case 'string':
|
|
174
|
+
// Binary may be supplied for a `string` field (the protocol schema
|
|
175
|
+
// declares pq/g_a/g_b/encrypted_data as `string`). Preserve bytes
|
|
176
|
+
// exactly; `string` and `bytes` share the same wire encoding.
|
|
177
|
+
if (Buffer.isBuffer(value))
|
|
178
|
+
w.writeBytes(value);
|
|
179
|
+
else
|
|
180
|
+
w.writeString(value == null ? '' : String(value));
|
|
181
|
+
return;
|
|
182
|
+
case 'bytes':
|
|
183
|
+
w.writeBytes(asBuffer(value));
|
|
184
|
+
return;
|
|
185
|
+
case 'int128':
|
|
186
|
+
w.writeFixed(asBuffer(value), 16);
|
|
187
|
+
return;
|
|
188
|
+
case 'int256':
|
|
189
|
+
w.writeFixed(asBuffer(value), 32);
|
|
190
|
+
return;
|
|
191
|
+
case 'bool':
|
|
192
|
+
w.writeBool(Boolean(value));
|
|
193
|
+
return;
|
|
194
|
+
case 'true':
|
|
195
|
+
return;
|
|
196
|
+
case 'flags':
|
|
197
|
+
w.writeUInt32(Number(value ?? 0) >>> 0);
|
|
198
|
+
return;
|
|
199
|
+
case 'vector':
|
|
200
|
+
this.writeVector(w, t, Array.isArray(value) ? value : []);
|
|
201
|
+
return;
|
|
202
|
+
case 'object':
|
|
203
|
+
case 'boxed':
|
|
204
|
+
this.writeObject(w, value);
|
|
205
|
+
return;
|
|
206
|
+
case 'bare':
|
|
207
|
+
this.writeBare(w, t.name, value);
|
|
208
|
+
return;
|
|
209
|
+
case 'flag':
|
|
210
|
+
throw new Error('flag must be handled by writeFields');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
readType(r, t) {
|
|
214
|
+
switch (t.kind) {
|
|
215
|
+
case 'int':
|
|
216
|
+
return r.readInt32();
|
|
217
|
+
case 'long':
|
|
218
|
+
return r.readLong();
|
|
219
|
+
case 'double':
|
|
220
|
+
return r.readDouble();
|
|
221
|
+
case 'string':
|
|
222
|
+
return r.readString();
|
|
223
|
+
case 'bytes':
|
|
224
|
+
return r.readBytes();
|
|
225
|
+
case 'int128':
|
|
226
|
+
return r.readInt128();
|
|
227
|
+
case 'int256':
|
|
228
|
+
return r.readInt256();
|
|
229
|
+
case 'bool':
|
|
230
|
+
return r.readUInt32() === BOOL_TRUE_ID;
|
|
231
|
+
case 'true':
|
|
232
|
+
return true;
|
|
233
|
+
case 'flags':
|
|
234
|
+
return r.readUInt32();
|
|
235
|
+
case 'vector':
|
|
236
|
+
return this.readVector(r, t);
|
|
237
|
+
case 'object':
|
|
238
|
+
case 'boxed':
|
|
239
|
+
return this.readObject(r);
|
|
240
|
+
case 'bare':
|
|
241
|
+
return this.readBare(r, t.name);
|
|
242
|
+
case 'flag':
|
|
243
|
+
throw new Error('flag must be handled by readFields');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
writeVector(w, t, arr) {
|
|
247
|
+
if (t.boxed)
|
|
248
|
+
w.writeUInt32(VECTOR_ID);
|
|
249
|
+
w.writeUInt32(arr.length);
|
|
250
|
+
for (const el of arr)
|
|
251
|
+
this.writeType(w, t.inner, el);
|
|
252
|
+
}
|
|
253
|
+
readVector(r, t) {
|
|
254
|
+
if (t.boxed) {
|
|
255
|
+
const id = r.readUInt32();
|
|
256
|
+
if (id !== VECTOR_ID) {
|
|
257
|
+
throw new Error(`Expected Vector id, got 0x${(id >>> 0).toString(16).padStart(8, '0')}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const count = r.readUInt32();
|
|
261
|
+
const out = [];
|
|
262
|
+
for (let i = 0; i < count; i++)
|
|
263
|
+
out.push(this.readType(r, t.inner));
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
protocolCodecByName(name) {
|
|
267
|
+
const def = this.registry.getByName(name);
|
|
268
|
+
if (!def)
|
|
269
|
+
return undefined;
|
|
270
|
+
return this.registry.getProtocolCodec(def.idNum);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Names of the bitmask fields in a param list: any `#` field plus any field
|
|
275
|
+
* referenced by a conditional (`name.bit?...`). Handles schemas that declare
|
|
276
|
+
* the bitmask as `flags:int` rather than the canonical `flags:#`.
|
|
277
|
+
*/
|
|
278
|
+
function collectBitmaskFields(params) {
|
|
279
|
+
const names = new Set();
|
|
280
|
+
for (const p of params) {
|
|
281
|
+
if (p.type.kind === 'flags')
|
|
282
|
+
names.add(p.name);
|
|
283
|
+
else if (p.type.kind === 'flag')
|
|
284
|
+
names.add(p.type.flagsField);
|
|
285
|
+
}
|
|
286
|
+
return names;
|
|
287
|
+
}
|
|
288
|
+
function asBuffer(value) {
|
|
289
|
+
if (Buffer.isBuffer(value))
|
|
290
|
+
return value;
|
|
291
|
+
if (value == null)
|
|
292
|
+
return Buffer.alloc(0);
|
|
293
|
+
if (typeof value === 'string')
|
|
294
|
+
return Buffer.from(value, 'hex');
|
|
295
|
+
throw new Error(`Expected Buffer, got ${typeof value}`);
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/tl/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TlDef } from '@mt-tl/tl';
|
|
2
|
+
import type { TlValue } from '@mt-tl/tl';
|
|
3
|
+
/**
|
|
4
|
+
* Per-layer schema snapshots, used to encode a result/update with the
|
|
5
|
+
* constructor id and fields valid for a client's negotiated layer (decoding
|
|
6
|
+
* stays global by id). Also answers whether a value is representable at a layer
|
|
7
|
+
* — a pushed update whose type doesn't exist there must be substituted/dropped.
|
|
8
|
+
*/
|
|
9
|
+
export declare class LayeredRegistry {
|
|
10
|
+
private layers;
|
|
11
|
+
private sortedLayers;
|
|
12
|
+
addLayer(layer: number, defs: TlDef[]): void;
|
|
13
|
+
hasLayers(): boolean;
|
|
14
|
+
/** Every distinct def across all layers (by id) — for the decode-union registry. */
|
|
15
|
+
allDefs(): TlDef[];
|
|
16
|
+
layerNumbers(): number[];
|
|
17
|
+
/** Largest available layer <= requested (or the smallest if requested is below all). */
|
|
18
|
+
resolveLayer(requested: number): number | undefined;
|
|
19
|
+
resolve(name: string, layer: number): TlDef | undefined;
|
|
20
|
+
/** True iff every constructed type in the value tree exists at `layer`. */
|
|
21
|
+
representable(value: TlValue, layer: number): boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Loads `scheme_<layer>.json` snapshots from a directory into a
|
|
25
|
+
* {@link LayeredRegistry}. A missing directory yields an empty registry
|
|
26
|
+
* (layered encoding then disabled — the gateway falls back to single-schema).
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadLayeredRegistry(dir: string): LayeredRegistry;
|
|
29
|
+
//# sourceMappingURL=layered-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layered-registry.d.ts","sourceRoot":"","sources":["../../src/tl/layered-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBxC;;;;;GAKG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,YAAY,CAAe;IAEnC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI;IAO5C,SAAS,IAAI,OAAO;IAIpB,oFAAoF;IACpF,OAAO,IAAI,KAAK,EAAE;IAalB,YAAY,IAAI,MAAM,EAAE;IAIxB,wFAAwF;IACxF,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUnD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAMvD,2EAA2E;IAC3E,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;CAgBxD;AAeD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAgBhE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { parseType } from '@mt-tl/tl';
|
|
4
|
+
/**
|
|
5
|
+
* Per-layer schema snapshots, used to encode a result/update with the
|
|
6
|
+
* constructor id and fields valid for a client's negotiated layer (decoding
|
|
7
|
+
* stays global by id). Also answers whether a value is representable at a layer
|
|
8
|
+
* — a pushed update whose type doesn't exist there must be substituted/dropped.
|
|
9
|
+
*/
|
|
10
|
+
export class LayeredRegistry {
|
|
11
|
+
layers = new Map();
|
|
12
|
+
sortedLayers = [];
|
|
13
|
+
addLayer(layer, defs) {
|
|
14
|
+
const byName = new Map();
|
|
15
|
+
for (const def of defs)
|
|
16
|
+
if (!byName.has(def.name))
|
|
17
|
+
byName.set(def.name, def);
|
|
18
|
+
this.layers.set(layer, { byName });
|
|
19
|
+
this.sortedLayers = [...this.layers.keys()].sort((a, b) => a - b);
|
|
20
|
+
}
|
|
21
|
+
hasLayers() {
|
|
22
|
+
return this.sortedLayers.length > 0;
|
|
23
|
+
}
|
|
24
|
+
/** Every distinct def across all layers (by id) — for the decode-union registry. */
|
|
25
|
+
allDefs() {
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const { byName } of this.layers.values()) {
|
|
29
|
+
for (const def of byName.values()) {
|
|
30
|
+
if (seen.has(def.id))
|
|
31
|
+
continue;
|
|
32
|
+
seen.add(def.id);
|
|
33
|
+
out.push(def);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
layerNumbers() {
|
|
39
|
+
return [...this.sortedLayers];
|
|
40
|
+
}
|
|
41
|
+
/** Largest available layer <= requested (or the smallest if requested is below all). */
|
|
42
|
+
resolveLayer(requested) {
|
|
43
|
+
if (!this.sortedLayers.length)
|
|
44
|
+
return undefined;
|
|
45
|
+
let best;
|
|
46
|
+
for (const layer of this.sortedLayers) {
|
|
47
|
+
if (layer <= requested)
|
|
48
|
+
best = layer;
|
|
49
|
+
else
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
return best ?? this.sortedLayers[0];
|
|
53
|
+
}
|
|
54
|
+
resolve(name, layer) {
|
|
55
|
+
const l = this.resolveLayer(layer);
|
|
56
|
+
if (l === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
return this.layers.get(l)?.byName.get(name);
|
|
59
|
+
}
|
|
60
|
+
/** True iff every constructed type in the value tree exists at `layer`. */
|
|
61
|
+
representable(value, layer) {
|
|
62
|
+
if (value === null || value === undefined)
|
|
63
|
+
return true;
|
|
64
|
+
if (Array.isArray(value))
|
|
65
|
+
return value.every(v => this.representable(v, layer));
|
|
66
|
+
if (Buffer.isBuffer(value))
|
|
67
|
+
return true;
|
|
68
|
+
if (typeof value === 'object') {
|
|
69
|
+
const obj = value;
|
|
70
|
+
if (typeof obj._ === 'string') {
|
|
71
|
+
if (!this.resolve(obj._, layer))
|
|
72
|
+
return false;
|
|
73
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
74
|
+
if (k !== '_' && !this.representable(v, layer))
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return true; // primitives, bigint, boolean, string, number
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function rawToDef(raw, kind) {
|
|
84
|
+
const id = raw.id.toLowerCase().padStart(8, '0');
|
|
85
|
+
return {
|
|
86
|
+
id,
|
|
87
|
+
idNum: parseInt(id, 16) >>> 0,
|
|
88
|
+
name: (raw.predicate ?? raw.method),
|
|
89
|
+
kind,
|
|
90
|
+
params: raw.params.map(p => ({ name: p.name, raw: p.type, type: parseType(p.type) })),
|
|
91
|
+
type: raw.type,
|
|
92
|
+
isProtocol: false,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Loads `scheme_<layer>.json` snapshots from a directory into a
|
|
97
|
+
* {@link LayeredRegistry}. A missing directory yields an empty registry
|
|
98
|
+
* (layered encoding then disabled — the gateway falls back to single-schema).
|
|
99
|
+
*/
|
|
100
|
+
export function loadLayeredRegistry(dir) {
|
|
101
|
+
const registry = new LayeredRegistry();
|
|
102
|
+
if (!existsSync(dir))
|
|
103
|
+
return registry;
|
|
104
|
+
for (const file of readdirSync(dir)) {
|
|
105
|
+
const m = file.match(/_(\d+)\.json$/);
|
|
106
|
+
if (!m)
|
|
107
|
+
continue;
|
|
108
|
+
const layer = Number(m[1]);
|
|
109
|
+
const raw = JSON.parse(readFileSync(join(dir, file), 'utf-8'));
|
|
110
|
+
const defs = [
|
|
111
|
+
...raw.constructors.map(c => rawToDef(c, 'constructor')),
|
|
112
|
+
...(raw.methods ?? []).map(c => rawToDef(c, 'method')),
|
|
113
|
+
];
|
|
114
|
+
registry.addLayer(layer, defs);
|
|
115
|
+
}
|
|
116
|
+
return registry;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=layered-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layered-registry.js","sourceRoot":"","sources":["../../src/tl/layered-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAmBrC;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IAChB,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAA;IACvC,YAAY,GAAa,EAAE,CAAA;IAEnC,QAAQ,CAAC,KAAa,EAAE,IAAa;QACjC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC5E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACrE,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;IACvC,CAAC;IAED,oFAAoF;IACpF,OAAO;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QAC9B,MAAM,GAAG,GAAY,EAAE,CAAA;QACvB,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAQ;gBAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAChB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjB,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAA;IACd,CAAC;IAED,YAAY;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;IACjC,CAAC;IAED,wFAAwF;IACxF,YAAY,CAAC,SAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YAAE,OAAO,SAAS,CAAA;QAC/C,IAAI,IAAwB,CAAA;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,KAAK,IAAI,SAAS;gBAAE,IAAI,GAAG,KAAK,CAAA;;gBAC/B,MAAK;QACd,CAAC;QACD,OAAO,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,KAAa;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAED,2EAA2E;IAC3E,aAAa,CAAC,KAAc,EAAE,KAAa;QACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAC/E,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAgC,CAAA;YAC5C,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAY,EAAE,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAA;gBAC3E,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,IAAI,CAAA,CAAC,8CAA8C;IAC9D,CAAC;CACJ;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAA8B;IACzD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChD,OAAO;QACH,EAAE;QACF,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAE;QACpC,IAAI;QACJ,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,KAAK;KACpB,CAAA;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC3C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAA;IACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAA;IAErC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACrC,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAc,CAAA;QAC3E,MAAM,IAAI,GAAG;YACT,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACxD,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;SACzD,CAAA;QACD,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,QAAQ,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { TlObject } from '@mt-tl/tl';
|
|
2
|
+
/**
|
|
3
|
+
* Typed views over the immutable MTProto protocol/service constructors.
|
|
4
|
+
*
|
|
5
|
+
* These are the ~30 types the gateway reads/writes directly during the
|
|
6
|
+
* handshake, session setup and service-message handling. They are still
|
|
7
|
+
* encoded/decoded by the generic {@link TlCodec} (the constructors live in the
|
|
8
|
+
* registry); these interfaces just give the gateway code type-safety when it
|
|
9
|
+
* builds or inspects them. `_` is the constructor predicate.
|
|
10
|
+
*/
|
|
11
|
+
export interface ResPQ extends TlObject {
|
|
12
|
+
_: 'resPQ';
|
|
13
|
+
nonce: Buffer;
|
|
14
|
+
server_nonce: Buffer;
|
|
15
|
+
pq: Buffer;
|
|
16
|
+
server_public_key_fingerprints: bigint[];
|
|
17
|
+
}
|
|
18
|
+
export interface PQInnerData extends TlObject {
|
|
19
|
+
_: 'p_q_inner_data' | 'p_q_inner_data_dc' | 'p_q_inner_data_temp' | 'p_q_inner_data_temp_dc';
|
|
20
|
+
pq: Buffer;
|
|
21
|
+
p: Buffer;
|
|
22
|
+
q: Buffer;
|
|
23
|
+
nonce: Buffer;
|
|
24
|
+
server_nonce: Buffer;
|
|
25
|
+
new_nonce: Buffer;
|
|
26
|
+
dc?: number;
|
|
27
|
+
expires_in?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ServerDHParamsOk extends TlObject {
|
|
30
|
+
_: 'server_DH_params_ok';
|
|
31
|
+
nonce: Buffer;
|
|
32
|
+
server_nonce: Buffer;
|
|
33
|
+
encrypted_answer: Buffer;
|
|
34
|
+
}
|
|
35
|
+
export interface ServerDHParamsFail extends TlObject {
|
|
36
|
+
_: 'server_DH_params_fail';
|
|
37
|
+
nonce: Buffer;
|
|
38
|
+
server_nonce: Buffer;
|
|
39
|
+
new_nonce_hash: Buffer;
|
|
40
|
+
}
|
|
41
|
+
export interface ServerDHInnerData extends TlObject {
|
|
42
|
+
_: 'server_DH_inner_data';
|
|
43
|
+
nonce: Buffer;
|
|
44
|
+
server_nonce: Buffer;
|
|
45
|
+
g: number;
|
|
46
|
+
dh_prime: Buffer;
|
|
47
|
+
g_a: Buffer;
|
|
48
|
+
server_time: number;
|
|
49
|
+
}
|
|
50
|
+
export interface ClientDHInnerData extends TlObject {
|
|
51
|
+
_: 'client_DH_inner_data';
|
|
52
|
+
nonce: Buffer;
|
|
53
|
+
server_nonce: Buffer;
|
|
54
|
+
retry_id: bigint;
|
|
55
|
+
g_b: Buffer;
|
|
56
|
+
}
|
|
57
|
+
export interface DhGenOk extends TlObject {
|
|
58
|
+
_: 'dh_gen_ok';
|
|
59
|
+
nonce: Buffer;
|
|
60
|
+
server_nonce: Buffer;
|
|
61
|
+
new_nonce_hash1: Buffer;
|
|
62
|
+
}
|
|
63
|
+
export interface NewSessionCreated extends TlObject {
|
|
64
|
+
_: 'new_session_created';
|
|
65
|
+
first_msg_id: bigint;
|
|
66
|
+
unique_id: bigint;
|
|
67
|
+
server_salt: bigint;
|
|
68
|
+
}
|
|
69
|
+
export interface RpcResult extends TlObject {
|
|
70
|
+
_: 'rpc_result';
|
|
71
|
+
req_msg_id: bigint;
|
|
72
|
+
result: TlObject | boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface RpcError extends TlObject {
|
|
75
|
+
_: 'rpc_error';
|
|
76
|
+
error_code: number;
|
|
77
|
+
error_message: string;
|
|
78
|
+
}
|
|
79
|
+
export interface Pong extends TlObject {
|
|
80
|
+
_: 'pong';
|
|
81
|
+
msg_id: bigint;
|
|
82
|
+
ping_id: bigint;
|
|
83
|
+
}
|
|
84
|
+
export interface MsgsAck extends TlObject {
|
|
85
|
+
_: 'msgs_ack';
|
|
86
|
+
msg_ids: bigint[];
|
|
87
|
+
}
|
|
88
|
+
export interface BadServerSalt extends TlObject {
|
|
89
|
+
_: 'bad_server_salt';
|
|
90
|
+
bad_msg_id: bigint;
|
|
91
|
+
bad_msg_seqno: number;
|
|
92
|
+
error_code: number;
|
|
93
|
+
new_server_salt: bigint;
|
|
94
|
+
}
|
|
95
|
+
export interface BadMsgNotification extends TlObject {
|
|
96
|
+
_: 'bad_msg_notification';
|
|
97
|
+
bad_msg_id: bigint;
|
|
98
|
+
bad_msg_seqno: number;
|
|
99
|
+
error_code: number;
|
|
100
|
+
}
|
|
101
|
+
export interface MsgContainer extends TlObject {
|
|
102
|
+
_: 'msg_container';
|
|
103
|
+
messages: TlObject[];
|
|
104
|
+
}
|
|
105
|
+
/** Well-known protocol constructor predicates, for branching in the pipeline. */
|
|
106
|
+
export declare const Predicate: {
|
|
107
|
+
readonly req_pq: "req_pq";
|
|
108
|
+
readonly req_pq_multi: "req_pq_multi";
|
|
109
|
+
readonly req_DH_params: "req_DH_params";
|
|
110
|
+
readonly set_client_DH_params: "set_client_DH_params";
|
|
111
|
+
readonly ping: "ping";
|
|
112
|
+
readonly ping_delay_disconnect: "ping_delay_disconnect";
|
|
113
|
+
readonly msgs_ack: "msgs_ack";
|
|
114
|
+
readonly msgs_state_req: "msgs_state_req";
|
|
115
|
+
readonly rpc_drop_answer: "rpc_drop_answer";
|
|
116
|
+
readonly destroy_session: "destroy_session";
|
|
117
|
+
readonly get_future_salts: "get_future_salts";
|
|
118
|
+
readonly http_wait: "http_wait";
|
|
119
|
+
readonly msg_container: "msg_container";
|
|
120
|
+
readonly gzip_packed: "gzip_packed";
|
|
121
|
+
readonly invokeWithLayer: "invokeWithLayer";
|
|
122
|
+
readonly invokeWithoutUpdates: "invokeWithoutUpdates";
|
|
123
|
+
readonly invokeAfterMsg: "invokeAfterMsg";
|
|
124
|
+
readonly initConnection: "initConnection";
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/tl/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Well-known protocol constructor predicates, for branching in the pipeline. */
|
|
2
|
+
export const Predicate = {
|
|
3
|
+
req_pq: 'req_pq',
|
|
4
|
+
req_pq_multi: 'req_pq_multi',
|
|
5
|
+
req_DH_params: 'req_DH_params',
|
|
6
|
+
set_client_DH_params: 'set_client_DH_params',
|
|
7
|
+
ping: 'ping',
|
|
8
|
+
ping_delay_disconnect: 'ping_delay_disconnect',
|
|
9
|
+
msgs_ack: 'msgs_ack',
|
|
10
|
+
msgs_state_req: 'msgs_state_req',
|
|
11
|
+
rpc_drop_answer: 'rpc_drop_answer',
|
|
12
|
+
destroy_session: 'destroy_session',
|
|
13
|
+
get_future_salts: 'get_future_salts',
|
|
14
|
+
http_wait: 'http_wait',
|
|
15
|
+
msg_container: 'msg_container',
|
|
16
|
+
gzip_packed: 'gzip_packed',
|
|
17
|
+
invokeWithLayer: 'invokeWithLayer',
|
|
18
|
+
invokeWithoutUpdates: 'invokeWithoutUpdates',
|
|
19
|
+
invokeAfterMsg: 'invokeAfterMsg',
|
|
20
|
+
initConnection: 'initConnection',
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/tl/protocol.ts"],"names":[],"mappings":"AA6HA,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,sBAAsB;IAC5C,IAAI,EAAE,MAAM;IACZ,qBAAqB,EAAE,uBAAuB;IAC9C,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,kBAAkB;IACpC,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;IAC5C,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;CAC1B,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const BOOL_TRUE_ID = 2574415285;
|
|
2
|
+
export declare const BOOL_FALSE_ID = 3162085175;
|
|
3
|
+
export declare const VECTOR_ID = 481674261;
|
|
4
|
+
/**
|
|
5
|
+
* Low-level reader for the TL wire format. Exposes only primitive reads; the
|
|
6
|
+
* codec drives constructor-id dispatch, vectors and flags. Ported from the
|
|
7
|
+
* existing `protocolBuffer.js` (same little-endian / padding rules).
|
|
8
|
+
*/
|
|
9
|
+
export declare class TlReader {
|
|
10
|
+
private readonly buf;
|
|
11
|
+
private pos;
|
|
12
|
+
constructor(buf: Buffer);
|
|
13
|
+
get position(): number;
|
|
14
|
+
get remaining(): number;
|
|
15
|
+
private expect;
|
|
16
|
+
read(len: number): Buffer;
|
|
17
|
+
skip(len: number): void;
|
|
18
|
+
readUInt8(): number;
|
|
19
|
+
readUInt32(): number;
|
|
20
|
+
readInt32(): number;
|
|
21
|
+
/** TL `long` — 8 bytes LE, read as an unsigned bigint (matches existing server). */
|
|
22
|
+
readLong(): bigint;
|
|
23
|
+
readDouble(): number;
|
|
24
|
+
readInt128(): Buffer;
|
|
25
|
+
readInt256(): Buffer;
|
|
26
|
+
/** TL `bytes`/`string` — length-prefixed with 4-byte alignment padding. */
|
|
27
|
+
readBytes(): Buffer;
|
|
28
|
+
readString(): string;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/tl/reader.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,aAAa,CAAA;AACtC,eAAO,MAAM,aAAa,aAAa,CAAA;AACvC,eAAO,MAAM,SAAS,YAAa,CAAA;AAEnC;;;;GAIG;AACH,qBAAa,QAAQ;IAGL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,GAAG,CAAI;gBAEc,GAAG,EAAE,MAAM;IAExC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,MAAM;IAMd,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOzB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvB,SAAS,IAAI,MAAM;IAKnB,UAAU,IAAI,MAAM;IAOpB,SAAS,IAAI,MAAM;IAOnB,oFAAoF;IACpF,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAOpB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,2EAA2E;IAC3E,SAAS,IAAI,MAAM;IAanB,UAAU,IAAI,MAAM;CAGvB"}
|