@omujs/omu 0.1.22

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 (342) hide show
  1. package/.eslintignore +13 -0
  2. package/.eslintrc.cjs +6 -0
  3. package/.prettierignore +1 -0
  4. package/CHANGELOG.md +268 -0
  5. package/LICENSE +21 -0
  6. package/README.md +1 -0
  7. package/built/dts/address.d.ts +6 -0
  8. package/built/dts/address.d.ts.map +1 -0
  9. package/built/dts/app.d.ts +38 -0
  10. package/built/dts/app.d.ts.map +1 -0
  11. package/built/dts/bytebuffer.d.ts +46 -0
  12. package/built/dts/bytebuffer.d.ts.map +1 -0
  13. package/built/dts/client/client.d.ts +47 -0
  14. package/built/dts/client/client.d.ts.map +1 -0
  15. package/built/dts/client/index.d.ts +2 -0
  16. package/built/dts/client/index.d.ts.map +1 -0
  17. package/built/dts/client/omu.d.ts +53 -0
  18. package/built/dts/client/omu.d.ts.map +1 -0
  19. package/built/dts/client/omuclient.d.ts +50 -0
  20. package/built/dts/client/omuclient.d.ts.map +1 -0
  21. package/built/dts/client/token.d.ts +14 -0
  22. package/built/dts/client/token.d.ts.map +1 -0
  23. package/built/dts/client.d.ts +48 -0
  24. package/built/dts/client.d.ts.map +1 -0
  25. package/built/dts/const.d.ts +3 -0
  26. package/built/dts/const.d.ts.map +1 -0
  27. package/built/dts/errors.d.ts +29 -0
  28. package/built/dts/errors.d.ts.map +1 -0
  29. package/built/dts/event-emitter.d.ts +7 -0
  30. package/built/dts/event-emitter.d.ts.map +1 -0
  31. package/built/dts/extension/asset/asset-extension.d.ts +26 -0
  32. package/built/dts/extension/asset/asset-extension.d.ts.map +1 -0
  33. package/built/dts/extension/asset/index.d.ts +2 -0
  34. package/built/dts/extension/asset/index.d.ts.map +1 -0
  35. package/built/dts/extension/dashboard/dashboard-extension.d.ts +24 -0
  36. package/built/dts/extension/dashboard/dashboard-extension.d.ts.map +1 -0
  37. package/built/dts/extension/dashboard/dashboard.d.ts +8 -0
  38. package/built/dts/extension/dashboard/dashboard.d.ts.map +1 -0
  39. package/built/dts/extension/dashboard/index.d.ts +3 -0
  40. package/built/dts/extension/dashboard/index.d.ts.map +1 -0
  41. package/built/dts/extension/dashboard/packets.d.ts +20 -0
  42. package/built/dts/extension/dashboard/packets.d.ts.map +1 -0
  43. package/built/dts/extension/endpoint/endpoint-extension.d.ts +16 -0
  44. package/built/dts/extension/endpoint/endpoint-extension.d.ts.map +1 -0
  45. package/built/dts/extension/endpoint/endpoint.d.ts +22 -0
  46. package/built/dts/extension/endpoint/endpoint.d.ts.map +1 -0
  47. package/built/dts/extension/endpoint/index.d.ts +3 -0
  48. package/built/dts/extension/endpoint/index.d.ts.map +1 -0
  49. package/built/dts/extension/endpoint/packets.d.ts +24 -0
  50. package/built/dts/extension/endpoint/packets.d.ts.map +1 -0
  51. package/built/dts/extension/extension-registry.d.ts +12 -0
  52. package/built/dts/extension/extension-registry.d.ts.map +1 -0
  53. package/built/dts/extension/extension.d.ts +12 -0
  54. package/built/dts/extension/extension.d.ts.map +1 -0
  55. package/built/dts/extension/i18n/i18n-extension.d.ts +19 -0
  56. package/built/dts/extension/i18n/i18n-extension.d.ts.map +1 -0
  57. package/built/dts/extension/i18n/index.d.ts +2 -0
  58. package/built/dts/extension/i18n/index.d.ts.map +1 -0
  59. package/built/dts/extension/index.d.ts +3 -0
  60. package/built/dts/extension/index.d.ts.map +1 -0
  61. package/built/dts/extension/logger/index.d.ts +2 -0
  62. package/built/dts/extension/logger/index.d.ts.map +1 -0
  63. package/built/dts/extension/logger/logger-extension.d.ts +25 -0
  64. package/built/dts/extension/logger/logger-extension.d.ts.map +1 -0
  65. package/built/dts/extension/logger/packets.d.ts +19 -0
  66. package/built/dts/extension/logger/packets.d.ts.map +1 -0
  67. package/built/dts/extension/permission/index.d.ts +3 -0
  68. package/built/dts/extension/permission/index.d.ts.map +1 -0
  69. package/built/dts/extension/permission/permission-extension.d.ts +18 -0
  70. package/built/dts/extension/permission/permission-extension.d.ts.map +1 -0
  71. package/built/dts/extension/permission/permission.d.ts +29 -0
  72. package/built/dts/extension/permission/permission.d.ts.map +1 -0
  73. package/built/dts/extension/plugin/index.d.ts +2 -0
  74. package/built/dts/extension/plugin/index.d.ts.map +1 -0
  75. package/built/dts/extension/plugin/package-info.d.ts +85 -0
  76. package/built/dts/extension/plugin/package-info.d.ts.map +1 -0
  77. package/built/dts/extension/plugin/plugin-extension.d.ts +11 -0
  78. package/built/dts/extension/plugin/plugin-extension.d.ts.map +1 -0
  79. package/built/dts/extension/registry/index.d.ts +3 -0
  80. package/built/dts/extension/registry/index.d.ts.map +1 -0
  81. package/built/dts/extension/registry/packets.d.ts +17 -0
  82. package/built/dts/extension/registry/packets.d.ts.map +1 -0
  83. package/built/dts/extension/registry/registry-extension.d.ts +15 -0
  84. package/built/dts/extension/registry/registry-extension.d.ts.map +1 -0
  85. package/built/dts/extension/registry/registry.d.ts +39 -0
  86. package/built/dts/extension/registry/registry.d.ts.map +1 -0
  87. package/built/dts/extension/server/index.d.ts +2 -0
  88. package/built/dts/extension/server/index.d.ts.map +1 -0
  89. package/built/dts/extension/server/packets.d.ts +8 -0
  90. package/built/dts/extension/server/packets.d.ts.map +1 -0
  91. package/built/dts/extension/server/server-extension.d.ts +19 -0
  92. package/built/dts/extension/server/server-extension.d.ts.map +1 -0
  93. package/built/dts/extension/signal/index.d.ts +3 -0
  94. package/built/dts/extension/signal/index.d.ts.map +1 -0
  95. package/built/dts/extension/signal/packets.d.ts +17 -0
  96. package/built/dts/extension/signal/packets.d.ts.map +1 -0
  97. package/built/dts/extension/signal/signal-extension.d.ts +14 -0
  98. package/built/dts/extension/signal/signal-extension.d.ts.map +1 -0
  99. package/built/dts/extension/signal/signal.d.ts +32 -0
  100. package/built/dts/extension/signal/signal.d.ts.map +1 -0
  101. package/built/dts/extension/table/index.d.ts +3 -0
  102. package/built/dts/extension/table/index.d.ts.map +1 -0
  103. package/built/dts/extension/table/packets.d.ts +58 -0
  104. package/built/dts/extension/table/packets.d.ts.map +1 -0
  105. package/built/dts/extension/table/table-extension.d.ts +24 -0
  106. package/built/dts/extension/table/table-extension.d.ts.map +1 -0
  107. package/built/dts/extension/table/table.d.ts +64 -0
  108. package/built/dts/extension/table/table.d.ts.map +1 -0
  109. package/built/dts/identifier.d.ts +43 -0
  110. package/built/dts/identifier.d.ts.map +1 -0
  111. package/built/dts/index.d.ts +5 -0
  112. package/built/dts/index.d.ts.map +1 -0
  113. package/built/dts/interface.d.ts +7 -0
  114. package/built/dts/interface.d.ts.map +1 -0
  115. package/built/dts/localization/index.d.ts +3 -0
  116. package/built/dts/localization/index.d.ts.map +1 -0
  117. package/built/dts/localization/locale.d.ts +736 -0
  118. package/built/dts/localization/locale.d.ts.map +1 -0
  119. package/built/dts/localization/localization.d.ts +8 -0
  120. package/built/dts/localization/localization.d.ts.map +1 -0
  121. package/built/dts/model.d.ts +5 -0
  122. package/built/dts/model.d.ts.map +1 -0
  123. package/built/dts/network/connection.d.ts +17 -0
  124. package/built/dts/network/connection.d.ts.map +1 -0
  125. package/built/dts/network/index.d.ts +4 -0
  126. package/built/dts/network/index.d.ts.map +1 -0
  127. package/built/dts/network/network.d.ts +45 -0
  128. package/built/dts/network/network.d.ts.map +1 -0
  129. package/built/dts/network/packet/index.d.ts +3 -0
  130. package/built/dts/network/packet/index.d.ts.map +1 -0
  131. package/built/dts/network/packet/packet-types.d.ts +52 -0
  132. package/built/dts/network/packet/packet-types.d.ts.map +1 -0
  133. package/built/dts/network/packet/packet.d.ts +24 -0
  134. package/built/dts/network/packet/packet.d.ts.map +1 -0
  135. package/built/dts/network/websocket-connection.d.ts +20 -0
  136. package/built/dts/network/websocket-connection.d.ts.map +1 -0
  137. package/built/dts/omu.d.ts +50 -0
  138. package/built/dts/omu.d.ts.map +1 -0
  139. package/built/dts/serializer.d.ts +21 -0
  140. package/built/dts/serializer.d.ts.map +1 -0
  141. package/built/dts/token.d.ts +14 -0
  142. package/built/dts/token.d.ts.map +1 -0
  143. package/built/esm/address.js +2 -0
  144. package/built/esm/address.js.map +1 -0
  145. package/built/esm/app.js +33 -0
  146. package/built/esm/app.js.map +1 -0
  147. package/built/esm/bytebuffer.js +191 -0
  148. package/built/esm/bytebuffer.js.map +1 -0
  149. package/built/esm/client/client.js +2 -0
  150. package/built/esm/client/client.js.map +1 -0
  151. package/built/esm/client/index.js +2 -0
  152. package/built/esm/client/index.js.map +1 -0
  153. package/built/esm/client/omu.js +96 -0
  154. package/built/esm/client/omu.js.map +1 -0
  155. package/built/esm/client/omuclient.js +96 -0
  156. package/built/esm/client/omuclient.js.map +1 -0
  157. package/built/esm/client/token.js +21 -0
  158. package/built/esm/client/token.js.map +1 -0
  159. package/built/esm/client.js +2 -0
  160. package/built/esm/client.js.map +1 -0
  161. package/built/esm/const.js +3 -0
  162. package/built/esm/const.js.map +1 -0
  163. package/built/esm/errors.js +46 -0
  164. package/built/esm/errors.js.map +1 -0
  165. package/built/esm/event-emitter.js +15 -0
  166. package/built/esm/event-emitter.js.map +1 -0
  167. package/built/esm/extension/asset/asset-extension.js +105 -0
  168. package/built/esm/extension/asset/asset-extension.js.map +1 -0
  169. package/built/esm/extension/asset/index.js +2 -0
  170. package/built/esm/extension/asset/index.js.map +1 -0
  171. package/built/esm/extension/dashboard/dashboard-extension.js +119 -0
  172. package/built/esm/extension/dashboard/dashboard-extension.js.map +1 -0
  173. package/built/esm/extension/dashboard/dashboard.js +2 -0
  174. package/built/esm/extension/dashboard/dashboard.js.map +1 -0
  175. package/built/esm/extension/dashboard/index.js +2 -0
  176. package/built/esm/extension/dashboard/index.js.map +1 -0
  177. package/built/esm/extension/dashboard/packets.js +52 -0
  178. package/built/esm/extension/dashboard/packets.js.map +1 -0
  179. package/built/esm/extension/endpoint/endpoint-extension.js +85 -0
  180. package/built/esm/extension/endpoint/endpoint-extension.js.map +1 -0
  181. package/built/esm/extension/endpoint/endpoint.js +22 -0
  182. package/built/esm/extension/endpoint/endpoint.js.map +1 -0
  183. package/built/esm/extension/endpoint/index.js +2 -0
  184. package/built/esm/extension/endpoint/index.js.map +1 -0
  185. package/built/esm/extension/endpoint/packets.js +77 -0
  186. package/built/esm/extension/endpoint/packets.js.map +1 -0
  187. package/built/esm/extension/extension-registry.js +34 -0
  188. package/built/esm/extension/extension-registry.js.map +1 -0
  189. package/built/esm/extension/extension.js +16 -0
  190. package/built/esm/extension/extension.js.map +1 -0
  191. package/built/esm/extension/i18n/i18n-extension.js +59 -0
  192. package/built/esm/extension/i18n/i18n-extension.js.map +1 -0
  193. package/built/esm/extension/i18n/index.js +2 -0
  194. package/built/esm/extension/i18n/index.js.map +1 -0
  195. package/built/esm/extension/index.js +3 -0
  196. package/built/esm/extension/index.js.map +1 -0
  197. package/built/esm/extension/logger/index.js +2 -0
  198. package/built/esm/extension/logger/index.js.map +1 -0
  199. package/built/esm/extension/logger/logger-extension.js +59 -0
  200. package/built/esm/extension/logger/logger-extension.js.map +1 -0
  201. package/built/esm/extension/logger/packets.js +33 -0
  202. package/built/esm/extension/logger/packets.js.map +1 -0
  203. package/built/esm/extension/permission/index.js +3 -0
  204. package/built/esm/extension/permission/index.js.map +1 -0
  205. package/built/esm/extension/permission/permission-extension.js +73 -0
  206. package/built/esm/extension/permission/permission-extension.js.map +1 -0
  207. package/built/esm/extension/permission/permission.js +28 -0
  208. package/built/esm/extension/permission/permission.js.map +1 -0
  209. package/built/esm/extension/plugin/index.js +2 -0
  210. package/built/esm/extension/plugin/index.js.map +1 -0
  211. package/built/esm/extension/plugin/package-info.js +2 -0
  212. package/built/esm/extension/plugin/package-info.js.map +1 -0
  213. package/built/esm/extension/plugin/plugin-extension.js +27 -0
  214. package/built/esm/extension/plugin/plugin-extension.js.map +1 -0
  215. package/built/esm/extension/registry/index.js +3 -0
  216. package/built/esm/extension/registry/index.js.map +1 -0
  217. package/built/esm/extension/registry/packets.js +48 -0
  218. package/built/esm/extension/registry/packets.js.map +1 -0
  219. package/built/esm/extension/registry/registry-extension.js +123 -0
  220. package/built/esm/extension/registry/registry-extension.js.map +1 -0
  221. package/built/esm/extension/registry/registry.js +55 -0
  222. package/built/esm/extension/registry/registry.js.map +1 -0
  223. package/built/esm/extension/server/index.js +2 -0
  224. package/built/esm/extension/server/index.js.map +1 -0
  225. package/built/esm/extension/server/packets.js +25 -0
  226. package/built/esm/extension/server/packets.js.map +1 -0
  227. package/built/esm/extension/server/server-extension.js +52 -0
  228. package/built/esm/extension/server/server-extension.js.map +1 -0
  229. package/built/esm/extension/signal/index.js +3 -0
  230. package/built/esm/extension/signal/index.js.map +1 -0
  231. package/built/esm/extension/signal/packets.js +44 -0
  232. package/built/esm/extension/signal/packets.js.map +1 -0
  233. package/built/esm/extension/signal/signal-extension.js +91 -0
  234. package/built/esm/extension/signal/signal-extension.js.map +1 -0
  235. package/built/esm/extension/signal/signal.js +53 -0
  236. package/built/esm/extension/signal/signal.js.map +1 -0
  237. package/built/esm/extension/table/index.js +3 -0
  238. package/built/esm/extension/table/index.js.map +1 -0
  239. package/built/esm/extension/table/packets.js +230 -0
  240. package/built/esm/extension/table/packets.js.map +1 -0
  241. package/built/esm/extension/table/table-extension.js +384 -0
  242. package/built/esm/extension/table/table-extension.js.map +1 -0
  243. package/built/esm/extension/table/table.js +17 -0
  244. package/built/esm/extension/table/table.js.map +1 -0
  245. package/built/esm/identifier.js +160 -0
  246. package/built/esm/identifier.js.map +1 -0
  247. package/built/esm/index.js +5 -0
  248. package/built/esm/index.js.map +1 -0
  249. package/built/esm/interface.js +2 -0
  250. package/built/esm/interface.js.map +1 -0
  251. package/built/esm/localization/index.js +2 -0
  252. package/built/esm/localization/index.js.map +1 -0
  253. package/built/esm/localization/locale.js +736 -0
  254. package/built/esm/localization/locale.js.map +1 -0
  255. package/built/esm/localization/localization.js +2 -0
  256. package/built/esm/localization/localization.js.map +1 -0
  257. package/built/esm/model.js +2 -0
  258. package/built/esm/model.js.map +1 -0
  259. package/built/esm/network/connection.js +29 -0
  260. package/built/esm/network/connection.js.map +1 -0
  261. package/built/esm/network/index.js +2 -0
  262. package/built/esm/network/index.js.map +1 -0
  263. package/built/esm/network/network.js +190 -0
  264. package/built/esm/network/network.js.map +1 -0
  265. package/built/esm/network/packet/index.js +2 -0
  266. package/built/esm/network/packet/index.js.map +1 -0
  267. package/built/esm/network/packet/packet-types.js +75 -0
  268. package/built/esm/network/packet/packet-types.js.map +1 -0
  269. package/built/esm/network/packet/packet.js +17 -0
  270. package/built/esm/network/packet/packet.js.map +1 -0
  271. package/built/esm/network/websocket-connection.js +88 -0
  272. package/built/esm/network/websocket-connection.js.map +1 -0
  273. package/built/esm/omu.js +96 -0
  274. package/built/esm/omu.js.map +1 -0
  275. package/built/esm/serializer.js +52 -0
  276. package/built/esm/serializer.js.map +1 -0
  277. package/built/esm/token.js +21 -0
  278. package/built/esm/token.js.map +1 -0
  279. package/package.json +49 -0
  280. package/src/address.ts +5 -0
  281. package/src/app.ts +65 -0
  282. package/src/bytebuffer.ts +219 -0
  283. package/src/client.ts +53 -0
  284. package/src/const.ts +2 -0
  285. package/src/errors.ts +52 -0
  286. package/src/event-emitter.ts +18 -0
  287. package/src/extension/asset/asset-extension.ts +148 -0
  288. package/src/extension/asset/index.ts +1 -0
  289. package/src/extension/dashboard/dashboard-extension.ts +162 -0
  290. package/src/extension/dashboard/dashboard.ts +9 -0
  291. package/src/extension/dashboard/index.ts +3 -0
  292. package/src/extension/dashboard/packets.ts +52 -0
  293. package/src/extension/endpoint/endpoint-extension.ts +124 -0
  294. package/src/extension/endpoint/endpoint.ts +58 -0
  295. package/src/extension/endpoint/index.ts +3 -0
  296. package/src/extension/endpoint/packets.ts +78 -0
  297. package/src/extension/extension-registry.ts +39 -0
  298. package/src/extension/extension.ts +18 -0
  299. package/src/extension/i18n/i18n-extension.ts +73 -0
  300. package/src/extension/i18n/index.ts +2 -0
  301. package/src/extension/index.ts +3 -0
  302. package/src/extension/logger/index.ts +5 -0
  303. package/src/extension/logger/logger-extension.ts +75 -0
  304. package/src/extension/logger/packets.ts +38 -0
  305. package/src/extension/permission/index.ts +3 -0
  306. package/src/extension/permission/permission-extension.ts +98 -0
  307. package/src/extension/permission/permission.ts +56 -0
  308. package/src/extension/plugin/index.ts +2 -0
  309. package/src/extension/plugin/package-info.ts +91 -0
  310. package/src/extension/plugin/plugin-extension.ts +37 -0
  311. package/src/extension/registry/index.ts +3 -0
  312. package/src/extension/registry/packets.ts +50 -0
  313. package/src/extension/registry/registry-extension.ts +154 -0
  314. package/src/extension/registry/registry.ts +97 -0
  315. package/src/extension/server/index.ts +6 -0
  316. package/src/extension/server/server-extension.ts +63 -0
  317. package/src/extension/signal/index.ts +3 -0
  318. package/src/extension/signal/packets.ts +46 -0
  319. package/src/extension/signal/signal-extension.ts +114 -0
  320. package/src/extension/signal/signal.ts +85 -0
  321. package/src/extension/table/index.ts +3 -0
  322. package/src/extension/table/packets.ts +237 -0
  323. package/src/extension/table/table-extension.ts +503 -0
  324. package/src/extension/table/table.ts +87 -0
  325. package/src/identifier.ts +197 -0
  326. package/src/index.ts +4 -0
  327. package/src/interface.ts +8 -0
  328. package/src/localization/index.ts +3 -0
  329. package/src/localization/locale.ts +737 -0
  330. package/src/localization/localization.ts +9 -0
  331. package/src/model.ts +4 -0
  332. package/src/network/connection.ts +43 -0
  333. package/src/network/index.ts +3 -0
  334. package/src/network/network.ts +225 -0
  335. package/src/network/packet/index.ts +2 -0
  336. package/src/network/packet/packet-types.ts +101 -0
  337. package/src/network/packet/packet.ts +46 -0
  338. package/src/network/websocket-connection.ts +102 -0
  339. package/src/omu.ts +123 -0
  340. package/src/serializer.ts +82 -0
  341. package/src/token.ts +29 -0
  342. package/tsconfig.json +12 -0
