@honeybbq/teamspeak 0.0.1 → 1.0.0-beta.8

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 (393) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +726 -2
  3. package/dist/client/abort.d.ts +5 -0
  4. package/dist/client/abort.d.ts.map +1 -0
  5. package/dist/client/abort.js +23 -0
  6. package/dist/client/abort.js.map +1 -0
  7. package/dist/client/address.d.ts +17 -0
  8. package/dist/client/address.d.ts.map +1 -0
  9. package/dist/client/address.js +66 -0
  10. package/dist/client/address.js.map +1 -0
  11. package/dist/client/api/voice.d.ts +24 -0
  12. package/dist/client/api/voice.d.ts.map +1 -0
  13. package/dist/client/api/voice.js +33 -0
  14. package/dist/client/api/voice.js.map +1 -0
  15. package/dist/client/capabilities.d.ts +68 -0
  16. package/dist/client/capabilities.d.ts.map +1 -0
  17. package/dist/client/capabilities.js +59 -0
  18. package/dist/client/capabilities.js.map +1 -0
  19. package/dist/client/client.d.ts +196 -0
  20. package/dist/client/client.d.ts.map +1 -0
  21. package/dist/client/client.js +1523 -0
  22. package/dist/client/client.js.map +1 -0
  23. package/dist/client/commands.d.ts +66 -0
  24. package/dist/client/commands.d.ts.map +1 -0
  25. package/dist/client/commands.js +162 -0
  26. package/dist/client/commands.js.map +1 -0
  27. package/dist/client/crypto/crypt-ops.d.ts +7 -0
  28. package/dist/client/crypto/crypt-ops.d.ts.map +1 -0
  29. package/dist/client/crypto/crypt-ops.js +2 -0
  30. package/dist/client/crypto/crypt-ops.js.map +1 -0
  31. package/dist/client/crypto/crypt.d.ts +37 -0
  32. package/dist/client/crypto/crypt.d.ts.map +1 -0
  33. package/dist/client/crypto/crypt.js +203 -0
  34. package/dist/client/crypto/crypt.js.map +1 -0
  35. package/dist/client/crypto/eax.d.ts +12 -0
  36. package/dist/client/crypto/eax.d.ts.map +1 -0
  37. package/dist/client/crypto/eax.js +118 -0
  38. package/dist/client/crypto/eax.js.map +1 -0
  39. package/dist/client/crypto/identity.d.ts +97 -0
  40. package/dist/client/crypto/identity.d.ts.map +1 -0
  41. package/dist/client/crypto/identity.js +412 -0
  42. package/dist/client/crypto/identity.js.map +1 -0
  43. package/dist/client/crypto/index.d.ts +7 -0
  44. package/dist/client/crypto/index.d.ts.map +1 -0
  45. package/dist/client/crypto/index.js +5 -0
  46. package/dist/client/crypto/index.js.map +1 -0
  47. package/dist/client/crypto/primitives.d.ts +43 -0
  48. package/dist/client/crypto/primitives.d.ts.map +1 -0
  49. package/dist/client/crypto/primitives.js +116 -0
  50. package/dist/client/crypto/primitives.js.map +1 -0
  51. package/dist/client/diagnostics.d.ts +45 -0
  52. package/dist/client/diagnostics.d.ts.map +1 -0
  53. package/dist/client/diagnostics.js +30 -0
  54. package/dist/client/diagnostics.js.map +1 -0
  55. package/dist/client/discovery/index.d.ts +2 -0
  56. package/dist/client/discovery/index.d.ts.map +1 -0
  57. package/dist/client/discovery/index.js +2 -0
  58. package/dist/client/discovery/index.js.map +1 -0
  59. package/dist/client/discovery/resolver.d.ts +26 -0
  60. package/dist/client/discovery/resolver.d.ts.map +1 -0
  61. package/dist/client/discovery/resolver.js +275 -0
  62. package/dist/client/discovery/resolver.js.map +1 -0
  63. package/dist/client/errors.d.ts +82 -0
  64. package/dist/client/errors.d.ts.map +1 -0
  65. package/dist/client/errors.js +201 -0
  66. package/dist/client/errors.js.map +1 -0
  67. package/dist/client/events.d.ts +3 -0
  68. package/dist/client/events.d.ts.map +1 -0
  69. package/dist/client/events.js +8 -0
  70. package/dist/client/events.js.map +1 -0
  71. package/dist/client/handshake/crypt-handshake.d.ts +17 -0
  72. package/dist/client/handshake/crypt-handshake.d.ts.map +1 -0
  73. package/dist/client/handshake/crypt-handshake.js +128 -0
  74. package/dist/client/handshake/crypt-handshake.js.map +1 -0
  75. package/dist/client/handshake/crypt-init2.d.ts +7 -0
  76. package/dist/client/handshake/crypt-init2.d.ts.map +1 -0
  77. package/dist/client/handshake/crypt-init2.js +37 -0
  78. package/dist/client/handshake/crypt-init2.js.map +1 -0
  79. package/dist/client/handshake/index.d.ts +4 -0
  80. package/dist/client/handshake/index.d.ts.map +1 -0
  81. package/dist/client/handshake/index.js +4 -0
  82. package/dist/client/handshake/index.js.map +1 -0
  83. package/dist/client/handshake/license.d.ts +35 -0
  84. package/dist/client/handshake/license.d.ts.map +1 -0
  85. package/dist/client/handshake/license.js +169 -0
  86. package/dist/client/handshake/license.js.map +1 -0
  87. package/dist/client/handshake.d.ts +27 -0
  88. package/dist/client/handshake.d.ts.map +1 -0
  89. package/dist/client/handshake.js +126 -0
  90. package/dist/client/handshake.js.map +1 -0
  91. package/dist/client/helpers.d.ts +6 -0
  92. package/dist/client/helpers.d.ts.map +1 -0
  93. package/dist/client/helpers.js +13 -0
  94. package/dist/client/helpers.js.map +1 -0
  95. package/dist/client/hooks.d.ts +7 -0
  96. package/dist/client/hooks.d.ts.map +1 -0
  97. package/dist/client/hooks.js +28 -0
  98. package/dist/client/hooks.js.map +1 -0
  99. package/dist/client/index.d.ts +26 -0
  100. package/dist/client/index.d.ts.map +1 -0
  101. package/dist/client/index.js +28 -0
  102. package/dist/client/index.js.map +1 -0
  103. package/dist/client/reconnect.d.ts +12 -0
  104. package/dist/client/reconnect.d.ts.map +1 -0
  105. package/dist/client/reconnect.js +44 -0
  106. package/dist/client/reconnect.js.map +1 -0
  107. package/dist/client/throttle.d.ts +20 -0
  108. package/dist/client/throttle.d.ts.map +1 -0
  109. package/dist/client/throttle.js +83 -0
  110. package/dist/client/throttle.js.map +1 -0
  111. package/dist/client/trace.d.ts +223 -0
  112. package/dist/client/trace.d.ts.map +1 -0
  113. package/dist/client/trace.js +13 -0
  114. package/dist/client/trace.js.map +1 -0
  115. package/dist/client/transfer.d.ts +111 -0
  116. package/dist/client/transfer.d.ts.map +1 -0
  117. package/dist/client/transfer.js +243 -0
  118. package/dist/client/transfer.js.map +1 -0
  119. package/dist/client/transport/generation-window.d.ts +30 -0
  120. package/dist/client/transport/generation-window.d.ts.map +1 -0
  121. package/dist/client/transport/generation-window.js +97 -0
  122. package/dist/client/transport/generation-window.js.map +1 -0
  123. package/dist/client/transport/handler.d.ts +61 -0
  124. package/dist/client/transport/handler.d.ts.map +1 -0
  125. package/dist/client/transport/handler.js +793 -0
  126. package/dist/client/transport/handler.js.map +1 -0
  127. package/dist/client/transport/index.d.ts +6 -0
  128. package/dist/client/transport/index.d.ts.map +1 -0
  129. package/dist/client/transport/index.js +5 -0
  130. package/dist/client/transport/index.js.map +1 -0
  131. package/dist/client/transport/packet.d.ts +36 -0
  132. package/dist/client/transport/packet.d.ts.map +1 -0
  133. package/dist/client/transport/packet.js +55 -0
  134. package/dist/client/transport/packet.js.map +1 -0
  135. package/dist/client/transport/quicklz.d.ts +24 -0
  136. package/dist/client/transport/quicklz.d.ts.map +1 -0
  137. package/dist/client/transport/quicklz.js +179 -0
  138. package/dist/client/transport/quicklz.js.map +1 -0
  139. package/dist/client/types.d.ts +226 -0
  140. package/dist/client/types.d.ts.map +1 -0
  141. package/dist/client/types.js +39 -0
  142. package/dist/client/types.js.map +1 -0
  143. package/dist/core/api/channels.d.ts +182 -0
  144. package/dist/core/api/channels.d.ts.map +1 -0
  145. package/dist/core/api/channels.js +155 -0
  146. package/dist/core/api/channels.js.map +1 -0
  147. package/dist/core/api/clients.d.ts +304 -0
  148. package/dist/core/api/clients.d.ts.map +1 -0
  149. package/dist/core/api/clients.js +260 -0
  150. package/dist/core/api/clients.js.map +1 -0
  151. package/dist/core/api/command.d.ts +305 -0
  152. package/dist/core/api/command.d.ts.map +1 -0
  153. package/dist/core/api/command.js +363 -0
  154. package/dist/core/api/command.js.map +1 -0
  155. package/dist/core/api/files.d.ts +153 -0
  156. package/dist/core/api/files.d.ts.map +1 -0
  157. package/dist/core/api/files.js +181 -0
  158. package/dist/core/api/files.js.map +1 -0
  159. package/dist/core/api/groups.d.ts +248 -0
  160. package/dist/core/api/groups.d.ts.map +1 -0
  161. package/dist/core/api/groups.js +271 -0
  162. package/dist/core/api/groups.js.map +1 -0
  163. package/dist/core/api/moderation.d.ts +205 -0
  164. package/dist/core/api/moderation.d.ts.map +1 -0
  165. package/dist/core/api/moderation.js +209 -0
  166. package/dist/core/api/moderation.js.map +1 -0
  167. package/dist/core/api/parse.d.ts +16 -0
  168. package/dist/core/api/parse.d.ts.map +1 -0
  169. package/dist/core/api/parse.js +40 -0
  170. package/dist/core/api/parse.js.map +1 -0
  171. package/dist/core/api/server.d.ts +310 -0
  172. package/dist/core/api/server.d.ts.map +1 -0
  173. package/dist/core/api/server.js +290 -0
  174. package/dist/core/api/server.js.map +1 -0
  175. package/dist/core/command/command.d.ts +20 -0
  176. package/dist/core/command/command.d.ts.map +1 -0
  177. package/dist/core/command/command.js +112 -0
  178. package/dist/core/command/command.js.map +1 -0
  179. package/dist/core/command/ids.d.ts +125 -0
  180. package/dist/core/command/ids.d.ts.map +1 -0
  181. package/dist/core/command/ids.js +85 -0
  182. package/dist/core/command/ids.js.map +1 -0
  183. package/dist/core/command/parser.d.ts +17 -0
  184. package/dist/core/command/parser.d.ts.map +1 -0
  185. package/dist/core/command/parser.js +65 -0
  186. package/dist/core/command/parser.js.map +1 -0
  187. package/dist/core/command/request.d.ts +61 -0
  188. package/dist/core/command/request.d.ts.map +1 -0
  189. package/dist/core/command/request.js +64 -0
  190. package/dist/core/command/request.js.map +1 -0
  191. package/dist/core/command/responses.d.ts +59 -0
  192. package/dist/core/command/responses.d.ts.map +1 -0
  193. package/dist/core/command/responses.js +74 -0
  194. package/dist/core/command/responses.js.map +1 -0
  195. package/dist/core/command-name.d.ts +333 -0
  196. package/dist/core/command-name.d.ts.map +1 -0
  197. package/dist/core/command-name.js +331 -0
  198. package/dist/core/command-name.js.map +1 -0
  199. package/dist/core/enums.d.ts +146 -0
  200. package/dist/core/enums.d.ts.map +1 -0
  201. package/dist/core/enums.js +132 -0
  202. package/dist/core/enums.js.map +1 -0
  203. package/dist/core/errorcode.d.ts +413 -0
  204. package/dist/core/errorcode.d.ts.map +1 -0
  205. package/dist/core/errorcode.js +410 -0
  206. package/dist/core/errorcode.js.map +1 -0
  207. package/dist/core/errors.d.ts +111 -0
  208. package/dist/core/errors.d.ts.map +1 -0
  209. package/dist/core/errors.js +233 -0
  210. package/dist/core/errors.js.map +1 -0
  211. package/dist/core/events.d.ts +207 -0
  212. package/dist/core/events.d.ts.map +1 -0
  213. package/dist/core/events.js +6 -0
  214. package/dist/core/events.js.map +1 -0
  215. package/dist/core/helpers.d.ts +42 -0
  216. package/dist/core/helpers.d.ts.map +1 -0
  217. package/dist/core/helpers.js +156 -0
  218. package/dist/core/helpers.js.map +1 -0
  219. package/dist/core/index.d.ts +35 -0
  220. package/dist/core/index.d.ts.map +1 -0
  221. package/dist/core/index.js +34 -0
  222. package/dist/core/index.js.map +1 -0
  223. package/dist/core/internal.d.ts +23 -0
  224. package/dist/core/internal.d.ts.map +1 -0
  225. package/dist/core/internal.js +20 -0
  226. package/dist/core/internal.js.map +1 -0
  227. package/dist/core/middleware.d.ts +14 -0
  228. package/dist/core/middleware.d.ts.map +1 -0
  229. package/dist/core/middleware.js +18 -0
  230. package/dist/core/middleware.js.map +1 -0
  231. package/dist/core/notification-name.d.ts +154 -0
  232. package/dist/core/notification-name.d.ts.map +1 -0
  233. package/dist/core/notification-name.js +152 -0
  234. package/dist/core/notification-name.js.map +1 -0
  235. package/dist/core/notifications.d.ts +43 -0
  236. package/dist/core/notifications.d.ts.map +1 -0
  237. package/dist/core/notifications.js +116 -0
  238. package/dist/core/notifications.js.map +1 -0
  239. package/dist/core/permission-name.d.ts +533 -0
  240. package/dist/core/permission-name.d.ts.map +1 -0
  241. package/dist/core/permission-name.js +531 -0
  242. package/dist/core/permission-name.js.map +1 -0
  243. package/dist/core/permission.d.ts +31 -0
  244. package/dist/core/permission.d.ts.map +1 -0
  245. package/dist/core/permission.js +20 -0
  246. package/dist/core/permission.js.map +1 -0
  247. package/dist/core/property-name.d.ts +403 -0
  248. package/dist/core/property-name.d.ts.map +1 -0
  249. package/dist/core/property-name.js +405 -0
  250. package/dist/core/property-name.js.map +1 -0
  251. package/dist/core/reason.d.ts +39 -0
  252. package/dist/core/reason.d.ts.map +1 -0
  253. package/dist/core/reason.js +36 -0
  254. package/dist/core/reason.js.map +1 -0
  255. package/dist/core/reconnect.d.ts +59 -0
  256. package/dist/core/reconnect.d.ts.map +1 -0
  257. package/dist/core/reconnect.js +55 -0
  258. package/dist/core/reconnect.js.map +1 -0
  259. package/dist/core/types.d.ts +110 -0
  260. package/dist/core/types.d.ts.map +1 -0
  261. package/dist/core/types.js +27 -0
  262. package/dist/core/types.js.map +1 -0
  263. package/dist/query/client.d.ts +194 -0
  264. package/dist/query/client.d.ts.map +1 -0
  265. package/dist/query/client.js +969 -0
  266. package/dist/query/client.js.map +1 -0
  267. package/dist/query/errors.d.ts +61 -0
  268. package/dist/query/errors.d.ts.map +1 -0
  269. package/dist/query/errors.js +100 -0
  270. package/dist/query/errors.js.map +1 -0
  271. package/dist/query/index.d.ts +36 -0
  272. package/dist/query/index.d.ts.map +1 -0
  273. package/dist/query/index.js +34 -0
  274. package/dist/query/index.js.map +1 -0
  275. package/dist/query/knownhosts.d.ts +61 -0
  276. package/dist/query/knownhosts.d.ts.map +1 -0
  277. package/dist/query/knownhosts.js +223 -0
  278. package/dist/query/knownhosts.js.map +1 -0
  279. package/dist/query/lines.d.ts +14 -0
  280. package/dist/query/lines.d.ts.map +1 -0
  281. package/dist/query/lines.js +29 -0
  282. package/dist/query/lines.js.map +1 -0
  283. package/dist/query/options.d.ts +187 -0
  284. package/dist/query/options.d.ts.map +1 -0
  285. package/dist/query/options.js +213 -0
  286. package/dist/query/options.js.map +1 -0
  287. package/dist/query/reconnect.d.ts +29 -0
  288. package/dist/query/reconnect.d.ts.map +1 -0
  289. package/dist/query/reconnect.js +87 -0
  290. package/dist/query/reconnect.js.map +1 -0
  291. package/dist/query/ssh.d.ts +345 -0
  292. package/dist/query/ssh.d.ts.map +1 -0
  293. package/dist/query/ssh.js +241 -0
  294. package/dist/query/ssh.js.map +1 -0
  295. package/dist/query/stream.d.ts +38 -0
  296. package/dist/query/stream.d.ts.map +1 -0
  297. package/dist/query/stream.js +70 -0
  298. package/dist/query/stream.js.map +1 -0
  299. package/dist/query/tcp.d.ts +38 -0
  300. package/dist/query/tcp.d.ts.map +1 -0
  301. package/dist/query/tcp.js +53 -0
  302. package/dist/query/tcp.js.map +1 -0
  303. package/dist/query/transport.d.ts +36 -0
  304. package/dist/query/transport.d.ts.map +1 -0
  305. package/dist/query/transport.js +2 -0
  306. package/dist/query/transport.js.map +1 -0
  307. package/dist/query/web.d.ts +54 -0
  308. package/dist/query/web.d.ts.map +1 -0
  309. package/dist/query/web.js +146 -0
  310. package/dist/query/web.js.map +1 -0
  311. package/dist/versions/index.d.ts +3094 -0
  312. package/dist/versions/index.d.ts.map +1 -0
  313. package/dist/versions/index.js +9237 -0
  314. package/dist/versions/index.js.map +1 -0
  315. package/package.json +118 -4
  316. package/src/client/abort.ts +24 -0
  317. package/src/client/address.ts +74 -0
  318. package/src/client/api/voice.ts +61 -0
  319. package/src/client/capabilities.ts +106 -0
  320. package/src/client/client.ts +1809 -0
  321. package/src/client/commands.ts +193 -0
  322. package/src/client/crypto/crypt-ops.ts +6 -0
  323. package/src/client/crypto/crypt.ts +275 -0
  324. package/src/client/crypto/eax.ts +152 -0
  325. package/src/client/crypto/identity.ts +484 -0
  326. package/src/client/crypto/index.ts +21 -0
  327. package/src/client/crypto/primitives.ts +141 -0
  328. package/src/client/diagnostics.ts +58 -0
  329. package/src/client/discovery/index.ts +1 -0
  330. package/src/client/discovery/resolver.ts +325 -0
  331. package/src/client/errors.ts +217 -0
  332. package/src/client/events.ts +12 -0
  333. package/src/client/handshake/crypt-handshake.ts +157 -0
  334. package/src/client/handshake/crypt-init2.ts +48 -0
  335. package/src/client/handshake/index.ts +3 -0
  336. package/src/client/handshake/license.ts +208 -0
  337. package/src/client/handshake.ts +150 -0
  338. package/src/client/helpers.ts +10 -0
  339. package/src/client/hooks.ts +30 -0
  340. package/src/client/index.ts +93 -0
  341. package/src/client/reconnect.ts +43 -0
  342. package/src/client/throttle.ts +92 -0
  343. package/src/client/trace.ts +237 -0
  344. package/src/client/transfer.ts +436 -0
  345. package/src/client/transport/generation-window.ts +108 -0
  346. package/src/client/transport/handler.ts +926 -0
  347. package/src/client/transport/index.ts +14 -0
  348. package/src/client/transport/packet.ts +69 -0
  349. package/src/client/transport/quicklz.ts +209 -0
  350. package/src/client/types.ts +268 -0
  351. package/src/core/api/channels.ts +396 -0
  352. package/src/core/api/clients.ts +654 -0
  353. package/src/core/api/command.ts +563 -0
  354. package/src/core/api/files.ts +405 -0
  355. package/src/core/api/groups.ts +622 -0
  356. package/src/core/api/moderation.ts +525 -0
  357. package/src/core/api/parse.ts +52 -0
  358. package/src/core/api/server.ts +709 -0
  359. package/src/core/command/command.ts +125 -0
  360. package/src/core/command/ids.ts +149 -0
  361. package/src/core/command/parser.ts +68 -0
  362. package/src/core/command/request.ts +119 -0
  363. package/src/core/command/responses.ts +114 -0
  364. package/src/core/command-name.ts +334 -0
  365. package/src/core/enums.ts +167 -0
  366. package/src/core/errorcode.ts +412 -0
  367. package/src/core/errors.ts +258 -0
  368. package/src/core/events.ts +219 -0
  369. package/src/core/helpers.ts +161 -0
  370. package/src/core/index.ts +126 -0
  371. package/src/core/internal.ts +23 -0
  372. package/src/core/middleware.ts +24 -0
  373. package/src/core/notification-name.ts +155 -0
  374. package/src/core/notifications.ts +157 -0
  375. package/src/core/permission-name.ts +538 -0
  376. package/src/core/permission.ts +34 -0
  377. package/src/core/property-name.ts +411 -0
  378. package/src/core/reason.ts +38 -0
  379. package/src/core/reconnect.ts +98 -0
  380. package/src/core/types.ts +138 -0
  381. package/src/query/client.ts +1129 -0
  382. package/src/query/errors.ts +108 -0
  383. package/src/query/index.ts +65 -0
  384. package/src/query/knownhosts.ts +257 -0
  385. package/src/query/lines.ts +28 -0
  386. package/src/query/options.ts +388 -0
  387. package/src/query/reconnect.ts +84 -0
  388. package/src/query/ssh.ts +614 -0
  389. package/src/query/stream.ts +91 -0
  390. package/src/query/tcp.ts +85 -0
  391. package/src/query/transport.ts +35 -0
  392. package/src/query/web.ts +195 -0
  393. package/src/versions/index.ts +10774 -0
