@omujs/omu 0.10.7 → 0.10.9

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 (52) hide show
  1. package/README.md +30 -0
  2. package/dist/api/asset/extension.js +1 -1
  3. package/dist/api/asset/extension.js.map +2 -2
  4. package/dist/api/dashboard/webview.js +1 -1
  5. package/dist/api/dashboard/webview.js.map +2 -2
  6. package/dist/api/endpoint/extension.d.ts +9 -1
  7. package/dist/api/endpoint/extension.js +1 -1
  8. package/dist/api/endpoint/extension.js.map +3 -3
  9. package/dist/api/endpoint/index.d.ts +1 -0
  10. package/dist/api/endpoint/index.js.map +1 -1
  11. package/dist/api/http/extension.js +1 -1
  12. package/dist/api/http/extension.js.map +2 -2
  13. package/dist/api/http/websocket.js +1 -1
  14. package/dist/api/http/websocket.js.map +2 -2
  15. package/dist/api/logger/extension.js +1 -1
  16. package/dist/api/logger/extension.js.map +3 -3
  17. package/dist/api/registry/extension.js +1 -1
  18. package/dist/api/registry/extension.js.map +3 -3
  19. package/dist/api/server/extension.js +1 -1
  20. package/dist/api/server/extension.js.map +2 -2
  21. package/dist/api/signal/extension.js +1 -1
  22. package/dist/api/signal/extension.js.map +3 -3
  23. package/dist/api/signal/signal.d.ts +2 -1
  24. package/dist/api/signal/signal.js +1 -1
  25. package/dist/api/signal/signal.js.map +1 -1
  26. package/dist/api/table/extension.js +1 -1
  27. package/dist/api/table/extension.js.map +3 -3
  28. package/dist/api/table/index.d.ts +1 -1
  29. package/dist/api/table/index.js +1 -1
  30. package/dist/api/table/index.js.map +2 -2
  31. package/dist/api/table/table.d.ts +8 -7
  32. package/dist/api/table/table.js +1 -1
  33. package/dist/api/table/table.js.map +2 -2
  34. package/dist/event/index.d.ts +7 -0
  35. package/dist/event/index.js +1 -1
  36. package/dist/event/index.js.map +3 -3
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +2 -2
  40. package/dist/network/network.d.ts +11 -9
  41. package/dist/network/network.js +1 -1
  42. package/dist/network/network.js.map +3 -3
  43. package/dist/omu.d.ts +11 -9
  44. package/dist/omu.js +1 -1
  45. package/dist/omu.js.map +3 -3
  46. package/dist/token.d.ts +4 -2
  47. package/dist/token.js +1 -1
  48. package/dist/token.js.map +2 -2
  49. package/dist/version.d.ts +1 -1
  50. package/dist/version.js +1 -1
  51. package/dist/version.js.map +1 -1
  52. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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 const index = list.indexOf(listener);\n if (index !== -1) {\n list.splice(index, 1);\n }\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,CACT,MAAMC,EAAQD,EAAK,QAAQL,CAAQ,EAC/BM,IAAU,IACVD,EAAK,OAAOC,EAAO,CAAC,CAE5B,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", "index"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
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.key()}' already exists`);const i=new I(this.omu,e);return this.registries.set(e.id,i),i}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){await 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
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/registry/extension.ts"],
4
- "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
5
- "mappings": "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",
6
- "names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "RegistryImpl", "identifier", "registry", "name", "options", "tableType", "type", "packet", "#get", "result", "REGISTRY_GET_ENDPOINT", "#set", "value", "fn", "newValue", "handler", "data", "isReady", "context", "handle", "listeners", "emit", "unsubscribe", "proxied", "proxy", "listener", "PROXIED_SYMBOL", "run", "resolve", "deepEqual", "objA", "objB", "keysA", "keysB", "key", "changed", "target", "prop", "p", "REGISTRY_PERMISSION_ID"]
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.key()}' already exists`);\n }\n const registry = new RegistryImpl(this.omu, registryType);\n this.registries.set(registryType.id, registry as Registry<unknown>);\n return registry;\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 }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n await 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", "registry", "RegistryImpl", "identifier", "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
7
  }
