@omujs/omu 0.9.49 → 0.9.50

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 (294) 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 +1 -3
  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/serialize/bytebuffer.js +2 -0
  150. package/dist/serialize/bytebuffer.js.map +7 -0
  151. package/dist/serialize/index.d.ts +2 -0
  152. package/dist/serialize/index.js +2 -0
  153. package/dist/serialize/index.js.map +7 -0
  154. package/dist/serialize/serializer.js +2 -0
  155. package/dist/serialize/serializer.js.map +7 -0
  156. package/dist/token.js +2 -0
  157. package/dist/token.js.map +7 -0
  158. package/dist/{dts/version.d.ts → version.d.ts} +1 -1
  159. package/dist/version.js +2 -0
  160. package/dist/version.js.map +7 -0
  161. package/package.json +9 -9
  162. package/dist/dts/api/dashboard/index.d.ts +0 -3
  163. package/dist/dts/api/index.d.ts +0 -2
  164. package/dist/dts/api/signal/index.d.ts +0 -1
  165. package/dist/dts/serialize/index.d.ts +0 -2
  166. package/dist/esm/address.js +0 -4
  167. package/dist/esm/api/asset/extension.js +0 -911
  168. package/dist/esm/api/asset/index.js +0 -909
  169. package/dist/esm/api/dashboard/extension.js +0 -1362
  170. package/dist/esm/api/dashboard/handler.js +0 -4
  171. package/dist/esm/api/dashboard/index.js +0 -1361
  172. package/dist/esm/api/dashboard/packets.js +0 -419
  173. package/dist/esm/api/endpoint/endpoint.js +0 -383
  174. package/dist/esm/api/endpoint/extension.js +0 -1096
  175. package/dist/esm/api/endpoint/index.js +0 -383
  176. package/dist/esm/api/endpoint/packets.js +0 -799
  177. package/dist/esm/api/extension-registry.js +0 -23
  178. package/dist/esm/api/extension.js +0 -278
  179. package/dist/esm/api/http/extension.js +0 -1420
  180. package/dist/esm/api/http/http.js +0 -448
  181. package/dist/esm/api/http/index.js +0 -1419
  182. package/dist/esm/api/http/websocket.js +0 -220
  183. package/dist/esm/api/i18n/extension.js +0 -1339
  184. package/dist/esm/api/i18n/index.js +0 -1337
  185. package/dist/esm/api/index.js +0 -295
  186. package/dist/esm/api/logger/extension.js +0 -856
  187. package/dist/esm/api/logger/index.js +0 -852
  188. package/dist/esm/api/logger/packets.js +0 -673
  189. package/dist/esm/api/permission/extension.js +0 -535
  190. package/dist/esm/api/permission/index.js +0 -294
  191. package/dist/esm/api/permission/permission.js +0 -294
  192. package/dist/esm/api/plugin/extension.js +0 -531
  193. package/dist/esm/api/plugin/index.js +0 -529
  194. package/dist/esm/api/plugin/package-info.js +0 -4
  195. package/dist/esm/api/registry/extension.js +0 -1286
  196. package/dist/esm/api/registry/index.js +0 -1285
  197. package/dist/esm/api/registry/packets.js +0 -694
  198. package/dist/esm/api/registry/registry.js +0 -383
  199. package/dist/esm/api/server/extension.js +0 -2140
  200. package/dist/esm/api/server/index.js +0 -2118
  201. package/dist/esm/api/session/extension.js +0 -2235
  202. package/dist/esm/api/session/index.js +0 -2235
  203. package/dist/esm/api/signal/extension.js +0 -1031
  204. package/dist/esm/api/signal/index.js +0 -379
  205. package/dist/esm/api/signal/packets.js +0 -690
  206. package/dist/esm/api/signal/signal.js +0 -379
  207. package/dist/esm/api/table/extension.js +0 -1553
  208. package/dist/esm/api/table/index.js +0 -1552
  209. package/dist/esm/api/table/packets.js +0 -904
  210. package/dist/esm/api/table/table.js +0 -383
  211. package/dist/esm/app.js +0 -264
  212. package/dist/esm/const.js +0 -11
  213. package/dist/esm/errors.js +0 -548
  214. package/dist/esm/event/index.js +0 -22
  215. package/dist/esm/helper.js +0 -15
  216. package/dist/esm/identifier.js +0 -266
  217. package/dist/esm/index.js +0 -5186
  218. package/dist/esm/localization/index.js +0 -742
  219. package/dist/esm/localization/locale.js +0 -742
  220. package/dist/esm/localization/localization.js +0 -4
  221. package/dist/esm/lock.js +0 -46
  222. package/dist/esm/network/connection.js +0 -293
  223. package/dist/esm/network/encryption.js +0 -986
  224. package/dist/esm/network/frame-transport.js +0 -531
  225. package/dist/esm/network/index.js +0 -1627
  226. package/dist/esm/network/network.js +0 -1368
  227. package/dist/esm/network/packet/index.js +0 -485
  228. package/dist/esm/network/packet/packet-types.js +0 -486
  229. package/dist/esm/network/packet/packet.js +0 -126
  230. package/dist/esm/network/websocket-transport.js +0 -493
  231. package/dist/esm/omu.js +0 -4945
  232. package/dist/esm/result.js +0 -68
  233. package/dist/esm/serialize/bytebuffer.js +0 -384
  234. package/dist/esm/serialize/index.js +0 -471
  235. package/dist/esm/serialize/serializer.js +0 -97
  236. package/dist/esm/token.js +0 -42
  237. package/dist/esm/version.js +0 -11
  238. package/dist/tsconfig.tsbuildinfo +0 -1
  239. /package/dist/{dts/address.d.ts → address.d.ts} +0 -0
  240. /package/dist/{dts/api → api}/asset/extension.d.ts +0 -0
  241. /package/dist/{dts/api → api}/asset/index.d.ts +0 -0
  242. /package/dist/{dts/api → api}/endpoint/extension.d.ts +0 -0
  243. /package/dist/{dts/api → api}/endpoint/index.d.ts +0 -0
  244. /package/dist/{dts/api → api}/endpoint/packets.d.ts +0 -0
  245. /package/dist/{dts/api → api}/extension-registry.d.ts +0 -0
  246. /package/dist/{dts/api → api}/extension.d.ts +0 -0
  247. /package/dist/{dts/api → api}/http/extension.d.ts +0 -0
  248. /package/dist/{dts/api → api}/http/http.d.ts +0 -0
  249. /package/dist/{dts/api → api}/http/index.d.ts +0 -0
  250. /package/dist/{dts/api → api}/http/websocket.d.ts +0 -0
  251. /package/dist/{dts/api → api}/i18n/extension.d.ts +0 -0
  252. /package/dist/{dts/api → api}/i18n/index.d.ts +0 -0
  253. /package/dist/{dts/api → api}/logger/extension.d.ts +0 -0
  254. /package/dist/{dts/api → api}/logger/index.d.ts +0 -0
  255. /package/dist/{dts/api → api}/logger/packets.d.ts +0 -0
  256. /package/dist/{dts/api → api}/permission/extension.d.ts +0 -0
  257. /package/dist/{dts/api → api}/permission/index.d.ts +0 -0
  258. /package/dist/{dts/api → api}/plugin/extension.d.ts +0 -0
  259. /package/dist/{dts/api → api}/plugin/index.d.ts +0 -0
  260. /package/dist/{dts/api → api}/plugin/package-info.d.ts +0 -0
  261. /package/dist/{dts/api → api}/registry/index.d.ts +0 -0
  262. /package/dist/{dts/api → api}/registry/packets.d.ts +0 -0
  263. /package/dist/{dts/api → api}/server/extension.d.ts +0 -0
  264. /package/dist/{dts/api → api}/server/index.d.ts +0 -0
  265. /package/dist/{dts/api → api}/session/extension.d.ts +0 -0
  266. /package/dist/{dts/api → api}/session/index.d.ts +0 -0
  267. /package/dist/{dts/api → api}/signal/extension.d.ts +0 -0
  268. /package/dist/{dts/api → api}/signal/packets.d.ts +0 -0
  269. /package/dist/{dts/api → api}/table/extension.d.ts +0 -0
  270. /package/dist/{dts/api → api}/table/index.d.ts +0 -0
  271. /package/dist/{dts/api → api}/table/packets.d.ts +0 -0
  272. /package/dist/{dts/app.d.ts → app.d.ts} +0 -0
  273. /package/dist/{dts/const.d.ts → const.d.ts} +0 -0
  274. /package/dist/{dts/errors.d.ts → errors.d.ts} +0 -0
  275. /package/dist/{dts/event → event}/index.d.ts +0 -0
  276. /package/dist/{dts/helper.d.ts → helper.d.ts} +0 -0
  277. /package/dist/{dts/identifier.d.ts → identifier.d.ts} +0 -0
  278. /package/dist/{dts/localization → localization}/index.d.ts +0 -0
  279. /package/dist/{dts/localization → localization}/locale.d.ts +0 -0
  280. /package/dist/{dts/localization → localization}/localization.d.ts +0 -0
  281. /package/dist/{dts/lock.d.ts → lock.d.ts} +0 -0
  282. /package/dist/{dts/network → network}/connection.d.ts +0 -0
  283. /package/dist/{dts/network → network}/encryption.d.ts +0 -0
  284. /package/dist/{dts/network → network}/frame-transport.d.ts +0 -0
  285. /package/dist/{dts/network → network}/index.d.ts +0 -0
  286. /package/dist/{dts/network → network}/network.d.ts +0 -0
  287. /package/dist/{dts/network → network}/packet/index.d.ts +0 -0
  288. /package/dist/{dts/network → network}/packet/packet-types.d.ts +0 -0
  289. /package/dist/{dts/network → network}/websocket-transport.d.ts +0 -0
  290. /package/dist/{dts/omu.d.ts → omu.d.ts} +0 -0
  291. /package/dist/{dts/result.d.ts → result.d.ts} +0 -0
  292. /package/dist/{dts/serialize → serialize}/bytebuffer.d.ts +0 -0
  293. /package/dist/{dts/serialize → serialize}/serializer.d.ts +0 -0
  294. /package/dist/{dts/token.d.ts → token.d.ts} +0 -0