@@ -0,0 +1,7 @@
1
+ export { Identity, parseIdentity, generateIdentity, generateIdentitySync, uidFromPublicKey, uidAlgorithmForVersion, hash512, importPublicKey, } from "./identity.js";
2
+ export type { UIDAlgorithm } from "./identity.js";
3
+ export { Crypt } from "./crypt.js";
4
+ export type { KeyNonce } from "./crypt.js";
5
+ export { EAX, aesCmac } from "./eax.js";
6
+ export { generateTemporaryKey, sign, verifySign, getSharedSecret2, clampScalar, } from "./primitives.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,OAAO,EACP,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { Identity, parseIdentity, generateIdentity, generateIdentitySync, uidFromPublicKey, uidAlgorithmForVersion, hash512, importPublicKey, } from "./identity.js";
2
+ export { Crypt } from "./crypt.js";
3
+ export { EAX, aesCmac } from "./eax.js";
4
+ export { generateTemporaryKey, sign, verifySign, getSharedSecret2, clampScalar, } from "./primitives.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,OAAO,EACP,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type KeyObject } from "node:crypto";
2
+ import { ed25519 } from "@noble/curves/ed25519.js";
3
+ /** Clamp a Curve25519 scalar in-place (required before scalar multiplication). */
4
+ export declare function clampScalar(key: Uint8Array): void;
5
+ /**
6
+ * Generate an ephemeral Ed25519 key pair for the TS3 handshake.
7
+ * Returns [publicKey (32 bytes, RFC-8032 encoded), privateKey (32 bytes)].
8
+ */
9
+ export declare function generateTemporaryKey(): [Uint8Array, Uint8Array];
10
+ /**
11
+ * Sign data with a P-256 private key (SHA-256 hash, ASN.1 DER encoded).
12
+ */
13
+ export declare function sign(privateKey: KeyObject, data: Uint8Array): Uint8Array;
14
+ /**
15
+ * Verify a P-256 ECDSA signature (SHA-256 hash, ASN.1 DER encoded).
16
+ */
17
+ export declare function verifySign(publicKey: KeyObject, data: Uint8Array, sig: Uint8Array): boolean;
18
+ /**
19
+ * TS3-specific shared secret derivation using Ed25519 point arithmetic.
20
+ * Mirrors NaCl's ge_scalarmult_vartime:
21
+ * 1. Negate the public point
22
+ * 2. Scalar-multiply by clamped private key bytes (NOT reduced mod n)
23
+ * 3. Flip sign bit of result
24
+ * 4. SHA-512 the resulting point bytes
25
+ *
26
+ * The scalar must NOT be reduced mod n: Ed25519 has cofactor 8, so the server's
27
+ * public key may have a small-order component, and P*s ≠ P*(s mod n) in that case.
28
+ * We use scalarMultFull to handle scalars >= n without losing the cofactor term.
29
+ */
30
+ export declare function getSharedSecret2(publicKeyBytes: Uint8Array, privateKeyBytes: Uint8Array): Uint8Array;
31
+ /**
32
+ * Multiply an Ed25519 point by a scalar that may be >= curve order n.
33
+ * Decomposes as: P*s = P*(s mod n) + (P*n)*q where q = floor(s/n).
34
+ * This preserves the small-order component (cofactor 8) that would be
35
+ * lost by reducing mod n first.
36
+ *
37
+ * For a clamped 255-bit scalar, q is at most 7 (since maxScalar / n < 8),
38
+ * so the second term is computed with at most one extra scalar multiplication.
39
+ */
40
+ export declare function scalarMultFull(point: InstanceType<typeof ed25519.Point>, scalar: bigint): InstanceType<typeof ed25519.Point>;
41
+ /** Interpret a little-endian byte array as an unsigned BigInt. */
42
+ export declare function bytesToBigIntLE(bytes: Uint8Array): bigint;
43
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/client/crypto/primitives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AASnD,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAKjD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAU/D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAIxE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAQ3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,UAAU,EAC1B,eAAe,EAAE,UAAU,GAC1B,UAAU,CA4BZ;AAID;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,EACzC,MAAM,EAAE,MAAM,GACb,YAAY,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAgBpC;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMzD"}
@@ -0,0 +1,116 @@
1
+ import { createSign, createVerify, createHash, randomBytes } from "node:crypto";
2
+ import { ed25519 } from "@noble/curves/ed25519.js";
3
+ const CURVE25519_KEY_SIZE = 32;
4
+ const CLAMP_MASK_LOW = 248;
5
+ const CLAMP_MASK_HIGH = 127;
6
+ const CLAMP_HIGH_BIT = 64;
7
+ const SHARED_SIGN_BIT = 0x80;
8
+ const PRIVATE_KEY_TOP_MASK = 0x7f;
9
+ /** Clamp a Curve25519 scalar in-place (required before scalar multiplication). */
10
+ export function clampScalar(key) {
11
+ if (key.length < CURVE25519_KEY_SIZE)
12
+ return;
13
+ key[0] = (key[0] ?? 0) & CLAMP_MASK_LOW;
14
+ key[CURVE25519_KEY_SIZE - 1] =
15
+ ((key[CURVE25519_KEY_SIZE - 1] ?? 0) & CLAMP_MASK_HIGH) | CLAMP_HIGH_BIT;
16
+ }
17
+ /**
18
+ * Generate an ephemeral Ed25519 key pair for the TS3 handshake.
19
+ * Returns [publicKey (32 bytes, RFC-8032 encoded), privateKey (32 bytes)].
20
+ */
21
+ export function generateTemporaryKey() {
22
+ const privateKey = new Uint8Array(randomBytes(CURVE25519_KEY_SIZE));
23
+ clampScalar(privateKey);
24
+ // Base point G is in the prime-order subgroup, so G*s = G*(s mod n).
25
+ // Safe to reduce here since G has no small-order component.
26
+ const scalar = bytesToBigIntLE(privateKey) % ed25519.Point.CURVE().n;
27
+ const publicKey = ed25519.Point.BASE.multiply(scalar).toBytes();
28
+ return [publicKey, Uint8Array.from(privateKey)];
29
+ }
30
+ /**
31
+ * Sign data with a P-256 private key (SHA-256 hash, ASN.1 DER encoded).
32
+ */
33
+ export function sign(privateKey, data) {
34
+ const signer = createSign("SHA256");
35
+ signer.update(data);
36
+ return signer.sign(privateKey);
37
+ }
38
+ /**
39
+ * Verify a P-256 ECDSA signature (SHA-256 hash, ASN.1 DER encoded).
40
+ */
41
+ export function verifySign(publicKey, data, sig) {
42
+ try {
43
+ const verifier = createVerify("SHA256");
44
+ verifier.update(data);
45
+ return verifier.verify(publicKey, Buffer.from(sig));
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * TS3-specific shared secret derivation using Ed25519 point arithmetic.
53
+ * Mirrors NaCl's ge_scalarmult_vartime:
54
+ * 1. Negate the public point
55
+ * 2. Scalar-multiply by clamped private key bytes (NOT reduced mod n)
56
+ * 3. Flip sign bit of result
57
+ * 4. SHA-512 the resulting point bytes
58
+ *
59
+ * The scalar must NOT be reduced mod n: Ed25519 has cofactor 8, so the server's
60
+ * public key may have a small-order component, and P*s ≠ P*(s mod n) in that case.
61
+ * We use scalarMultFull to handle scalars >= n without losing the cofactor term.
62
+ */
63
+ export function getSharedSecret2(publicKeyBytes, privateKeyBytes) {
64
+ if (publicKeyBytes.length !== CURVE25519_KEY_SIZE ||
65
+ privateKeyBytes.length !== CURVE25519_KEY_SIZE) {
66
+ throw new Error("invalid key length");
67
+ }
68
+ const privCopy = Uint8Array.from(privateKeyBytes);
69
+ privCopy[CURVE25519_KEY_SIZE - 1] =
70
+ (privCopy[CURVE25519_KEY_SIZE - 1] ?? 0) & PRIVATE_KEY_TOP_MASK;
71
+ // Use raw scalar WITHOUT reducing mod n — matches NaCl's ge_scalarmult_vartime.
72
+ // Ed25519 has cofactor 8, so P*s ≠ P*(s mod n) when P has a small-order component.
73
+ // Since @noble/curves rejects scalars >= n, we decompose: P*s = P*(s%n) + (P*n)*q
74
+ const rawScalar = bytesToBigIntLE(privCopy);
75
+ const pub = ed25519.Point.fromBytes(publicKeyBytes);
76
+ const negPub = pub.negate();
77
+ const sharedPoint = scalarMultFull(negPub, rawScalar);
78
+ const sharedBytes = sharedPoint.toBytes();
79
+ // Flip sign bit (mirrors Go: shared[31] ^= 0x80)
80
+ sharedBytes[CURVE25519_KEY_SIZE - 1] =
81
+ (sharedBytes[CURVE25519_KEY_SIZE - 1] ?? 0) ^ SHARED_SIGN_BIT;
82
+ return createHash("sha512").update(sharedBytes).digest();
83
+ }
84
+ // ---- Internal ---------------------------------------------------------------
85
+ /**
86
+ * Multiply an Ed25519 point by a scalar that may be >= curve order n.
87
+ * Decomposes as: P*s = P*(s mod n) + (P*n)*q where q = floor(s/n).
88
+ * This preserves the small-order component (cofactor 8) that would be
89
+ * lost by reducing mod n first.
90
+ *
91
+ * For a clamped 255-bit scalar, q is at most 7 (since maxScalar / n < 8),
92
+ * so the second term is computed with at most one extra scalar multiplication.
93
+ */
94
+ export function scalarMultFull(point, scalar) {
95
+ const n = ed25519.Point.CURVE().n;
96
+ if (scalar < n) {
97
+ return scalar === 0n ? ed25519.Point.ZERO : point.multiply(scalar);
98
+ }
99
+ const remainder = scalar % n;
100
+ const quotient = scalar / n; // integer division, 1 <= quotient <= 7 for clamped scalars
101
+ // P * (s mod n)
102
+ const mainPart = remainder === 0n ? ed25519.Point.ZERO : point.multiply(remainder);
103
+ // (P * n) * q — compute P*n via P*(n-1)+P since multiply() rejects scalar == n
104
+ const pointTimesN = point.multiply(n - 1n).add(point);
105
+ const cofactorPart = pointTimesN.multiply(quotient);
106
+ return mainPart.add(cofactorPart);
107
+ }
108
+ /** Interpret a little-endian byte array as an unsigned BigInt. */
109
+ export function bytesToBigIntLE(bytes) {
110
+ let result = 0n;
111
+ for (let i = bytes.length - 1; i >= 0; i--) {
112
+ result = (result << 8n) | BigInt(bytes[i]);
113
+ }
114
+ return result;
115
+ }
116
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/client/crypto/primitives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Diagnostics channels: the SDK's tracing points, for an application or an
3
+ * APM agent (OpenTelemetry instruments `diagnostics_channel` directly) to
4
+ * subscribe to.
5
+ *
6
+ * A library does not decide where its traces go, so the SDK publishes them
7
+ * here, and with no subscriber a channel costs a property read.
8
+ *
9
+ * Messages carry the command's name, never its parameters: those hold
10
+ * password hashes, which the server accepts as passwords, and privilege keys.
11
+ *
12
+ * ```ts
13
+ * import { tracingChannel } from "node:diagnostics_channel";
14
+ *
15
+ * tracingChannel("honeybbq:teamspeak:command").subscribe({
16
+ * start: ({ command }) => console.time(command),
17
+ * asyncEnd: ({ command }) => console.timeEnd(command),
18
+ * error: ({ command, error }) => console.error(command, error),
19
+ * });
20
+ * ```
21
+ */
22
+ import { type Channel, type TracingChannel } from "node:diagnostics_channel";
23
+ import type { Client } from "./client.js";
24
+ /** What `honeybbq:teamspeak:command` reports about a command. */
25
+ export interface CommandTrace {
26
+ /** The command's name, such as `clientlist`. */
27
+ readonly command: string;
28
+ /** The client sending it. Its fields are private, so it carries no secret. */
29
+ readonly client: Client;
30
+ }
31
+ /** What `honeybbq:teamspeak:incoming` reports about a command arriving from the server. */
32
+ export interface IncomingTrace {
33
+ /** The command's name, such as `notifytextmessage`, or `""` for a data row. */
34
+ readonly command: string;
35
+ /** The client receiving it. */
36
+ readonly client: Client;
37
+ }
38
+ /**
39
+ * Traces every command with an answer: `start` when it is sent, `asyncEnd`
40
+ * when its answer arrives, `error` when it fails.
41
+ */
42
+ export declare const commandChannel: TracingChannel<CommandTrace>;
43
+ /** Publishes every command the server sends. */
44
+ export declare const incomingChannel: Channel<IncomingTrace>;
45
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/client/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,2FAA2F;AAC3F,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,YAAY,CAEvD,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,aAAa,CAElD,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Diagnostics channels: the SDK's tracing points, for an application or an
3
+ * APM agent (OpenTelemetry instruments `diagnostics_channel` directly) to
4
+ * subscribe to.
5
+ *
6
+ * A library does not decide where its traces go, so the SDK publishes them
7
+ * here, and with no subscriber a channel costs a property read.
8
+ *
9
+ * Messages carry the command's name, never its parameters: those hold
10
+ * password hashes, which the server accepts as passwords, and privilege keys.
11
+ *
12
+ * ```ts
13
+ * import { tracingChannel } from "node:diagnostics_channel";
14
+ *
15
+ * tracingChannel("honeybbq:teamspeak:command").subscribe({
16
+ * start: ({ command }) => console.time(command),
17
+ * asyncEnd: ({ command }) => console.timeEnd(command),
18
+ * error: ({ command, error }) => console.error(command, error),
19
+ * });
20
+ * ```
21
+ */
22
+ import { channel, tracingChannel, } from "node:diagnostics_channel";
23
+ /**
24
+ * Traces every command with an answer: `start` when it is sent, `asyncEnd`
25
+ * when its answer arrives, `error` when it fails.
26
+ */
27
+ export const commandChannel = tracingChannel("honeybbq:teamspeak:command");
28
+ /** Publishes every command the server sends. */
29
+ export const incomingChannel = channel("honeybbq:teamspeak:incoming");
30
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/client/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,OAAO,EACP,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAmBlC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiC,cAAc,CACxE,4BAA4B,CAC7B,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAA2B,OAAO,CAC5D,6BAA6B,CAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Resolver } from "./resolver.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Resolver } from "./resolver.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ResolvedAddr } from "../types.js";
2
+ /**
3
+ * The most a TSDNS server or the nickname service is read for. Either answers
4
+ * with one short line; without a bound, one that kept sending would be held in
5
+ * memory until the resolution budget ran out.
6
+ */
7
+ export declare const MAX_DISCOVERY_RESPONSE: number;
8
+ /** How the default resolver resolves. */
9
+ export interface ResolverOptions {
10
+ /** Look dot-less names up at named.myteamspeak.com; off by default. */
11
+ readonly nicknameLookup?: boolean | undefined;
12
+ }
13
+ export declare class Resolver {
14
+ #private;
15
+ constructor(options?: ResolverOptions);
16
+ /**
17
+ * Resolve as the TeamSpeak application does: a server nickname (only with
18
+ * `nicknameLookup`), then SRV, then TSDNS, then the address as given. The
19
+ * whole resolution is bounded: past the budget, or when a step fails, the
20
+ * address as given is the answer.
21
+ */
22
+ resolve(inputAddr: string, options?: {
23
+ readonly signal?: AbortSignal | undefined;
24
+ }): Promise<ResolvedAddr[]>;
25
+ }
26
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/client/discovery/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAiB,CAAC;AAEvD,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/C;AAED,qBAAa,QAAQ;;IAInB,YAAY,OAAO,GAAE,eAAoB,EAExC;IAED;;;;;OAKG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KAAO,GAC1D,OAAO,CAAC,YAAY,EAAE,CAAC,CAYzB;CAgHF"}
@@ -0,0 +1,275 @@
1
+ import { resolveSrv } from "node:dns/promises";
2
+ import { createConnection } from "node:net";
3
+ import { isIpAddress, joinHostPort, splitHostPort } from "../address.js";
4
+ import { abortable } from "../abort.js";
5
+ import { InvalidAddressError } from "../errors.js";
6
+ const TS_DNS_DEFAULT_PORT = 41144;
7
+ const NICKNAME_LOOKUP_URL = "https://named.myteamspeak.com/lookup";
8
+ const CACHE_TTL_MS = 10 * 60 * 1000;
9
+ /**
10
+ * How long resolution may take in all; past it, the address is used as given.
11
+ * A Client holds any resolver, its own or a custom one, to the same budget.
12
+ *
13
+ * @internal
14
+ */
15
+ export const RESOLVE_BUDGET_MS = 10_000;
16
+ /** How long one TSDNS server may take to answer. */
17
+ const TSDNS_TIMEOUT_MS = 3_000;
18
+ /**
19
+ * The most a TSDNS server or the nickname service is read for. Either answers
20
+ * with one short line; without a bound, one that kept sending would be held in
21
+ * memory until the resolution budget ran out.
22
+ */
23
+ export const MAX_DISCOVERY_RESPONSE = 8 * 1024;
24
+ export class Resolver {
25
+ #cache = new Map();
26
+ #nicknameLookup;
27
+ constructor(options = {}) {
28
+ this.#nicknameLookup = options.nicknameLookup ?? false;
29
+ }
30
+ /**
31
+ * Resolve as the TeamSpeak application does: a server nickname (only with
32
+ * `nicknameLookup`), then SRV, then TSDNS, then the address as given. The
33
+ * whole resolution is bounded: past the budget, or when a step fails, the
34
+ * address as given is the answer.
35
+ */
36
+ async resolve(inputAddr, options = {}) {
37
+ if (!inputAddr)
38
+ throw new InvalidAddressError(inputAddr, "empty address");
39
+ const budget = AbortSignal.timeout(RESOLVE_BUDGET_MS);
40
+ const signal = options.signal ? AbortSignal.any([options.signal, budget]) : budget;
41
+ try {
42
+ return await this.#resolve(inputAddr, signal, true);
43
+ }
44
+ catch (error) {
45
+ options.signal?.throwIfAborted();
46
+ if (!budget.aborted)
47
+ throw error;
48
+ const { host, port } = splitHostPort(inputAddr);
49
+ return [{ addr: joinHostPort(host, port), source: "Direct" }];
50
+ }
51
+ }
52
+ async #resolve(inputAddr, signal, nicknames) {
53
+ const cached = this.#getValidCache(inputAddr);
54
+ if (cached)
55
+ return cached;
56
+ const { host, port } = splitHostPort(inputAddr);
57
+ if (isIpAddress(host)) {
58
+ return [{ addr: joinHostPort(host, port), source: "Direct" }];
59
+ }
60
+ // A dot-less name may be a server nickname, which only the TeamSpeak
61
+ // service can answer: asking it sends the name to a third party, so it is
62
+ // opt-in. Otherwise the name is resolved like any host.
63
+ if (nicknames && this.#nicknameLookup && !host.includes(".") && host !== "localhost") {
64
+ const nickAddr = await resolveNickname(host, signal);
65
+ signal.throwIfAborted();
66
+ if (nickAddr)
67
+ return this.#resolve(nickAddr, signal, false);
68
+ }
69
+ // SRV _ts3._udp.<host>
70
+ const srvResults = await this.#resolveSRV(host, signal);
71
+ if (srvResults)
72
+ return this.#setCache(inputAddr, srvResults);
73
+ const domainList = getDomainList(host);
74
+ // TSDNS via SRV _tsdns._tcp.<domain>
75
+ const tsdnsSrv = await this.#resolveTSDNSSRV(domainList, host, signal);
76
+ if (tsdnsSrv) {
77
+ return this.#setCache(inputAddr, [{ addr: tsdnsSrv, source: "TSDNS-SRV" }]);
78
+ }
79
+ // TSDNS direct :41144
80
+ const tsdnsDirect = await this.#resolveTSDNSDirect(domainList, host, signal);
81
+ if (tsdnsDirect) {
82
+ return this.#setCache(inputAddr, [{ addr: tsdnsDirect, source: "TSDNS-Direct" }]);
83
+ }
84
+ signal.throwIfAborted();
85
+ // Plain DNS fallback
86
+ const fallback = [{ addr: joinHostPort(host, port), source: "Direct" }];
87
+ return this.#setCache(inputAddr, fallback);
88
+ }
89
+ #getValidCache(inputAddr) {
90
+ const cached = this.#cache.get(inputAddr);
91
+ if (!cached || cached.length === 0)
92
+ return null;
93
+ const first = cached[0];
94
+ if (first.expiry !== undefined && Date.now() > first.expiry.getTime())
95
+ return null;
96
+ return cached;
97
+ }
98
+ #setCache(key, results) {
99
+ const expiry = new Date(Date.now() + CACHE_TTL_MS);
100
+ const withExpiry = results.map((r) => ({ ...r, expiry }));
101
+ this.#cache.set(key, withExpiry);
102
+ return withExpiry;
103
+ }
104
+ async #resolveSRV(host, signal) {
105
+ try {
106
+ const srvs = await abortable(resolveSrv(`_ts3._udp.${host}`), signal);
107
+ if (!srvs || srvs.length === 0)
108
+ return null;
109
+ return orderSrvRecords(srvs).map((srv) => ({
110
+ addr: joinHostPort(srv.name.replace(/\.$/, ""), String(srv.port)),
111
+ source: "SRV",
112
+ }));
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ async #resolveTSDNSSRV(domains, queryHost, signal) {
119
+ for (const domain of domains) {
120
+ try {
121
+ const srvs = await abortable(resolveSrv(`_tsdns._tcp.${domain}`), signal);
122
+ if (!srvs || srvs.length === 0)
123
+ continue;
124
+ for (const srv of orderSrvRecords(srvs)) {
125
+ const tsdnsAddr = joinHostPort(srv.name.replace(/\.$/, ""), String(srv.port));
126
+ const result = await queryTSDNS(tsdnsAddr, queryHost, signal);
127
+ if (result)
128
+ return result;
129
+ }
130
+ }
131
+ catch {
132
+ continue;
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ async #resolveTSDNSDirect(domains, queryHost, signal) {
138
+ // Asked at once rather than in turn, so the probes cost one timeout in
139
+ // all; the most specific domain's answer wins.
140
+ const answers = await Promise.all(domains.map((domain) => queryTSDNS(joinHostPort(domain, String(TS_DNS_DEFAULT_PORT)), queryHost, signal)));
141
+ return answers.find((answer) => answer !== null) ?? null;
142
+ }
143
+ }
144
+ /**
145
+ * Put SRV records in the order RFC 2782 has a client try them: by priority,
146
+ * lowest first, and within a priority by weighted random selection, so a
147
+ * record of weight 2 is first twice as often as one of weight 1. Records of
148
+ * weight 0 follow the others of their priority, in the order given. Node's
149
+ * `resolveSrv` returns the records unsorted.
150
+ *
151
+ * @param random Returns a number in [0, 1); injected to make the order testable.
152
+ * @internal
153
+ */
154
+ export function orderSrvRecords(records, random = Math.random) {
155
+ const byPriority = new Map();
156
+ for (const record of records) {
157
+ const group = byPriority.get(record.priority);
158
+ if (group)
159
+ group.push(record);
160
+ else
161
+ byPriority.set(record.priority, [record]);
162
+ }
163
+ const ordered = [];
164
+ for (const priority of [...byPriority.keys()].sort((a, b) => a - b)) {
165
+ const group = byPriority.get(priority);
166
+ const weighted = group.filter((r) => r.weight > 0);
167
+ const unweighted = group.filter((r) => r.weight <= 0);
168
+ let sum = weighted.reduce((total, r) => total + r.weight, 0);
169
+ while (weighted.length > 0) {
170
+ const target = random() * sum;
171
+ let running = 0;
172
+ let pick = weighted.length - 1;
173
+ for (let i = 0; i < weighted.length; i++) {
174
+ running += weighted[i].weight;
175
+ if (running > target) {
176
+ pick = i;
177
+ break;
178
+ }
179
+ }
180
+ const [chosen] = weighted.splice(pick, 1);
181
+ ordered.push(chosen);
182
+ sum -= chosen.weight;
183
+ }
184
+ ordered.push(...unweighted);
185
+ }
186
+ return ordered;
187
+ }
188
+ /** @internal Ask the nickname service for `nickname`'s address. */
189
+ export async function resolveNickname(nickname, signal) {
190
+ try {
191
+ const url = new URL(NICKNAME_LOOKUP_URL);
192
+ url.searchParams.set("name", nickname);
193
+ const init = signal ? { signal } : {};
194
+ const resp = await fetch(url.toString(), init);
195
+ if (!resp.ok)
196
+ return null;
197
+ const text = await readLimited(resp, MAX_DISCOVERY_RESPONSE);
198
+ const line = text.split("\n")[0]?.trim();
199
+ return line || null;
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ /** A response body's first `limit` bytes, as text; the rest is not read. */
206
+ async function readLimited(resp, limit) {
207
+ if (resp.body === null)
208
+ return "";
209
+ const reader = resp.body.getReader();
210
+ const chunks = [];
211
+ let size = 0;
212
+ try {
213
+ while (size < limit) {
214
+ const { done, value } = await reader.read();
215
+ if (done)
216
+ break;
217
+ const part = value.subarray(0, limit - size);
218
+ chunks.push(part);
219
+ size += part.length;
220
+ }
221
+ }
222
+ finally {
223
+ reader.cancel().catch(() => { });
224
+ }
225
+ return Buffer.concat(chunks).toString("utf8");
226
+ }
227
+ /** @internal Ask the TSDNS server at `tsdnsAddr` for `queryHost`'s address. */
228
+ export function queryTSDNS(tsdnsAddr, queryHost, signal) {
229
+ const [host, portStr] = splitHostPortParts(tsdnsAddr);
230
+ const port = parseInt(portStr, 10);
231
+ return new Promise((resolve) => {
232
+ if (signal?.aborted)
233
+ return resolve(null);
234
+ const finish = (answer) => {
235
+ clearTimeout(timeout);
236
+ signal?.removeEventListener("abort", onAbort);
237
+ socket.destroy();
238
+ resolve(answer);
239
+ };
240
+ const onAbort = () => finish(null);
241
+ const timeout = setTimeout(() => finish(null), TSDNS_TIMEOUT_MS);
242
+ const socket = createConnection({ host, port, timeout: 2_000 }, () => {
243
+ socket.write(`${queryHost}\n`);
244
+ });
245
+ let buf = "";
246
+ socket.on("data", (chunk) => {
247
+ buf += chunk.toString("latin1");
248
+ const idx = buf.indexOf("\n");
249
+ if (idx >= 0 && idx < MAX_DISCOVERY_RESPONSE) {
250
+ const line = Buffer.from(buf.slice(0, idx), "latin1").toString("utf8").trim();
251
+ finish(!line || line === "404" || line === "errors" ? null : line);
252
+ }
253
+ else if (buf.length >= MAX_DISCOVERY_RESPONSE) {
254
+ // No answer is that long.
255
+ finish(null);
256
+ }
257
+ });
258
+ socket.on("error", () => finish(null));
259
+ socket.on("timeout", () => finish(null));
260
+ signal?.addEventListener("abort", onAbort, { once: true });
261
+ });
262
+ }
263
+ function splitHostPortParts(addr) {
264
+ const { host, port } = splitHostPort(addr);
265
+ return [host, port];
266
+ }
267
+ function getDomainList(host) {
268
+ const parts = host.split(".");
269
+ const list = [];
270
+ for (let i = 0; i < parts.length - 1; i++) {
271
+ list.push(parts.slice(i).join("."));
272
+ }
273
+ return list.slice(0, 3);
274
+ }
275
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/client/discovery/resolver.ts"],"names":[],"mappings":"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"}