@@ -1,2 +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};
1
+ import{App as p}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:p,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.on("disconnected",()=>{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),o=p.deserialize(E);if(!s.isNamespaceEqual(o.id))throw new Error(`App ID does not match the ID in the index. ${o.id} != ${s}`);r.set(s,o)}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(),p.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
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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": "AAAA,OAAS,OAAAA,MAAoB,eAC7B,OAAS,cAAAC,EAAY,iBAAAC,MAA6B,mBAGlD,OAAS,gBAAAC,MAAoB,0BAC7B,OAAS,iBAAAC,MAAqC,kBAC9C,OAAmB,gBAAAC,MAAoB,cACvC,OAAS,aAAAC,MAA6B,WAE/B,MAAMC,EAAwD,IAAIH,EACrE,SACCI,GAAa,IAAIC,EAAgBD,CAAG,CACzC,EAYaE,EAA6CH,EAAsB,KAAK,OAAQ,MAAM,EACtFI,EAA8CJ,EAAsB,KAAK,OAAQ,OAAO,EACxFK,EAA8CL,EAAsB,KAAK,QAAS,MAAM,EACxFM,EAAqDR,EAAa,WAAqBE,EAAuB,CACvH,KAAM,QACN,aAAc,CAAE,QAAW,CAAC,CAAE,EAC9B,YAAa,CACT,MAAOI,EACP,KAAMC,CACV,CACJ,CAAC,EACKE,EAAiBR,EAAU,WAAWC,EAAuB,CAC/D,KAAM,OACN,WAAYP,EACZ,IAAMe,GAAQA,EAAI,GAAG,IAAI,EACzB,YAAa,CACT,IAAKJ,EACL,KAAMD,CACV,CACJ,CAAC,EAEYM,EAA4CT,EAAsB,KAAK,UAAU,EACxFU,EAAyBd,EAAa,WAA6BI,EAAuB,CAC5F,KAAM,WACN,aAAcS,CAClB,CAAC,EACYE,EAAgDX,EAAsB,KAAK,kBAAmB,KAAK,EACnGY,EAAgDZ,EAAsB,KAAK,kBAAmB,KAAK,EAC1Ga,EAA8Bf,EAAa,WAAmCE,EAAuB,CACvG,KAAM,gBACN,aAAc,CAAC,EACf,YAAa,CACT,KAAMW,EACN,MAAOC,CACX,CACJ,CAAC,EAEM,MAAMV,CAAqC,CAM9C,YAA6BD,EAAU,CAAV,SAAAA,EACzB,KAAK,KAAOA,EAAI,OAAO,IAAIM,CAAc,EACzC,KAAK,MAAQN,EAAI,WAAW,IAAIK,CAA0B,EAC1D,KAAK,aAAeL,EAAI,WAAW,IAAIY,CAA2B,CACtE,CATgB,KAAuCb,EACvC,KACA,MACA,aAQhB,MAAa,SAASc,EAAqC,CACvD,YAAK,IAAI,UAAU,KAAKJ,EAAwBI,GAAW,EAAK,EAChE,MAAM,IAAI,QAAeC,GAAY,CACjC,MAAMC,EAAW,KAAK,IAAI,QAAQ,MAAM,aAAa,OAAO,IAAM,CAC9DD,EAAQ,EACRC,EAAS,CACb,CAAC,CACL,CAAC,EACM,EACX,CACJ,CAEO,MAAMC,CAAgB,CACzB,YACoBC,EACAC,EAClB,CAFkB,wBAAAD,EACA,2BAAAC,CAChB,CAEG,UAAUC,EAAoD,CACjE,KAAK,mBAAmB,KAAKA,CAAQ,CACzC,CAEO,aAAaA,EAAoD,CACpE,KAAK,sBAAsB,KAAKA,CAAQ,CAC5C,CACJ,CAaO,MAAMC,CAAiB,CAC1B,YACWC,EACAC,EACAC,EACT,CAHS,QAAAF,EACA,UAAAC,EACA,UAAAC,CACP,CAEJ,OAAc,MAAMC,EAAoF,CACpG,OAAO,IAAIJ,EACP3B,EAAW,KAAK+B,EAAQ,EAAE,EAC1B,IAAI9B,EAAc8B,EAAQ,KAAK,IAAKjB,GAAQ,CAACA,EAAI,GAAIA,CAAG,CAAC,CAAC,EAC1DiB,EAAQ,IACZ,CACJ,CAEA,OAAc,SAASC,EAA8C,CACjE,MAAMJ,EAAK5B,EAAW,QAAQgC,EAAK,EAAK,EAClCH,EAAO,IAAI5B,EACjB,SAAW,CAACgC,EAAOC,CAAO,IAAK,OAAO,QAAQF,EAAK,IAAO,EAAG,CACzD,MAAMJ,EAAK5B,EAAW,QAAQiC,CAAK,EAC7BnB,EAAMf,EAAI,YAAYmC,CAAO,EACnC,GAAI,CAACN,EAAG,iBAAiBd,EAAI,EAAE,EAC3B,MAAM,IAAI,MAAM,8CAA8CA,EAAI,EAAE,OAAOc,CAAE,EAAE,EAEnFC,EAAK,IAAID,EAAId,CAAG,CACpB,CACA,OAAO,IAAIa,EACPC,EACAC,EACAG,EAAK,IACT,CACJ,CAEO,QAA+B,CAClC,MAAO,CACH,GAAI,KAAK,GAAG,IAAI,EAChB,KAAM,KAAK,KACX,KAAM,OAAO,YAAY,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAACJ,EAAId,CAAG,IAAM,CACjEc,EAAG,IAAI,EACP7B,EAAI,UAAUe,CAAG,CACrB,CAAC,CAAC,CACN,CACJ,CACJ",
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.on('disconnected', () => {\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
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
7
  }
@@ -1,2 +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};
1
+ import{Identifier as d,IdentifierMap as c}from"../../identifier";import{PacketType as r}from"../../network/packet";import{ExtensionType as g}from"../extension.js";import{SignalPacket as S,SignalRegisterPacket as T}from"./packets.js";import{SignalType as l}from"./signal.js";const n=new g("signal",s=>new m(s)),o=r.createJson(n,{name:"register",serializer:T}),p=r.createJson(n,{name:"listen",serializer:d}),a=r.createSerialized(n,{name:"notify",serializer:S});class m{constructor(i){this.omu=i;i.network.registerPacket(o,p,a)}type=n;signals=new c;createSignal(i){if(this.signals.has(i.id))throw new Error(`Signal with identifier '${i.id.key()}' already exists`);const e=new h(this.omu,i);return this.signals.set(i.id,e),e}json(i,e){const t=l.createJson(this.omu.app.id.base,{name:i,serializer:e?.serializer});return this.createSignal(t)}serialized(i,e){const t=l.createSerialized(this.omu.app.id.base,{name:i,serializer:e?.serializer});return this.createSignal(t)}get(i){const e=this.signals.get(i.id);return e||this.createSignal(i)}}class h{constructor(i,e){this.omu=i;this.type=e;i.network.addPacketHandler(a,t=>this.handleBroadcast(t)),i.network.addTask(()=>this.onTask())}listeners=[];listening=!1;async notify(i){const e=this.type.serializer.serialize(i);await this.omu.send(a,{id:this.type.id,body:e});for(const t of this.listeners)t(i)}listen(i){return this.listening||(this.omu.onReady(()=>{this.omu.send(p,this.type.id)}),this.listening=!0),this.listeners.push(i),()=>{const e=this.listeners.indexOf(i);e!==-1&&this.listeners.splice(e,1)}}handleBroadcast(i){if(!i.id.isEqual(this.type.id))return;const e=this.type.serializer.deserialize(i.body);for(const t of this.listeners)t(e)}onTask(){this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(o,{id:this.type.id,permissions:this.type.permissions})}}export{n as SIGNAL_EXTENSION_TYPE,m as SignalExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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<Signal<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 with identifier '${signalType.id.key()}' already exists`);\n }\n const signal = new SignalImpl(this.omu, signalType);\n this.signals.set(signalType.id, signal as Signal<unknown>);\n return signal;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options?: { serializer?: Serializable<T, D> }): Signal<T> {\n const type = SignalType.createJson<T>(this.omu.app.id.base, {\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 type = SignalType.createSerialized<T>(this.omu.app.id.base, {\n name,\n serializer: options?.serializer,\n });\n return this.createSignal(type);\n }\n\n public get<T>(signalType: SignalType<T>): Signal<T> {\n const signal = this.signals.get(signalType.id);\n if (signal) {\n return signal as Signal<T>;\n }\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 public 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 async notify(body: T): Promise<void> {\n const data = this.type.serializer.serialize(body);\n await 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 const index = this.listeners.indexOf(handler);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\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": "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",
6
+ "names": ["Identifier", "IdentifierMap", "PacketType", "ExtensionType", "SignalPacket", "SignalRegisterPacket", "SignalType", "SIGNAL_EXTENSION_TYPE", "omu", "SignalExtension", "SIGNAL_REGISTER_PACKET", "SIGNAL_LISTEN_PACKET", "SIGNAL_NOTIFY_PACKET", "signalType", "signal", "SignalImpl", "name", "options", "type", "data", "body", "listener", "handler", "index"]
7
7
  }
@@ -28,6 +28,7 @@ export declare class SignalType<T> {
28
28
  }): SignalType<T>;
29
29
  }
30
30
  export interface Signal<T> {
31
+ readonly type: SignalType<T>;
31
32
  listen(handler: (value: T) => void): Unlisten;
32
- notify(body: T): void;
33
+ notify(body: T): Promise<void>;
33
34
  }
@@ -1,2 +1,2 @@
1
- import{Identifier as t}from"../../identifier";import{Serializer as o}from"../../serialize";class s{constructor(i,e,n){this.id=i;this.serializer=e;this.permissions=n}static createJson(i,{name:e,serializer:n,permissions:r}){return new s(t.from(i).join(e),o.of(n??o.noop()).toJson(),r??{})}static createSerialized(i,{name:e,serializer:n,permissions:r}){return new s(t.from(i).join(e),n,r??{})}}export{s as SignalType};
1
+ import{Identifier as o}from"../../identifier";import{Serializer as t}from"../../serialize";class s{constructor(i,e,n){this.id=i;this.serializer=e;this.permissions=n}static createJson(i,{name:e,serializer:n,permissions:r}){return new s(o.from(i).join(e),t.of(n??t.noop()).toJson(),r??{})}static createSerialized(i,{name:e,serializer:n,permissions:r}){return new s(o.from(i).join(e),n,r??{})}}export{s as SignalType};
2
2
  //# sourceMappingURL=signal.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/signal/signal.ts"],
4
- "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport interface SignalPermissionsJSON {\n all?: string;\n listen?: string;\n send?: string;\n}\n\nexport interface SignalPermissions {\n all?: IntoId | undefined;\n listen?: IntoId | undefined;\n send?: IntoId | undefined;\n}\n\nexport class SignalType<T> {\n constructor(\n public readonly id: Identifier,\n public readonly serializer: Serializable<T, Uint8Array>,\n public readonly permissions: SignalPermissions,\n ) {}\n\n static createJson<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer?: Serializable<T, any>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n Serializer.of<T, any>(serializer ?? Serializer.noop()).toJson(),\n permissions ?? {},\n );\n }\n\n static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer: Serializable<T, Uint8Array>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n serializer,\n permissions ?? {},\n );\n }\n}\n\nexport interface Signal<T> {\n listen(handler: (value: T) => void): Unlisten;\n notify(body: T): void;\n}\n"],
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport interface SignalPermissionsJSON {\n all?: string;\n listen?: string;\n send?: string;\n}\n\nexport interface SignalPermissions {\n all?: IntoId | undefined;\n listen?: IntoId | undefined;\n send?: IntoId | undefined;\n}\n\nexport class SignalType<T> {\n constructor(\n public readonly id: Identifier,\n public readonly serializer: Serializable<T, Uint8Array>,\n public readonly permissions: SignalPermissions,\n ) {}\n\n static createJson<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer?: Serializable<T, any>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n Serializer.of<T, any>(serializer ?? Serializer.noop()).toJson(),\n permissions ?? {},\n );\n }\n\n static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer: Serializable<T, Uint8Array>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n serializer,\n permissions ?? {},\n );\n }\n}\n\nexport interface Signal<T> {\n readonly type: SignalType<T>;\n listen(handler: (value: T) => void): Unlisten;\n notify(body: T): Promise<void>;\n}\n"],
5
5
  "mappings": "AACA,OAAS,cAAAA,MAA0B,mBAEnC,OAAS,cAAAC,MAAkB,kBAcpB,MAAMC,CAAc,CACvB,YACoBC,EACAC,EACAC,EAClB,CAHkB,QAAAF,EACA,gBAAAC,EACA,iBAAAC,CACjB,CAEH,OAAO,WACHC,EACA,CACI,KAAAC,EACA,WAAAH,EACA,YAAAC,CACJ,EAKa,CACb,OAAO,IAAIH,EACPF,EAAW,KAAKM,CAAU,EAAE,KAAKC,CAAI,EACrCN,EAAW,GAAWG,GAAcH,EAAW,KAAK,CAAC,EAAE,OAAO,EAC9DI,GAAe,CAAC,CACpB,CACJ,CAEA,OAAO,iBACHC,EACA,CACI,KAAAC,EACA,WAAAH,EACA,YAAAC,CACJ,EAKa,CACb,OAAO,IAAIH,EACPF,EAAW,KAAKM,CAAU,EAAE,KAAKC,CAAI,EACrCH,EACAC,GAAe,CAAC,CACpB,CACJ,CACJ",
6
6
  "names": ["Identifier", "Serializer", "SignalType", "id", "serializer", "permissions", "identifier", "name"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{EventEmitter as m}from"../../event";import{Identifier as I,IdentifierMap as x}from"../../identifier";import{PacketType as o}from"../../network/packet/packet.js";import{Serializer as h}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as C}from"../extension.js";import{SetConfigPacket as L,SetPermissionPacket as N,TableFetchPacket as g,TableFetchRangePacket as O,TableItemsPacket as d,TableKeysPacket as p,TablePacket as u,TableProxyPacket as B}from"./packets.js";import{TableType as _}from"./table.js";const r=new C("table",T=>new H(T)),c=r.join("permission"),R=o.createSerialized(r,{name:"set_permission",serializer:N}),S=o.createSerialized(r,{name:"set_config",serializer:L}),k=o.createJson(r,{name:"listen",serializer:I}),v=o.createJson(r,{name:"proxy_listen",serializer:I}),b=o.createSerialized(r,{name:"proxy",serializer:B}),f=o.createSerialized(r,{name:"item_add",serializer:d}),E=o.createSerialized(r,{name:"item_update",serializer:d}),z=o.createSerialized(r,{name:"item_remove",serializer:d}),M=l.createSerialized(r,{name:"item_get",requestSerializer:p,responseSerializer:d,permissionId:c}),A=l.createSerialized(r,{name:"item_has",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_all",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),K=l.createSerialized(r,{name:"item_has_any",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:g,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),U=l.createSerialized(r,{name:"fetch_all",requestSerializer:u,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"size",requestSerializer:u,responseSerializer:h.json(),permissionId:c}),P=o.createSerialized(r,{name:"clear",serializer:u});class H{constructor(e){this.omu=e;e.network.registerPacket(R,S,k,v,b,f,E,z,P)}type=r;tableMap=new x;createTable(e){this.omu.permissions.require(c);const i=this.tableMap.get(e.id);if(i)return i;const t=new J(this.omu,e);return this.tableMap.set(e.id,t),t}json(e,i){const t=new _(this.omu.app.id.base.join(e),h.pipe(i.serializer??h.noop(),h.json()),i.key);return this.createTable(t)}serialized(e,i){const t=new _(this.omu.app.id.base.join(e),i.serializer,i.key);return this.createTable(t)}get(e){return this.has(e.id)?this.tableMap.get(e.id):this.createTable(e)}has(e){return this.tableMap.has(e)}}class J{constructor(e,i){this.omu=e;this.type=i;this.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.event={add:new m,update:new m,remove:new m,clear:new m,cacheUpdate:new m},this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,w])=>{const y=a(w);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(b,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.add.emit(s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.update.emit(s)}),e.network.addPacketHandler(z,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.event.remove.emit(s),this.event.cacheUpdate.emit(this.cache)}),e.network.addPacketHandler(P,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.event.clear.emit(),this.event.cacheUpdate.emit(this.cache))}),e.event.ready.listen(()=>this.onReady())}cache;event;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.event.cacheUpdate.emit(this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.listening=!0),e?this.event.cacheUpdate.listen(e):()=>{}}proxy(e){return this.proxies.length===0&&this.omu.onReady(()=>{this.omu.send(v,this.id)}),this.proxies.push(e),()=>{this.proxies.splice(this.proxies.indexOf(e),1)}}onReady(){this.config&&this.omu.send(S,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(M,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(M,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);this.omu.send(f,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);this.omu.send(E,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),this.omu.send(z,{id:this.id,items:i})}async clear(){this.omu.send(P,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(A,{id:this.id,keys:[e]}))[e]??!1}async hasMany(...e){return await this.omu.endpoints.call(A,{id:this.id,keys:e})}async hasAll(...e){return await this.omu.endpoints.call(j,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(K,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){const s=await this.omu.endpoints.call(q,new g(this.id,e,i,t)),a=this.deserializeItems(s.items);return this.updateCache(a),a}async fetchRange({start:e,end:i}){const t=await this.omu.endpoints.call(D,{id:this.id,start:e,end:i}),s=this.deserializeItems(t.items);return this.updateCache(s),s}async fetchAll(){const e=await this.omu.endpoints.call(U,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values(),i!==void 0&&t.delete(i);const s=e?t.values().next().value:[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(F,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,H as TableExtension};
1
+ import{EventHub as M}from"../../event";import{Identifier as P,IdentifierMap as x}from"../../identifier";import{PacketType as o}from"../../network/packet/packet.js";import{Serializer as h}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as C}from"../extension.js";import{SetConfigPacket as L,SetPermissionPacket as N,TableFetchPacket as I,TableFetchRangePacket as O,TableItemsPacket as d,TableKeysPacket as m,TablePacket as T,TableProxyPacket as K}from"./packets.js";import{TableType as _}from"./table.js";const r=new C("table",p=>new U(p)),c=r.join("permission"),B=o.createSerialized(r,{name:"set_permission",serializer:N}),g=o.createSerialized(r,{name:"set_config",serializer:L}),S=o.createJson(r,{name:"listen",serializer:P}),k=o.createJson(r,{name:"proxy_listen",serializer:P}),u=o.createSerialized(r,{name:"proxy",serializer:K}),b=o.createSerialized(r,{name:"item_add",serializer:d}),f=o.createSerialized(r,{name:"item_update",serializer:d}),E=o.createSerialized(r,{name:"item_remove",serializer:d}),v=l.createSerialized(r,{name:"item_get",requestSerializer:m,responseSerializer:d,permissionId:c}),w=l.createSerialized(r,{name:"item_has",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),R=l.createSerialized(r,{name:"item_has_all",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_any",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:I,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"fetch_all",requestSerializer:T,responseSerializer:d,permissionId:c}),H=l.createSerialized(r,{name:"size",requestSerializer:T,responseSerializer:h.json(),permissionId:c}),z=o.createSerialized(r,{name:"clear",serializer:T});class U{constructor(e){this.omu=e;e.network.registerPacket(B,g,S,k,u,b,f,E,z)}type=r;tableMap=new x;createTable(e){this.omu.permissions.require(c);const i=this.tableMap.get(e.id);if(i)return i;const t=new J(this.omu,e);return this.tableMap.set(e.id,t),t}json(e,i){const t=new _(this.omu.app.id.base.join(e),h.pipe(i.serializer??h.noop(),h.json()),i.key);return this.createTable(t)}serialized(e,i){const t=new _(this.omu.app.id.base.join(e),i.serializer,i.key);return this.createTable(t)}get(e){return this.has(e.id)?this.tableMap.get(e.id):this.createTable(e)}has(e){return this.tableMap.has(e)}}class J{constructor(e,i){this.omu=e;this.type=i;this.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(u,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,A])=>{const y=a(A);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(u,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.events.emit("add",s)}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.events.emit("update",s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.events.emit("remove",s),this.events.emit("cache",this.cache)}),e.network.addPacketHandler(z,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.events.emit("clear"),this.events.emit("cache",this.cache))}),e.on("ready",()=>this.onReady())}cache;events=new M;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;on(e,i){return this.events.on(e,i)}off(e,i){this.events.off(e,i)}updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.events.emit("cache",this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(S,this.id)}),this.listening=!0),e?this.events.on("cache",e):()=>{}}proxy(e){return this.proxies.length===0&&this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.proxies.push(e),()=>{const i=this.proxies.indexOf(e);i!==-1&&this.proxies.splice(i,1)}}onReady(){this.config&&this.omu.send(g,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(v,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(v,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);await this.omu.send(b,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);await this.omu.send(f,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),await this.omu.send(E,{id:this.id,items:i})}async clear(){await this.omu.send(z,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(w,{id:this.id,keys:[e]}))[e]??!1}async hasMany(...e){return await this.omu.endpoints.call(w,{id:this.id,keys:e})}async hasAll(...e){return await this.omu.endpoints.call(R,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(j,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){await this.omu.waitForReady();const s=await this.omu.endpoints.call(q,new I(this.id,e,i,t)),a=this.deserializeItems(s.items);return this.updateCache(a),a}async fetchRange({start:e,end:i}){const t=await this.omu.endpoints.call(D,{id:this.id,start:e,end:i}),s=this.deserializeItems(t.items);return this.updateCache(s),s}async fetchAll(){const e=await this.omu.endpoints.call(F,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values();const s=[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(H,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,U as TableExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/table/extension.ts"],
4
- "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n const existing = this.tableMap.get(tableType.id);\n if (existing) {\n return existing as Table<T>;\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n public readonly event: TableEvents<T>;\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: TableType<T>,\n ) {\n this.id = type.id;\n this.serializer = type.serializer;\n this.keyFunction = type.keyFunction;\n this.cache = new Map();\n this.event = {\n add: new EventEmitter<[Map<string, T>]>(),\n update: new EventEmitter<[Map<string, T>]>(),\n remove: new EventEmitter<[Map<string, T>]>(),\n clear: new EventEmitter<[]>(),\n cacheUpdate: new EventEmitter<[Map<string, T>]>(),\n };\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.add.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.update.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.event.remove.emit(items);\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.event.clear.emit();\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.event.ready.listen(() => this.onReady());\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.event.cacheUpdate.emit(this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.event.cacheUpdate.listen(listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n this.proxies.splice(this.proxies.indexOf(callback), 1);\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n if (cursor !== undefined) {\n items.delete(cursor);\n }\n const cursorItem = backward ? items.values().next().value : [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["EventEmitter", "Identifier", "IdentifierMap", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SetConfigPacket", "SetPermissionPacket", "TableFetchPacket", "TableFetchRangePacket", "TableItemsPacket", "TableKeysPacket", "TablePacket", "TableProxyPacket", "TableType", "TABLE_EXTENSION_TYPE", "client", "TableExtension", "TABLE_PERMISSION_ID", "TABLE_SET_PERMISSION_PACKET", "TABLE_SET_CONFIG_PACKET", "TABLE_LISTEN_PACKET", "TABLE_PROXY_LISTEN_PACKET", "TABLE_PROXY_PACKET", "TABLE_ITEM_ADD_PACKET", "TABLE_ITEM_UPDATE_PACKET", "TABLE_ITEM_REMOVE_PACKET", "TABLE_ITEM_GET_ENDPOINT", "TABLE_ITEM_HAS_ENDPOINT", "TABLE_ITEM_HAS_ALL_ENDPOINT", "TABLE_ITEM_HAS_ANY_ENDPOINT", "TABLE_FETCH_ENDPOINT", "TABLE_FETCH_RANGE_ENDPOINT", "TABLE_FETCH_ALL_ENDPOINT", "TABLE_SIZE_ENDPOINT", "TABLE_ITEM_CLEAR_PACKET", "omu", "tableType", "existing", "table", "TableImpl", "name", "options", "type", "identifier", "packet", "items", "proxy", "key", "item", "proxyItem", "_", "cache", "listener", "callback", "promise", "res", "keys", "filteredKeys", "data", "limit", "backward", "cursor", "start", "end", "cursorItem", "size", "config", "permissions"]
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventHub } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n const existing = this.tableMap.get(tableType.id);\n if (existing) {\n return existing as Table<T>;\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n private readonly events = new EventHub<TableEvents<T>>();\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: TableType<T>,\n ) {\n this.id = type.id;\n this.serializer = type.serializer;\n this.keyFunction = type.keyFunction;\n this.cache = new Map();\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('add', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('update', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.events.emit('remove', items);\n this.events.emit('cache', this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.events.emit('clear');\n this.events.emit('cache', this.cache);\n });\n omu.on('ready', () => this.onReady());\n }\n\n public on<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): Unlisten {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): void {\n this.events.off(event, listener);\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.events.emit('cache', this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.events.on('cache', listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n const index = this.proxies.indexOf(callback);\n if (index !== -1) {\n this.proxies.splice(index, 1);\n }\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n await this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n await this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n await this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n await this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n await this.omu.waitForReady();\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n const cursorItem = [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["EventHub", "Identifier", "IdentifierMap", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SetConfigPacket", "SetPermissionPacket", "TableFetchPacket", "TableFetchRangePacket", "TableItemsPacket", "TableKeysPacket", "TablePacket", "TableProxyPacket", "TableType", "TABLE_EXTENSION_TYPE", "client", "TableExtension", "TABLE_PERMISSION_ID", "TABLE_SET_PERMISSION_PACKET", "TABLE_SET_CONFIG_PACKET", "TABLE_LISTEN_PACKET", "TABLE_PROXY_LISTEN_PACKET", "TABLE_PROXY_PACKET", "TABLE_ITEM_ADD_PACKET", "TABLE_ITEM_UPDATE_PACKET", "TABLE_ITEM_REMOVE_PACKET", "TABLE_ITEM_GET_ENDPOINT", "TABLE_ITEM_HAS_ENDPOINT", "TABLE_ITEM_HAS_ALL_ENDPOINT", "TABLE_ITEM_HAS_ANY_ENDPOINT", "TABLE_FETCH_ENDPOINT", "TABLE_FETCH_RANGE_ENDPOINT", "TABLE_FETCH_ALL_ENDPOINT", "TABLE_SIZE_ENDPOINT", "TABLE_ITEM_CLEAR_PACKET", "omu", "tableType", "existing", "table", "TableImpl", "name", "options", "type", "identifier", "packet", "items", "proxy", "key", "item", "proxyItem", "_", "event", "listener", "cache", "callback", "index", "promise", "res", "keys", "filteredKeys", "data", "limit", "backward", "cursor", "start", "end", "cursorItem", "size", "config", "permissions"]
7
7
  }
@@ -1,2 +1,2 @@
1
1
  export { TABLE_PERMISSION_ID } from './extension.js';
2
- export { TableType, type Table, type TableConfig } from './table.js';
2
+ export { TableType, type Table, type TableConfig, type TableEvents } from './table.js';
@@ -1,2 +1,2 @@
1
- import{TABLE_PERMISSION_ID as p}from"./extension.js";import{TableType as r}from"./table.js";export{p as TABLE_PERMISSION_ID,r as TableType};
1
+ import{TABLE_PERMISSION_ID as t}from"./extension.js";import{TableType as o}from"./table.js";export{t as TABLE_PERMISSION_ID,o as TableType};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/table/index.ts"],
4
- "sourcesContent": ["export { TABLE_PERMISSION_ID } from './extension.js';\nexport { TableType, type Table, type TableConfig } from './table.js';\n\n"],
5
- "mappings": "AAAA,OAAS,uBAAAA,MAA2B,iBACpC,OAAS,aAAAC,MAA+C",
4
+ "sourcesContent": ["export { TABLE_PERMISSION_ID } from './extension.js';\nexport { TableType, type Table, type TableConfig, type TableEvents } from './table.js';\n"],
5
+ "mappings": "AAAA,OAAS,uBAAAA,MAA2B,iBACpC,OAAS,aAAAC,MAAiE",
6
6
  "names": ["TABLE_PERMISSION_ID", "TableType"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import type { EventEmitter, Unlisten } from '../../event';
1
+ import type { Unlisten } from '../../event';
2
2
  import { Identifier, IntoId } from '../../identifier';
3
3
  import type { JsonType, Serializable } from '../../serialize';
4
4
  export type TableConfig = {
@@ -7,7 +7,8 @@ export type TableConfig = {
7
7
  export interface Table<T> {
8
8
  type: TableType<T>;
9
9
  readonly cache: ReadonlyMap<string, T>;
10
- readonly event: TableEvents<T>;
10
+ on<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): Unlisten;
11
+ off<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): void;
11
12
  get(key: string): Promise<T | undefined>;
12
13
  getMany(...keys: string[]): Promise<Map<string, T>>;
13
14
  add(...item: T[]): Promise<void>;
@@ -42,11 +43,11 @@ export interface Table<T> {
42
43
  listen(listener?: (items: Map<string, T>) => void): Unlisten;
43
44
  }
44
45
  export type TableEvents<T> = {
45
- add: EventEmitter<[Map<string, T>]>;
46
- update: EventEmitter<[Map<string, T>]>;
47
- remove: EventEmitter<[Map<string, T>]>;
48
- clear: EventEmitter<[]>;
49
- cacheUpdate: EventEmitter<[Map<string, T>]>;
46
+ add: [Map<string, T>];
47
+ update: [Map<string, T>];
48
+ remove: [Map<string, T>];
49
+ clear: [];
50
+ cache: [Map<string, T>];
50
51
  };
51
52
  export type TablePermissions = {
52
53
  all?: Identifier;