@@ -0,0 +1,18 @@
1
+ import { type Client } from '../client.js';
2
+ import { Identifier } from '../identifier.js';
3
+
4
+ export interface Extension {}
5
+
6
+ export class ExtensionType<T extends Extension = Extension> extends Identifier {
7
+ constructor(
8
+ public readonly name: string,
9
+ public readonly create: (client: Client) => T,
10
+ public readonly dependencies?: () => ExtensionType[],
11
+ ) {
12
+ super('ext', name);
13
+ }
14
+
15
+ public key(): string {
16
+ return this.name;
17
+ }
18
+ }
@@ -0,0 +1,73 @@
1
+ import type { Client } from '../../client.js';
2
+ import type { Locale } from '../../localization/locale.js';
3
+ import type { LocalizedText } from '../../localization/localization.js';
4
+ import type { Extension } from '../extension.js';
5
+ import { ExtensionType } from '../extension.js';
6
+ import type { Registry } from '../registry/index.js';
7
+ import { RegistryType } from '../registry/index.js';
8
+
9
+ export const I18N_EXTENSION_TYPE = new ExtensionType('i18n', (client) => new I18nExtension(client));
10
+
11
+ export const I18N_SET_LOCALES_PERMISSION_ID = I18N_EXTENSION_TYPE.join('locales', 'set');
12
+ export const I18N_GET_LOCALES_PERMISSION_ID = I18N_EXTENSION_TYPE.join('locales', 'get');
13
+ const I18N_LOCALES_REGISTRY_TYPE = RegistryType.createJson<Locale[]>(I18N_EXTENSION_TYPE, {
14
+ name: 'locales',
15
+ defaultValue: [],
16
+ });
17
+
18
+ export class I18nExtension implements Extension {
19
+ public readonly localesRegistry: Registry<Locale[]>;
20
+ public locales?: Locale[];
21
+
22
+ constructor(private readonly client: Client) {
23
+ client.permissions.require(I18N_GET_LOCALES_PERMISSION_ID);
24
+ this.localesRegistry = client.registry.get(I18N_LOCALES_REGISTRY_TYPE);
25
+ this.localesRegistry.listen((locale) => {
26
+ this.locales = locale;
27
+ });
28
+ }
29
+
30
+ public translate(localizedText: LocalizedText): string {
31
+ if (!this.locales) {
32
+ throw new Error('Locale not set');
33
+ }
34
+ if (typeof localizedText === 'string') {
35
+ return localizedText;
36
+ }
37
+ const translation = this.selectBestTranslation(this.locales, localizedText);
38
+ if (!translation) {
39
+ throw new Error(
40
+ `Missing translation for ${this.locales} in ${JSON.stringify(localizedText)}`,
41
+ );
42
+ }
43
+ return translation;
44
+ }
45
+
46
+ public selectBestTranslation(
47
+ locales: Locale[],
48
+ localizedText: LocalizedText,
49
+ ): string | undefined {
50
+ if (typeof localizedText === 'string') {
51
+ return localizedText;
52
+ }
53
+ const translations = localizedText;
54
+ const transformedLocales = locales.reduce((acc, l) => {
55
+ const parts = l.split('-');
56
+ for (let i = parts.length; i > 0; i--) {
57
+ acc.push(parts.slice(0, i).join('-'));
58
+ }
59
+ return acc;
60
+ }, [] as string[]);
61
+ for (const l of transformedLocales) {
62
+ const translation = translations[l];
63
+ if (translation) {
64
+ return translation;
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+
70
+ public setLocale(locale: Locale[]): Promise<void> {
71
+ return this.localesRegistry.set(locale);
72
+ }
73
+ }
@@ -0,0 +1,2 @@
1
+ export { I18N_EXTENSION_TYPE, I18N_GET_LOCALES_PERMISSION_ID, I18N_SET_LOCALES_PERMISSION_ID, I18nExtension } from './i18n-extension.js';
2
+
@@ -0,0 +1,3 @@
1
+ export { ExtensionRegistry } from './extension-registry.js';
2
+ export { Extension, ExtensionType } from './extension.js';
3
+
@@ -0,0 +1,5 @@
1
+ export {
2
+ LOGGER_EXTENSION_TYPE,
3
+ LOGGER_LOG_PERMISSION_ID,
4
+ LoggerExtension,
5
+ } from './logger-extension.js';
@@ -0,0 +1,75 @@
1
+ import type { Client } from '../../client.js';
2
+ import type { Unlisten } from '../../event-emitter.js';
3
+ import { Identifier, IdentifierMap } from '../../identifier.js';
4
+ import { PacketType } from '../../network/packet/packet.js';
5
+ import { Serializer } from '../../serializer.js';
6
+ import { ExtensionType } from '../extension.js';
7
+
8
+ import type { LogMessage } from './packets.js';
9
+ import { LogPacket, LogType } from './packets.js';
10
+
11
+ export const LOGGER_EXTENSION_TYPE = new ExtensionType(
12
+ 'logger',
13
+ (client) => new LoggerExtension(client),
14
+ );
15
+
16
+ export const LOGGER_LOG_PERMISSION_ID = LOGGER_EXTENSION_TYPE.join('log');
17
+
18
+ export const LOGGER_LOG_PACKET = PacketType.createSerialized<LogPacket>(LOGGER_EXTENSION_TYPE, {
19
+ name: 'log',
20
+ serializer: LogPacket,
21
+ });
22
+ export const LOGGER_LISTEN_PACKET = PacketType.createJson<Identifier>(LOGGER_EXTENSION_TYPE, {
23
+ name: 'listen',
24
+ serializer: Serializer.model(Identifier),
25
+ });
26
+
27
+ type LogListener = (message: LogMessage) => void;
28
+ export class LoggerExtension {
29
+ private readonly listeners: IdentifierMap<LogListener[]> = new IdentifierMap();
30
+
31
+ constructor(private readonly client: Client) {
32
+ client.network.registerPacket(LOGGER_LOG_PACKET, LOGGER_LISTEN_PACKET);
33
+ client.network.addPacketHandler(LOGGER_LOG_PACKET, (packet) => {
34
+ const listener = this.listeners.get(packet.id);
35
+ if (listener) {
36
+ listener.forEach((it) => it(packet.message));
37
+ }
38
+ });
39
+ }
40
+
41
+ public log(message: LogMessage): void {
42
+ const packet = new LogPacket(this.client.app.id, message);
43
+ this.client.send(LOGGER_LOG_PACKET, packet);
44
+ }
45
+
46
+ public error(text: string): void {
47
+ this.log({ type: LogType.ERROR, text });
48
+ }
49
+
50
+ public warning(text: string): void {
51
+ this.log({ type: LogType.WARNING, text });
52
+ }
53
+
54
+ public info(text: string): void {
55
+ this.log({ type: LogType.INFO, text });
56
+ }
57
+
58
+ public debug(text: string): void {
59
+ this.log({ type: LogType.DEBUG, text });
60
+ }
61
+
62
+ public listen(id: Identifier, listener: LogListener): Unlisten {
63
+ if (!this.listeners.has(id)) {
64
+ this.client.whenReady(() => {
65
+ this.client.send(LOGGER_LISTEN_PACKET, id);
66
+ });
67
+ }
68
+ const list = this.listeners.get(id) ?? [];
69
+ list.push(listener);
70
+ this.listeners.set(id, list);
71
+ return () => {
72
+ list.splice(list.indexOf(listener), 1);
73
+ };
74
+ }
75
+ }
@@ -0,0 +1,38 @@
1
+ import { ByteReader, ByteWriter } from '../../bytebuffer.js';
2
+ import { Identifier } from '../../identifier.js';
3
+
4
+ export enum LogType {
5
+ ERROR = 'error',
6
+ WARNING = 'warning',
7
+ INFO = 'info',
8
+ DEBUG = 'debug',
9
+ }
10
+
11
+ export type LogMessage = {
12
+ type: LogType;
13
+ text: string;
14
+ };
15
+
16
+ export class LogPacket {
17
+ constructor(
18
+ public readonly id: Identifier,
19
+ public readonly message: LogMessage,
20
+ ) {}
21
+
22
+ public static serialize(item: LogPacket): Uint8Array {
23
+ const writer = new ByteWriter();
24
+ writer.writeString(item.id.key());
25
+ writer.writeString(item.message.type);
26
+ writer.writeString(item.message.text);
27
+ return writer.finish();
28
+ }
29
+
30
+ public static deserialize(item: Uint8Array): LogPacket {
31
+ const reader = new ByteReader(item);
32
+ const id = reader.readString();
33
+ const type = reader.readString() as LogType;
34
+ const text = reader.readString();
35
+ const message = { type, text };
36
+ return new LogPacket(Identifier.fromKey(id), message);
37
+ }
38
+ }
@@ -0,0 +1,3 @@
1
+ export { PERMISSION_EXTENSION_TYPE, PermissionExtension } from './permission-extension.js';
2
+ export { PermissionType } from './permission.js';
3
+
@@ -0,0 +1,98 @@
1
+ import type { Client } from '../../client.js';
2
+ import { Identifier, IdentifierMap, IdentifierSet } from '../../identifier.js';
3
+ import { PacketType } from '../../network/packet/packet.js';
4
+ import { Serializer } from '../../serializer.js';
5
+ import { EndpointType } from '../endpoint/endpoint.js';
6
+ import { ExtensionType } from '../extension.js';
7
+
8
+ import { PermissionType } from './permission.js';
9
+
10
+ export const PERMISSION_EXTENSION_TYPE = new ExtensionType(
11
+ 'permission',
12
+ (client) => new PermissionExtension(client),
13
+ );
14
+ const PERMISSION_REGISTER_PACKET = PacketType.createJson<PermissionType[]>(
15
+ PERMISSION_EXTENSION_TYPE,
16
+ {
17
+ name: 'register',
18
+ serializer: Serializer.model(PermissionType).toArray(),
19
+ },
20
+ );
21
+ const PERMISSION_REQUIRE_PACKET = PacketType.createJson<Identifier[]>(PERMISSION_EXTENSION_TYPE, {
22
+ name: 'require',
23
+ serializer: Serializer.model(Identifier).toArray(),
24
+ });
25
+ const PERMISSION_REQUEST_ENDPOINT = EndpointType.createJson<Identifier[], void>(
26
+ PERMISSION_EXTENSION_TYPE,
27
+ {
28
+ name: 'request',
29
+ requestSerializer: Serializer.model(Identifier).toArray(),
30
+ },
31
+ );
32
+ const PERMISSION_GRANT_PACKET = PacketType.createJson<PermissionType[]>(PERMISSION_EXTENSION_TYPE, {
33
+ name: 'grant',
34
+ serializer: Serializer.model(PermissionType).toArray(),
35
+ });
36
+
37
+ export class PermissionExtension {
38
+ private permissions = new IdentifierMap<PermissionType>();
39
+ private readonly registeredPermissions = new IdentifierMap<PermissionType>();
40
+ private readonly requiredPermissions = new IdentifierSet();
41
+
42
+ constructor(private readonly client: Client) {
43
+ client.network.registerPacket(
44
+ PERMISSION_REGISTER_PACKET,
45
+ PERMISSION_REQUIRE_PACKET,
46
+ PERMISSION_GRANT_PACKET,
47
+ );
48
+ client.network.addPacketHandler(PERMISSION_GRANT_PACKET, (permissions) => {
49
+ for (const permission of permissions) {
50
+ this.permissions.set(permission.id, permission);
51
+ }
52
+ });
53
+ client.network.addTask(() => this.onTask());
54
+ }
55
+
56
+ private onTask(): void {
57
+ if (this.registeredPermissions.size > 0) {
58
+ this.client.send(
59
+ PERMISSION_REGISTER_PACKET,
60
+ Array.from(this.registeredPermissions.values()),
61
+ );
62
+ }
63
+ if (this.requiredPermissions.size > 0) {
64
+ this.client.send(
65
+ PERMISSION_REQUIRE_PACKET,
66
+ Array.from(this.requiredPermissions.values()),
67
+ );
68
+ }
69
+ }
70
+
71
+ public register(permission: PermissionType): void {
72
+ if (this.client.running) {
73
+ this.client.send(PERMISSION_REGISTER_PACKET, [permission]);
74
+ }
75
+ this.registeredPermissions.set(permission.id, permission);
76
+ }
77
+
78
+ public require(...permissionIds: (Identifier | string)[]): void {
79
+ if (this.client.running) {
80
+ throw new Error('Permissions must be required before the client starts');
81
+ }
82
+ for (const permissionId of permissionIds) {
83
+ if (typeof permissionId === 'string') {
84
+ this.requiredPermissions.add(Identifier.fromKey(permissionId));
85
+ } else {
86
+ this.requiredPermissions.add(permissionId);
87
+ }
88
+ }
89
+ }
90
+
91
+ public async request(...permissionIds: Identifier[]): Promise<void> {
92
+ await this.client.endpoints.call(PERMISSION_REQUEST_ENDPOINT, permissionIds);
93
+ }
94
+
95
+ public has(permissionIdentifier: Identifier): boolean {
96
+ return this.permissions.has(permissionIdentifier);
97
+ }
98
+ }
@@ -0,0 +1,56 @@
1
+ import { Identifier } from '../../identifier.js';
2
+ import type { LocalizedText } from '../../localization/localization.js';
3
+ import type { Model } from '../../model.js';
4
+
5
+ type PermissionLevel = 'low' | 'medium' | 'high';
6
+
7
+ export type PermissionMetadata = {
8
+ name: LocalizedText,
9
+ note: LocalizedText,
10
+ level: PermissionLevel,
11
+ }
12
+
13
+ export type PermissionTypeJson = {
14
+ id: string;
15
+ metadata: PermissionMetadata;
16
+ }
17
+
18
+ export class PermissionType implements Model<PermissionTypeJson> {
19
+ public readonly id: Identifier;
20
+ public readonly metadata: PermissionMetadata;
21
+
22
+ constructor(options: {
23
+ id: Identifier,
24
+ metadata: PermissionMetadata,
25
+ }) {
26
+ this.id = options.id;
27
+ this.metadata = options.metadata;
28
+ }
29
+
30
+ public static create(identifier: Identifier, {
31
+ name,
32
+ metadata,
33
+ }: {
34
+ name: string,
35
+ metadata: PermissionMetadata,
36
+ }): PermissionType {
37
+ return new PermissionType({
38
+ id: identifier.join(name),
39
+ metadata: metadata,
40
+ });
41
+ }
42
+
43
+ public toJson(): PermissionTypeJson {
44
+ return {
45
+ id: this.id.key(),
46
+ metadata: this.metadata,
47
+ };
48
+ }
49
+
50
+ public static fromJson(json: PermissionTypeJson): PermissionType {
51
+ return new PermissionType({
52
+ id: Identifier.fromKey(json.id),
53
+ metadata: json.metadata,
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,2 @@
1
+ export { PLUGIN_EXTENSION_TYPE, PluginExtension } from './plugin-extension.js';
2
+
@@ -0,0 +1,91 @@
1
+ // type generated from https://warehouse.pypa.io/api-reference/json.html
2
+ export type Downloads = {
3
+ last_day: number;
4
+ last_month: number;
5
+ last_week: number;
6
+ };
7
+
8
+ export type ProjectUrls = {
9
+ 'Bug Reports': string;
10
+ 'Funding': string;
11
+ 'Homepage': string;
12
+ 'Say Thanks!': string;
13
+ 'Source': string;
14
+ };
15
+ export type Info = {
16
+ author: string;
17
+ author_email: string;
18
+ bugtrack_url: string | null;
19
+ classifiers: string[];
20
+ description: string;
21
+ description_content_type: 'text/markdown';
22
+ docs_url: string | null;
23
+ download_url: string;
24
+ downloads: Downloads;
25
+ home_page: string;
26
+ keywords: string;
27
+ license: string;
28
+ maintainer: string;
29
+ maintainer_email: string;
30
+ name: string;
31
+ package_url: string;
32
+ platform: unknown;
33
+ project_url: string;
34
+ project_urls: ProjectUrls;
35
+ release_url: string;
36
+ requires_dist: string[];
37
+ requires_python: string;
38
+ summary: string;
39
+ version: string;
40
+ yanked: boolean;
41
+ yanked_reason: string | null;
42
+ };
43
+ export type Digests = {
44
+ blake2b_256: string;
45
+ md5: string;
46
+ sha256: string;
47
+ };
48
+
49
+ export type ReleasesItem = {
50
+ comment_text: string;
51
+ digests: Digests;
52
+ downloads: string;
53
+ filename: string;
54
+ has_sig: boolean;
55
+ md5_digest: string;
56
+ packagetype: string;
57
+ python_version: string;
58
+ requires_python: string | null;
59
+ size: number;
60
+ upload_time: string;
61
+ upload_time_iso_8601: string;
62
+ url: string;
63
+ yanked: boolean;
64
+ yanked_reason: string | null;
65
+ };
66
+
67
+ export type Releases = {
68
+ [key: string]: ReleasesItem[];
69
+ };
70
+ export type Urls = ReleasesItem[];
71
+
72
+ export type VulnerabilitiesItem = {
73
+ aliases: string[];
74
+ details: string;
75
+ summary: string;
76
+ fixed_in: string[];
77
+ id: string;
78
+ link: string;
79
+ source: string;
80
+ withdrawn: string | null;
81
+ };
82
+
83
+ export type Vulnerabilities = VulnerabilitiesItem[];
84
+
85
+ export type PackageInfo = {
86
+ info: Info;
87
+ last_serial: number;
88
+ releases: Releases;
89
+ urls: Urls;
90
+ vulnerabilities: Vulnerabilities;
91
+ };
@@ -0,0 +1,37 @@
1
+ import type { Client } from '../../client.js';
2
+ import { PacketType } from '../../network/packet/packet.js';
3
+ import { ExtensionType } from '../extension.js';
4
+
5
+ export const PLUGIN_EXTENSION_TYPE = new ExtensionType(
6
+ 'plugin',
7
+ (client: Client) => new PluginExtension(client),
8
+ );
9
+
10
+ export class PluginExtension {
11
+ private readonly requiredPlugins: Map<string, string | null> = new Map();
12
+
13
+ constructor(private readonly client: Client) {
14
+ client.network.registerPacket(PLUGIN_REQUIRE_PACKET);
15
+ client.network.addTask(() => this.onTask());
16
+ }
17
+
18
+ private async onTask(): Promise<void> {
19
+ this.client.send(PLUGIN_REQUIRE_PACKET, Object.fromEntries(this.requiredPlugins));
20
+ }
21
+
22
+ public require(plugins: Record<string, string | null>): void {
23
+ if (this.client.running) {
24
+ throw new Error('Plugins must be required before the client starts');
25
+ }
26
+ for (const [key, value] of Object.entries(plugins)) {
27
+ this.requiredPlugins.set(key, value);
28
+ }
29
+ }
30
+ }
31
+
32
+ const PLUGIN_REQUIRE_PACKET = PacketType.createJson<Record<string, string | null>>(
33
+ PLUGIN_EXTENSION_TYPE,
34
+ {
35
+ name: 'require',
36
+ },
37
+ );
@@ -0,0 +1,3 @@
1
+ export { REGISTRY_EXTENSION_TYPE, RegistryExtension } from './registry-extension.js';
2
+ export { Registry, RegistryType } from './registry.js';
3
+
@@ -0,0 +1,50 @@
1
+ import { ByteReader, ByteWriter } from '../../bytebuffer.js';
2
+ import { Identifier } from '../../identifier.js';
3
+
4
+ import { RegistryPermissions } from './registry.js';
5
+
6
+ export class RegistryPacket {
7
+ constructor(
8
+ public readonly id: Identifier,
9
+ public readonly value: Uint8Array | null,
10
+ ) { }
11
+
12
+ public static serialize(packet: RegistryPacket): Uint8Array {
13
+ const writer = new ByteWriter();
14
+ writer.writeString(packet.id.key());
15
+ writer.writeBoolean(packet.value !== null);
16
+ if (packet.value !== null) {
17
+ writer.writeByteArray(packet.value);
18
+ }
19
+ return writer.finish();
20
+ }
21
+
22
+ public static deserialize(data: Uint8Array): RegistryPacket {
23
+ const reader = new ByteReader(data);
24
+ const id = Identifier.fromKey(reader.readString());
25
+ const existing = reader.readBoolean();
26
+ const value = existing ? reader.readByteArray() : null;
27
+ return new RegistryPacket(id, value);
28
+ }
29
+ }
30
+
31
+ export class RegistryRegisterPacket {
32
+ constructor(
33
+ public readonly id: Identifier,
34
+ public readonly permissions: RegistryPermissions,
35
+ ) { }
36
+
37
+ public static serialize(packet: RegistryRegisterPacket): Uint8Array {
38
+ const writer = new ByteWriter();
39
+ writer.writeString(packet.id.key());
40
+ packet.permissions.serialize(writer);
41
+ return writer.finish();
42
+ }
43
+
44
+ public static deserialize(data: Uint8Array): RegistryRegisterPacket {
45
+ const reader = new ByteReader(data);
46
+ const id = Identifier.fromKey(reader.readString());
47
+ const permissions = RegistryPermissions.deserialize(reader);
48
+ return new RegistryRegisterPacket(id, permissions);
49
+ }
50
+ }