@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.
Files changed (293) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/auth/handshake.d.ts +35 -0
  4. package/dist/auth/handshake.d.ts.map +1 -0
  5. package/dist/auth/handshake.js +208 -0
  6. package/dist/auth/handshake.js.map +1 -0
  7. package/dist/auth/nonce-store.d.ts +22 -0
  8. package/dist/auth/nonce-store.d.ts.map +1 -0
  9. package/dist/auth/nonce-store.js +23 -0
  10. package/dist/auth/nonce-store.js.map +1 -0
  11. package/dist/bootstrap.d.ts +36 -0
  12. package/dist/bootstrap.d.ts.map +1 -0
  13. package/dist/bootstrap.js +82 -0
  14. package/dist/bootstrap.js.map +1 -0
  15. package/dist/config.d.ts +103 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +2 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/core/context.d.ts +57 -0
  20. package/dist/core/context.d.ts.map +1 -0
  21. package/dist/core/context.js +27 -0
  22. package/dist/core/context.js.map +1 -0
  23. package/dist/core/errors.d.ts +33 -0
  24. package/dist/core/errors.d.ts.map +1 -0
  25. package/dist/core/errors.js +47 -0
  26. package/dist/core/errors.js.map +1 -0
  27. package/dist/core/index.d.ts +5 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +5 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/rpc.d.ts +83 -0
  32. package/dist/core/rpc.d.ts.map +1 -0
  33. package/dist/core/rpc.js +102 -0
  34. package/dist/core/rpc.js.map +1 -0
  35. package/dist/core/updates.d.ts +56 -0
  36. package/dist/core/updates.d.ts.map +1 -0
  37. package/dist/core/updates.js +34 -0
  38. package/dist/core/updates.js.map +1 -0
  39. package/dist/create-server.d.ts +89 -0
  40. package/dist/create-server.d.ts.map +1 -0
  41. package/dist/create-server.js +109 -0
  42. package/dist/create-server.js.map +1 -0
  43. package/dist/crypto/aes-ige.d.ts +3 -0
  44. package/dist/crypto/aes-ige.d.ts.map +1 -0
  45. package/dist/crypto/aes-ige.js +55 -0
  46. package/dist/crypto/aes-ige.js.map +1 -0
  47. package/dist/crypto/dh.d.ts +21 -0
  48. package/dist/crypto/dh.d.ts.map +1 -0
  49. package/dist/crypto/dh.js +99 -0
  50. package/dist/crypto/dh.js.map +1 -0
  51. package/dist/crypto/hashes.d.ts +6 -0
  52. package/dist/crypto/hashes.d.ts.map +1 -0
  53. package/dist/crypto/hashes.js +14 -0
  54. package/dist/crypto/hashes.js.map +1 -0
  55. package/dist/crypto/msg-key.d.ts +15 -0
  56. package/dist/crypto/msg-key.d.ts.map +1 -0
  57. package/dist/crypto/msg-key.js +24 -0
  58. package/dist/crypto/msg-key.js.map +1 -0
  59. package/dist/crypto/rsa.d.ts +27 -0
  60. package/dist/crypto/rsa.d.ts.map +1 -0
  61. package/dist/crypto/rsa.js +50 -0
  62. package/dist/crypto/rsa.js.map +1 -0
  63. package/dist/dispatch/dispatcher.d.ts +72 -0
  64. package/dist/dispatch/dispatcher.d.ts.map +1 -0
  65. package/dist/dispatch/dispatcher.js +503 -0
  66. package/dist/dispatch/dispatcher.js.map +1 -0
  67. package/dist/dispatch/forwarders/in-process.d.ts +12 -0
  68. package/dist/dispatch/forwarders/in-process.d.ts.map +1 -0
  69. package/dist/dispatch/forwarders/in-process.js +15 -0
  70. package/dist/dispatch/forwarders/in-process.js.map +1 -0
  71. package/dist/dispatch/forwarders/print.d.ts +14 -0
  72. package/dist/dispatch/forwarders/print.d.ts.map +1 -0
  73. package/dist/dispatch/forwarders/print.js +23 -0
  74. package/dist/dispatch/forwarders/print.js.map +1 -0
  75. package/dist/dispatch/rpc-forwarder.d.ts +14 -0
  76. package/dist/dispatch/rpc-forwarder.d.ts.map +1 -0
  77. package/dist/dispatch/rpc-forwarder.js +2 -0
  78. package/dist/dispatch/rpc-forwarder.js.map +1 -0
  79. package/dist/dispatch/types.d.ts +32 -0
  80. package/dist/dispatch/types.d.ts.map +1 -0
  81. package/dist/dispatch/types.js +23 -0
  82. package/dist/dispatch/types.js.map +1 -0
  83. package/dist/gateway.d.ts +57 -0
  84. package/dist/gateway.d.ts.map +1 -0
  85. package/dist/gateway.js +150 -0
  86. package/dist/gateway.js.map +1 -0
  87. package/dist/index.d.ts +7 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +25 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/lib.d.ts +12 -0
  92. package/dist/lib.d.ts.map +1 -0
  93. package/dist/lib.js +13 -0
  94. package/dist/lib.js.map +1 -0
  95. package/dist/server/message-pipeline.d.ts +57 -0
  96. package/dist/server/message-pipeline.d.ts.map +1 -0
  97. package/dist/server/message-pipeline.js +199 -0
  98. package/dist/server/message-pipeline.js.map +1 -0
  99. package/dist/session/inbound-tracker.d.ts +118 -0
  100. package/dist/session/inbound-tracker.d.ts.map +1 -0
  101. package/dist/session/inbound-tracker.js +170 -0
  102. package/dist/session/inbound-tracker.js.map +1 -0
  103. package/dist/session/message-id.d.ts +19 -0
  104. package/dist/session/message-id.d.ts.map +1 -0
  105. package/dist/session/message-id.js +30 -0
  106. package/dist/session/message-id.js.map +1 -0
  107. package/dist/session/salts.d.ts +51 -0
  108. package/dist/session/salts.d.ts.map +1 -0
  109. package/dist/session/salts.js +132 -0
  110. package/dist/session/salts.js.map +1 -0
  111. package/dist/session/session-manager.d.ts +18 -0
  112. package/dist/session/session-manager.d.ts.map +1 -0
  113. package/dist/session/session-manager.js +43 -0
  114. package/dist/session/session-manager.js.map +1 -0
  115. package/dist/storage/index.d.ts +14 -0
  116. package/dist/storage/index.d.ts.map +1 -0
  117. package/dist/storage/index.js +16 -0
  118. package/dist/storage/index.js.map +1 -0
  119. package/dist/storage/memory.d.ts +3 -0
  120. package/dist/storage/memory.d.ts.map +1 -0
  121. package/dist/storage/memory.js +91 -0
  122. package/dist/storage/memory.js.map +1 -0
  123. package/dist/storage/mongo.d.ts +3 -0
  124. package/dist/storage/mongo.d.ts.map +1 -0
  125. package/dist/storage/mongo.js +175 -0
  126. package/dist/storage/mongo.js.map +1 -0
  127. package/dist/storage/types.d.ts +85 -0
  128. package/dist/storage/types.d.ts.map +1 -0
  129. package/dist/storage/types.js +3 -0
  130. package/dist/storage/types.js.map +1 -0
  131. package/dist/testkit.d.ts +11 -0
  132. package/dist/testkit.d.ts.map +1 -0
  133. package/dist/testkit.js +17 -0
  134. package/dist/testkit.js.map +1 -0
  135. package/dist/tl/codec.d.ts +37 -0
  136. package/dist/tl/codec.d.ts.map +1 -0
  137. package/dist/tl/codec.js +297 -0
  138. package/dist/tl/codec.js.map +1 -0
  139. package/dist/tl/layered-registry.d.ts +29 -0
  140. package/dist/tl/layered-registry.d.ts.map +1 -0
  141. package/dist/tl/layered-registry.js +118 -0
  142. package/dist/tl/layered-registry.js.map +1 -0
  143. package/dist/tl/protocol.d.ts +126 -0
  144. package/dist/tl/protocol.d.ts.map +1 -0
  145. package/dist/tl/protocol.js +22 -0
  146. package/dist/tl/protocol.js.map +1 -0
  147. package/dist/tl/reader.d.ts +30 -0
  148. package/dist/tl/reader.d.ts.map +1 -0
  149. package/dist/tl/reader.js +87 -0
  150. package/dist/tl/reader.js.map +1 -0
  151. package/dist/tl/registry.d.ts +39 -0
  152. package/dist/tl/registry.d.ts.map +1 -0
  153. package/dist/tl/registry.js +52 -0
  154. package/dist/tl/registry.js.map +1 -0
  155. package/dist/tl/writer.d.ts +24 -0
  156. package/dist/tl/writer.d.ts.map +1 -0
  157. package/dist/tl/writer.js +95 -0
  158. package/dist/tl/writer.js.map +1 -0
  159. package/dist/transport/connection-registry.d.ts +31 -0
  160. package/dist/transport/connection-registry.d.ts.map +1 -0
  161. package/dist/transport/connection-registry.js +84 -0
  162. package/dist/transport/connection-registry.js.map +1 -0
  163. package/dist/transport/connection.d.ts +62 -0
  164. package/dist/transport/connection.d.ts.map +1 -0
  165. package/dist/transport/connection.js +77 -0
  166. package/dist/transport/connection.js.map +1 -0
  167. package/dist/transport/framing.d.ts +39 -0
  168. package/dist/transport/framing.d.ts.map +1 -0
  169. package/dist/transport/framing.js +212 -0
  170. package/dist/transport/framing.js.map +1 -0
  171. package/dist/transport/proxy-protocol.d.ts +23 -0
  172. package/dist/transport/proxy-protocol.d.ts.map +1 -0
  173. package/dist/transport/proxy-protocol.js +108 -0
  174. package/dist/transport/proxy-protocol.js.map +1 -0
  175. package/dist/transport/server-common.d.ts +27 -0
  176. package/dist/transport/server-common.d.ts.map +1 -0
  177. package/dist/transport/server-common.js +27 -0
  178. package/dist/transport/server-common.js.map +1 -0
  179. package/dist/transport/tcp-server.d.ts +26 -0
  180. package/dist/transport/tcp-server.d.ts.map +1 -0
  181. package/dist/transport/tcp-server.js +91 -0
  182. package/dist/transport/tcp-server.js.map +1 -0
  183. package/dist/transport/ws-server.d.ts +19 -0
  184. package/dist/transport/ws-server.d.ts.map +1 -0
  185. package/dist/transport/ws-server.js +78 -0
  186. package/dist/transport/ws-server.js.map +1 -0
  187. package/dist/update-publisher.d.ts +34 -0
  188. package/dist/update-publisher.d.ts.map +1 -0
  189. package/dist/update-publisher.js +29 -0
  190. package/dist/update-publisher.js.map +1 -0
  191. package/dist/updates/mongo-update-log.d.ts +13 -0
  192. package/dist/updates/mongo-update-log.d.ts.map +1 -0
  193. package/dist/updates/mongo-update-log.js +39 -0
  194. package/dist/updates/mongo-update-log.js.map +1 -0
  195. package/dist/updates/presence-binder.d.ts +29 -0
  196. package/dist/updates/presence-binder.d.ts.map +1 -0
  197. package/dist/updates/presence-binder.js +36 -0
  198. package/dist/updates/presence-binder.js.map +1 -0
  199. package/dist/updates/presence.d.ts +31 -0
  200. package/dist/updates/presence.d.ts.map +1 -0
  201. package/dist/updates/presence.js +44 -0
  202. package/dist/updates/presence.js.map +1 -0
  203. package/dist/updates/push.d.ts +25 -0
  204. package/dist/updates/push.d.ts.map +1 -0
  205. package/dist/updates/push.js +72 -0
  206. package/dist/updates/push.js.map +1 -0
  207. package/dist/updates/redis-bus.d.ts +45 -0
  208. package/dist/updates/redis-bus.d.ts.map +1 -0
  209. package/dist/updates/redis-bus.js +59 -0
  210. package/dist/updates/redis-bus.js.map +1 -0
  211. package/dist/updates/redis-presence.d.ts +43 -0
  212. package/dist/updates/redis-presence.d.ts.map +1 -0
  213. package/dist/updates/redis-presence.js +65 -0
  214. package/dist/updates/redis-presence.js.map +1 -0
  215. package/dist/updates/render.d.ts +16 -0
  216. package/dist/updates/render.d.ts.map +1 -0
  217. package/dist/updates/render.js +46 -0
  218. package/dist/updates/render.js.map +1 -0
  219. package/dist/updates/router.d.ts +27 -0
  220. package/dist/updates/router.d.ts.map +1 -0
  221. package/dist/updates/router.js +36 -0
  222. package/dist/updates/router.js.map +1 -0
  223. package/dist/updates/types.d.ts +23 -0
  224. package/dist/updates/types.d.ts.map +1 -0
  225. package/dist/updates/types.js +2 -0
  226. package/dist/updates/types.js.map +1 -0
  227. package/dist/updates/update-bus.d.ts +29 -0
  228. package/dist/updates/update-bus.d.ts.map +1 -0
  229. package/dist/updates/update-bus.js +24 -0
  230. package/dist/updates/update-bus.js.map +1 -0
  231. package/dist/util/bytes.d.ts +12 -0
  232. package/dist/util/bytes.d.ts.map +1 -0
  233. package/dist/util/bytes.js +46 -0
  234. package/dist/util/bytes.js.map +1 -0
  235. package/package.json +84 -0
  236. package/src/auth/handshake.ts +262 -0
  237. package/src/auth/nonce-store.ts +39 -0
  238. package/src/bootstrap.ts +114 -0
  239. package/src/config.ts +103 -0
  240. package/src/core/context.ts +94 -0
  241. package/src/core/errors.ts +52 -0
  242. package/src/core/index.ts +4 -0
  243. package/src/core/rpc.ts +165 -0
  244. package/src/core/updates.ts +69 -0
  245. package/src/create-server.ts +181 -0
  246. package/src/crypto/aes-ige.ts +57 -0
  247. package/src/crypto/dh.ts +101 -0
  248. package/src/crypto/hashes.ts +17 -0
  249. package/src/crypto/msg-key.ts +29 -0
  250. package/src/crypto/rsa.ts +70 -0
  251. package/src/dispatch/dispatcher.ts +586 -0
  252. package/src/dispatch/forwarders/in-process.ts +14 -0
  253. package/src/dispatch/forwarders/print.ts +22 -0
  254. package/src/dispatch/rpc-forwarder.ts +15 -0
  255. package/src/dispatch/types.ts +60 -0
  256. package/src/gateway.ts +214 -0
  257. package/src/index.ts +53 -0
  258. package/src/lib.ts +24 -0
  259. package/src/server/message-pipeline.ts +256 -0
  260. package/src/session/inbound-tracker.ts +221 -0
  261. package/src/session/message-id.ts +43 -0
  262. package/src/session/salts.ts +162 -0
  263. package/src/session/session-manager.ts +66 -0
  264. package/src/storage/index.ts +26 -0
  265. package/src/storage/memory.ts +101 -0
  266. package/src/storage/mongo.ts +215 -0
  267. package/src/storage/types.ts +92 -0
  268. package/src/testkit.ts +19 -0
  269. package/src/tl/codec.ts +292 -0
  270. package/src/tl/layered-registry.ts +132 -0
  271. package/src/tl/protocol.ts +146 -0
  272. package/src/tl/reader.ts +99 -0
  273. package/src/tl/registry.ts +78 -0
  274. package/src/tl/writer.ts +104 -0
  275. package/src/transport/connection-registry.ts +91 -0
  276. package/src/transport/connection.ts +113 -0
  277. package/src/transport/framing.ts +223 -0
  278. package/src/transport/proxy-protocol.ts +109 -0
  279. package/src/transport/server-common.ts +49 -0
  280. package/src/transport/tcp-server.ts +102 -0
  281. package/src/transport/ws-server.ts +94 -0
  282. package/src/update-publisher.ts +47 -0
  283. package/src/updates/mongo-update-log.ts +49 -0
  284. package/src/updates/presence-binder.ts +51 -0
  285. package/src/updates/presence.ts +61 -0
  286. package/src/updates/push.ts +90 -0
  287. package/src/updates/redis-bus.ts +86 -0
  288. package/src/updates/redis-presence.ts +87 -0
  289. package/src/updates/render.ts +53 -0
  290. package/src/updates/router.ts +52 -0
  291. package/src/updates/types.ts +24 -0
  292. package/src/updates/update-bus.ts +49 -0
  293. package/src/util/bytes.ts +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,WAAW,CAAA;AAInD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AASlD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,OAAgB,EAChB,SAAoB,EACpB,IAAgB,EAChB,IAAiB,EACjB,MAAc,UAAU;IAExB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAE3D,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACpD,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QACnC,OAAM;IACV,CAAC;IACD,IAAI,QAAQ;QAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAE3D,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;IACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAE/B,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;KAC3B,CAAC,CAAA;IACF,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACxB,CAAC,CAAA;IAEF,SAAS,CAAC,aAAa,CACnB,IAAI,EACJ;QACI,CAAC,EAAE,qBAAqB;QACxB,YAAY,EAAE,IAAI,CAAC,UAAU;QAC7B,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;KACzC,EACD,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAClD,CAAA;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Storage } from './types.js';
