@omujs/omu 0.9.49 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/dist/address.js +1 -0
  2. package/dist/address.js.map +7 -0
  3. package/dist/api/asset/extension.js +2 -0
  4. package/dist/api/asset/extension.js.map +7 -0
  5. package/dist/api/asset/index.js +2 -0
  6. package/dist/api/asset/index.js.map +7 -0
  7. package/dist/{dts/api → api}/dashboard/extension.d.ts +9 -5
  8. package/dist/api/dashboard/extension.js +2 -0
  9. package/dist/api/dashboard/extension.js.map +7 -0
  10. package/dist/{dts/api → api}/dashboard/handler.d.ts +3 -3
  11. package/dist/api/dashboard/handler.js +1 -0
  12. package/dist/api/dashboard/handler.js.map +7 -0
  13. package/dist/api/dashboard/index.d.ts +3 -0
  14. package/dist/api/dashboard/index.js +2 -0
  15. package/dist/api/dashboard/index.js.map +7 -0
  16. package/dist/{dts/api → api}/dashboard/packets.d.ts +2 -12
  17. package/dist/api/dashboard/packets.js +2 -0
  18. package/dist/api/dashboard/packets.js.map +7 -0
  19. package/dist/{dts/api → api}/endpoint/endpoint.d.ts +2 -2
  20. package/dist/api/endpoint/endpoint.js +2 -0
  21. package/dist/api/endpoint/endpoint.js.map +7 -0
  22. package/dist/api/endpoint/extension.js +2 -0
  23. package/dist/api/endpoint/extension.js.map +7 -0
  24. package/dist/api/endpoint/index.js +2 -0
  25. package/dist/api/endpoint/index.js.map +7 -0
  26. package/dist/api/endpoint/packets.js +2 -0
  27. package/dist/api/endpoint/packets.js.map +7 -0
  28. package/dist/api/extension-registry.js +2 -0
  29. package/dist/api/extension-registry.js.map +7 -0
  30. package/dist/api/extension.js +2 -0
  31. package/dist/api/extension.js.map +7 -0
  32. package/dist/api/http/extension.js +2 -0
  33. package/dist/api/http/extension.js.map +7 -0
  34. package/dist/api/http/http.js +2 -0
  35. package/dist/api/http/http.js.map +7 -0
  36. package/dist/api/http/index.js +2 -0
  37. package/dist/api/http/index.js.map +7 -0
  38. package/dist/api/http/websocket.js +2 -0
  39. package/dist/api/http/websocket.js.map +7 -0
  40. package/dist/api/i18n/extension.js +2 -0
  41. package/dist/api/i18n/extension.js.map +7 -0
  42. package/dist/api/i18n/index.js +2 -0
  43. package/dist/api/i18n/index.js.map +7 -0
  44. package/dist/api/index.d.ts +2 -0
  45. package/dist/api/index.js +2 -0
  46. package/dist/api/index.js.map +7 -0
  47. package/dist/api/logger/extension.js +2 -0
  48. package/dist/api/logger/extension.js.map +7 -0
  49. package/dist/api/logger/index.js +2 -0
  50. package/dist/api/logger/index.js.map +7 -0
  51. package/dist/api/logger/packets.js +2 -0
  52. package/dist/api/logger/packets.js.map +7 -0
  53. package/dist/api/permission/extension.js +2 -0
  54. package/dist/api/permission/extension.js.map +7 -0
  55. package/dist/api/permission/index.js +2 -0
  56. package/dist/api/permission/index.js.map +7 -0
  57. package/dist/{dts/api → api}/permission/permission.d.ts +1 -1
  58. package/dist/api/permission/permission.js +2 -0
  59. package/dist/api/permission/permission.js.map +7 -0
  60. package/dist/api/plugin/extension.js +2 -0
  61. package/dist/api/plugin/extension.js.map +7 -0
  62. package/dist/api/plugin/index.js +2 -0
  63. package/dist/api/plugin/index.js.map +7 -0
  64. package/dist/api/plugin/package-info.js +1 -0
  65. package/dist/api/plugin/package-info.js.map +7 -0
  66. package/dist/{dts/api → api}/registry/extension.d.ts +1 -1
  67. package/dist/api/registry/extension.js +2 -0
  68. package/dist/api/registry/extension.js.map +7 -0
  69. package/dist/api/registry/index.js +2 -0
  70. package/dist/api/registry/index.js.map +7 -0
  71. package/dist/api/registry/packets.js +2 -0
  72. package/dist/api/registry/packets.js.map +7 -0
  73. package/dist/{dts/api → api}/registry/registry.d.ts +2 -2
  74. package/dist/api/registry/registry.js +2 -0
  75. package/dist/api/registry/registry.js.map +7 -0
  76. package/dist/api/server/extension.js +2 -0
  77. package/dist/api/server/extension.js.map +7 -0
  78. package/dist/api/server/index.js +2 -0
  79. package/dist/api/server/index.js.map +7 -0
  80. package/dist/api/session/extension.js +2 -0
  81. package/dist/api/session/extension.js.map +7 -0
  82. package/dist/api/session/index.js +2 -0
  83. package/dist/api/session/index.js.map +7 -0
  84. package/dist/api/signal/extension.js +2 -0
  85. package/dist/api/signal/extension.js.map +7 -0
  86. package/dist/api/signal/index.d.ts +1 -0
  87. package/dist/api/signal/index.js +2 -0
  88. package/dist/api/signal/index.js.map +7 -0
  89. package/dist/api/signal/packets.js +2 -0
  90. package/dist/api/signal/packets.js.map +7 -0
  91. package/dist/{dts/api → api}/signal/signal.d.ts +2 -2
  92. package/dist/api/signal/signal.js +2 -0
  93. package/dist/api/signal/signal.js.map +7 -0
  94. package/dist/api/table/extension.js +2 -0
  95. package/dist/api/table/extension.js.map +7 -0
  96. package/dist/api/table/index.js +2 -0
  97. package/dist/api/table/index.js.map +7 -0
  98. package/dist/api/table/packets.js +2 -0
  99. package/dist/api/table/packets.js.map +7 -0
  100. package/dist/{dts/api → api}/table/table.d.ts +3 -3
  101. package/dist/api/table/table.js +2 -0
  102. package/dist/api/table/table.js.map +7 -0
  103. package/dist/app.js +2 -0
  104. package/dist/app.js.map +7 -0
  105. package/dist/const.js +2 -0
  106. package/dist/const.js.map +7 -0
  107. package/dist/errors.js +2 -0
  108. package/dist/errors.js.map +7 -0
  109. package/dist/event/index.js +2 -0
  110. package/dist/event/index.js.map +7 -0
  111. package/dist/helper.js +2 -0
  112. package/dist/helper.js.map +7 -0
  113. package/dist/identifier.js +2 -0
  114. package/dist/identifier.js.map +7 -0
  115. package/dist/{dts/index.d.ts → index.d.ts} +3 -3
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +7 -0
  118. package/dist/localization/index.js +2 -0
  119. package/dist/localization/index.js.map +7 -0
  120. package/dist/localization/locale.js +2 -0
  121. package/dist/localization/locale.js.map +7 -0
  122. package/dist/localization/localization.js +1 -0
  123. package/dist/localization/localization.js.map +7 -0
  124. package/dist/lock.js +2 -0
  125. package/dist/lock.js.map +7 -0
  126. package/dist/network/connection.js +2 -0
  127. package/dist/network/connection.js.map +7 -0
  128. package/dist/network/encryption.js +2 -0
  129. package/dist/network/encryption.js.map +7 -0
  130. package/dist/network/frame-transport.js +2 -0
  131. package/dist/network/frame-transport.js.map +7 -0
  132. package/dist/network/index.js +2 -0
  133. package/dist/network/index.js.map +7 -0
  134. package/dist/network/network.js +2 -0
  135. package/dist/network/network.js.map +7 -0
  136. package/dist/network/packet/index.js +2 -0
  137. package/dist/network/packet/index.js.map +7 -0
  138. package/dist/network/packet/packet-types.js +2 -0
  139. package/dist/network/packet/packet-types.js.map +7 -0
  140. package/dist/{dts/network → network}/packet/packet.d.ts +2 -2
  141. package/dist/network/packet/packet.js +2 -0
  142. package/dist/network/packet/packet.js.map +7 -0
  143. package/dist/network/websocket-transport.js +2 -0
  144. package/dist/network/websocket-transport.js.map +7 -0
  145. package/dist/omu.js +2 -0
  146. package/dist/omu.js.map +7 -0
  147. package/dist/result.js +2 -0
  148. package/dist/result.js.map +7 -0
  149. package/dist/{dts/serialize → serialize}/bytebuffer.d.ts +1 -1
  150. package/dist/serialize/bytebuffer.js +2 -0
  151. package/dist/serialize/bytebuffer.js.map +7 -0
  152. package/dist/serialize/index.d.ts +2 -0
  153. package/dist/serialize/index.js +2 -0
  154. package/dist/serialize/index.js.map +7 -0
  155. package/dist/serialize/serializer.js +2 -0
  156. package/dist/serialize/serializer.js.map +7 -0
  157. package/dist/token.js +2 -0
  158. package/dist/token.js.map +7 -0
  159. package/dist/version.d.ts +2 -0
  160. package/dist/version.js +2 -0
  161. package/dist/version.js.map +7 -0
  162. package/package.json +9 -9
  163. package/dist/dts/api/dashboard/index.d.ts +0 -3
  164. package/dist/dts/api/index.d.ts +0 -2
  165. package/dist/dts/api/signal/index.d.ts +0 -1
  166. package/dist/dts/serialize/index.d.ts +0 -2
  167. package/dist/dts/version.d.ts +0 -2
  168. package/dist/esm/address.js +0 -4
  169. package/dist/esm/api/asset/extension.js +0 -911
  170. package/dist/esm/api/asset/index.js +0 -909
  171. package/dist/esm/api/dashboard/extension.js +0 -1362
  172. package/dist/esm/api/dashboard/handler.js +0 -4
  173. package/dist/esm/api/dashboard/index.js +0 -1361
  174. package/dist/esm/api/dashboard/packets.js +0 -419
  175. package/dist/esm/api/endpoint/endpoint.js +0 -383
  176. package/dist/esm/api/endpoint/extension.js +0 -1096
  177. package/dist/esm/api/endpoint/index.js +0 -383
  178. package/dist/esm/api/endpoint/packets.js +0 -799
  179. package/dist/esm/api/extension-registry.js +0 -23
  180. package/dist/esm/api/extension.js +0 -278
  181. package/dist/esm/api/http/extension.js +0 -1420
  182. package/dist/esm/api/http/http.js +0 -448
  183. package/dist/esm/api/http/index.js +0 -1419
  184. package/dist/esm/api/http/websocket.js +0 -220
  185. package/dist/esm/api/i18n/extension.js +0 -1339
  186. package/dist/esm/api/i18n/index.js +0 -1337
  187. package/dist/esm/api/index.js +0 -295
  188. package/dist/esm/api/logger/extension.js +0 -856
  189. package/dist/esm/api/logger/index.js +0 -852
  190. package/dist/esm/api/logger/packets.js +0 -673
  191. package/dist/esm/api/permission/extension.js +0 -535
  192. package/dist/esm/api/permission/index.js +0 -294
  193. package/dist/esm/api/permission/permission.js +0 -294
  194. package/dist/esm/api/plugin/extension.js +0 -531
  195. package/dist/esm/api/plugin/index.js +0 -529
  196. package/dist/esm/api/plugin/package-info.js +0 -4
  197. package/dist/esm/api/registry/extension.js +0 -1286
  198. package/dist/esm/api/registry/index.js +0 -1285
  199. package/dist/esm/api/registry/packets.js +0 -694
  200. package/dist/esm/api/registry/registry.js +0 -383
  201. package/dist/esm/api/server/extension.js +0 -2140
  202. package/dist/esm/api/server/index.js +0 -2118
  203. package/dist/esm/api/session/extension.js +0 -2235
  204. package/dist/esm/api/session/index.js +0 -2235
  205. package/dist/esm/api/signal/extension.js +0 -1031
  206. package/dist/esm/api/signal/index.js +0 -379
  207. package/dist/esm/api/signal/packets.js +0 -690
  208. package/dist/esm/api/signal/signal.js +0 -379
  209. package/dist/esm/api/table/extension.js +0 -1553
  210. package/dist/esm/api/table/index.js +0 -1552
  211. package/dist/esm/api/table/packets.js +0 -904
  212. package/dist/esm/api/table/table.js +0 -383
  213. package/dist/esm/app.js +0 -264
  214. package/dist/esm/const.js +0 -11
  215. package/dist/esm/errors.js +0 -548
  216. package/dist/esm/event/index.js +0 -22
  217. package/dist/esm/helper.js +0 -15
  218. package/dist/esm/identifier.js +0 -266
  219. package/dist/esm/index.js +0 -5186
  220. package/dist/esm/localization/index.js +0 -742
  221. package/dist/esm/localization/locale.js +0 -742
  222. package/dist/esm/localization/localization.js +0 -4
  223. package/dist/esm/lock.js +0 -46
  224. package/dist/esm/network/connection.js +0 -293
  225. package/dist/esm/network/encryption.js +0 -986
  226. package/dist/esm/network/frame-transport.js +0 -531
  227. package/dist/esm/network/index.js +0 -1627
  228. package/dist/esm/network/network.js +0 -1368
  229. package/dist/esm/network/packet/index.js +0 -485
  230. package/dist/esm/network/packet/packet-types.js +0 -486
  231. package/dist/esm/network/packet/packet.js +0 -126
  232. package/dist/esm/network/websocket-transport.js +0 -493
  233. package/dist/esm/omu.js +0 -4945
  234. package/dist/esm/result.js +0 -68
  235. package/dist/esm/serialize/bytebuffer.js +0 -384
  236. package/dist/esm/serialize/index.js +0 -471
  237. package/dist/esm/serialize/serializer.js +0 -97
  238. package/dist/esm/token.js +0 -42
  239. package/dist/esm/version.js +0 -11
  240. package/dist/tsconfig.tsbuildinfo +0 -1
  241. /package/dist/{dts/address.d.ts → address.d.ts} +0 -0
  242. /package/dist/{dts/api → api}/asset/extension.d.ts +0 -0
  243. /package/dist/{dts/api → api}/asset/index.d.ts +0 -0
  244. /package/dist/{dts/api → api}/endpoint/extension.d.ts +0 -0
  245. /package/dist/{dts/api → api}/endpoint/index.d.ts +0 -0
  246. /package/dist/{dts/api → api}/endpoint/packets.d.ts +0 -0
  247. /package/dist/{dts/api → api}/extension-registry.d.ts +0 -0
  248. /package/dist/{dts/api → api}/extension.d.ts +0 -0
  249. /package/dist/{dts/api → api}/http/extension.d.ts +0 -0
  250. /package/dist/{dts/api → api}/http/http.d.ts +0 -0
  251. /package/dist/{dts/api → api}/http/index.d.ts +0 -0
  252. /package/dist/{dts/api → api}/http/websocket.d.ts +0 -0
  253. /package/dist/{dts/api → api}/i18n/extension.d.ts +0 -0
  254. /package/dist/{dts/api → api}/i18n/index.d.ts +0 -0
  255. /package/dist/{dts/api → api}/logger/extension.d.ts +0 -0
  256. /package/dist/{dts/api → api}/logger/index.d.ts +0 -0
  257. /package/dist/{dts/api → api}/logger/packets.d.ts +0 -0
  258. /package/dist/{dts/api → api}/permission/extension.d.ts +0 -0
  259. /package/dist/{dts/api → api}/permission/index.d.ts +0 -0
  260. /package/dist/{dts/api → api}/plugin/extension.d.ts +0 -0
  261. /package/dist/{dts/api → api}/plugin/index.d.ts +0 -0
  262. /package/dist/{dts/api → api}/plugin/package-info.d.ts +0 -0
  263. /package/dist/{dts/api → api}/registry/index.d.ts +0 -0
  264. /package/dist/{dts/api → api}/registry/packets.d.ts +0 -0
  265. /package/dist/{dts/api → api}/server/extension.d.ts +0 -0
  266. /package/dist/{dts/api → api}/server/index.d.ts +0 -0
  267. /package/dist/{dts/api → api}/session/extension.d.ts +0 -0
  268. /package/dist/{dts/api → api}/session/index.d.ts +0 -0
  269. /package/dist/{dts/api → api}/signal/extension.d.ts +0 -0
  270. /package/dist/{dts/api → api}/signal/packets.d.ts +0 -0
  271. /package/dist/{dts/api → api}/table/extension.d.ts +0 -0
  272. /package/dist/{dts/api → api}/table/index.d.ts +0 -0
  273. /package/dist/{dts/api → api}/table/packets.d.ts +0 -0
  274. /package/dist/{dts/app.d.ts → app.d.ts} +0 -0
  275. /package/dist/{dts/const.d.ts → const.d.ts} +0 -0
  276. /package/dist/{dts/errors.d.ts → errors.d.ts} +0 -0
  277. /package/dist/{dts/event → event}/index.d.ts +0 -0
  278. /package/dist/{dts/helper.d.ts → helper.d.ts} +0 -0
  279. /package/dist/{dts/identifier.d.ts → identifier.d.ts} +0 -0
  280. /package/dist/{dts/localization → localization}/index.d.ts +0 -0
  281. /package/dist/{dts/localization → localization}/locale.d.ts +0 -0
  282. /package/dist/{dts/localization → localization}/localization.d.ts +0 -0
  283. /package/dist/{dts/lock.d.ts → lock.d.ts} +0 -0
  284. /package/dist/{dts/network → network}/connection.d.ts +0 -0
  285. /package/dist/{dts/network → network}/encryption.d.ts +0 -0
  286. /package/dist/{dts/network → network}/frame-transport.d.ts +0 -0
  287. /package/dist/{dts/network → network}/index.d.ts +0 -0
  288. /package/dist/{dts/network → network}/network.d.ts +0 -0
  289. /package/dist/{dts/network → network}/packet/index.d.ts +0 -0
  290. /package/dist/{dts/network → network}/packet/packet-types.d.ts +0 -0
  291. /package/dist/{dts/network → network}/websocket-transport.d.ts +0 -0
  292. /package/dist/{dts/omu.d.ts → omu.d.ts} +0 -0
  293. /package/dist/{dts/result.d.ts → result.d.ts} +0 -0
  294. /package/dist/{dts/serialize → serialize}/serializer.d.ts +0 -0
  295. /package/dist/{dts/token.d.ts → token.d.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/http/http.ts"],
4
+ "sourcesContent": ["import { ByteReader, ByteWriter, JsonType } from '../../serialize';\n\nexport type RequestHandle = {\n id: string;\n};\n\nexport type HttpRequest = RequestHandle & {\n header: Record<string, string>;\n method: string;\n redirect: RequestRedirect;\n url: string;\n};\n\nexport class DataChunk<T extends JsonType> {\n constructor(\n public readonly meta: T,\n public readonly body: Uint8Array,\n ) { }\n\n public static serialize<T extends JsonType>(data: DataChunk<T>): Uint8Array {\n const writer = new ByteWriter();\n writer.writeJSON(data.meta);\n writer.writeUint8Array(data.body);\n return writer.finish();\n }\n\n public static deserialize<T extends JsonType>(data: Uint8Array): DataChunk<T> {\n const reader = ByteReader.fromUint8Array(data);\n const meta = reader.readJSON<T>();\n const body = reader.readUint8Array();\n return new DataChunk(meta, body);\n }\n}\n\nexport class OmuResponse implements Response {\n constructor(\n public readonly headers: Headers,\n public readonly ok: boolean,\n public readonly redirected: boolean,\n public readonly status: number,\n public readonly statusText: string,\n public readonly type: ResponseType,\n public readonly url: string,\n public readonly body: ReadableStream<Uint8Array<ArrayBuffer>> | null,\n public readonly bodyUsed: boolean,\n ) {}\n\n clone(): OmuResponse {\n return new OmuResponse(\n this.headers,\n this.ok,\n this.redirected,\n this.status,\n this.statusText,\n this.type,\n this.url,\n this.body,\n this.bodyUsed,\n );\n }\n async arrayBuffer(): Promise<ArrayBuffer> {\n return await new Response(this.body).arrayBuffer();\n }\n blob(): Promise<Blob> {\n return new Response(this.body).blob();\n }\n bytes(): Promise<Uint8Array<ArrayBuffer>> {\n return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));\n }\n formData(): Promise<FormData> {\n return new Response(this.body).formData();\n }\n json(): Promise<any> {\n return new Response(this.body).json();\n }\n text(): Promise<string> {\n return new Response(this.body).text();\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,EAAY,cAAAC,MAA4B,kBAa1C,MAAMC,CAA8B,CACvC,YACoBC,EACAC,EAClB,CAFkB,UAAAD,EACA,UAAAC,CAChB,CAEJ,OAAc,UAA8BC,EAAgC,CACxE,MAAMC,EAAS,IAAIL,EACnB,OAAAK,EAAO,UAAUD,EAAK,IAAI,EAC1BC,EAAO,gBAAgBD,EAAK,IAAI,EACzBC,EAAO,OAAO,CACzB,CAEA,OAAc,YAAgCD,EAAgC,CAC1E,MAAME,EAASP,EAAW,eAAeK,CAAI,EACvCF,EAAOI,EAAO,SAAY,EAC1BH,EAAOG,EAAO,eAAe,EACnC,OAAO,IAAIL,EAAUC,EAAMC,CAAI,CACnC,CACJ,CAEO,MAAMI,CAAgC,CACzC,YACoBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAX,EACAY,EAClB,CATkB,aAAAP,EACA,QAAAC,EACA,gBAAAC,EACA,YAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,SAAAC,EACA,UAAAX,EACA,cAAAY,CACjB,CAEH,OAAqB,CACjB,OAAO,IAAIR,EACP,KAAK,QACL,KAAK,GACL,KAAK,WACL,KAAK,OACL,KAAK,WACL,KAAK,KACL,KAAK,IACL,KAAK,KACL,KAAK,QACT,CACJ,CACA,MAAM,aAAoC,CACtC,OAAO,MAAM,IAAI,SAAS,KAAK,IAAI,EAAE,YAAY,CACrD,CACA,MAAsB,CAClB,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,KAAK,CACxC,CACA,OAA0C,CACtC,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,YAAY,EAAE,KAAMS,GAAQ,IAAI,WAAWA,CAAG,CAAC,CAClF,CACA,UAA8B,CAC1B,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,CAC5C,CACA,MAAqB,CACjB,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,KAAK,CACxC,CACA,MAAwB,CACpB,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,KAAK,CACxC,CACJ",
6
+ "names": ["ByteReader", "ByteWriter", "DataChunk", "meta", "body", "data", "writer", "reader", "OmuResponse", "headers", "ok", "redirected", "status", "statusText", "type", "url", "bodyUsed", "buf"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{HTTP_REQUEST_PERMISSION_ID as r}from"./extension";import{OmuWS as m}from"./websocket";export{r as HTTP_REQUEST_PERMISSION_ID,m as OmuWS};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/http/index.ts"],
4
+ "sourcesContent": ["export { HTTP_REQUEST_PERMISSION_ID } from './extension';\nexport { OmuWS, type WSMsg } from './websocket';\n\n"],
5
+ "mappings": "AAAA,OAAS,8BAAAA,MAAkC,cAC3C,OAAS,SAAAC,MAAyB",
6
+ "names": ["HTTP_REQUEST_PERMISSION_ID", "OmuWS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{textDecoder as r}from"../../const";const i={CONTINUATION:0,TEXT:1,BINARY:2,PING:9,PONG:10,CLOSE:8},y={OK:1e3,GOING_AWAY:1001,PROTOCOL_ERROR:1002,UNSUPPORTED_DATA:1003,ABNORMAL_CLOSURE:1006,INVALID_TEXT:1007,POLICY_VIOLATION:1008,MESSAGE_TOO_BIG:1009,MANDATORY_EXTENSION:1010,INTERNAL_ERROR:1011,SERVICE_RESTART:1012,TRY_AGAIN_LATER:1013,BAD_GATEWAY:1014};class n{constructor(e,t,o=[],s=void 0,p="connecting"){this.addQueue=e;this.dispose=t;this.receiveQueue=o;this.receiveResolve=s;this.status=p}toWebSocket(){return new a(this)}static create(e){const t=new n(e.addQueue,e.dispose);return{ws:t,open:o=>{t.receiveQueue.push({type:"open",data:o}),t.receiveResolve?.()},dispatch:o=>{o.meta.type===i.BINARY?t.receiveQueue.push({type:"binary",data:o.body}):t.receiveQueue.push({type:"text",data:r.decode(o.body)}),t.receiveResolve?.()},close:o=>{t.receiveQueue.push({type:"close",data:o}),t.receiveResolve?.()},error:o=>{t.receiveQueue.push({type:"error",data:o}),t.receiveResolve?.()}}}send(e){this.addQueue(e)}close(e,t){this.dispose({code:e,reason:t})}async receive(){if(this.receiveResolve)throw new Error("Already receiving from another async call");for(;this.status!=="closed";){const e=this.receiveQueue.shift();if(!e){await new Promise(t=>this.receiveResolve=t);continue}return e.type==="close"&&(this.status="closed"),e.type==="open"&&(this.status="open"),this.receiveResolve=void 0,e}throw new Error("Receiving on already closed socket")}protocol="";url=""}class a{constructor(e,t={close:[],error:[],message:[],open:[]}){this.ws=e;this.eventListeners=t;this.receiveLoop()}CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;binaryType="blob";bufferedAmount=0;extensions="";onclose=null;onerror=null;onmessage=null;onopen=null;protocol="";readyState=0;url="";async receiveLoop(){for(;this.readyState===WebSocket.CLOSED;){const{data:e,type:t}=await this.ws.receive();switch(t){case"close":this.dispatchEvent(new CloseEvent("close",{code:e.code,reason:e.reason??void 0}));break;case"open":this.url=e.url,this.protocol=e.protocol??"",this.dispatchEvent(new Event("open",{}));break;case"error":this.dispatchEvent(new ErrorEvent("error",{error:e.type,message:e.reason??void 0}));break;case"text":case"binary":this.dispatchEvent(new MessageEvent("message",{data:e}));break}}}dispatchEvent(e){const t=this.eventListeners[e.type];for(const o of t)o(e);return e.type==="open"&&this.onopen?.(e),e.type==="error"&&this.onerror?.(e),e.type==="message"&&this.onmessage?.(e),e.type==="close"&&this.onclose?.(e),!0}send(e){this.ws.send(e)}close(e,t){this.ws.close(e,t)}addEventListener(e,t){this.eventListeners[e].push(t)}removeEventListener(e,t){const o=this.eventListeners[e],s=o.indexOf(t);s!==-1&&o.splice(s,1)}}export{n as OmuWS,a as OmuWebSocket,y as WSCloseCode,i as WSMsgType};
2
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/http/websocket.ts"],
4
+ "sourcesContent": ["import { textDecoder } from '../../const';\nimport { DataChunk, RequestHandle } from './http';\n\nexport type WSData = string | ArrayBufferLike | Blob | ArrayBufferView;\n\nexport const WSMsgType = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n PING: 0x9,\n PONG: 0xA,\n CLOSE: 0x8,\n} as const;\n\nexport const WSCloseCode = {\n OK: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n ABNORMAL_CLOSURE: 1006,\n INVALID_TEXT: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n MANDATORY_EXTENSION: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n BAD_GATEWAY: 1014,\n} as const;\n\nexport type WebSocketOpen = RequestHandle & {\n url: string;\n protocol?: string | null;\n};\nexport type WebSocketClose = RequestHandle & {\n code?: number;\n reason?: string | null;\n};\nexport type WebSocketError = RequestHandle & {\n type: 'ConnectionRefused';\n reason?: string | null;\n};\n\nexport type EventListenerMap<T> = {\n [K in keyof T]: ((event: T[K]) => unknown)[]\n};\n\nexport type WSMsg = {\n type: 'open';\n data: WebSocketOpen;\n} | {\n type: 'error';\n data: WebSocketError;\n} | {\n type: 'text';\n data: string;\n} | {\n type: 'binary';\n data: Uint8Array;\n} | {\n type: 'close';\n data: WebSocketClose;\n};\n\nexport type WebSocketHandle = {\n ws: OmuWS;\n open: (response: WebSocketOpen) => void;\n dispatch: (data: DataChunk<WSDataMeta>) => void;\n close: (response: WebSocketClose) => void;\n error: (response: WebSocketError) => void;\n};\n\nexport type WSDataMeta = {\n id: string;\n type:\n | typeof WSMsgType.TEXT\n | typeof WSMsgType.BINARY\n | typeof WSMsgType.PING\n | typeof WSMsgType.PONG;\n};\n\nexport type WSHandleState = {\n type: 'created' | 'receiving';\n handle: WebSocketHandle;\n};\n\ntype WSOptions = {\n addQueue: (data: WSData) => void;\n dispose(options: {\n code?: number;\n reason?: string;\n }): void;\n};\n\nexport class OmuWS {\n constructor(\n protected readonly addQueue: (data: WSData) => void,\n protected readonly dispose: (options: { code?: number; reason?: string }) => void,\n protected readonly receiveQueue: WSMsg[] = [],\n private receiveResolve: (() => void) | undefined = undefined,\n private status: 'connecting' | 'open' | 'closed' = 'connecting',\n ) { }\n\n public toWebSocket(): OmuWebSocket {\n return new OmuWebSocket(this);\n }\n\n public static create(options: WSOptions): WebSocketHandle {\n const ws = new OmuWS(options.addQueue, options.dispose);\n return {\n ws,\n open: (response) => {\n ws.receiveQueue.push({\n type: 'open',\n data: response,\n });\n ws.receiveResolve?.();\n },\n dispatch: (data: DataChunk<WSDataMeta>): void => {\n if (data.meta.type === WSMsgType.BINARY) {\n ws.receiveQueue.push({\n type: 'binary',\n data: data.body,\n });\n } else {\n ws.receiveQueue.push({\n type: 'text',\n data: textDecoder.decode(data.body),\n });\n }\n ws.receiveResolve?.();\n },\n close: (response) => {\n ws.receiveQueue.push({\n type: 'close',\n data: response,\n });\n ws.receiveResolve?.();\n },\n error: (response) => {\n ws.receiveQueue.push({\n type: 'error',\n data: response,\n });\n ws.receiveResolve?.();\n },\n };\n }\n\n public send(data: WSData): void {\n this.addQueue(data);\n }\n\n public close(code?: number, reason?: string): void {\n this.dispose({ code, reason });\n }\n\n public async receive(): Promise<WSMsg> {\n if (this.receiveResolve) {\n throw new Error('Already receiving from another async call');\n }\n while (this.status !== 'closed') {\n const data = this.receiveQueue.shift();\n if (!data) {\n await new Promise<void>((resolve) => this.receiveResolve = resolve);\n continue;\n }\n if (data.type === 'close') {\n this.status = 'closed';\n }\n if (data.type === 'open') {\n this.status = 'open';\n }\n this.receiveResolve = undefined;\n return data;\n }\n throw new Error('Receiving on already closed socket');\n }\n\n protocol: string = '';\n url: string = '';\n}\n\nexport class OmuWebSocket implements WebSocket {\n public CONNECTING = 0 as const;\n public OPEN = 1 as const;\n public CLOSING = 2 as const;\n public CLOSED = 3 as const;\n\n binaryType: BinaryType = 'blob';\n bufferedAmount: number = 0;\n extensions: string = '';\n onclose: ((this: WebSocket, ev: CloseEvent) => unknown) | null = null;\n onerror: ((this: WebSocket, ev: Event) => unknown) | null = null;\n onmessage: ((this: WebSocket, ev: MessageEvent) => unknown) | null = null;\n onopen: ((this: WebSocket, ev: Event) => unknown) | null = null;\n protocol: string = '';\n readyState: 0 | 2 | 1 | 3 = 0;\n url: string = '';\n\n constructor(\n protected readonly ws: OmuWS,\n private readonly eventListeners: EventListenerMap<WebSocketEventMap> = {\n close: [],\n error: [],\n message: [],\n open: [],\n },\n ) {\n this.receiveLoop();\n }\n\n private async receiveLoop() {\n while (this.readyState === WebSocket.CLOSED) {\n const { data, type } = await this.ws.receive();\n switch (type) {\n case 'close':\n this.dispatchEvent(new CloseEvent('close', {\n code: data.code,\n reason: data.reason ?? undefined,\n }));\n break;\n case 'open':\n this.url = data.url;\n this.protocol = data.protocol ?? '';\n this.dispatchEvent(new Event('open', {}));\n break;\n case 'error':\n this.dispatchEvent(new ErrorEvent('error', {\n error: data.type,\n message: data.reason ?? undefined,\n }));\n break;\n case 'text':\n case 'binary':\n this.dispatchEvent(new MessageEvent('message', {\n data,\n }));\n break;\n }\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const listeners = this.eventListeners[event.type];\n for (const listener of listeners) {\n listener(event);\n }\n if (event.type === 'open') {\n this.onopen?.(event as MessageEvent);\n }\n if (event.type === 'error') {\n this.onerror?.(event);\n }\n if (event.type === 'message') {\n this.onmessage?.(event as MessageEvent);\n }\n if (event.type === 'close') {\n this.onclose?.(event as CloseEvent);\n }\n return true;\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this.ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this.ws.close(code, reason);\n }\n\n addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n this.eventListeners[type].push(listener);\n }\n\n removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n const listeners = this.eventListeners[type];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["textDecoder", "WSMsgType", "WSCloseCode", "OmuWS", "addQueue", "dispose", "receiveQueue", "receiveResolve", "status", "OmuWebSocket", "options", "ws", "response", "data", "code", "reason", "resolve", "eventListeners", "type", "event", "listeners", "listener", "index"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ExtensionType as p}from"../extension.js";import{RegistryType as u}from"../registry";const i=new p("i18n",l=>new y(l)),_=i.join("locales","set"),x=i.join("locales","get"),f=u.createJson(i,{name:"locales",defaultValue:typeof window>"u"?[]:window.navigator.languages});class y{constructor(e){this.omu=e;this.localesRegistry=e.registries.get(f)}type=i;localesRegistry;translate(e){const t=this.localesRegistry.value;if(typeof e=="string")return e;const n=this.selectBestTranslation(t,e);return n||Object.values(e)[0]}selectBestTranslation(e,t){if(typeof t=="string")return t;const n=t,c=e.reduce((o,s)=>{const a=s.split("-");for(let r=a.length;r>0;r--)o.push(a.slice(0,r).join("-"));return o},[]);for(const o of c){const s=n[o];if(s)return s}}setLocale(e){return this.localesRegistry.set(e)}}export{i as I18N_EXTENSION_TYPE,x as I18N_GET_LOCALES_PERMISSION_ID,_ as I18N_SET_LOCALES_PERMISSION_ID,y as I18nExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/i18n/extension.ts"],
4
+ "sourcesContent": ["import { Identifier } from '../../identifier';\nimport type { Locale } from '../../localization/locale.js';\nimport type { LocalizedText } from '../../localization/localization.js';\nimport { Omu } from '../../omu';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\nimport { RegistryType, type Registry } from '../registry';\n\nexport const I18N_EXTENSION_TYPE: ExtensionType<I18nExtension> = new ExtensionType('i18n', (client) => new I18nExtension(client));\n\nexport const I18N_SET_LOCALES_PERMISSION_ID: Identifier = I18N_EXTENSION_TYPE.join('locales', 'set');\nexport const I18N_GET_LOCALES_PERMISSION_ID: Identifier = I18N_EXTENSION_TYPE.join('locales', 'get');\nconst I18N_LOCALES_REGISTRY_TYPE = RegistryType.createJson<Locale[]>(I18N_EXTENSION_TYPE, {\n name: 'locales',\n defaultValue: typeof window === 'undefined' ? [] : window.navigator.languages as Locale[],\n});\n\nexport class I18nExtension implements Extension {\n public readonly type: ExtensionType<I18nExtension> = I18N_EXTENSION_TYPE;\n public readonly localesRegistry: Registry<Locale[]>;\n\n constructor(private readonly omu: Omu) {\n this.localesRegistry = omu.registries.get(I18N_LOCALES_REGISTRY_TYPE);\n }\n\n public translate(localizedText: LocalizedText): string {\n const locales = this.localesRegistry.value;\n if (typeof localizedText === 'string') {\n return localizedText;\n }\n const translation = this.selectBestTranslation(locales, localizedText);\n if (!translation) {\n return Object.values(localizedText)[0];\n }\n return translation;\n }\n\n public selectBestTranslation(\n locales: readonly Locale[],\n localizedText: LocalizedText,\n ): string | undefined {\n if (typeof localizedText === 'string') {\n return localizedText;\n }\n const translations = localizedText;\n const transformedLocales = locales.reduce((acc, l) => {\n const parts = l.split('-');\n for (let i = parts.length; i > 0; i--) {\n acc.push(parts.slice(0, i).join('-'));\n }\n return acc;\n }, [] as string[]);\n for (const l of transformedLocales) {\n const translation = translations[l];\n if (translation) {\n return translation;\n }\n }\n return undefined;\n }\n\n public setLocale(locale: Locale[]): Promise<void> {\n return this.localesRegistry.set(locale);\n }\n}\n"],
5
+ "mappings": "AAKA,OAAS,iBAAAA,MAAqB,kBAC9B,OAAS,gBAAAC,MAAmC,cAErC,MAAMC,EAAoD,IAAIF,EAAc,OAASG,GAAW,IAAIC,EAAcD,CAAM,CAAC,EAEnHE,EAA6CH,EAAoB,KAAK,UAAW,KAAK,EACtFI,EAA6CJ,EAAoB,KAAK,UAAW,KAAK,EAC7FK,EAA6BN,EAAa,WAAqBC,EAAqB,CACtF,KAAM,UACN,aAAc,OAAO,OAAW,IAAc,CAAC,EAAI,OAAO,UAAU,SACxE,CAAC,EAEM,MAAME,CAAmC,CAI5C,YAA6BI,EAAU,CAAV,SAAAA,EACzB,KAAK,gBAAkBA,EAAI,WAAW,IAAID,CAA0B,CACxE,CALgB,KAAqCL,EACrC,gBAMT,UAAUO,EAAsC,CACnD,MAAMC,EAAU,KAAK,gBAAgB,MACrC,GAAI,OAAOD,GAAkB,SACzB,OAAOA,EAEX,MAAME,EAAc,KAAK,sBAAsBD,EAASD,CAAa,EACrE,OAAKE,GACM,OAAO,OAAOF,CAAa,EAAE,CAAC,CAG7C,CAEO,sBACHC,EACAD,EACkB,CAClB,GAAI,OAAOA,GAAkB,SACzB,OAAOA,EAEX,MAAMG,EAAeH,EACfI,EAAqBH,EAAQ,OAAO,CAACI,EAAKC,IAAM,CAClD,MAAMC,EAAQD,EAAE,MAAM,GAAG,EACzB,QAASE,EAAID,EAAM,OAAQC,EAAI,EAAGA,IAC9BH,EAAI,KAAKE,EAAM,MAAM,EAAGC,CAAC,EAAE,KAAK,GAAG,CAAC,EAExC,OAAOH,CACX,EAAG,CAAC,CAAa,EACjB,UAAWC,KAAKF,EAAoB,CAChC,MAAMF,EAAcC,EAAaG,CAAC,EAClC,GAAIJ,EACA,OAAOA,CAEf,CAEJ,CAEO,UAAUO,EAAiC,CAC9C,OAAO,KAAK,gBAAgB,IAAIA,CAAM,CAC1C,CACJ",
6
+ "names": ["ExtensionType", "RegistryType", "I18N_EXTENSION_TYPE", "client", "I18nExtension", "I18N_SET_LOCALES_PERMISSION_ID", "I18N_GET_LOCALES_PERMISSION_ID", "I18N_LOCALES_REGISTRY_TYPE", "omu", "localizedText", "locales", "translation", "translations", "transformedLocales", "acc", "l", "parts", "i", "locale"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{I18N_GET_LOCALES_PERMISSION_ID as S,I18N_SET_LOCALES_PERMISSION_ID as E}from"./extension.js";export{S as I18N_GET_LOCALES_PERMISSION_ID,E as I18N_SET_LOCALES_PERMISSION_ID};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/i18n/index.ts"],
4
+ "sourcesContent": ["export { I18N_GET_LOCALES_PERMISSION_ID, I18N_SET_LOCALES_PERMISSION_ID } from './extension.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,kCAAAA,EAAgC,kCAAAC,MAAsC",
6
+ "names": ["I18N_GET_LOCALES_PERMISSION_ID", "I18N_SET_LOCALES_PERMISSION_ID"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export { ExtensionRegistry } from './extension-registry.js';
2
+ export { ExtensionType, type Extension } from './extension.js';
@@ -0,0 +1,2 @@
1
+ import{ExtensionRegistry as t}from"./extension-registry.js";import{ExtensionType as r}from"./extension.js";export{t as ExtensionRegistry,r as ExtensionType};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/api/index.ts"],
4
+ "sourcesContent": ["export { ExtensionRegistry } from './extension-registry.js';\nexport { ExtensionType, type Extension } from './extension.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,qBAAAA,MAAyB,0BAClC,OAAS,iBAAAC,MAAqC",
6
+ "names": ["ExtensionRegistry", "ExtensionType"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as c,IdentifierMap as d}from"../../identifier";import{PacketType as p}from"../../network/packet/packet.js";import{ExtensionType as m}from"../extension.js";import{LogPacket as g,LogType as o}from"./packets.js";const s=new m("logger",r=>new L(r)),O=s.join("log"),n=p.createSerialized(s,{name:"log",serializer:g}),a=p.createJson(s,{name:"listen",serializer:c});class L{constructor(e){this.omu=e;e.network.registerPacket(n,a),e.network.addPacketHandler(n,t=>{const i=this.listeners.get(t.id);i&&i.forEach(l=>l(t.message))})}type=s;listeners=new d;log(e){const t=new g(this.omu.app.id,e);this.omu.send(n,t)}error(e){this.log({type:o.ERROR,text:e})}warning(e){this.log({type:o.WARNING,text:e})}info(e){this.log({type:o.INFO,text:e})}debug(e){this.log({type:o.DEBUG,text:e})}listen(e,t){this.listeners.has(e)||this.omu.onReady(()=>{this.omu.send(a,e)});const i=this.listeners.get(e)??[];return i.push(t),this.listeners.set(e,i),()=>{i.splice(i.indexOf(t),1)}}}export{s as LOGGER_EXTENSION_TYPE,a as LOGGER_LISTEN_PACKET,n as LOGGER_LOG_PACKET,O as LOGGER_LOG_PERMISSION_ID,L as LoggerExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/logger/extension.ts"],
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport { ExtensionType } from '../extension.js';\n\nimport type { LogMessage } from './packets.js';\nimport { LogPacket, LogType } from './packets.js';\n\nexport const LOGGER_EXTENSION_TYPE: ExtensionType<LoggerExtension> = new ExtensionType(\n 'logger',\n (client) => new LoggerExtension(client),\n);\n\nexport const LOGGER_LOG_PERMISSION_ID: Identifier = LOGGER_EXTENSION_TYPE.join('log');\n\nexport const LOGGER_LOG_PACKET: PacketType<LogPacket> = PacketType.createSerialized<LogPacket>(LOGGER_EXTENSION_TYPE, {\n name: 'log',\n serializer: LogPacket,\n});\nexport const LOGGER_LISTEN_PACKET: PacketType<Identifier> = PacketType.createJson<Identifier>(LOGGER_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\n\ntype LogListener = (message: LogMessage) => void;\nexport class LoggerExtension {\n public readonly type: ExtensionType<LoggerExtension> = LOGGER_EXTENSION_TYPE;\n private readonly listeners: IdentifierMap<LogListener[]> = new IdentifierMap();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(LOGGER_LOG_PACKET, LOGGER_LISTEN_PACKET);\n omu.network.addPacketHandler(LOGGER_LOG_PACKET, (packet) => {\n const listener = this.listeners.get(packet.id);\n if (listener) {\n listener.forEach((it) => it(packet.message));\n }\n });\n }\n\n public log(message: LogMessage): void {\n const packet = new LogPacket(this.omu.app.id, message);\n this.omu.send(LOGGER_LOG_PACKET, packet);\n }\n\n public error(text: string): void {\n this.log({ type: LogType.ERROR, text });\n }\n\n public warning(text: string): void {\n this.log({ type: LogType.WARNING, text });\n }\n\n public info(text: string): void {\n this.log({ type: LogType.INFO, text });\n }\n\n public debug(text: string): void {\n this.log({ type: LogType.DEBUG, text });\n }\n\n public listen(id: Identifier, listener: LogListener): Unlisten {\n if (!this.listeners.has(id)) {\n this.omu.onReady(() => {\n this.omu.send(LOGGER_LISTEN_PACKET, id);\n });\n }\n const list = this.listeners.get(id) ?? [];\n list.push(listener);\n this.listeners.set(id, list);\n return () => {\n list.splice(list.indexOf(listener), 1);\n };\n }\n}\n"],
5
+ "mappings": "AACA,OAAS,cAAAA,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,cAAAC,MAAkB,iCAE3B,OAAS,iBAAAC,MAAqB,kBAG9B,OAAS,aAAAC,EAAW,WAAAC,MAAe,eAE5B,MAAMC,EAAwD,IAAIH,EACrE,SACCI,GAAW,IAAIC,EAAgBD,CAAM,CAC1C,EAEaE,EAAuCH,EAAsB,KAAK,KAAK,EAEvEI,EAA2CR,EAAW,iBAA4BI,EAAuB,CAClH,KAAM,MACN,WAAYF,CAChB,CAAC,EACYO,EAA+CT,EAAW,WAAuBI,EAAuB,CACjH,KAAM,SACN,WAAYN,CAChB,CAAC,EAGM,MAAMQ,CAAgB,CAIzB,YAA6BI,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eAAeF,EAAmBC,CAAoB,EAClEC,EAAI,QAAQ,iBAAiBF,EAAoBG,GAAW,CACxD,MAAMC,EAAW,KAAK,UAAU,IAAID,EAAO,EAAE,EACzCC,GACAA,EAAS,QAASC,GAAOA,EAAGF,EAAO,OAAO,CAAC,CAEnD,CAAC,CACL,CAXgB,KAAuCP,EACtC,UAA0C,IAAIL,EAYxD,IAAIe,EAA2B,CAClC,MAAMH,EAAS,IAAIT,EAAU,KAAK,IAAI,IAAI,GAAIY,CAAO,EACrD,KAAK,IAAI,KAAKN,EAAmBG,CAAM,CAC3C,CAEO,MAAMI,EAAoB,CAC7B,KAAK,IAAI,CAAE,KAAMZ,EAAQ,MAAO,KAAAY,CAAK,CAAC,CAC1C,CAEO,QAAQA,EAAoB,CAC/B,KAAK,IAAI,CAAE,KAAMZ,EAAQ,QAAS,KAAAY,CAAK,CAAC,CAC5C,CAEO,KAAKA,EAAoB,CAC5B,KAAK,IAAI,CAAE,KAAMZ,EAAQ,KAAM,KAAAY,CAAK,CAAC,CACzC,CAEO,MAAMA,EAAoB,CAC7B,KAAK,IAAI,CAAE,KAAMZ,EAAQ,MAAO,KAAAY,CAAK,CAAC,CAC1C,CAEO,OAAOC,EAAgBJ,EAAiC,CACtD,KAAK,UAAU,IAAII,CAAE,GACtB,KAAK,IAAI,QAAQ,IAAM,CACnB,KAAK,IAAI,KAAKP,EAAsBO,CAAE,CAC1C,CAAC,EAEL,MAAMC,EAAO,KAAK,UAAU,IAAID,CAAE,GAAK,CAAC,EACxC,OAAAC,EAAK,KAAKL,CAAQ,EAClB,KAAK,UAAU,IAAII,EAAIC,CAAI,EACpB,IAAM,CACTA,EAAK,OAAOA,EAAK,QAAQL,CAAQ,EAAG,CAAC,CACzC,CACJ,CACJ",
6
+ "names": ["Identifier", "IdentifierMap", "PacketType", "ExtensionType", "LogPacket", "LogType", "LOGGER_EXTENSION_TYPE", "client", "LoggerExtension", "LOGGER_LOG_PERMISSION_ID", "LOGGER_LOG_PACKET", "LOGGER_LISTEN_PACKET", "omu", "packet", "listener", "it", "message", "text", "id", "list"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{LOGGER_LOG_PERMISSION_ID as O}from"./extension.js";export{O as LOGGER_LOG_PERMISSION_ID};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/logger/index.ts"],
4
+ "sourcesContent": ["export {\n LOGGER_LOG_PERMISSION_ID,\n} from './extension.js';\n\n"],
5
+ "mappings": "AAAA,OACI,4BAAAA,MACG",
6
+ "names": ["LOGGER_LOG_PERMISSION_ID"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as o}from"../../identifier";import{ByteReader as c,ByteWriter as g}from"../../serialize";var d=(t=>(t.ERROR="error",t.WARNING="warning",t.INFO="info",t.DEBUG="debug",t))(d||{});class i{constructor(r,e){this.id=r;this.message=e}static serialize(r){const e=new g;return e.writeString(r.id.key()),e.writeString(r.message.type),e.writeString(r.message.text),e.finish()}static deserialize(r){const e=c.fromUint8Array(r),n=e.readString(),t=e.readString(),s=e.readString(),a={type:t,text:s};return new i(o.fromKey(n),a)}}export{i as LogPacket,d as LogType};
2
+ //# sourceMappingURL=packets.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/logger/packets.ts"],
4
+ "sourcesContent": ["import { Identifier } from '../../identifier';\nimport { ByteReader, ByteWriter } from '../../serialize';\n\nexport enum LogType {\n ERROR = 'error',\n WARNING = 'warning',\n INFO = 'info',\n DEBUG = 'debug',\n}\n\nexport type LogMessage = {\n type: LogType;\n text: string;\n};\n\nexport class LogPacket {\n constructor(\n public readonly id: Identifier,\n public readonly message: LogMessage,\n ) {}\n\n public static serialize(item: LogPacket): Uint8Array {\n const writer = new ByteWriter();\n writer.writeString(item.id.key());\n writer.writeString(item.message.type);\n writer.writeString(item.message.text);\n return writer.finish();\n }\n\n public static deserialize(item: Uint8Array): LogPacket {\n const reader = ByteReader.fromUint8Array(item);\n const id = reader.readString();\n const type = reader.readString() as LogType;\n const text = reader.readString();\n const message = { type, text };\n return new LogPacket(Identifier.fromKey(id), message);\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,MAAkB,mBAC3B,OAAS,cAAAC,EAAY,cAAAC,MAAkB,kBAEhC,IAAKC,OACRA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,QAJAA,OAAA,IAYL,MAAMC,CAAU,CACnB,YACoBC,EACAC,EAClB,CAFkB,QAAAD,EACA,aAAAC,CACjB,CAEH,OAAc,UAAUC,EAA6B,CACjD,MAAMC,EAAS,IAAIN,EACnB,OAAAM,EAAO,YAAYD,EAAK,GAAG,IAAI,CAAC,EAChCC,EAAO,YAAYD,EAAK,QAAQ,IAAI,EACpCC,EAAO,YAAYD,EAAK,QAAQ,IAAI,EAC7BC,EAAO,OAAO,CACzB,CAEA,OAAc,YAAYD,EAA6B,CACnD,MAAME,EAASR,EAAW,eAAeM,CAAI,EACvCF,EAAKI,EAAO,WAAW,EACvBC,EAAOD,EAAO,WAAW,EACzBE,EAAOF,EAAO,WAAW,EACzBH,EAAU,CAAE,KAAAI,EAAM,KAAAC,CAAK,EAC7B,OAAO,IAAIP,EAAUJ,EAAW,QAAQK,CAAE,EAAGC,CAAO,CACxD,CACJ",
6
+ "names": ["Identifier", "ByteReader", "ByteWriter", "LogType", "LogPacket", "id", "message", "item", "writer", "reader", "type", "text"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as n,IdentifierMap as p,IdentifierSet as c}from"../../identifier";import{PacketType as a}from"../../network/packet/packet.js";import{Serializer as o}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as E}from"../extension.js";import{PermissionType as f}from"./permission.js";const i=new E("permission",d=>new h(d)),m=a.createJson(i,{name:"register",serializer:o.of(f).toArray()}),u=a.createJson(i,{name:"require",serializer:o.of(n).toArray()}),I=l.createJson(i,{name:"request",requestSerializer:o.of(n).toArray()}),P=a.createJson(i,{name:"grant",serializer:o.of(f).toArray()});class h{constructor(e){this.omu=e;e.network.registerPacket(m,u,P),e.network.addPacketHandler(P,r=>{for(const s of r)this.permissions.set(s.id,s)}),e.network.addTask(()=>this.onTask())}type=i;permissions=new p;registeredPermissions=new p;requiredPermissions=new c;onTask(){this.omu.app.type!=="remote"&&(this.registeredPermissions.size>0&&this.omu.send(m,Array.from(this.registeredPermissions.values())),this.requiredPermissions.size>0&&this.omu.send(u,Array.from(this.requiredPermissions.values())))}register(e){this.omu.running&&this.omu.send(m,[e]),this.registeredPermissions.set(e.id,e)}require(...e){const r=e.map(n.from),s=r.filter(t=>!this.permissions.has(t));if(this.omu.running){if(s.length>0)throw new Error("Permissions must be registered before the client starts");return}for(const t of r)this.requiredPermissions.add(t)}async request(...e){await this.omu.endpoints.call(I,e)}has(e){return this.permissions.has(e)}required(e){return this.requiredPermissions.has(e)}}export{i as PERMISSION_EXTENSION_TYPE,h as PermissionExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/permission/extension.ts"],
4
+ "sourcesContent": ["import { Identifier, IdentifierMap, IdentifierSet, IntoId } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { ExtensionType } from '../extension.js';\n\nimport { PermissionType } from './permission.js';\n\nexport const PERMISSION_EXTENSION_TYPE: ExtensionType<PermissionExtension> = new ExtensionType(\n 'permission',\n (client) => new PermissionExtension(client),\n);\nconst PERMISSION_REGISTER_PACKET = PacketType.createJson<PermissionType[]>(\n PERMISSION_EXTENSION_TYPE,\n {\n name: 'register',\n serializer: Serializer.of(PermissionType).toArray(),\n },\n);\nconst PERMISSION_REQUIRE_PACKET = PacketType.createJson<Identifier[]>(PERMISSION_EXTENSION_TYPE, {\n name: 'require',\n serializer: Serializer.of(Identifier).toArray(),\n});\nconst PERMISSION_REQUEST_ENDPOINT = EndpointType.createJson<Identifier[], void>(\n PERMISSION_EXTENSION_TYPE,\n {\n name: 'request',\n requestSerializer: Serializer.of(Identifier).toArray(),\n },\n);\nconst PERMISSION_GRANT_PACKET = PacketType.createJson<PermissionType[]>(PERMISSION_EXTENSION_TYPE, {\n name: 'grant',\n serializer: Serializer.of(PermissionType).toArray(),\n});\n\nexport class PermissionExtension {\n public readonly type: ExtensionType<PermissionExtension> = PERMISSION_EXTENSION_TYPE;\n private permissions = new IdentifierMap<PermissionType>();\n private readonly registeredPermissions = new IdentifierMap<PermissionType>();\n private readonly requiredPermissions = new IdentifierSet();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n PERMISSION_REGISTER_PACKET,\n PERMISSION_REQUIRE_PACKET,\n PERMISSION_GRANT_PACKET,\n );\n omu.network.addPacketHandler(PERMISSION_GRANT_PACKET, (permissions) => {\n for (const permission of permissions) {\n this.permissions.set(permission.id, permission);\n }\n });\n omu.network.addTask(() => this.onTask());\n }\n\n private onTask(): void {\n if (this.omu.app.type === 'remote') {\n return;\n }\n if (this.registeredPermissions.size > 0) {\n this.omu.send(\n PERMISSION_REGISTER_PACKET,\n Array.from(this.registeredPermissions.values()),\n );\n }\n if (this.requiredPermissions.size > 0) {\n this.omu.send(\n PERMISSION_REQUIRE_PACKET,\n Array.from(this.requiredPermissions.values()),\n );\n }\n }\n\n public register(permission: PermissionType): void {\n if (this.omu.running) {\n this.omu.send(PERMISSION_REGISTER_PACKET, [permission]);\n }\n this.registeredPermissions.set(permission.id, permission);\n }\n\n public require(...permissionIds: IntoId[]): void {\n const ids = permissionIds.map(Identifier.from);\n const missing = ids.filter((id) => !this.permissions.has(id));\n if (this.omu.running) {\n if (missing.length > 0) {\n throw new Error('Permissions must be registered before the client starts');\n }\n return;\n }\n for (const id of ids) {\n this.requiredPermissions.add(id);\n }\n }\n\n public async request(...permissionIds: Identifier[]): Promise<void> {\n await this.omu.endpoints.call(PERMISSION_REQUEST_ENDPOINT, permissionIds);\n }\n\n public has(permissionIdentifier: Identifier): boolean {\n return this.permissions.has(permissionIdentifier);\n }\n\n public required(permissionIdentifier: Identifier): boolean {\n return this.requiredPermissions.has(permissionIdentifier);\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,EAAY,iBAAAC,EAAe,iBAAAC,MAA6B,mBACjE,OAAS,cAAAC,MAAkB,iCAE3B,OAAS,cAAAC,MAAkB,kBAC3B,OAAS,gBAAAC,MAAoB,0BAC7B,OAAS,iBAAAC,MAAqB,kBAE9B,OAAS,kBAAAC,MAAsB,kBAExB,MAAMC,EAAgE,IAAIF,EAC7E,aACCG,GAAW,IAAIC,EAAoBD,CAAM,CAC9C,EACME,EAA6BR,EAAW,WAC1CK,EACA,CACI,KAAM,WACN,WAAYJ,EAAW,GAAGG,CAAc,EAAE,QAAQ,CACtD,CACJ,EACMK,EAA4BT,EAAW,WAAyBK,EAA2B,CAC7F,KAAM,UACN,WAAYJ,EAAW,GAAGJ,CAAU,EAAE,QAAQ,CAClD,CAAC,EACKa,EAA8BR,EAAa,WAC7CG,EACA,CACI,KAAM,UACN,kBAAmBJ,EAAW,GAAGJ,CAAU,EAAE,QAAQ,CACzD,CACJ,EACMc,EAA0BX,EAAW,WAA6BK,EAA2B,CAC/F,KAAM,QACN,WAAYJ,EAAW,GAAGG,CAAc,EAAE,QAAQ,CACtD,CAAC,EAEM,MAAMG,CAAoB,CAM7B,YAA6BK,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRJ,EACAC,EACAE,CACJ,EACAC,EAAI,QAAQ,iBAAiBD,EAA0BE,GAAgB,CACnE,UAAWC,KAAcD,EACrB,KAAK,YAAY,IAAIC,EAAW,GAAIA,CAAU,CAEtD,CAAC,EACDF,EAAI,QAAQ,QAAQ,IAAM,KAAK,OAAO,CAAC,CAC3C,CAjBgB,KAA2CP,EACnD,YAAc,IAAIP,EACT,sBAAwB,IAAIA,EAC5B,oBAAsB,IAAIC,EAgBnC,QAAe,CACf,KAAK,IAAI,IAAI,OAAS,WAGtB,KAAK,sBAAsB,KAAO,GAClC,KAAK,IAAI,KACLS,EACA,MAAM,KAAK,KAAK,sBAAsB,OAAO,CAAC,CAClD,EAEA,KAAK,oBAAoB,KAAO,GAChC,KAAK,IAAI,KACLC,EACA,MAAM,KAAK,KAAK,oBAAoB,OAAO,CAAC,CAChD,EAER,CAEO,SAASK,EAAkC,CAC1C,KAAK,IAAI,SACT,KAAK,IAAI,KAAKN,EAA4B,CAACM,CAAU,CAAC,EAE1D,KAAK,sBAAsB,IAAIA,EAAW,GAAIA,CAAU,CAC5D,CAEO,WAAWC,EAA+B,CAC7C,MAAMC,EAAMD,EAAc,IAAIlB,EAAW,IAAI,EACvCoB,EAAUD,EAAI,OAAQE,GAAO,CAAC,KAAK,YAAY,IAAIA,CAAE,CAAC,EAC5D,GAAI,KAAK,IAAI,QAAS,CAClB,GAAID,EAAQ,OAAS,EACjB,MAAM,IAAI,MAAM,yDAAyD,EAE7E,MACJ,CACA,UAAWC,KAAMF,EACb,KAAK,oBAAoB,IAAIE,CAAE,CAEvC,CAEA,MAAa,WAAWH,EAA4C,CAChE,MAAM,KAAK,IAAI,UAAU,KAAKL,EAA6BK,CAAa,CAC5E,CAEO,IAAII,EAA2C,CAClD,OAAO,KAAK,YAAY,IAAIA,CAAoB,CACpD,CAEO,SAASA,EAA2C,CACvD,OAAO,KAAK,oBAAoB,IAAIA,CAAoB,CAC5D,CACJ",
6
+ "names": ["Identifier", "IdentifierMap", "IdentifierSet", "PacketType", "Serializer", "EndpointType", "ExtensionType", "PermissionType", "PERMISSION_EXTENSION_TYPE", "client", "PermissionExtension", "PERMISSION_REGISTER_PACKET", "PERMISSION_REQUIRE_PACKET", "PERMISSION_REQUEST_ENDPOINT", "PERMISSION_GRANT_PACKET", "omu", "permissions", "permission", "permissionIds", "ids", "missing", "id", "permissionIdentifier"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{PermissionType as s}from"./permission.js";export{s as PermissionType};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/permission/index.ts"],
4
+ "sourcesContent": ["export { PermissionType, type PermissionLevel, type PermissionMetadata } from './permission.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,kBAAAA,MAAqE",
6
+ "names": ["PermissionType"]
7
+ }
@@ -17,7 +17,7 @@ export declare class PermissionType {
17
17
  id: Identifier;
18
18
  metadata: PermissionMetadata;
19
19
  });
20
- static create(identifier: IntoId, { metadata, }: {
20
+ static create(identifier: IntoId, { metadata }: {
21
21
  metadata: PermissionMetadata;
22
22
  }): PermissionType;
23
23
  static serialize(data: PermissionType): PermissionTypeJson;
@@ -0,0 +1,2 @@
1
+ import{Identifier as i}from"../../identifier";class t{id;metadata;constructor(e){this.id=e.id,this.metadata=e.metadata}static create(e,{metadata:a}){return new t({id:i.from(e),metadata:a})}static serialize(e){return{id:e.id.key(),metadata:e.metadata}}static deserialize(e){return new t({id:i.fromKey(e.id),metadata:e.metadata})}}export{t as PermissionType};
2
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/permission/permission.ts"],
4
+ "sourcesContent": ["import { Identifier, IntoId } from '../../identifier';\nimport type { LocalizedText } from '../../localization/localization.js';\n\nexport type PermissionLevel = 'low' | 'medium' | 'high';\n\nexport type PermissionMetadata = {\n name: LocalizedText;\n note?: LocalizedText;\n level: PermissionLevel;\n};\n\nexport type PermissionTypeJson = {\n id: string;\n metadata: PermissionMetadata;\n};\n\nexport class PermissionType {\n public readonly id: Identifier;\n public readonly metadata: PermissionMetadata;\n\n constructor(options: { id: Identifier; metadata: PermissionMetadata }) {\n this.id = options.id;\n this.metadata = options.metadata;\n }\n\n public static create(\n identifier: IntoId,\n {\n metadata,\n }: {\n metadata: PermissionMetadata;\n },\n ): PermissionType {\n return new PermissionType({\n id: Identifier.from(identifier),\n metadata: metadata,\n });\n }\n\n public static serialize(data: PermissionType): PermissionTypeJson {\n return {\n id: data.id.key(),\n metadata: data.metadata,\n };\n }\n\n public static deserialize(json: PermissionTypeJson): PermissionType {\n return new PermissionType({\n id: Identifier.fromKey(json.id),\n metadata: json.metadata,\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,MAA0B,mBAgB5B,MAAMC,CAAe,CACR,GACA,SAEhB,YAAYC,EAA2D,CACnE,KAAK,GAAKA,EAAQ,GAClB,KAAK,SAAWA,EAAQ,QAC5B,CAEA,OAAc,OACVC,EACA,CACI,SAAAC,CACJ,EAGc,CACd,OAAO,IAAIH,EAAe,CACtB,GAAID,EAAW,KAAKG,CAAU,EAC9B,SAAUC,CACd,CAAC,CACL,CAEA,OAAc,UAAUC,EAA0C,CAC9D,MAAO,CACH,GAAIA,EAAK,GAAG,IAAI,EAChB,SAAUA,EAAK,QACnB,CACJ,CAEA,OAAc,YAAYC,EAA0C,CAChE,OAAO,IAAIL,EAAe,CACtB,GAAID,EAAW,QAAQM,EAAK,EAAE,EAC9B,SAAUA,EAAK,QACnB,CAAC,CACL,CACJ",
6
+ "names": ["Identifier", "PermissionType", "options", "identifier", "metadata", "data", "json"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{PacketType as a}from"../../network/packet/packet.js";import{EndpointType as c}from"../endpoint/endpoint.js";import{ExtensionType as l}from"../extension.js";import{TableType as p}from"../table/table.js";const i=new l("plugin",n=>new g(n));class g{constructor(e){this.omu=e;e.network.registerPacket(s),e.network.addTask(()=>this.onTask())}type=i;requiredPlugins=new Map;getAllowedPackages(){return this.omu.tables.get(d)}reload(e){this.omu.endpoints.call(P,e)}async onTask(){this.omu.send(s,Object.fromEntries(this.requiredPlugins))}require(e){if(this.omu.running)throw new Error("Plugins must be required before the client starts");for(const[t,o]of Object.entries(e))this.requiredPlugins.set(t,o)}}const s=a.createJson(i,{name:"require"});class r{package;version;constructor(e,t){this.package=e,this.version=t}static serialize(e){return e.toJson()}static deserialize(e){return r.fromJson(e)}static fromJson(e){return new r(e.package,e.version)}toJson(){return{package:this.package,version:this.version}}key(){return this.package}}const v=i.join("package","read"),u=i.join("package","manage"),d=p.createJson(i,{name:"allowed_package",serializer:r,key:n=>n.key()}),P=c.createJson(i,{name:"reload",permissionId:u});export{i as PLUGIN_EXTENSION_TYPE,u as PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,v as PLUGIN_READ_PACKAGE_PERMISSION_ID,g as PluginExtension,r as PluginPackageInfo};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/plugin/extension.ts"],
4
+ "sourcesContent": ["import { Identifier } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { ExtensionType } from '../extension.js';\nimport { Table, TableType } from '../table/table.js';\n\nexport const PLUGIN_EXTENSION_TYPE: ExtensionType<PluginExtension> = new ExtensionType(\n 'plugin',\n (omu: Omu) => new PluginExtension(omu),\n);\n\nexport class PluginExtension {\n public readonly type: ExtensionType<PluginExtension> = PLUGIN_EXTENSION_TYPE;\n private readonly requiredPlugins: Map<string, string | null> = new Map();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(PLUGIN_REQUIRE_PACKET);\n omu.network.addTask(() => this.onTask());\n }\n\n public getAllowedPackages(): Table<PluginPackageInfo> {\n return this.omu.tables.get(PLUGIN_ALLOWED_PACKAGE_TABLE);\n }\n\n public reload(options: ReloadOptions): void {\n this.omu.endpoints.call(PLUGIN_RELOAD_ENDPOINT_TYPE, options);\n }\n\n private async onTask(): Promise<void> {\n this.omu.send(PLUGIN_REQUIRE_PACKET, Object.fromEntries(this.requiredPlugins));\n }\n\n public require(plugins: Record<string, string | null>): void {\n if (this.omu.running) {\n throw new Error('Plugins must be required before the client starts');\n }\n for (const [key, value] of Object.entries(plugins)) {\n this.requiredPlugins.set(key, value);\n }\n }\n}\n\nconst PLUGIN_REQUIRE_PACKET = PacketType.createJson<Record<string, string | null>>(\n PLUGIN_EXTENSION_TYPE,\n {\n name: 'require',\n },\n);\nexport class PluginPackageInfo {\n public package: string;\n public version: string;\n\n constructor(_package: string, version: string) {\n this.package = _package;\n this.version = version;\n }\n\n public static serialize(data: PluginPackageInfo): { package: string; version: string } {\n return data.toJson();\n }\n\n public static deserialize(data: { package: string; version: string }): PluginPackageInfo {\n return PluginPackageInfo.fromJson(data);\n }\n\n public static fromJson(json: { package: string; version: string }): PluginPackageInfo {\n return new PluginPackageInfo(json.package, json.version);\n }\n\n public toJson(): { package: string; version: string } {\n return { package: this.package, version: this.version };\n }\n\n public key(): string {\n return this.package;\n }\n}\n\nexport const PLUGIN_READ_PACKAGE_PERMISSION_ID: Identifier = PLUGIN_EXTENSION_TYPE.join('package', 'read');\nexport const PLUGIN_MANAGE_PACKAGE_PERMISSION_ID: Identifier = PLUGIN_EXTENSION_TYPE.join('package', 'manage');\n\nconst PLUGIN_ALLOWED_PACKAGE_TABLE = TableType.createJson(PLUGIN_EXTENSION_TYPE, {\n name: 'allowed_package',\n serializer: PluginPackageInfo,\n key: (item) => item.key(),\n});\n\ntype ReloadOptions = {\n packages: string[] | null;\n};\n\ntype ReloadResult = {\n packages: Record<string, string>;\n};\n\nconst PLUGIN_RELOAD_ENDPOINT_TYPE = EndpointType.createJson<ReloadOptions, ReloadResult>(PLUGIN_EXTENSION_TYPE, {\n name: 'reload',\n permissionId: PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,\n});\n"],
5
+ "mappings": "AACA,OAAS,cAAAA,MAAkB,iCAE3B,OAAS,gBAAAC,MAAoB,0BAC7B,OAAS,iBAAAC,MAAqB,kBAC9B,OAAgB,aAAAC,MAAiB,oBAE1B,MAAMC,EAAwD,IAAIF,EACrE,SACCG,GAAa,IAAIC,EAAgBD,CAAG,CACzC,EAEO,MAAMC,CAAgB,CAIzB,YAA6BD,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eAAeE,CAAqB,EAChDF,EAAI,QAAQ,QAAQ,IAAM,KAAK,OAAO,CAAC,CAC3C,CANgB,KAAuCD,EACtC,gBAA8C,IAAI,IAO5D,oBAA+C,CAClD,OAAO,KAAK,IAAI,OAAO,IAAII,CAA4B,CAC3D,CAEO,OAAOC,EAA8B,CACxC,KAAK,IAAI,UAAU,KAAKC,EAA6BD,CAAO,CAChE,CAEA,MAAc,QAAwB,CAClC,KAAK,IAAI,KAAKF,EAAuB,OAAO,YAAY,KAAK,eAAe,CAAC,CACjF,CAEO,QAAQI,EAA8C,CACzD,GAAI,KAAK,IAAI,QACT,MAAM,IAAI,MAAM,mDAAmD,EAEvE,SAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQF,CAAO,EAC7C,KAAK,gBAAgB,IAAIC,EAAKC,CAAK,CAE3C,CACJ,CAEA,MAAMN,EAAwBP,EAAW,WACrCI,EACA,CACI,KAAM,SACV,CACJ,EACO,MAAMU,CAAkB,CACpB,QACA,QAEP,YAAYC,EAAkBC,EAAiB,CAC3C,KAAK,QAAUD,EACf,KAAK,QAAUC,CACnB,CAEA,OAAc,UAAUC,EAA+D,CACnF,OAAOA,EAAK,OAAO,CACvB,CAEA,OAAc,YAAYA,EAA+D,CACrF,OAAOH,EAAkB,SAASG,CAAI,CAC1C,CAEA,OAAc,SAASC,EAA+D,CAClF,OAAO,IAAIJ,EAAkBI,EAAK,QAASA,EAAK,OAAO,CAC3D,CAEO,QAA+C,CAClD,MAAO,CAAE,QAAS,KAAK,QAAS,QAAS,KAAK,OAAQ,CAC1D,CAEO,KAAc,CACjB,OAAO,KAAK,OAChB,CACJ,CAEO,MAAMC,EAAgDf,EAAsB,KAAK,UAAW,MAAM,EAC5FgB,EAAkDhB,EAAsB,KAAK,UAAW,QAAQ,EAEvGI,EAA+BL,EAAU,WAAWC,EAAuB,CAC7E,KAAM,kBACN,WAAYU,EACZ,IAAMO,GAASA,EAAK,IAAI,CAC5B,CAAC,EAUKX,EAA8BT,EAAa,WAAwCG,EAAuB,CAC5G,KAAM,SACN,aAAcgB,CAClB,CAAC",
6
+ "names": ["PacketType", "EndpointType", "ExtensionType", "TableType", "PLUGIN_EXTENSION_TYPE", "omu", "PluginExtension", "PLUGIN_REQUIRE_PACKET", "PLUGIN_ALLOWED_PACKAGE_TABLE", "options", "PLUGIN_RELOAD_ENDPOINT_TYPE", "plugins", "key", "value", "PluginPackageInfo", "_package", "version", "data", "json", "PLUGIN_READ_PACKAGE_PERMISSION_ID", "PLUGIN_MANAGE_PACKAGE_PERMISSION_ID", "item"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{PLUGIN_MANAGE_PACKAGE_PERMISSION_ID as _,PLUGIN_READ_PACKAGE_PERMISSION_ID as o,PluginPackageInfo as A}from"./extension.js";export{_ as PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,o as PLUGIN_READ_PACKAGE_PERMISSION_ID,A as PluginPackageInfo};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/plugin/index.ts"],
4
+ "sourcesContent": ["export { PLUGIN_MANAGE_PACKAGE_PERMISSION_ID, PLUGIN_READ_PACKAGE_PERMISSION_ID, PluginPackageInfo } from './extension.js';\nexport type { PackageInfo } from './package-info.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,uCAAAA,EAAqC,qCAAAC,EAAmC,qBAAAC,MAAyB",
6
+ "names": ["PLUGIN_MANAGE_PACKAGE_PERMISSION_ID", "PLUGIN_READ_PACKAGE_PERMISSION_ID", "PluginPackageInfo"]
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=package-info.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -10,7 +10,7 @@ export declare class RegistryExtension implements Extension {
10
10
  constructor(omu: Omu);
11
11
  private createRegistry;
12
12
  get<T>(registryType: RegistryType<T>): Registry<T>;
13
- json<T, D extends JsonType = JsonType>(name: string, options: {
13
+ json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: {
14
14
  default: T;
15
15
  serializer?: Serializer<T, D>;
16
16
  }): Registry<T>;
@@ -0,0 +1,2 @@
1
+ import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/registry/extension.ts"],
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "RegistryImpl", "identifier", "registry", "name", "options", "tableType", "type", "packet", "#get", "result", "REGISTRY_GET_ENDPOINT", "#set", "value", "fn", "newValue", "handler", "data", "isReady", "context", "handle", "listeners", "emit", "unsubscribe", "proxied", "proxy", "listener", "PROXIED_SYMBOL", "run", "resolve", "deepEqual", "objA", "objB", "keysA", "keysB", "key", "changed", "target", "prop", "p", "REGISTRY_PERMISSION_ID"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{REGISTRY_PERMISSION_ID as t}from"./extension.js";import{RegistryType as y}from"./registry.js";export{t as REGISTRY_PERMISSION_ID,y as RegistryType};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/registry/index.ts"],
4
+ "sourcesContent": ["export { REGISTRY_PERMISSION_ID } from './extension.js';\nexport { RegistryType, type Registry, type RegistryPermissions } from './registry.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,0BAAAA,MAA8B,iBACvC,OAAS,gBAAAC,MAA6D",
6
+ "names": ["REGISTRY_PERMISSION_ID", "RegistryType"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as i}from"../../identifier";import{ByteReader as o,ByteWriter as l}from"../../serialize";class t{constructor(r,e){this.id=r;this.value=e}static serialize(r){const e=new l;return e.writeString(r.id.key()),e.writeBoolean(r.value!==null),r.value!==null&&e.writeUint8Array(r.value),e.finish()}static deserialize(r){const e=o.fromUint8Array(r),n=i.fromKey(e.readString()),a=e.readBoolean()?e.readUint8Array():null;return new t(n,a)}}class s{constructor(r,e){this.id=r;this.permissions=e}static serialize(r){const{permissions:e}=r;return{id:r.id.key(),permissions:{all:e.all?i.from(e.all).key():void 0,read:e.read?i.from(e.read).key():void 0,write:e.write?i.from(e.write).key():void 0}}}static deserialize(r){const{permissions:e}=r;return new s(i.from(r.id),{all:e.all?i.from(e.all):void 0,read:e.read?i.from(e.read):void 0,write:e.write?i.from(e.write):void 0})}}export{s as RegisterPacket,t as RegistryPacket};
2
+ //# sourceMappingURL=packets.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/registry/packets.ts"],
4
+ "sourcesContent": ["import { Identifier } from '../../identifier';\nimport { ByteReader, ByteWriter } from '../../serialize';\nimport { RegistryPermissions, RegistryPermissionsJSON } from './registry';\n\nexport class RegistryPacket {\n constructor(\n public readonly id: Identifier,\n public readonly value: Uint8Array | null,\n ) { }\n\n public static serialize(packet: RegistryPacket): Uint8Array {\n const writer = new ByteWriter();\n writer.writeString(packet.id.key());\n writer.writeBoolean(packet.value !== null);\n if (packet.value !== null) {\n writer.writeUint8Array(packet.value);\n }\n return writer.finish();\n }\n\n public static deserialize(data: Uint8Array): RegistryPacket {\n const reader = ByteReader.fromUint8Array(data);\n const id = Identifier.fromKey(reader.readString());\n const existing = reader.readBoolean();\n const value = existing ? reader.readUint8Array() : null;\n return new RegistryPacket(id, value);\n }\n}\n\nexport interface RegisterPacketJSON {\n id: string;\n permissions: RegistryPermissionsJSON;\n}\n\nexport class RegisterPacket {\n constructor(\n public readonly id: Identifier,\n public readonly permissions: RegistryPermissions,\n ) {}\n\n public static serialize(packet: RegisterPacket): RegisterPacketJSON {\n const { permissions: perms } = packet;\n return {\n id: packet.id.key(),\n permissions: {\n all: perms.all ? Identifier.from(perms.all).key() : undefined,\n read: perms.read ? Identifier.from(perms.read).key() : undefined,\n write: perms.write ? Identifier.from(perms.write).key() : undefined,\n },\n };\n }\n\n public static deserialize(data: RegisterPacketJSON): RegisterPacket {\n const { permissions: perms } = data;\n return new RegisterPacket(\n Identifier.from(data.id),\n {\n all: perms.all ? Identifier.from(perms.all) : undefined,\n read: perms.read ? Identifier.from(perms.read) : undefined,\n write: perms.write ? Identifier.from(perms.write) : undefined,\n },\n );\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,MAAkB,mBAC3B,OAAS,cAAAC,EAAY,cAAAC,MAAkB,kBAGhC,MAAMC,CAAe,CACxB,YACoBC,EACAC,EAClB,CAFkB,QAAAD,EACA,WAAAC,CAChB,CAEJ,OAAc,UAAUC,EAAoC,CACxD,MAAMC,EAAS,IAAIL,EACnB,OAAAK,EAAO,YAAYD,EAAO,GAAG,IAAI,CAAC,EAClCC,EAAO,aAAaD,EAAO,QAAU,IAAI,EACrCA,EAAO,QAAU,MACjBC,EAAO,gBAAgBD,EAAO,KAAK,EAEhCC,EAAO,OAAO,CACzB,CAEA,OAAc,YAAYC,EAAkC,CACxD,MAAMC,EAASR,EAAW,eAAeO,CAAI,EACvCJ,EAAKJ,EAAW,QAAQS,EAAO,WAAW,CAAC,EAE3CJ,EADWI,EAAO,YAAY,EACXA,EAAO,eAAe,EAAI,KACnD,OAAO,IAAIN,EAAeC,EAAIC,CAAK,CACvC,CACJ,CAOO,MAAMK,CAAe,CACxB,YACoBN,EACAO,EAClB,CAFkB,QAAAP,EACA,iBAAAO,CACjB,CAEH,OAAc,UAAUL,EAA4C,CAChE,KAAM,CAAE,YAAaM,CAAM,EAAIN,EAC/B,MAAO,CACH,GAAIA,EAAO,GAAG,IAAI,EAClB,YAAa,CACT,IAAKM,EAAM,IAAMZ,EAAW,KAAKY,EAAM,GAAG,EAAE,IAAI,EAAI,OACpD,KAAMA,EAAM,KAAOZ,EAAW,KAAKY,EAAM,IAAI,EAAE,IAAI,EAAI,OACvD,MAAOA,EAAM,MAAQZ,EAAW,KAAKY,EAAM,KAAK,EAAE,IAAI,EAAI,MAC9D,CACJ,CACJ,CAEA,OAAc,YAAYJ,EAA0C,CAChE,KAAM,CAAE,YAAaI,CAAM,EAAIJ,EAC/B,OAAO,IAAIE,EACPV,EAAW,KAAKQ,EAAK,EAAE,EACvB,CACI,IAAKI,EAAM,IAAMZ,EAAW,KAAKY,EAAM,GAAG,EAAI,OAC9C,KAAMA,EAAM,KAAOZ,EAAW,KAAKY,EAAM,IAAI,EAAI,OACjD,MAAOA,EAAM,MAAQZ,EAAW,KAAKY,EAAM,KAAK,EAAI,MACxD,CACJ,CACJ,CACJ",
6
+ "names": ["Identifier", "ByteReader", "ByteWriter", "RegistryPacket", "id", "value", "packet", "writer", "data", "reader", "RegisterPacket", "permissions", "perms"]
7
+ }
@@ -17,13 +17,13 @@ export declare class RegistryType<T> {
17
17
  readonly serializer: Serializable<T, Uint8Array>;
18
18
  readonly permissions: RegistryPermissions;
19
19
  constructor(id: Identifier, defaultValue: T, serializer: Serializable<T, Uint8Array>, permissions: RegistryPermissions);
20
- static createJson<T, D extends JsonType = JsonType>(identifier: IntoId, { name, defaultValue, permissions, serializer, }: {
20
+ static createJson<T, D extends JsonType = JsonType>(identifier: IntoId, { name, defaultValue, permissions, serializer }: {
21
21
  name: string;
22
22
  defaultValue: T;
23
23
  permissions?: RegistryPermissions;
24
24
  serializer?: Serializable<T, D>;
25
25
  }): RegistryType<T>;
26
- static createSerialized<T>(identifier: IntoId, { name, defaultValue, serializer, permissions, }: {
26
+ static createSerialized<T>(identifier: IntoId, { name, defaultValue, serializer, permissions }: {
27
27
  name: string;
28
28
  defaultValue: T;
29
29
  serializer: Serializable<T, Uint8Array>;
@@ -0,0 +1,2 @@
1
+ import{Identifier as n}from"../../identifier";import{Serializer as s}from"../../serialize";class a{constructor(e,i,r,t){this.id=e;this.defaultValue=i;this.serializer=r;this.permissions=t}static createJson(e,{name:i,defaultValue:r,permissions:t,serializer:o}){return new a(n.from(e).join(i),r,s.pipe(o??s.noop(),s.json()),t??{})}static createSerialized(e,{name:i,defaultValue:r,serializer:t,permissions:o}){return new a(n.from(e).join(i),r,t,o??{})}}export{a as RegistryType};
2
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/registry/registry.ts"],
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport interface RegistryPermissionsJSON {\n all?: string;\n read?: string;\n write?: string;\n}\n\nexport interface RegistryPermissions {\n all?: IntoId;\n read?: IntoId;\n write?: IntoId;\n}\n\nexport class RegistryType<T> {\n constructor(\n public readonly id: Identifier,\n public readonly defaultValue: T,\n public readonly serializer: Serializable<T, Uint8Array>,\n public readonly permissions: RegistryPermissions,\n ) { }\n\n public static createJson<T, D extends JsonType = JsonType>(identifier: IntoId, {\n name,\n defaultValue,\n permissions,\n serializer,\n }: {\n name: string;\n defaultValue: T;\n permissions?: RegistryPermissions;\n serializer?: Serializable<T, D>;\n }): RegistryType<T> {\n return new RegistryType(\n Identifier.from(identifier).join(name),\n defaultValue,\n Serializer.pipe<T, D, Uint8Array>(serializer ?? Serializer.noop(), Serializer.json()),\n permissions ?? {},\n );\n }\n\n public static createSerialized<T>(identifier: IntoId, {\n name,\n defaultValue,\n serializer,\n permissions,\n }: {\n name: string;\n defaultValue: T;\n serializer: Serializable<T, Uint8Array>;\n permissions?: RegistryPermissions;\n }): RegistryType<T> {\n return new RegistryType(\n Identifier.from(identifier).join(name),\n defaultValue,\n serializer,\n permissions ?? {},\n );\n }\n}\n\nexport interface Registry<T> {\n readonly type: RegistryType<T>;\n readonly value: T;\n get(): Promise<T>;\n set(value: T): Promise<void>;\n update(fn: (value: T) => PromiseLike<T> | T): Promise<T>;\n modify(fn: (value: T) => PromiseLike<void> | void): Promise<T>;\n listen(fn: (value: T) => void): Unlisten;\n\n compatSvelte(): Writable<T>;\n}\n\nexport type Subscriber<T> = (value: T) => void;\n\nexport type Unsubscriber = () => void;\n\nexport type Updater<T> = (value: T) => T;\n\nexport type StartStopNotifier<T> = (\n set: (value: T) => void,\n update: (fn: Updater<T>) => void\n) => void | (() => void);\n\nexport interface Readable<T> {\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n wait(): Promise<T>;\n}\n"],
5
+ "mappings": "AACA,OAAS,cAAAA,MAA0B,mBAEnC,OAAS,cAAAC,MAAkB,kBAcpB,MAAMC,CAAgB,CACzB,YACoBC,EACAC,EACAC,EACAC,EAClB,CAJkB,QAAAH,EACA,kBAAAC,EACA,gBAAAC,EACA,iBAAAC,CAChB,CAEJ,OAAc,WAA6CC,EAAoB,CAC3E,KAAAC,EACA,aAAAJ,EACA,YAAAE,EACA,WAAAD,CACJ,EAKoB,CAChB,OAAO,IAAIH,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCJ,EACAH,EAAW,KAAuBI,GAAcJ,EAAW,KAAK,EAAGA,EAAW,KAAK,CAAC,EACpFK,GAAe,CAAC,CACpB,CACJ,CAEA,OAAc,iBAAoBC,EAAoB,CAClD,KAAAC,EACA,aAAAJ,EACA,WAAAC,EACA,YAAAC,CACJ,EAKoB,CAChB,OAAO,IAAIJ,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCJ,EACAC,EACAC,GAAe,CAAC,CACpB,CACJ,CACJ",
6
+ "names": ["Identifier", "Serializer", "RegistryType", "id", "defaultValue", "serializer", "permissions", "identifier", "name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{App as o}from"../../app.js";import{Identifier as a,IdentifierMap as c}from"../../identifier";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as R}from"../extension.js";import{RegistryType as l}from"../registry";import{TableType as u}from"../table";const t=new R("server",n=>new P(n)),S=t.join("apps","read"),I=t.join("apps","write"),y=t.join("index","read"),_=l.createJson(t,{name:"index",defaultValue:{indexes:{}},permissions:{write:I,read:y}}),A=u.createJson(t,{name:"apps",serializer:o,key:n=>n.id.key(),permissions:{all:I,read:S}}),T=t.join("shutdown"),f=x.createJson(t,{name:"shutdown",permissionId:T}),b=t.join("trusted_origins","get"),g=t.join("trusted_origins","set"),O=l.createJson(t,{name:"trusted_hosts",defaultValue:{},permissions:{read:b,write:g}});class P{constructor(e){this.omu=e;this.apps=e.tables.get(A),this.index=e.registries.get(_),this.trustedHosts=e.registries.get(O)}type=t;apps;index;trustedHosts;async shutdown(e){return this.omu.endpoints.call(f,e??!1),await new Promise(i=>{const r=this.omu.network.event.disconnected.listen(()=>{i(),r()})}),!0}}class G{constructor(e,i){this.onConnectCallbacks=e;this.onDisconnectCallbacks=i}onConnect(e){this.onConnectCallbacks.push(e)}onDisconnect(e){this.onDisconnectCallbacks.push(e)}}class d{constructor(e,i,r){this.id=e;this.apps=i;this.meta=r}static build(e){return new d(a.from(e.id),new c(e.apps.map(i=>[i.id,i])),e.meta)}static fromJSON(e){const i=a.fromKey(e.id),r=new c;for(const[m,E]of Object.entries(e.apps)){const s=a.fromKey(m),p=o.deserialize(E);if(!s.isNamespaceEqual(p.id))throw new Error(`App ID does not match the ID in the index. ${p.id} != ${s}`);r.set(s,p)}return new d(i,r,e.meta)}toJSON(){return{id:this.id.key(),meta:this.meta,apps:Object.fromEntries([...this.apps.entries()].map(([e,i])=>[e.key(),o.serialize(i)]))}}}export{d as AppIndexRegistry,S as SERVER_APPS_READ_PERMISSION_ID,I as SERVER_APPS_WRITE_PERMISSION_ID,t as SERVER_EXTENSION_TYPE,y as SERVER_INDEX_READ_PERMISSION_ID,_ as SERVER_INDEX_REGISTRY_TYPE,T as SERVER_SHUTDOWN_PERMISSION_ID,P as ServerExtension,G as SessionObserver,b as TRUSTED_ORIGINS_GET_PERMISSION_ID,g as TRUSTED_ORIGINS_SET_PERMISSION_ID};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/server/extension.ts"],
4
+ "sourcesContent": ["import { App, AppJson } from '../../app.js';\nimport { Identifier, IdentifierMap, IntoId } from '../../identifier';\nimport { LocalizedText } from '../../localization/localization.js';\nimport { Omu } from '../../omu.js';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { ExtensionType, type Extension } from '../extension.js';\nimport { Registry, RegistryType } from '../registry';\nimport { TableType, type Table } from '../table';\n\nexport const SERVER_EXTENSION_TYPE: ExtensionType<ServerExtension> = new ExtensionType(\n 'server',\n (omu: Omu) => new ServerExtension(omu),\n);\n\nexport interface AppIndexEntry {\n url: string;\n meta?: AppIndexRegistryMeta;\n added_at: string;\n};\n\nexport interface AppIndex {\n indexes: Record<string, AppIndexEntry>;\n};\n\nexport const SERVER_APPS_READ_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('apps', 'read');\nexport const SERVER_APPS_WRITE_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('apps', 'write');\nexport const SERVER_INDEX_READ_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('index', 'read');\nexport const SERVER_INDEX_REGISTRY_TYPE: RegistryType<AppIndex> = RegistryType.createJson<AppIndex>(SERVER_EXTENSION_TYPE, {\n name: 'index',\n defaultValue: { 'indexes': {} },\n permissions: {\n write: SERVER_APPS_WRITE_PERMISSION_ID,\n read: SERVER_INDEX_READ_PERMISSION_ID,\n },\n});\nconst APP_TABLE_TYPE = TableType.createJson(SERVER_EXTENSION_TYPE, {\n name: 'apps',\n serializer: App,\n key: (app) => app.id.key(),\n permissions: {\n all: SERVER_APPS_WRITE_PERMISSION_ID,\n read: SERVER_APPS_READ_PERMISSION_ID,\n },\n});\n\nexport const SERVER_SHUTDOWN_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('shutdown');\nconst SHUTDOWN_ENDPOINT_TYPE = EndpointType.createJson<boolean, boolean>(SERVER_EXTENSION_TYPE, {\n name: 'shutdown',\n permissionId: SERVER_SHUTDOWN_PERMISSION_ID,\n});\nexport const TRUSTED_ORIGINS_GET_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('trusted_origins', 'get');\nexport const TRUSTED_ORIGINS_SET_PERMISSION_ID: Identifier = SERVER_EXTENSION_TYPE.join('trusted_origins', 'set');\nconst TRUSTED_HOSTS_REGISTRY_TYPE = RegistryType.createJson<Record<string, string>>(SERVER_EXTENSION_TYPE, {\n name: 'trusted_hosts',\n defaultValue: {},\n permissions: {\n read: TRUSTED_ORIGINS_GET_PERMISSION_ID,\n write: TRUSTED_ORIGINS_SET_PERMISSION_ID,\n },\n});\n\nexport class ServerExtension implements Extension {\n public readonly type: ExtensionType<ServerExtension> = SERVER_EXTENSION_TYPE;\n public readonly apps: Table<App>;\n public readonly index: Registry<AppIndex>;\n public readonly trustedHosts: Registry<Record<string, string>>;\n\n constructor(private readonly omu: Omu) {\n this.apps = omu.tables.get(APP_TABLE_TYPE);\n this.index = omu.registries.get(SERVER_INDEX_REGISTRY_TYPE);\n this.trustedHosts = omu.registries.get(TRUSTED_HOSTS_REGISTRY_TYPE);\n }\n\n public async shutdown(restart?: boolean): Promise<boolean> {\n this.omu.endpoints.call(SHUTDOWN_ENDPOINT_TYPE, restart ?? false);\n await new Promise<void>((resolve) => {\n const unlisten = this.omu.network.event.disconnected.listen(() => {\n resolve();\n unlisten();\n });\n });\n return true;\n }\n}\n\nexport class SessionObserver {\n constructor(\n public readonly onConnectCallbacks: Array<(app: App) => Promise<void> | void>,\n public readonly onDisconnectCallbacks: Array<(app: App) => Promise<void> | void>,\n ) { }\n\n public onConnect(callback: (app: App) => Promise<void> | void): void {\n this.onConnectCallbacks.push(callback);\n }\n\n public onDisconnect(callback: (app: App) => Promise<void> | void): void {\n this.onDisconnectCallbacks.push(callback);\n }\n}\n\nexport type AppIndexRegistryMeta = {\n name: LocalizedText;\n note: LocalizedText;\n};\n\nexport interface AppIndexRegistryJSON {\n id: string;\n meta?: AppIndexRegistryMeta;\n apps: Record<string, AppJson>;\n}\n\nexport class AppIndexRegistry {\n constructor(\n public id: Identifier,\n public apps: IdentifierMap<App>,\n public meta: AppIndexRegistryMeta | undefined,\n ) { }\n\n public static build(options: { id: IntoId; meta: AppIndexRegistryMeta; apps: App[] }): AppIndexRegistry {\n return new AppIndexRegistry(\n Identifier.from(options.id),\n new IdentifierMap(options.apps.map((app) => [app.id, app])),\n options.meta,\n );\n }\n\n public static fromJSON(json: AppIndexRegistryJSON): AppIndexRegistry {\n const id = Identifier.fromKey(json['id']);\n const apps = new IdentifierMap<App>();\n for (const [idStr, appJSON] of Object.entries(json['apps'])) {\n const id = Identifier.fromKey(idStr);\n const app = App.deserialize(appJSON);\n if (!id.isNamespaceEqual(app.id)) {\n throw new Error(`App ID does not match the ID in the index. ${app.id} != ${id}`);\n }\n apps.set(id, app);\n }\n return new AppIndexRegistry(\n id,\n apps,\n json.meta,\n );\n }\n\n public toJSON(): AppIndexRegistryJSON {\n return {\n id: this.id.key(),\n meta: this.meta,\n apps: Object.fromEntries([...this.apps.entries()].map(([id, app]) => [\n id.key(),\n App.serialize(app),\n ])),\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["App", "Identifier", "IdentifierMap", "EndpointType", "ExtensionType", "RegistryType", "TableType", "SERVER_EXTENSION_TYPE", "omu", "ServerExtension", "SERVER_APPS_READ_PERMISSION_ID", "SERVER_APPS_WRITE_PERMISSION_ID", "SERVER_INDEX_READ_PERMISSION_ID", "SERVER_INDEX_REGISTRY_TYPE", "APP_TABLE_TYPE", "app", "SERVER_SHUTDOWN_PERMISSION_ID", "SHUTDOWN_ENDPOINT_TYPE", "TRUSTED_ORIGINS_GET_PERMISSION_ID", "TRUSTED_ORIGINS_SET_PERMISSION_ID", "TRUSTED_HOSTS_REGISTRY_TYPE", "restart", "resolve", "unlisten", "SessionObserver", "onConnectCallbacks", "onDisconnectCallbacks", "callback", "AppIndexRegistry", "id", "apps", "meta", "options", "json", "idStr", "appJSON"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{AppIndexRegistry as R,SERVER_APPS_READ_PERMISSION_ID as _,SERVER_SHUTDOWN_PERMISSION_ID as E,TRUSTED_ORIGINS_GET_PERMISSION_ID as p,TRUSTED_ORIGINS_SET_PERMISSION_ID as e}from"./extension.js";export{R as AppIndexRegistry,_ as SERVER_APPS_READ_PERMISSION_ID,E as SERVER_SHUTDOWN_PERMISSION_ID,p as TRUSTED_ORIGINS_GET_PERMISSION_ID,e as TRUSTED_ORIGINS_SET_PERMISSION_ID};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/server/index.ts"],
4
+ "sourcesContent": ["export {\n AppIndexRegistry,\n SERVER_APPS_READ_PERMISSION_ID,\n SERVER_SHUTDOWN_PERMISSION_ID,\n TRUSTED_ORIGINS_GET_PERMISSION_ID,\n TRUSTED_ORIGINS_SET_PERMISSION_ID,\n type AppIndex,\n type AppIndexEntry,\n type AppIndexRegistryJSON,\n} from './extension.js';\n\n"],
5
+ "mappings": "AAAA,OACI,oBAAAA,EACA,kCAAAC,EACA,iCAAAC,EACA,qCAAAC,EACA,qCAAAC,MAIG",
6
+ "names": ["AppIndexRegistry", "SERVER_APPS_READ_PERMISSION_ID", "SERVER_SHUTDOWN_PERMISSION_ID", "TRUSTED_ORIGINS_GET_PERMISSION_ID", "TRUSTED_ORIGINS_SET_PERMISSION_ID"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{App as t}from"../../app";import{Identifier as o,IdentifierMap as u,IdentifierSet as f}from"../../identifier";import{PacketType as p}from"../../network/packet";import{Serializer as m}from"../../serialize";import{EndpointType as d}from"../endpoint";import{ExtensionType as S}from"../extension";import{SessionObserver as I}from"../server/extension";import{TableType as T}from"../table";const r=new S("sessions",i=>new k(i)),A=r.join("read"),_=T.createJson(r,{name:"sessions",serializer:t,key:i=>i.id.key(),permissions:{read:A}}),E=p.createJson(r,{name:"require",serializer:m.of(o).toArray()}),c=p.createJson(r,{name:"observe",serializer:m.of(o).toArray()}),l=p.createJson(r,{name:"session_connected",serializer:t}),y=p.createJson(r,{name:"session_disconnected",serializer:t}),P=r.join("remote_app","request"),h=d.createJson(r,{name:"remote_app_request",permissionId:P}),R=r.join("generate_token"),b=d.createJson(r,{name:"generate_token",permissionId:R});class k{constructor(e){this.omu=e;e.network.registerPacket(E,c,l,y),e.network.addPacketHandler(l,s=>this.handleSessionConnect(s)),e.network.addPacketHandler(y,s=>this.handleSessionDisconnect(s)),this.sessions=e.tables.get(_),e.network.addTask(()=>this.onTask()),e.onReady(()=>this.onReady())}type=r;sessions;sessionObservers=new u;requiredApps=new f;async has(e){return await this.sessions.has(o.from(e).key())}observe(e,s){const n=o.from(e);this.omu.running&&this.omu.send(c,[n]);const a=this.sessionObservers.get(n)??new I([],[]);return s?.onConnect&&a.onConnect(s.onConnect),s?.onDisconnect&&a.onDisconnect(s.onDisconnect),this.sessionObservers.set(n,a),a}async handleSessionConnect(e){const s=this.sessionObservers.get(e.id);if(s)for(const n of s.onConnectCallbacks)await n(e)}async handleSessionDisconnect(e){const s=this.sessionObservers.get(e.id);if(s)for(const n of s.onDisconnectCallbacks)await n(e)}require(...e){if(this.omu.running)throw new Error("Cannot require apps after the client has started");for(const s of e)this.requiredApps.add(o.from(s))}async onTask(){this.requiredApps.size>0&&this.omu.send(E,Array.from(this.requiredApps.values()))}async onReady(){this.sessionObservers.size>0&&this.omu.send(c,Array.from(this.sessionObservers.keys()))}async requestRemoteApp(e){const{app:s}=e;if(!s.url)throw new Error("App must have a URL to request it remotely");if(s.type!=="remote")throw new Error("App must be a remote app to request it remotely");if(!s.metadata)throw new Error("App must have metadata to request it remotely");return this.omu.endpoints.call(h,{app:t.serialize(e.app),permissions:e.permissions.map(n=>o.from(n).key())})}async generateToken(e){const s=await this.omu.endpoints.call(b,{app:t.serialize(e.app),permissions:e.permissions?.map(n=>o.from(n).key())});if(s.type==="error")throw new Error(s.message);return{token:s.token,address:this.omu.address}}}export{R as GENERATE_TOKEN_PERMISSION_ID,P as REMOTE_APP_REQUEST_PERMISSION_ID,A as SESSIONS_READ_PERMISSION_ID,r as SESSION_EXTENSION_TYPE,k as SessionExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/session/extension.ts"],
4
+ "sourcesContent": ["import { App, AppJson } from '../../app';\nimport { Identifier, IdentifierMap, IdentifierSet, IntoId } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { Serializer } from '../../serialize';\nimport { SessionParam } from '../../token';\nimport { EndpointType } from '../endpoint';\nimport { Extension, ExtensionType } from '../extension';\nimport { SessionObserver } from '../server/extension';\nimport { Table, TableType } from '../table';\n\nexport const SESSION_EXTENSION_TYPE: ExtensionType<SessionExtension> = new ExtensionType('sessions', (omu: Omu) => new SessionExtension(omu));\n\nexport const SESSIONS_READ_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('read');\nconst SESSION_TABLE_TYPE = TableType.createJson(SESSION_EXTENSION_TYPE, {\n name: 'sessions',\n serializer: App,\n key: (app) => app.id.key(),\n permissions: {\n read: SESSIONS_READ_PERMISSION_ID,\n },\n});\nconst REQUIRE_APPS_PACKET_TYPE = PacketType.createJson<Identifier[]>(SESSION_EXTENSION_TYPE, {\n name: 'require',\n serializer: Serializer.of(Identifier).toArray(),\n});\nconst SESSION_OBSERVE_PACKET_TYPE = PacketType.createJson<Identifier[]>(SESSION_EXTENSION_TYPE, {\n name: 'observe',\n serializer: Serializer.of(Identifier).toArray(),\n});\nconst SESSION_CONNECTED_PACKET_TYPE = PacketType.createJson<App>(SESSION_EXTENSION_TYPE, {\n name: 'session_connected',\n serializer: App,\n});\nconst SESSION_DISCONNECTED_PACKET_TYPE = PacketType.createJson<App>(SESSION_EXTENSION_TYPE, {\n name: 'session_disconnected',\n serializer: App,\n});\n\ntype RemoteAppRequestPayload = {\n app: AppJson;\n permissions: string[];\n};\n\nexport type RequestRemoteAppResponse = {\n type: 'success';\n token: string;\n lan_ip: string;\n} | {\n type: 'error';\n message: string;\n};\n\nexport const REMOTE_APP_REQUEST_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('remote_app', 'request');\n\nconst REMOTE_APP_REQUEST_ENDPOINT_TYPE = EndpointType.createJson<RemoteAppRequestPayload, RequestRemoteAppResponse>(SESSION_EXTENSION_TYPE, {\n name: 'remote_app_request',\n permissionId: REMOTE_APP_REQUEST_PERMISSION_ID,\n});\n\nexport type GenerateTokenResponse = {\n type: 'success';\n token: string;\n} | {\n type: 'error';\n message: string;\n};\n\nexport const GENERATE_TOKEN_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('generate_token');\n\ntype GenerateTokenPayload = {\n app: AppJson;\n permissions: string[];\n};\n\nconst GENERATE_TOKEN_ENDPOINT_TYPE = EndpointType.createJson<GenerateTokenPayload, GenerateTokenResponse>(SESSION_EXTENSION_TYPE, {\n name: 'generate_token',\n permissionId: GENERATE_TOKEN_PERMISSION_ID,\n});\n\nexport class SessionExtension implements Extension {\n public readonly type: ExtensionType<SessionExtension> = SESSION_EXTENSION_TYPE;\n public readonly sessions: Table<App>;\n private readonly sessionObservers = new IdentifierMap<SessionObserver>();\n private readonly requiredApps = new IdentifierSet();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REQUIRE_APPS_PACKET_TYPE,\n SESSION_OBSERVE_PACKET_TYPE,\n SESSION_CONNECTED_PACKET_TYPE,\n SESSION_DISCONNECTED_PACKET_TYPE,\n );\n omu.network.addPacketHandler(\n SESSION_CONNECTED_PACKET_TYPE, (app) => this.handleSessionConnect(app),\n );\n omu.network.addPacketHandler(\n SESSION_DISCONNECTED_PACKET_TYPE, (app) => this.handleSessionDisconnect(app),\n );\n this.sessions = omu.tables.get(SESSION_TABLE_TYPE);\n omu.network.addTask(() => this.onTask());\n omu.onReady(() => this.onReady());\n }\n\n public async has(id: IntoId): Promise<boolean> {\n return await this.sessions.has(Identifier.from(id).key());\n }\n\n public observe(appId: IntoId, options?: {\n onConnect?(app: App): void;\n onDisconnect?(app: App): void;\n }): SessionObserver {\n const id = Identifier.from(appId);\n if (this.omu.running) {\n this.omu.send(SESSION_OBSERVE_PACKET_TYPE, [id]);\n }\n const observer = this.sessionObservers.get(id) ?? new SessionObserver([], []);\n if (options?.onConnect) {\n observer.onConnect(options.onConnect);\n }\n if (options?.onDisconnect) {\n observer.onDisconnect(options.onDisconnect);\n }\n this.sessionObservers.set(id, observer);\n return observer;\n }\n\n private async handleSessionConnect(app: App): Promise<void> {\n const observer = this.sessionObservers.get(app.id);\n if (!observer) {\n return;\n }\n for (const callback of observer.onConnectCallbacks) {\n await callback(app);\n }\n }\n\n private async handleSessionDisconnect(app: App): Promise<void> {\n const observer = this.sessionObservers.get(app.id);\n if (!observer) {\n return;\n }\n for (const callback of observer.onDisconnectCallbacks) {\n await callback(app);\n }\n }\n\n public require(...appIds: IntoId[]): void {\n if (this.omu.running) {\n throw new Error('Cannot require apps after the client has started');\n }\n for (const appId of appIds) {\n this.requiredApps.add(Identifier.from(appId));\n }\n }\n\n private async onTask(): Promise<void> {\n if (this.requiredApps.size > 0) {\n this.omu.send(REQUIRE_APPS_PACKET_TYPE, Array.from(this.requiredApps.values()));\n }\n }\n\n private async onReady(): Promise<void> {\n if (this.sessionObservers.size > 0) {\n this.omu.send(SESSION_OBSERVE_PACKET_TYPE, Array.from(this.sessionObservers.keys()));\n }\n }\n\n public async requestRemoteApp(options: {\n app: App;\n permissions: IntoId[];\n }): Promise<RequestRemoteAppResponse> {\n const { app } = options;\n if (!app.url) {\n throw new Error('App must have a URL to request it remotely');\n }\n if (app.type !== 'remote') {\n throw new Error('App must be a remote app to request it remotely');\n }\n if (!app.metadata) {\n throw new Error('App must have metadata to request it remotely');\n }\n return this.omu.endpoints.call(REMOTE_APP_REQUEST_ENDPOINT_TYPE, {\n app: App.serialize(options.app),\n permissions: options.permissions.map(id => Identifier.from(id).key()),\n });\n }\n\n public async generateToken(options: {\n app: App;\n permissions?: IntoId[];\n }): Promise<SessionParam> {\n const result = await this.omu.endpoints.call(GENERATE_TOKEN_ENDPOINT_TYPE, {\n app: App.serialize(options.app),\n permissions: options.permissions?.map(id => Identifier.from(id).key()),\n });\n if (result.type === 'error') {\n throw new Error(result.message);\n }\n return {\n token: result.token,\n address: this.omu.address,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["App", "Identifier", "IdentifierMap", "IdentifierSet", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SessionObserver", "TableType", "SESSION_EXTENSION_TYPE", "omu", "SessionExtension", "SESSIONS_READ_PERMISSION_ID", "SESSION_TABLE_TYPE", "app", "REQUIRE_APPS_PACKET_TYPE", "SESSION_OBSERVE_PACKET_TYPE", "SESSION_CONNECTED_PACKET_TYPE", "SESSION_DISCONNECTED_PACKET_TYPE", "REMOTE_APP_REQUEST_PERMISSION_ID", "REMOTE_APP_REQUEST_ENDPOINT_TYPE", "GENERATE_TOKEN_PERMISSION_ID", "GENERATE_TOKEN_ENDPOINT_TYPE", "id", "appId", "options", "observer", "callback", "appIds", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{GENERATE_TOKEN_PERMISSION_ID as I,REMOTE_APP_REQUEST_PERMISSION_ID as _,SESSION_EXTENSION_TYPE as e,SessionExtension as R,SESSIONS_READ_PERMISSION_ID as N}from"./extension";export{I as GENERATE_TOKEN_PERMISSION_ID,_ as REMOTE_APP_REQUEST_PERMISSION_ID,N as SESSIONS_READ_PERMISSION_ID,e as SESSION_EXTENSION_TYPE,R as SessionExtension};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/session/index.ts"],
4
+ "sourcesContent": ["export {\n GENERATE_TOKEN_PERMISSION_ID, REMOTE_APP_REQUEST_PERMISSION_ID, SESSION_EXTENSION_TYPE,\n SessionExtension,\n SESSIONS_READ_PERMISSION_ID,\n type RequestRemoteAppResponse,\n} from './extension';\n\n"],
5
+ "mappings": "AAAA,OACI,gCAAAA,EAA8B,oCAAAC,EAAkC,0BAAAC,EAChE,oBAAAC,EACA,+BAAAC,MAEG",
6
+ "names": ["GENERATE_TOKEN_PERMISSION_ID", "REMOTE_APP_REQUEST_PERMISSION_ID", "SESSION_EXTENSION_TYPE", "SessionExtension", "SESSIONS_READ_PERMISSION_ID"]
7
+ }