@@ -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())}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 }\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
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as c,IdentifierMap as T}from"../../identifier";import{PacketType as a}from"../../network/packet";import{ExtensionType as y}from"../extension.js";import{SignalPacket as S,SignalRegisterPacket as g}from"./packets.js";import{SignalType as l}from"./signal.js";const n=new y("signal",s=>new m(s)),p=a.createJson(n,{name:"register",serializer:g}),d=a.createJson(n,{name:"listen",serializer:c}),o=a.createSerialized(n,{name:"notify",serializer:S});class m{constructor(e){this.omu=e;e.network.registerPacket(p,d,o)}type=n;signals=new T;createSignal(e){if(this.signals.has(e.id))throw new Error(`Signal for key ${e.id} already created`);return new h(this.omu,e)}json(e,t){const i=this.omu.app.id.base.join(e),r=l.createJson(i,{name:e,serializer:t?.serializer});return this.createSignal(r)}serialized(e,t){const i=this.omu.app.id.base.join(e),r=l.createSerialized(i,{name:e,serializer:t?.serializer});return this.createSignal(r)}get(e){return this.createSignal(e)}}class h{constructor(e,t){this.omu=e;this.type=t;e.network.addPacketHandler(o,i=>this.handleBroadcast(i)),e.network.addTask(()=>this.onTask())}listeners=[];listening=!1;notify(e){const t=this.type.serializer.serialize(e);this.omu.send(o,{id:this.type.id,body:t});for(const i of this.listeners)i(e)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(d,this.type.id)}),this.listening=!0),this.listeners.push(e),()=>{this.listeners.splice(this.listeners.indexOf(e),1)}}handleBroadcast(e){if(!e.id.isEqual(this.type.id))return;const t=this.type.serializer.deserialize(e.body);for(const i of this.listeners)i(t)}onTask(){this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(p,{id:this.type.id,permissions:this.type.permissions})}}export{n as SIGNAL_EXTENSION_TYPE,m as SignalExtension};
2
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/signal/extension.ts"],
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializable } from '../../serialize';\nimport { ExtensionType, type Extension } from '../extension.js';\nimport { SignalPacket, SignalRegisterPacket } from './packets.js';\nimport { SignalType, type Signal } from './signal.js';\n\nexport const SIGNAL_EXTENSION_TYPE: ExtensionType<SignalExtension> = new ExtensionType(\n 'signal',\n (omu: Omu) => new SignalExtension(omu),\n);\n\nconst SIGNAL_REGISTER_PACKET = PacketType.createJson<SignalRegisterPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'register',\n serializer: SignalRegisterPacket,\n});\nconst SIGNAL_LISTEN_PACKET = PacketType.createJson<Identifier>(SIGNAL_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst SIGNAL_NOTIFY_PACKET = PacketType.createSerialized<SignalPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'notify',\n serializer: SignalPacket,\n});\n\nexport class SignalExtension implements Extension {\n public readonly type: ExtensionType<SignalExtension> = SIGNAL_EXTENSION_TYPE;\n private readonly signals = new IdentifierMap<SignalType<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n SIGNAL_REGISTER_PACKET,\n SIGNAL_LISTEN_PACKET,\n SIGNAL_NOTIFY_PACKET,\n );\n }\n\n private createSignal<T>(signalType: SignalType<T>): Signal<T> {\n if (this.signals.has(signalType.id)) {\n throw new Error(`Signal for key ${signalType.id} already created`);\n }\n return new SignalImpl(this.omu, signalType);\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options?: { serializer?: Serializable<T, D> }): Signal<T> {\n const id = this.omu.app.id.base.join(name);\n const type = SignalType.createJson<T>(id, {\n name,\n serializer: options?.serializer,\n });\n return this.createSignal(type);\n }\n\n public serialized<T>(name: string, options: { serializer: Serializable<T, Uint8Array> }): Signal<T> {\n const id = this.omu.app.id.base.join(name);\n const type = SignalType.createSerialized<T>(id, {\n name,\n serializer: options?.serializer,\n });\n return this.createSignal(type);\n }\n\n public get<T>(signalType: SignalType<T>): Signal<T> {\n return this.createSignal(signalType);\n }\n}\n\nclass SignalImpl<T> implements Signal<T> {\n private readonly listeners: ((value: T) => void)[] = [];\n private listening = false;\n\n constructor(\n private readonly omu: Omu,\n private readonly type: SignalType<T>,\n ) {\n omu.network.addPacketHandler(SIGNAL_NOTIFY_PACKET, (data) => this.handleBroadcast(data));\n omu.network.addTask(() => this.onTask());\n }\n\n public notify(body: T): void {\n const data = this.type.serializer.serialize(body);\n this.omu.send(SIGNAL_NOTIFY_PACKET, {\n id: this.type.id,\n body: data,\n });\n for (const listener of this.listeners) {\n listener(body);\n }\n }\n\n public listen(handler: (value: T) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(SIGNAL_LISTEN_PACKET, this.type.id);\n });\n this.listening = true;\n }\n this.listeners.push(handler);\n return () => {\n this.listeners.splice(this.listeners.indexOf(handler), 1);\n };\n }\n\n private handleBroadcast(data: SignalPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n const body = this.type.serializer.deserialize(data.body);\n for (const listener of this.listeners) {\n listener(body);\n }\n }\n\n private onTask(): void {\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(SIGNAL_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n}\n"],
5
+ "mappings": "AACA,OAAS,cAAAA,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,cAAAC,MAAkB,uBAG3B,OAAS,iBAAAC,MAAqC,kBAC9C,OAAS,gBAAAC,EAAc,wBAAAC,MAA4B,eACnD,OAAS,cAAAC,MAA+B,cAEjC,MAAMC,EAAwD,IAAIJ,EACrE,SACCK,GAAa,IAAIC,EAAgBD,CAAG,CACzC,EAEME,EAAyBR,EAAW,WAAiCK,EAAuB,CAC9F,KAAM,WACN,WAAYF,CAChB,CAAC,EACKM,EAAuBT,EAAW,WAAuBK,EAAuB,CAClF,KAAM,SACN,WAAYP,CAChB,CAAC,EACKY,EAAuBV,EAAW,iBAA+BK,EAAuB,CAC1F,KAAM,SACN,WAAYH,CAChB,CAAC,EAEM,MAAMK,CAAqC,CAI9C,YAA6BD,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRE,EACAC,EACAC,CACJ,CACJ,CATgB,KAAuCL,EACtC,QAAU,IAAIN,EAUvB,aAAgBY,EAAsC,CAC1D,GAAI,KAAK,QAAQ,IAAIA,EAAW,EAAE,EAC9B,MAAM,IAAI,MAAM,kBAAkBA,EAAW,EAAE,kBAAkB,EAErE,OAAO,IAAIC,EAAW,KAAK,IAAKD,CAAU,CAC9C,CAEO,KAAuCE,EAAcC,EAA0D,CAClH,MAAMC,EAAK,KAAK,IAAI,IAAI,GAAG,KAAK,KAAKF,CAAI,EACnCG,EAAOZ,EAAW,WAAcW,EAAI,CACtC,KAAAF,EACA,WAAYC,GAAS,UACzB,CAAC,EACD,OAAO,KAAK,aAAaE,CAAI,CACjC,CAEO,WAAcH,EAAcC,EAAiE,CAChG,MAAMC,EAAK,KAAK,IAAI,IAAI,GAAG,KAAK,KAAKF,CAAI,EACnCG,EAAOZ,EAAW,iBAAoBW,EAAI,CAC5C,KAAAF,EACA,WAAYC,GAAS,UACzB,CAAC,EACD,OAAO,KAAK,aAAaE,CAAI,CACjC,CAEO,IAAOL,EAAsC,CAChD,OAAO,KAAK,aAAaA,CAAU,CACvC,CACJ,CAEA,MAAMC,CAAmC,CAIrC,YACqBN,EACAU,EACnB,CAFmB,SAAAV,EACA,UAAAU,EAEjBV,EAAI,QAAQ,iBAAiBI,EAAuBO,GAAS,KAAK,gBAAgBA,CAAI,CAAC,EACvFX,EAAI,QAAQ,QAAQ,IAAM,KAAK,OAAO,CAAC,CAC3C,CATiB,UAAoC,CAAC,EAC9C,UAAY,GAUb,OAAOY,EAAe,CACzB,MAAMD,EAAO,KAAK,KAAK,WAAW,UAAUC,CAAI,EAChD,KAAK,IAAI,KAAKR,EAAsB,CAChC,GAAI,KAAK,KAAK,GACd,KAAMO,CACV,CAAC,EACD,UAAWE,KAAY,KAAK,UACxBA,EAASD,CAAI,CAErB,CAEO,OAAOE,EAAuC,CACjD,OAAK,KAAK,YACN,KAAK,IAAI,QAAQ,IAAM,CACnB,KAAK,IAAI,KAAKX,EAAsB,KAAK,KAAK,EAAE,CACpD,CAAC,EACD,KAAK,UAAY,IAErB,KAAK,UAAU,KAAKW,CAAO,EACpB,IAAM,CACT,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQA,CAAO,EAAG,CAAC,CAC5D,CACJ,CAEQ,gBAAgBH,EAA0B,CAC9C,GAAI,CAACA,EAAK,GAAG,QAAQ,KAAK,KAAK,EAAE,EAC7B,OAEJ,MAAMC,EAAO,KAAK,KAAK,WAAW,YAAYD,EAAK,IAAI,EACvD,UAAWE,KAAY,KAAK,UACxBA,EAASD,CAAI,CAErB,CAEQ,QAAe,CACd,KAAK,KAAK,GAAG,YAAY,KAAK,IAAI,IAAI,EAAE,GAG7C,KAAK,IAAI,KAAKV,EAAwB,CAClC,GAAI,KAAK,KAAK,GACd,YAAa,KAAK,KAAK,WAC3B,CAAC,CACL,CACJ",
6
+ "names": ["Identifier", "IdentifierMap", "PacketType", "ExtensionType", "SignalPacket", "SignalRegisterPacket", "SignalType", "SIGNAL_EXTENSION_TYPE", "omu", "SignalExtension", "SIGNAL_REGISTER_PACKET", "SIGNAL_LISTEN_PACKET", "SIGNAL_NOTIFY_PACKET", "signalType", "SignalImpl", "name", "options", "id", "type", "data", "body", "listener", "handler"]
7
+ }
@@ -0,0 +1 @@
1
+ export { SignalType, type Signal, type SignalPermissions } from './signal.js';
@@ -0,0 +1,2 @@
1
+ import{SignalType as n}from"./signal.js";export{n as SignalType};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/signal/index.ts"],
4
+ "sourcesContent": ["export { SignalType, type Signal, type SignalPermissions } from './signal.js';\n\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,MAAuD",
6
+ "names": ["SignalType"]
7
+ }