@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,503 @@
1
+ import type { Client } from '../../client.js';
2
+ import type { Unlisten } from '../../event-emitter.js';
3
+ import { EventEmitter } from '../../event-emitter.js';
4
+ import { Identifier, IdentifierMap } from '../../identifier.js';
5
+ import type { Keyable } from '../../interface.js';
6
+ import type { Model } from '../../model.js';
7
+ import { PacketType } from '../../network/packet/packet.js';
8
+ import type { Serializable } from '../../serializer.js';
9
+ import { Serializer } from '../../serializer.js';
10
+ import { EndpointType } from '../endpoint/endpoint.js';
11
+ import type { Extension } from '../extension.js';
12
+ import { ExtensionType } from '../extension.js';
13
+
14
+ import {
15
+ SetConfigPacket,
16
+ SetPermissionPacket,
17
+ TableFetchPacket,
18
+ TableItemsPacket,
19
+ TableKeysPacket,
20
+ TablePacket,
21
+ TableProxyPacket,
22
+ } from './packets.js';
23
+ import type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';
24
+ import { TableType } from './table.js';
25
+
26
+ export const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(
27
+ 'table',
28
+ (client) => new TableExtension(client),
29
+ );
30
+ const TABLE_PERMISSION_ID = TABLE_EXTENSION_TYPE.join('permission');
31
+
32
+ const TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(
33
+ TABLE_EXTENSION_TYPE,
34
+ {
35
+ name: 'set_permission',
36
+ serializer: SetPermissionPacket,
37
+ },
38
+ );
39
+ const TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {
40
+ name: 'set_config',
41
+ serializer: SetConfigPacket,
42
+ });
43
+ const TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {
44
+ name: 'listen',
45
+ serializer: Serializer.model(Identifier),
46
+ });
47
+ const TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {
48
+ name: 'proxy_listen',
49
+ serializer: Serializer.model(Identifier),
50
+ });
51
+ const TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {
52
+ name: 'proxy',
53
+ serializer: TableProxyPacket,
54
+ });
55
+ const TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {
56
+ name: 'item_add',
57
+ serializer: TableItemsPacket,
58
+ });
59
+ const TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(
60
+ TABLE_EXTENSION_TYPE,
61
+ {
62
+ name: 'item_update',
63
+ serializer: TableItemsPacket,
64
+ },
65
+ );
66
+ const TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(
67
+ TABLE_EXTENSION_TYPE,
68
+ {
69
+ name: 'item_remove',
70
+ serializer: TableItemsPacket,
71
+ },
72
+ );
73
+ const TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(
74
+ TABLE_EXTENSION_TYPE,
75
+ {
76
+ name: 'item_get',
77
+ requestSerializer: TableKeysPacket,
78
+ responseSerializer: TableItemsPacket,
79
+ permissionId: TABLE_PERMISSION_ID,
80
+ },
81
+ );
82
+ const TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(
83
+ TABLE_EXTENSION_TYPE,
84
+ {
85
+ name: 'fetch',
86
+ requestSerializer: TableFetchPacket,
87
+ responseSerializer: TableItemsPacket,
88
+ permissionId: TABLE_PERMISSION_ID,
89
+ },
90
+ );
91
+ const TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(
92
+ TABLE_EXTENSION_TYPE,
93
+ {
94
+ name: 'fetch_all',
95
+ requestSerializer: TablePacket,
96
+ responseSerializer: TableItemsPacket,
97
+ permissionId: TABLE_PERMISSION_ID,
98
+ },
99
+ );
100
+ const TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(
101
+ TABLE_EXTENSION_TYPE,
102
+ {
103
+ name: 'size',
104
+ requestSerializer: TablePacket,
105
+ responseSerializer: Serializer.json(),
106
+ permissionId: TABLE_PERMISSION_ID,
107
+ },
108
+ );
109
+ const TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {
110
+ name: 'clear',
111
+ serializer: TablePacket,
112
+ });
113
+
114
+ export class TableExtension implements Extension {
115
+ private readonly tableMap = new IdentifierMap<Table<unknown>>();
116
+
117
+ constructor(private readonly client: Client) {
118
+ client.network.registerPacket(
119
+ TABLE_SET_PERMISSION_PACKET,
120
+ TABLE_SET_CONFIG_PACKET,
121
+ TABLE_LISTEN_PACKET,
122
+ TABLE_PROXY_LISTEN_PACKET,
123
+ TABLE_PROXY_PACKET,
124
+ TABLE_ITEM_ADD_PACKET,
125
+ TABLE_ITEM_UPDATE_PACKET,
126
+ TABLE_ITEM_REMOVE_PACKET,
127
+ TABLE_ITEM_CLEAR_PACKET,
128
+ );
129
+ }
130
+
131
+ public create<T>(tableType: TableType<T>): Table<T> {
132
+ this.client.permissions.require(TABLE_PERMISSION_ID);
133
+ if (this.has(tableType.id)) {
134
+ throw new Error('Table already exists');
135
+ }
136
+ const table = new TableImpl<T>(this.client, tableType);
137
+ this.tableMap.set(tableType.id, table as Table<unknown>);
138
+ return table;
139
+ }
140
+
141
+ public get<T extends Keyable>(type: TableType<T>): Table<T> {
142
+ if (this.has(type.id)) {
143
+ return this.tableMap.get(type.id) as Table<T>;
144
+ }
145
+ return this.create(type);
146
+ }
147
+
148
+ public model<T extends Keyable & Model<D>, D = unknown>(
149
+ identifier: Identifier,
150
+ {
151
+ name,
152
+ model,
153
+ }: {
154
+ name: string;
155
+ model: { fromJson(data: D): T };
156
+ },
157
+ ): Table<T> {
158
+ const tableType = TableType.createModel(identifier, { name, model });
159
+ if (this.has(tableType.id)) {
160
+ throw new Error('Table already exists');
161
+ }
162
+ return this.create(tableType);
163
+ }
164
+
165
+ public has(identifier: Identifier): boolean {
166
+ return this.tableMap.has(identifier);
167
+ }
168
+ }
169
+
170
+ class TableImpl<T> implements Table<T> {
171
+ public cache: Map<string, T>;
172
+ public readonly event: TableEvents<T>;
173
+ private readonly promiseMap: Map<string, Promise<T | undefined>>;
174
+ private readonly proxies: Array<(item: T) => T | undefined>;
175
+ private id: Identifier;
176
+ private serializer: Serializable<T, Uint8Array>;
177
+ private keyFunction: (item: T) => string;
178
+ private listening: boolean;
179
+ private cacheSize?: number;
180
+ private config?: TableConfig;
181
+ private permissions?: TablePermissions;
182
+
183
+ constructor(
184
+ private readonly client: Client,
185
+ tableType: TableType<T>,
186
+ ) {
187
+ this.id = tableType.id;
188
+ this.serializer = tableType.serializer;
189
+ this.keyFunction = tableType.keyFunction;
190
+ this.cache = new Map();
191
+ this.event = {
192
+ add: new EventEmitter<(items: Map<string, T>) => void>(),
193
+ update: new EventEmitter<(items: Map<string, T>) => void>(),
194
+ remove: new EventEmitter<(items: Map<string, T>) => void>(),
195
+ clear: new EventEmitter<() => void>(),
196
+ cacheUpdate: new EventEmitter<(items: Map<string, T>) => void>(),
197
+ };
198
+ this.promiseMap = new Map();
199
+ this.proxies = [];
200
+ this.listening = false;
201
+
202
+ client.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {
203
+ if (!packet.id.isEqual(this.id)) {
204
+ return;
205
+ }
206
+ let items = this.deserializeItems(packet.items);
207
+ this.proxies.forEach((proxy) => {
208
+ items = new Map(
209
+ [...items.entries()]
210
+ .map(([key, item]) => {
211
+ const proxyItem = proxy(item);
212
+ if (proxyItem !== undefined) {
213
+ return [key, proxyItem as T];
214
+ }
215
+ return undefined;
216
+ })
217
+ .filter((item): item is [string, T] => {
218
+ return typeof item !== 'undefined';
219
+ }),
220
+ );
221
+ });
222
+ client.send(TABLE_PROXY_PACKET, {
223
+ id: this.id,
224
+ key: packet.key,
225
+ items: Object.fromEntries(
226
+ [...items.entries()].map(([key, item]) => {
227
+ return [key, this.serializer.serialize(item)];
228
+ }),
229
+ ),
230
+ });
231
+ });
232
+ client.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {
233
+ if (!packet.id.isEqual(this.id)) {
234
+ return;
235
+ }
236
+ const items = this.deserializeItems(packet.items);
237
+ this.updateCache(items);
238
+ this.event.add.emit(items);
239
+ });
240
+ client.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {
241
+ if (!packet.id.isEqual(this.id)) {
242
+ return;
243
+ }
244
+ const items = this.deserializeItems(packet.items);
245
+ this.updateCache(items);
246
+ this.event.update.emit(items);
247
+ });
248
+ client.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {
249
+ if (!packet.id.isEqual(this.id)) {
250
+ return;
251
+ }
252
+ const items = this.deserializeItems(packet.items);
253
+ items.forEach((_, key) => {
254
+ this.cache.delete(key);
255
+ });
256
+ this.event.remove.emit(items);
257
+ this.event.cacheUpdate.emit(this.cache);
258
+ });
259
+ client.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {
260
+ if (!packet.id.isEqual(this.id)) {
261
+ return;
262
+ }
263
+ this.cache = new Map();
264
+ this.event.clear.emit();
265
+ this.event.cacheUpdate.emit(this.cache);
266
+ });
267
+ client.event.ready.listen(() => this.onReady());
268
+ }
269
+ private updateCache(items: Map<string, T>): void {
270
+ if (!this.cacheSize) {
271
+ this.cache = items;
272
+ } else {
273
+ const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));
274
+ this.cache = cache;
275
+ }
276
+ this.event.cacheUpdate.emit(this.cache);
277
+ }
278
+
279
+ public listen(listener?: (items: Map<string, T>) => void): Unlisten {
280
+ if (!this.listening) {
281
+ this.client.whenReady(() => {
282
+ this.client.send(TABLE_LISTEN_PACKET, this.id);
283
+ });
284
+ this.listening = true;
285
+ }
286
+ if (listener) {
287
+ return this.event.cacheUpdate.listen(listener);
288
+ }
289
+ return () => {};
290
+ }
291
+
292
+ public proxy(callback: (item: T) => T | undefined): Unlisten {
293
+ if (this.proxies.length === 0) {
294
+ let cancel = (): void => {};
295
+ cancel = this.client.whenReady(() => {
296
+ if (this.proxies.length === 0) {
297
+ cancel();
298
+ return;
299
+ }
300
+ this.client.send(TABLE_PROXY_LISTEN_PACKET, this.id);
301
+ });
302
+ }
303
+ this.proxies.push(callback);
304
+ return () => {
305
+ this.proxies.splice(this.proxies.indexOf(callback), 1);
306
+ };
307
+ }
308
+
309
+ private onReady(): void {
310
+ if (this.config) {
311
+ this.client.send(TABLE_SET_CONFIG_PACKET, {
312
+ id: this.id,
313
+ config: this.config,
314
+ });
315
+ }
316
+ }
317
+
318
+ public async get(key: string): Promise<T | undefined> {
319
+ if (this.cache.has(key)) {
320
+ return this.cache.get(key);
321
+ }
322
+ if (this.promiseMap.has(key)) {
323
+ return await this.promiseMap.get(key);
324
+ }
325
+ const promise = this.client.endpoints
326
+ .call(TABLE_ITEM_GET_ENDPOINT, {
327
+ id: this.id,
328
+ keys: [key],
329
+ })
330
+ .then((res) => {
331
+ const items = this.deserializeItems(res.items);
332
+ this.updateCache(items);
333
+ return this.cache.get(key);
334
+ });
335
+ this.promiseMap.set(key, promise);
336
+ return await promise.then((item) => {
337
+ this.promiseMap.delete(key);
338
+ return item;
339
+ });
340
+ }
341
+
342
+ public async getMany(...keys: string[]): Promise<Map<string, T>> {
343
+ const filteredKeys = keys
344
+ .filter((key) => !this.cache.has(key))
345
+ .filter((key) => !this.promiseMap.has(key));
346
+ if (filteredKeys.length === 0) {
347
+ return new Map([...this.cache].filter(([key]) => keys.includes(key)));
348
+ }
349
+ const promise = this.client.endpoints
350
+ .call(TABLE_ITEM_GET_ENDPOINT, {
351
+ id: this.id,
352
+ keys: filteredKeys,
353
+ })
354
+ .then((res) => {
355
+ const items = this.deserializeItems(res.items);
356
+ this.updateCache(items);
357
+ return items;
358
+ });
359
+ for (const key of filteredKeys) {
360
+ this.promiseMap.set(
361
+ key,
362
+ promise.then((items) => items.get(key)),
363
+ );
364
+ }
365
+ const items = await promise;
366
+ for (const key of filteredKeys) {
367
+ this.promiseMap.delete(key);
368
+ }
369
+ return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));
370
+ }
371
+
372
+ public async add(...items: T[]): Promise<void> {
373
+ const data = this.serializeItems(items);
374
+ this.client.send(TABLE_ITEM_ADD_PACKET, {
375
+ id: this.id,
376
+ items: data,
377
+ });
378
+ }
379
+
380
+ public async update(...items: T[]): Promise<void> {
381
+ const data = this.serializeItems(items);
382
+ this.client.send(TABLE_ITEM_UPDATE_PACKET, {
383
+ id: this.id,
384
+ items: data,
385
+ });
386
+ }
387
+
388
+ public async remove(...items: T[]): Promise<void> {
389
+ const data = this.serializeItems(items);
390
+ const keys = Object.keys(data);
391
+ this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));
392
+ this.client.send(TABLE_ITEM_REMOVE_PACKET, {
393
+ id: this.id,
394
+ items: data,
395
+ });
396
+ }
397
+
398
+ public async clear(): Promise<void> {
399
+ this.client.send(TABLE_ITEM_CLEAR_PACKET, {
400
+ id: this.id,
401
+ });
402
+ }
403
+
404
+ public async fetchItems({
405
+ before,
406
+ after,
407
+ cursor,
408
+ }: {
409
+ before: number;
410
+ after: number;
411
+ cursor?: string;
412
+ }): Promise<Map<string, T>> {
413
+ const res = await this.client.endpoints.call(
414
+ TABLE_FETCH_ENDPOINT,
415
+ new TableFetchPacket(this.id, before, after, cursor ?? null),
416
+ );
417
+ const items = this.deserializeItems(res.items);
418
+ this.updateCache(items);
419
+ return items;
420
+ }
421
+
422
+ public async fetchAll(): Promise<Map<string, T>> {
423
+ const res = await this.client.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {
424
+ id: this.id,
425
+ });
426
+ const items = this.deserializeItems(res.items);
427
+ this.updateCache(items);
428
+ return items;
429
+ }
430
+
431
+ public async *iterate({
432
+ backward,
433
+ cursor,
434
+ }: {
435
+ backward?: boolean;
436
+ cursor?: string;
437
+ }): AsyncIterable<T> {
438
+ let items: Map<string, T> = await this.fetchItems(
439
+ backward
440
+ ? {
441
+ before: 0,
442
+ after: this.cacheSize ?? 100,
443
+ cursor,
444
+ }
445
+ : {
446
+ before: this.cacheSize ?? 100,
447
+ after: 0,
448
+ cursor,
449
+ },
450
+ );
451
+ yield* items.values();
452
+ while (items.size > 0) {
453
+ const cursor = this.keyFunction(
454
+ backward ? items.values().next().value : [...items.values()].pop(),
455
+ );
456
+ items = await this.fetchItems(
457
+ backward
458
+ ? { before: 0, after: this.cacheSize ?? 100, cursor }
459
+ : { before: this.cacheSize ?? 100, after: 0, cursor },
460
+ );
461
+ yield* items.values();
462
+ }
463
+ }
464
+
465
+ public async size(): Promise<number> {
466
+ return await this.client.endpoints.call(TABLE_SIZE_ENDPOINT, {
467
+ id: this.id,
468
+ });
469
+ }
470
+
471
+ private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {
472
+ return new Map(
473
+ Object.entries(items).map(([key, data]) => {
474
+ const item = this.serializer.deserialize(data);
475
+ this.cache.set(key, item);
476
+ return [key, item];
477
+ }),
478
+ );
479
+ }
480
+
481
+ private serializeItems(items: T[]): Record<string, Uint8Array> {
482
+ return Object.fromEntries(
483
+ items.map((item) => {
484
+ return [this.keyFunction(item), this.serializer.serialize(item)];
485
+ }),
486
+ );
487
+ }
488
+
489
+ public setCacheSize(size: number): void {
490
+ this.cacheSize = size;
491
+ }
492
+
493
+ public setConfig(config: TableConfig): void {
494
+ if (this.client.running) {
495
+ throw new Error('Cannot set config after client has started');
496
+ }
497
+ this.config = config;
498
+ }
499
+
500
+ public setPermissions(permissions: TablePermissions): void {
501
+ this.permissions = permissions;
502
+ }
503
+ }
@@ -0,0 +1,87 @@
1
+ import type { EventEmitter, Unlisten } from '../../event-emitter.js';
2
+ import type { Identifier } from '../../identifier.js';
3
+ import type { Keyable } from '../../interface.js';
4
+ import type { Model } from '../../model.js';
5
+ import type { Serializable } from '../../serializer.js';
6
+ import { Serializer } from '../../serializer.js';
7
+ import type { ExtensionType } from '../extension.js';
8
+
9
+ export type TableConfig = {
10
+ cache_size: number;
11
+ };
12
+
13
+ export interface Table<T> {
14
+ readonly cache: ReadonlyMap<string, T>;
15
+ readonly event: TableEvents<T>;
16
+ get(key: string): Promise<T | undefined>;
17
+ getMany(...keys: string[]): Promise<Map<string, T>>;
18
+ add(...item: T[]): Promise<void>;
19
+ update(...item: T[]): Promise<void>;
20
+ remove(...items: T[]): Promise<void>;
21
+ clear(): Promise<void>;
22
+
23
+ fetchItems({
24
+ before,
25
+ after,
26
+ cursor,
27
+ }: {
28
+ before?: number;
29
+ after?: number;
30
+ cursor?: string;
31
+ }): Promise<Map<string, T>>;
32
+ fetchAll(): Promise<Map<string, T>>;
33
+ iterate({ backward, cursor }: { backward?: boolean; cursor?: string }): AsyncIterable<T>;
34
+ size(): Promise<number>;
35
+
36
+ proxy(proxy: (item: T) => T | undefined): Unlisten;
37
+ setCacheSize(size: number): void;
38
+ setConfig(config: TableConfig): void;
39
+ setPermissions(permissions: TablePermissions): void;
40
+
41
+ listen(listener?: (items: Map<string, T>) => void): Unlisten;
42
+ }
43
+
44
+ export type TableEvents<T> = {
45
+ add: EventEmitter<(items: Map<string, T>) => void>;
46
+ update: EventEmitter<(items: Map<string, T>) => void>;
47
+ remove: EventEmitter<(items: Map<string, T>) => void>;
48
+ clear: EventEmitter<() => void>;
49
+ cacheUpdate: EventEmitter<(items: Map<string, T>) => void>;
50
+ }
51
+
52
+ export type TablePermissions = {
53
+ all?: Identifier;
54
+ read?: Identifier;
55
+ write?: Identifier;
56
+ remove?: Identifier;
57
+ proxy?: Identifier;
58
+ };
59
+
60
+ export class TableType<T> {
61
+ constructor(
62
+ public id: Identifier,
63
+ public serializer: Serializable<T, Uint8Array>,
64
+ public keyFunction: (item: T) => string,
65
+ public permissions?: TablePermissions,
66
+ ) { }
67
+
68
+ public static createModel<T extends Keyable & Model<D>, D = unknown>(
69
+ identifier: Identifier | ExtensionType,
70
+ {
71
+ name,
72
+ model,
73
+ permissions,
74
+ }: {
75
+ name: string;
76
+ model: { fromJson(data: D): T };
77
+ permissions?: TablePermissions;
78
+ },
79
+ ): TableType<T> {
80
+ return new TableType<T>(
81
+ identifier.join(name),
82
+ Serializer.model(model).pipe(Serializer.json()),
83
+ (item) => item.key(),
84
+ permissions,
85
+ );
86
+ }
87
+ }