2
+ export type { Storage } from './types.js';
3
+ export type StorageBackend = 'memory' | 'mongo';
4
+ export interface StorageConfig {
5
+ backend: StorageBackend;
6
+ mongoUrl?: string;
7
+ mongoDb?: string;
8
+ }
9
+ /**
10
+ * Builds the configured storage backend. `memory` (default) needs no external
11
+ * services; `mongo` lazily imports the driver so memory mode stays dependency-free.
12
+ */
13
+ export declare function createStorage(config: StorageConfig): Promise<Storage>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGzC,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,cAAc,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3E"}
@@ -0,0 +1,16 @@
1
+ import { createMemoryStorage } from './memory.js';
2
+ /**
3
+ * Builds the configured storage backend. `memory` (default) needs no external
4
+ * services; `mongo` lazily imports the driver so memory mode stays dependency-free.
5
+ */
6
+ export async function createStorage(config) {
7
+ if (config.backend === 'mongo') {
8
+ if (!config.mongoUrl || !config.mongoDb) {
9
+ throw new Error('STORAGE_BACKEND=mongo requires MONGO_URL and MONGO_DB');
10
+ }
11
+ const { createMongoStorage } = await import('./mongo.js');
12
+ return createMongoStorage(config.mongoUrl, config.mongoDb);
13
+ }
14
+ return createMemoryStorage();
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAWjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB;IACrD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC5E,CAAC;QACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QACzD,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,mBAAmB,EAAE,CAAA;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Storage } from './types.js';
2
+ export declare function createMemoryStorage(): Storage;
3
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQR,OAAO,EACV,MAAM,YAAY,CAAA;AAoFnB,wBAAgB,mBAAmB,IAAI,OAAO,CAO7C"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * In-memory storage. The default backend so the gateway runs with no external
3
+ * services (dev, tests). Auth keys/sessions do not survive a restart — use the
4
+ * Mongo backend for that.
5
+ */
6
+ class MemoryAuthKeyRepo {
7
+ map = new Map();
8
+ async create(rec) {
9
+ this.map.set(rec.id.toString(), { ...rec });
10
+ }
11
+ async getById(id) {
12
+ return this.map.get(id.toString()) ?? null;
13
+ }
14
+ async setBlocked(id, blocked) {
15
+ const rec = this.map.get(id.toString());
16
+ if (rec)
17
+ rec.isBlocked = blocked;
18
+ }
19
+ async bindUser(id, subject) {
20
+ const rec = this.map.get(id.toString());
21
+ if (rec)
22
+ rec.subject = subject;
23
+ }
24
+ async updateMeta(id, patch) {
25
+ const rec = this.map.get(id.toString());
26
+ if (!rec)
27
+ return;
28
+ const meta = (rec.meta ??= {});
29
+ for (const [k, v] of Object.entries(patch)) {
30
+ if (v !== undefined)
31
+ meta[k] = v;
32
+ }
33
+ }
34
+ }
35
+ class MemorySaltRepo {
36
+ map = new Map();
37
+ async append(authKeyId, entries) {
38
+ const k = authKeyId.toString();
39
+ const list = this.map.get(k) ?? [];
40
+ for (const e of entries) {
41
+ // Insert-if-absent by window start; never overwrite an existing salt.
42
+ if (!list.some(x => x.validSince === e.validSince))
43
+ list.push({ ...e });
44
+ }
45
+ list.sort((a, b) => a.validSince - b.validSince);
46
+ this.map.set(k, list);
47
+ }
48
+ async list(authKeyId) {
49
+ return (this.map.get(authKeyId.toString()) ?? []).map(e => ({ ...e }));
50
+ }
51
+ async prune(authKeyId, before) {
52
+ const k = authKeyId.toString();
53
+ const list = this.map.get(k);
54
+ if (list)
55
+ this.map.set(k, list.filter(e => e.validUntil > before));
56
+ }
57
+ }
58
+ class MemorySessionRepo {
59
+ map = new Map();
60
+ async get(sessionId) {
61
+ const r = this.map.get(sessionId.toString());
62
+ return r ? { ...r } : null;
63
+ }
64
+ async save(rec) {
65
+ this.map.set(rec.sessionId.toString(), { ...rec });
66
+ }
67
+ async update(sessionId, patch) {
68
+ const r = this.map.get(sessionId.toString());
69
+ if (r)
70
+ this.map.set(sessionId.toString(), { ...r, ...patch });
71
+ }
72
+ async delete(sessionId) {
73
+ this.map.delete(sessionId.toString());
74
+ }
75
+ async touch(sessionId) {
76
+ const r = this.map.get(sessionId.toString());
77
+ if (!r)
78
+ return false;
79
+ r.lastActivity = Date.now();
80
+ return true;
81
+ }
82
+ }
83
+ export function createMemoryStorage() {
84
+ return {
85
+ authKeys: new MemoryAuthKeyRepo(),
86
+ salts: new MemorySaltRepo(),
87
+ sessions: new MemorySessionRepo(),
88
+ async close() { },
89
+ };
90
+ }
91
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Storage } from './types.js';
2
+ export declare function createMongoStorage(url: string, dbName: string): Promise<Storage>;
3
+ //# sourceMappingURL=mongo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/storage/mongo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAQR,OAAO,EACV,MAAM,YAAY,CAAA;AAyKnB,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAatF"}
@@ -0,0 +1,175 @@
1
+ import { MongoClient, Binary } from 'mongodb';
2
+ function toBuf(b) {
3
+ return Buffer.from(b.buffer);
4
+ }
5
+ class MongoAuthKeyRepo {
6
+ col;
7
+ constructor(col) {
8
+ this.col = col;
9
+ }
10
+ async create(rec) {
11
+ await this.col.updateOne({ _id: rec.id.toString() }, {
12
+ $set: {
13
+ key: new Binary(rec.key),
14
+ expiresIn: rec.expiresIn,
15
+ createdAt: rec.createdAt,
16
+ subject: rec.subject,
17
+ isBlocked: rec.isBlocked ?? false,
18
+ meta: rec.meta,
19
+ },
20
+ }, { upsert: true });
21
+ }
22
+ async getById(id) {
23
+ const doc = await this.col.findOne({ _id: id.toString() });
24
+ if (!doc)
25
+ return null;
26
+ return {
27
+ id,
28
+ key: toBuf(doc.key),
29
+ expiresIn: doc.expiresIn,
30
+ createdAt: doc.createdAt,
31
+ subject: doc.subject,
32
+ isBlocked: doc.isBlocked,
33
+ meta: doc.meta,
34
+ };
35
+ }
36
+ async setBlocked(id, blocked) {
37
+ await this.col.updateOne({ _id: id.toString() }, { $set: { isBlocked: blocked } });
38
+ }
39
+ async bindUser(id, subject) {
40
+ await this.col.updateOne({ _id: id.toString() }, { $set: { subject } });
41
+ }
42
+ async updateMeta(id, patch) {
43
+ // Set defined fields under dotted `meta.*` paths so we never clobber the
44
+ // sibling fields (e.g. `meta.apiLayer` set at handshake time).
45
+ const set = {};
46
+ for (const [k, v] of Object.entries(patch)) {
47
+ if (v !== undefined)
48
+ set[`meta.${k}`] = v;
49
+ }
50
+ if (Object.keys(set).length)
51
+ await this.col.updateOne({ _id: id.toString() }, { $set: set });
52
+ }
53
+ }
54
+ class MongoSaltRepo {
55
+ col;
56
+ constructor(col) {
57
+ this.col = col;
58
+ }
59
+ async append(authKeyId, entries) {
60
+ if (!entries.length)
61
+ return;
62
+ const key = authKeyId.toString();
63
+ // $setOnInsert keeps the first writer's salt for a window, so all nodes
64
+ // that derive the same (deterministic) window converge on one salt.
65
+ const ops = entries.map(e => ({
66
+ updateOne: {
67
+ filter: { _id: `${key}:${e.validSince}` },
68
+ update: {
69
+ $setOnInsert: {
70
+ authKeyId: key,
71
+ salt: e.salt.toString(),
72
+ validSince: e.validSince,
73
+ validUntil: e.validUntil,
74
+ },
75
+ },
76
+ upsert: true,
77
+ },
78
+ }));
79
+ await this.col.bulkWrite(ops, { ordered: false });
80
+ }
81
+ async list(authKeyId) {
82
+ const docs = await this.col
83
+ .find({ authKeyId: authKeyId.toString() })
84
+ .sort({ validSince: 1 })
85
+ .toArray();
86
+ return docs.map(d => ({ salt: BigInt(d.salt), validSince: d.validSince, validUntil: d.validUntil }));
87
+ }
88
+ async prune(authKeyId, before) {
89
+ await this.col.deleteMany({ authKeyId: authKeyId.toString(), validUntil: { $lte: before } });
90
+ }
91
+ }
92
+ class MongoSessionRepo {
93
+ col;
94
+ constructor(col) {
95
+ this.col = col;
96
+ }
97
+ async get(sessionId) {
98
+ const doc = await this.col.findOne({ _id: sessionId.toString() });
99
+ if (!doc)
100
+ return null;
101
+ return {
102
+ sessionId,
103
+ authKeyId: BigInt(doc.authKeyId),
104
+ uniqueId: BigInt(doc.uniqueId),
105
+ apiLayer: doc.apiLayer,
106
+ subject: doc.subject,
107
+ lastActivity: doc.lastActivity,
108
+ };
109
+ }
110
+ async save(rec) {
111
+ await this.col.updateOne({ _id: rec.sessionId.toString() }, {
112
+ $set: {
113
+ authKeyId: rec.authKeyId.toString(),
114
+ uniqueId: rec.uniqueId.toString(),
115
+ apiLayer: rec.apiLayer,
116
+ subject: rec.subject,
117
+ lastActivity: rec.lastActivity,
118
+ },
119
+ }, { upsert: true });
120
+ }
121
+ async update(sessionId, patch) {
122
+ const set = {};
123
+ if (patch.apiLayer !== undefined)
124
+ set.apiLayer = patch.apiLayer;
125
+ if (patch.subject !== undefined)
126
+ set.subject = patch.subject;
127
+ if (patch.lastActivity !== undefined)
128
+ set.lastActivity = patch.lastActivity;
129
+ if (Object.keys(set).length)
130
+ await this.col.updateOne({ _id: sessionId.toString() }, { $set: set });
131
+ }
132
+ async delete(sessionId) {
133
+ await this.col.deleteOne({ _id: sessionId.toString() });
134
+ }
135
+ async touch(sessionId) {
136
+ const res = await this.col.updateOne({ _id: sessionId.toString() }, { $set: { lastActivity: Date.now() } });
137
+ return res.matchedCount > 0;
138
+ }
139
+ }
140
+ export async function createMongoStorage(url, dbName) {
141
+ const client = new MongoClient(url);
142
+ await client.connect();
143
+ const db = client.db(dbName);
144
+ await ensureIndexes(db);
145
+ return {
146
+ authKeys: new MongoAuthKeyRepo(db.collection('authKeys')),
147
+ salts: new MongoSaltRepo(db.collection('serverSalts')),
148
+ sessions: new MongoSessionRepo(db.collection('sessions')),
149
+ async close() {
150
+ await client.close();
151
+ },
152
+ };
153
+ }
154
+ /**
155
+ * Create the secondary indexes the protocol collections rely on. Idempotent
156
+ * (Mongo no-ops an index that already exists), so it's safe to run on every
157
+ * startup. `_id`-keyed lookups (get/save/touch by id) need no extra index.
158
+ */
159
+ async function ensureIndexes(db) {
160
+ await Promise.all([
161
+ // serverSalts: list() filters by authKeyId + sorts by validSince; prune()
162
+ // filters by authKeyId + validUntil.
163
+ db.collection('serverSalts').createIndex({ authKeyId: 1, validSince: 1 }),
164
+ db.collection('serverSalts').createIndex({ authKeyId: 1, validUntil: 1 }),
165
+ // sessions: looked up / aggregated by the key, the user, and recency.
166
+ db.collection('sessions').createIndex({ authKeyId: 1 }),
167
+ db.collection('sessions').createIndex({ subject: 1 }),
168
+ db.collection('sessions').createIndex({ lastActivity: 1 }),
169
+ // authKeys: "all devices for a user", moderation, and creation-over-time.
170
+ db.collection('authKeys').createIndex({ subject: 1 }),
171
+ db.collection('authKeys').createIndex({ isBlocked: 1 }),
172
+ db.collection('authKeys').createIndex({ createdAt: 1 }),
173
+ ]);
174
+ }
175
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/storage/mongo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /** Persistence contracts for auth keys, server salts and sessions. */
2
+ /**
3
+ * Connection/device metadata for an auth key. An auth key is one device
4
+ * authorization (one app install), so this — captured from `initConnection` — is
5
+ * stable per key and lives here rather than being duplicated across the key's
6
+ * sessions. `apiLayer` is the last layer negotiated via `invokeWithLayer`,
7
+ * restored for a fresh session before it re-negotiates.
8
+ */
9
+ export interface AuthKeyMeta {
10
+ apiLayer?: number;
11
+ /** `initConnection.api_id` — the client app id. */
12
+ apiId?: number;
13
+ /** `initConnection.device_model`. */
14
+ deviceModel?: string;
15
+ /** `initConnection.system_version`. */
16
+ systemVersion?: string;
17
+ /** `initConnection.app_version`. */
18
+ appVersion?: string;
19
+ /** `initConnection.system_lang_code`. */
20
+ systemLangCode?: string;
21
+ /** `initConnection.lang_code`. */
22
+ langCode?: string;
23
+ }
24
+ export interface AuthKeyRecord {
25
+ id: bigint;
26
+ key: Buffer;
27
+ expiresIn: boolean;
28
+ createdAt: Date;
29
+ /** The bound subject (your internal user id), or null for an anonymous key. */
30
+ subject: string | null;
31
+ isBlocked?: boolean;
32
+ meta?: AuthKeyMeta;
33
+ }
34
+ export interface SessionRecord {
35
+ sessionId: bigint;
36
+ authKeyId: bigint;
37
+ uniqueId: bigint;
38
+ apiLayer: number;
39
+ subject?: string;
40
+ lastActivity: number;
41
+ }
42
+ export interface AuthKeyRepo {
43
+ create(rec: AuthKeyRecord): Promise<void>;
44
+ getById(id: bigint): Promise<AuthKeyRecord | null>;
45
+ setBlocked(id: bigint, blocked: boolean): Promise<void>;
46
+ /** Bind (or clear, with null) the subject authorized on this auth key. */
47
+ bindUser(id: bigint, subject: string | null): Promise<void>;
48
+ /** Merge `initConnection`-derived device/app fields into the key's meta. */
49
+ updateMeta(id: bigint, patch: AuthKeyMeta): Promise<void>;
50
+ }
51
+ /** One scheduled server salt and its validity window (unix seconds). */
52
+ export interface SaltScheduleEntry {
53
+ salt: bigint;
54
+ /** Inclusive lower bound (unix seconds). */
55
+ validSince: number;
56
+ /** Exclusive upper bound (unix seconds). */
57
+ validUntil: number;
58
+ }
59
+ export interface SaltRepo {
60
+ /**
61
+ * Persist salt-schedule entries for an auth key. Inserts only windows not
62
+ * already present (keyed by `validSince`) and never overwrites an existing
63
+ * window's salt, so concurrent gateway nodes converge on one salt per window.
64
+ */
65
+ append(authKeyId: bigint, entries: SaltScheduleEntry[]): Promise<void>;
66
+ /** Full salt schedule for an auth key, ascending by `validSince`. */
67
+ list(authKeyId: bigint): Promise<SaltScheduleEntry[]>;
68
+ /** Drop entries that fully expired before `before` (unix seconds). */
69
+ prune(authKeyId: bigint, before: number): Promise<void>;
70
+ }
71
+ export interface SessionRepo {
72
+ get(sessionId: bigint): Promise<SessionRecord | null>;
73
+ save(rec: SessionRecord): Promise<void>;
74
+ update(sessionId: bigint, patch: Partial<SessionRecord>): Promise<void>;
75
+ delete(sessionId: bigint): Promise<void>;
76
+ /** Refresh last-activity; returns true if the session existed. */
77
+ touch(sessionId: bigint): Promise<boolean>;
78
+ }
79
+ export interface Storage {
80
+ authKeys: AuthKeyRepo;
81
+ salts: SaltRepo;
82
+ sessions: SessionRepo;
83
+ close(): Promise<void>;
84
+ }
85
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Persistence contracts for auth keys, server salts and sessions. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA,sEAAsE"}
@@ -0,0 +1,11 @@
1
+ export { TlReader } from './tl/reader.js';
2
+ export { TlWriter } from './tl/writer.js';
3
+ export { TlCodec } from './tl/codec.js';
4
+ export { loadSchema, type LoadSchemaResult } from './tl/registry.js';
5
+ export { igeEncrypt, igeDecrypt } from './crypto/aes-ige.js';
6
+ export { sha1 } from './crypto/hashes.js';
7
+ export { generateMessageKey, computeMsgKey } from './crypto/msg-key.js';
8
+ export { modPow } from './crypto/dh.js';
9
+ export { rsaEncryptNoPadding } from './crypto/rsa.js';
10
+ export { toBigIntBE, toBigIntLE, toBufferBE, toBufferLE, xorBuffers } from './util/bytes.js';
11
+ //# sourceMappingURL=testkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testkit.d.ts","sourceRoot":"","sources":["../src/testkit.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,17 @@
1
+ // @mt-tl/server/testkit — protocol primitives a TEST CLIENT needs (TL codec +
2
+ // the client side of the MTProto 2.0 crypto). NOT part of the consumer surface:
3
+ // servers are built with `createServer` from the package root. This subpath
4
+ // exists so `@mt-tl/testing` can drive a real handshake + encrypted RPC
5
+ // against a gateway without deep-importing internal files. The crypto here is
6
+ // the same code pinned byte-for-byte by `test/crypto.kat.test.ts`.
7
+ export { TlReader } from './tl/reader.js';
8
+ export { TlWriter } from './tl/writer.js';
9
+ export { TlCodec } from './tl/codec.js';
10
+ export { loadSchema } from './tl/registry.js';
11
+ export { igeEncrypt, igeDecrypt } from './crypto/aes-ige.js';
12
+ export { sha1 } from './crypto/hashes.js';
13
+ export { generateMessageKey, computeMsgKey } from './crypto/msg-key.js';
14
+ export { modPow } from './crypto/dh.js';
15
+ export { rsaEncryptNoPadding } from './crypto/rsa.js';
16
+ export { toBigIntBE, toBigIntLE, toBufferBE, toBufferLE, xorBuffers } from './util/bytes.js';
17
+ //# sourceMappingURL=testkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testkit.js","sourceRoot":"","sources":["../src/testkit.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,wEAAwE;AACxE,8EAA8E;AAC9E,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,37 @@
1
+ import type { TlRegistry } from './registry.js';
2
+ import type { LayeredRegistry } from './layered-registry.js';
3
+ import { TlReader } from './reader.js';
4
+ import { TlWriter } from './writer.js';
5
+ import type { TlObject, TlValue } from '@mt-tl/tl';
6
+ /**
7
+ * IR-driven (de)serializer for arbitrary TL values. Constructed types are tagged
8
+ * objects `{ _: name, ...fields }`. Hand-written protocol codecs (registered on
9
+ * the registry) take precedence for their ids; everything else routes here.
10
+ *
11
+ * When a {@link LayeredRegistry} is supplied, `encode(value, layer)` writes each
12
+ * type with the constructor id/fields valid at the client's layer (decoding
13
+ * stays global by id). Without a layer, the merged registry is used.
14
+ */
15
+ export declare class TlCodec {
16
+ private readonly registry;
17
+ private readonly layered?;
18
+ /** Set transiently during a single `encode(value, layer)` call. */
19
+ private encodeLayer?;
20
+ constructor(registry: TlRegistry, layered?: LayeredRegistry | undefined);
21
+ encode(value: TlObject, layer?: number): Buffer;
22
+ decode(buf: Buffer): TlValue;
23
+ /** Resolve the def to serialize a name with, honoring the active encode layer. */
24
+ private defForWrite;
25
+ writeObject(w: TlWriter, value: TlValue): void;
26
+ readObject(r: TlReader): TlValue;
27
+ private writeBare;
28
+ private readBare;
29
+ private writeFields;
30
+ private readFields;
31
+ private writeType;
32
+ private readType;
33
+ private writeVector;
34
+ private readVector;
35
+ private protocolCodecByName;
36
+ }
37
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/tl/codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAA0C,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElD;;;;;;;;GAQG;AACH,qBAAa,OAAO;IAKZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAL7B,mEAAmE;IACnE,OAAO,CAAC,WAAW,CAAC,CAAQ;gBAGP,QAAQ,EAAE,UAAU,EACpB,OAAO,CAAC,EAAE,eAAe,YAAA;IAG9C,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAW/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,kFAAkF;IAClF,OAAO,CAAC,WAAW;IAUnB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IA2B9C,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO;IAuBhC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,SAAS;IAkDjB,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,mBAAmB;CAK9B"}