@omujs/omu 0.10.6 → 0.10.8

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.
@@ -1,2 +1,2 @@
1
- import{Identifier as n}from"../../identifier";import{ByteReader as u,ByteWriter as f,Serializer as o}from"../../serialize";import{EndpointType as p}from"../endpoint/endpoint.js";import{ExtensionType as I}from"../extension.js";const a=new I("asset",r=>new _(r)),m=new o(r=>{const e=new f;return e.writeString(r.id.key()),e.writeUint8Array(r.buffer),e.finish()},r=>{const e=u.fromUint8Array(r),t=n.fromKey(e.readString()),s=e.readUint8Array();return e.finish(),{id:t,buffer:s}}),A=new o(r=>{const e=new f;e.writeULEB128(r.length);for(const t of r)e.writeString(t.id.key()),e.writeUint8Array(t.buffer);return e.finish()},r=>{const e=u.fromUint8Array(r),t=e.readULEB128(),s=[];for(let i=0;i<t;i++){const l=n.fromKey(e.readString()),c=e.readUint8Array();s.push({id:l,buffer:c})}return e.finish(),s}),d=a.join("permission"),y=p.createSerialized(a,{name:"upload",requestSerializer:m,responseSerializer:o.of(n).toJson(),permissionId:d}),E=p.createSerialized(a,{name:"upload_many",requestSerializer:A,responseSerializer:o.of(n).toArray().pipe(o.json()),permissionId:d}),S=p.createSerialized(a,{name:"download",requestSerializer:o.of(n).pipe(o.json()),responseSerializer:m,permissionId:d}),h=p.createSerialized(a,{name:"download_many",requestSerializer:o.of(n).toArray().pipe(o.json()),responseSerializer:A,permissionId:d}),w=p.createJson(a,{name:"delete",requestSerializer:n,permissionId:d}),T=p.createJson(a,{name:"token_generate",permissionId:d});class _{constructor(e){this.omu=e;e.network.event.disconnected.listen(()=>{this.assetToken=void 0}),e.onReady(async()=>{e.permissions.required(d)&&await this.requestGenerateAssetToken()})}type=a;assetToken=void 0;async upload(e,t){return await this.omu.endpoints.call(y,{id:n.from(e),buffer:t})}async uploadMany(...e){return await this.omu.endpoints.call(E,e)}async download(e){const t=n.from(e);return await this.omu.endpoints.call(S,t)}async downloadMany(...e){return await this.omu.endpoints.call(h,e.map(s=>n.from(s)))}async delete(e){const t=n.from(e);await this.omu.endpoints.call(w,t)}async requestGenerateAssetToken(){const e=await this.omu.endpoints.call(T,{});this.assetToken=e.token}url(e,t){if(!this.assetToken)throw new Error("Asset token is not set");const s=n.from(e).key(),i=this.omu.network.address,l=i.secure?"https":"http",c=new URL(`${l}://${i.host}:${i.port}/asset`);return c.searchParams.set("asset_token",this.assetToken),c.searchParams.set("id",s),t?.cache==="no-cache"&&c.searchParams.set("t",Date.now().toString()),c.toString()}proxy(e){if(!this.assetToken)throw new Error("Asset token is not set");const t=this.omu.network.address,s=t.secure?"https":"http",i=new URL(`${s}://${t.host}:${t.port}/proxy`);return i.searchParams.set("asset_token",this.assetToken),i.searchParams.set("url",e),i.toString()}}export{a as ASSET_EXTENSION_TYPE,d as ASSET_PERMISSION_ID,_ as AssetExtension};
1
+ import{Identifier as n}from"../../identifier";import{ByteReader as u,ByteWriter as f,Serializer as o}from"../../serialize";import{EndpointType as p}from"../endpoint/endpoint.js";import{ExtensionType as I}from"../extension.js";const a=new I("asset",r=>new _(r)),m=new o(r=>{const e=new f;return e.writeString(r.id.key()),e.writeUint8Array(r.buffer),e.finish()},r=>{const e=u.fromUint8Array(r),t=n.fromKey(e.readString()),s=e.readUint8Array();return e.finish(),{id:t,buffer:s}}),A=new o(r=>{const e=new f;e.writeULEB128(r.length);for(const t of r)e.writeString(t.id.key()),e.writeUint8Array(t.buffer);return e.finish()},r=>{const e=u.fromUint8Array(r),t=e.readULEB128(),s=[];for(let i=0;i<t;i++){const l=n.fromKey(e.readString()),c=e.readUint8Array();s.push({id:l,buffer:c})}return e.finish(),s}),d=a.join("permission"),y=p.createSerialized(a,{name:"upload",requestSerializer:m,responseSerializer:o.of(n).toJson(),permissionId:d}),E=p.createSerialized(a,{name:"upload_many",requestSerializer:A,responseSerializer:o.of(n).toArray().pipe(o.json()),permissionId:d}),S=p.createSerialized(a,{name:"download",requestSerializer:o.of(n).pipe(o.json()),responseSerializer:m,permissionId:d}),h=p.createSerialized(a,{name:"download_many",requestSerializer:o.of(n).toArray().pipe(o.json()),responseSerializer:A,permissionId:d}),w=p.createJson(a,{name:"delete",requestSerializer:n,permissionId:d}),T=p.createJson(a,{name:"token_generate",permissionId:d});class _{constructor(e){this.omu=e;e.network.on("disconnected",()=>{this.assetToken=void 0}),e.onReady(async()=>{e.permissions.required(d)&&await this.requestGenerateAssetToken()})}type=a;assetToken=void 0;async upload(e,t){return await this.omu.endpoints.call(y,{id:n.from(e),buffer:t})}async uploadMany(...e){return await this.omu.endpoints.call(E,e)}async download(e){const t=n.from(e);return await this.omu.endpoints.call(S,t)}async downloadMany(...e){return await this.omu.endpoints.call(h,e.map(s=>n.from(s)))}async delete(e){const t=n.from(e);await this.omu.endpoints.call(w,t)}async requestGenerateAssetToken(){const e=await this.omu.endpoints.call(T,{});this.assetToken=e.token}url(e,t){if(!this.assetToken)throw new Error("Asset token is not set");const s=n.from(e).key(),i=this.omu.network.address,l=i.secure?"https":"http",c=new URL(`${l}://${i.host}:${i.port}/asset`);return c.searchParams.set("asset_token",this.assetToken),c.searchParams.set("id",s),t?.cache==="no-cache"&&c.searchParams.set("t",Date.now().toString()),c.toString()}proxy(e){if(!this.assetToken)throw new Error("Asset token is not set");const t=this.omu.network.address,s=t.secure?"https":"http",i=new URL(`${s}://${t.host}:${t.port}/proxy`);return i.searchParams.set("asset_token",this.assetToken),i.searchParams.set("url",e),i.toString()}}export{a as ASSET_EXTENSION_TYPE,d as ASSET_PERMISSION_ID,_ as AssetExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/asset/extension.ts"],
4
- "sourcesContent": ["import { Identifier, IntoId } from '../../identifier';\nimport { Omu } from '../../omu';\nimport { ByteReader, ByteWriter, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { ExtensionType } from '../extension.js';\n\nexport const ASSET_EXTENSION_TYPE: ExtensionType<AssetExtension> = new ExtensionType(\n 'asset',\n (omu: Omu) => new AssetExtension(omu),\n);\n\nexport type Asset = {\n id: Identifier;\n buffer: Uint8Array;\n};\n\nconst FILE_SERIALIZER = new Serializer<Asset, Uint8Array>(\n (file) => {\n const writer = new ByteWriter();\n writer.writeString(file.id.key());\n writer.writeUint8Array(file.buffer);\n return writer.finish();\n },\n (data) => {\n const reader = ByteReader.fromUint8Array(data);\n const identifier = Identifier.fromKey(reader.readString());\n const buffer = reader.readUint8Array();\n reader.finish();\n return { id: identifier, buffer };\n },\n);\nconst FILE_ARRAY_SERIALIZER = new Serializer<Asset[], Uint8Array>(\n (files) => {\n const writer = new ByteWriter();\n writer.writeULEB128(files.length);\n for (const file of files) {\n writer.writeString(file.id.key());\n writer.writeUint8Array(file.buffer);\n }\n return writer.finish();\n },\n (data) => {\n const reader = ByteReader.fromUint8Array(data);\n const length = reader.readULEB128();\n const files: Asset[] = [];\n for (let i = 0; i < length; i++) {\n const identifier = Identifier.fromKey(reader.readString());\n const buffer = reader.readUint8Array();\n files.push({ id: identifier, buffer });\n }\n reader.finish();\n return files;\n },\n);\n\nexport const ASSET_PERMISSION_ID: Identifier = ASSET_EXTENSION_TYPE.join('permission');\n\nconst ASSET_UPLOAD_ENDPOINT = EndpointType.createSerialized<Asset, Identifier>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'upload',\n requestSerializer: FILE_SERIALIZER,\n responseSerializer: Serializer.of(Identifier).toJson(),\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_UPLOAD_MANY_ENDPOINT = EndpointType.createSerialized<Asset[], Identifier[]>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'upload_many',\n requestSerializer: FILE_ARRAY_SERIALIZER,\n responseSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DOWNLOAD_ENDPOINT = EndpointType.createSerialized<Identifier, Asset>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'download',\n requestSerializer: Serializer.of(Identifier).pipe(Serializer.json()),\n responseSerializer: FILE_SERIALIZER,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DOWNLOAD_MANY_ENDPOINT = EndpointType.createSerialized<Identifier[], Asset[]>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'download_many',\n requestSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),\n responseSerializer: FILE_ARRAY_SERIALIZER,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DELETE_ENDPOINT = EndpointType.createJson<Identifier, null>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'delete',\n requestSerializer: Identifier,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\n\nconst ASSET_GENERATE_TOKEN_ENDPOINT = EndpointType.createJson<object, { token: string }>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'token_generate',\n permissionId: ASSET_PERMISSION_ID,\n },\n);\n\nexport class AssetExtension {\n public readonly type: ExtensionType<AssetExtension> = ASSET_EXTENSION_TYPE;\n private assetToken: string | undefined = undefined;\n\n constructor(private readonly omu: Omu) {\n omu.network.event.disconnected.listen(() => {\n this.assetToken = undefined;\n });\n omu.onReady(async () => {\n if (omu.permissions.required(ASSET_PERMISSION_ID)) {\n await this.requestGenerateAssetToken();\n }\n });\n }\n\n public async upload(identifier: IntoId, buffer: Uint8Array): Promise<Identifier> {\n const assetIdentifier = await this.omu.endpoints.call(ASSET_UPLOAD_ENDPOINT, {\n id: Identifier.from(identifier),\n buffer,\n });\n return assetIdentifier;\n }\n\n public async uploadMany(...files: Asset[]): Promise<Identifier[]> {\n const uploaded = await this.omu.endpoints.call(ASSET_UPLOAD_MANY_ENDPOINT, files);\n return uploaded;\n }\n\n public async download(identifier: IntoId): Promise<Asset> {\n const id = Identifier.from(identifier);\n const downloaded = await this.omu.endpoints.call(ASSET_DOWNLOAD_ENDPOINT, id);\n return downloaded;\n }\n\n public async downloadMany(...identifiers: IntoId[]): Promise<Asset[]> {\n const downloaded = await this.omu.endpoints.call(\n ASSET_DOWNLOAD_MANY_ENDPOINT,\n identifiers.map((id) => Identifier.from(id)),\n );\n return downloaded;\n }\n\n public async delete(identifier: IntoId): Promise<void> {\n const id = Identifier.from(identifier);\n await this.omu.endpoints.call(ASSET_DELETE_ENDPOINT, id);\n }\n\n private async requestGenerateAssetToken() {\n const result = await this.omu.endpoints.call(ASSET_GENERATE_TOKEN_ENDPOINT, {});\n this.assetToken = result.token;\n }\n\n public url(\n id: IntoId,\n options?: { cache?: 'no-cache' },\n ): string {\n if (!this.assetToken) {\n throw new Error('Asset token is not set');\n }\n const key = Identifier.from(id).key();\n const address = this.omu.network.address;\n const protocol = address.secure ? 'https' : 'http';\n const url = new URL(`${protocol}://${address.host}:${address.port}/asset`);\n url.searchParams.set('asset_token', this.assetToken);\n url.searchParams.set('id', key);\n if (options?.cache === 'no-cache') {\n url.searchParams.set('t', Date.now().toString());\n }\n return url.toString();\n }\n\n public proxy(url: string): string {\n if (!this.assetToken) {\n throw new Error('Asset token is not set');\n }\n const address = this.omu.network.address;\n const protocol = address.secure ? 'https' : 'http';\n const proxyUrl = new URL(`${protocol}://${address.host}:${address.port}/proxy`);\n proxyUrl.searchParams.set('asset_token', this.assetToken);\n proxyUrl.searchParams.set('url', url);\n return proxyUrl.toString();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Identifier, IntoId } from '../../identifier';\nimport { Omu } from '../../omu';\nimport { ByteReader, ByteWriter, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { ExtensionType } from '../extension.js';\n\nexport const ASSET_EXTENSION_TYPE: ExtensionType<AssetExtension> = new ExtensionType(\n 'asset',\n (omu: Omu) => new AssetExtension(omu),\n);\n\nexport type Asset = {\n id: Identifier;\n buffer: Uint8Array;\n};\n\nconst FILE_SERIALIZER = new Serializer<Asset, Uint8Array>(\n (file) => {\n const writer = new ByteWriter();\n writer.writeString(file.id.key());\n writer.writeUint8Array(file.buffer);\n return writer.finish();\n },\n (data) => {\n const reader = ByteReader.fromUint8Array(data);\n const identifier = Identifier.fromKey(reader.readString());\n const buffer = reader.readUint8Array();\n reader.finish();\n return { id: identifier, buffer };\n },\n);\nconst FILE_ARRAY_SERIALIZER = new Serializer<Asset[], Uint8Array>(\n (files) => {\n const writer = new ByteWriter();\n writer.writeULEB128(files.length);\n for (const file of files) {\n writer.writeString(file.id.key());\n writer.writeUint8Array(file.buffer);\n }\n return writer.finish();\n },\n (data) => {\n const reader = ByteReader.fromUint8Array(data);\n const length = reader.readULEB128();\n const files: Asset[] = [];\n for (let i = 0; i < length; i++) {\n const identifier = Identifier.fromKey(reader.readString());\n const buffer = reader.readUint8Array();\n files.push({ id: identifier, buffer });\n }\n reader.finish();\n return files;\n },\n);\n\nexport const ASSET_PERMISSION_ID: Identifier = ASSET_EXTENSION_TYPE.join('permission');\n\nconst ASSET_UPLOAD_ENDPOINT = EndpointType.createSerialized<Asset, Identifier>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'upload',\n requestSerializer: FILE_SERIALIZER,\n responseSerializer: Serializer.of(Identifier).toJson(),\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_UPLOAD_MANY_ENDPOINT = EndpointType.createSerialized<Asset[], Identifier[]>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'upload_many',\n requestSerializer: FILE_ARRAY_SERIALIZER,\n responseSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DOWNLOAD_ENDPOINT = EndpointType.createSerialized<Identifier, Asset>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'download',\n requestSerializer: Serializer.of(Identifier).pipe(Serializer.json()),\n responseSerializer: FILE_SERIALIZER,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DOWNLOAD_MANY_ENDPOINT = EndpointType.createSerialized<Identifier[], Asset[]>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'download_many',\n requestSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),\n responseSerializer: FILE_ARRAY_SERIALIZER,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\nconst ASSET_DELETE_ENDPOINT = EndpointType.createJson<Identifier, null>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'delete',\n requestSerializer: Identifier,\n permissionId: ASSET_PERMISSION_ID,\n },\n);\n\nconst ASSET_GENERATE_TOKEN_ENDPOINT = EndpointType.createJson<object, { token: string }>(\n ASSET_EXTENSION_TYPE,\n {\n name: 'token_generate',\n permissionId: ASSET_PERMISSION_ID,\n },\n);\n\nexport class AssetExtension {\n public readonly type: ExtensionType<AssetExtension> = ASSET_EXTENSION_TYPE;\n private assetToken: string | undefined = undefined;\n\n constructor(private readonly omu: Omu) {\n omu.network.on('disconnected', () => {\n this.assetToken = undefined;\n });\n omu.onReady(async () => {\n if (omu.permissions.required(ASSET_PERMISSION_ID)) {\n await this.requestGenerateAssetToken();\n }\n });\n }\n\n public async upload(identifier: IntoId, buffer: Uint8Array): Promise<Identifier> {\n const assetIdentifier = await this.omu.endpoints.call(ASSET_UPLOAD_ENDPOINT, {\n id: Identifier.from(identifier),\n buffer,\n });\n return assetIdentifier;\n }\n\n public async uploadMany(...files: Asset[]): Promise<Identifier[]> {\n const uploaded = await this.omu.endpoints.call(ASSET_UPLOAD_MANY_ENDPOINT, files);\n return uploaded;\n }\n\n public async download(identifier: IntoId): Promise<Asset> {\n const id = Identifier.from(identifier);\n const downloaded = await this.omu.endpoints.call(ASSET_DOWNLOAD_ENDPOINT, id);\n return downloaded;\n }\n\n public async downloadMany(...identifiers: IntoId[]): Promise<Asset[]> {\n const downloaded = await this.omu.endpoints.call(\n ASSET_DOWNLOAD_MANY_ENDPOINT,\n identifiers.map((id) => Identifier.from(id)),\n );\n return downloaded;\n }\n\n public async delete(identifier: IntoId): Promise<void> {\n const id = Identifier.from(identifier);\n await this.omu.endpoints.call(ASSET_DELETE_ENDPOINT, id);\n }\n\n private async requestGenerateAssetToken() {\n const result = await this.omu.endpoints.call(ASSET_GENERATE_TOKEN_ENDPOINT, {});\n this.assetToken = result.token;\n }\n\n public url(\n id: IntoId,\n options?: { cache?: 'no-cache' },\n ): string {\n if (!this.assetToken) {\n throw new Error('Asset token is not set');\n }\n const key = Identifier.from(id).key();\n const address = this.omu.network.address;\n const protocol = address.secure ? 'https' : 'http';\n const url = new URL(`${protocol}://${address.host}:${address.port}/asset`);\n url.searchParams.set('asset_token', this.assetToken);\n url.searchParams.set('id', key);\n if (options?.cache === 'no-cache') {\n url.searchParams.set('t', Date.now().toString());\n }\n return url.toString();\n }\n\n public proxy(url: string): string {\n if (!this.assetToken) {\n throw new Error('Asset token is not set');\n }\n const address = this.omu.network.address;\n const protocol = address.secure ? 'https' : 'http';\n const proxyUrl = new URL(`${protocol}://${address.host}:${address.port}/proxy`);\n proxyUrl.searchParams.set('asset_token', this.assetToken);\n proxyUrl.searchParams.set('url', url);\n return proxyUrl.toString();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Identifier", "ByteReader", "ByteWriter", "Serializer", "EndpointType", "ExtensionType", "ASSET_EXTENSION_TYPE", "omu", "AssetExtension", "FILE_SERIALIZER", "file", "writer", "data", "reader", "identifier", "buffer", "FILE_ARRAY_SERIALIZER", "files", "length", "ASSET_PERMISSION_ID", "ASSET_UPLOAD_ENDPOINT", "ASSET_UPLOAD_MANY_ENDPOINT", "ASSET_DOWNLOAD_ENDPOINT", "ASSET_DOWNLOAD_MANY_ENDPOINT", "ASSET_DELETE_ENDPOINT", "ASSET_GENERATE_TOKEN_ENDPOINT", "id", "identifiers", "result", "options", "key", "address", "protocol", "url", "proxyUrl"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Identifier as b,IdentifierMap as h}from"../../identifier";import{PacketType as R}from"../../network/packet";import{PromiseResult as E}from"../../result";import{Serializer as _}from"../../serialize";import{EndpointType as p}from"../endpoint";import{TableType as H}from"../table";import{DASHBOARD_EXTENSION_TYPE as c,DASHBOARD_SET_PERMISSION_ID as x}from"./constants";class A extends Array{toString(){return this.map(i=>`${i.name}=${i.value}`).join("; ")}}const m=R.createJson(c,{name:"webview_event",serializer:_.noop().field("id",b).field("target",b)}),w=c.join("webview"),P=H.createJson(c,{name:"allowed_webview_hosts",key:u=>u.id,permissions:{all:x}}),g=p.createJson(c,{name:"host_request",permissionId:w}),W=p.createJson(c,{name:"cookies_get",permissionId:w}),k=p.createJson(c,{name:"webview_request",permissionId:w}),f=p.createJson(c,{name:"webview_close",permissionId:w});class G{constructor(i){this.omu=i;i.network.registerPacket(m),i.network.addPacketHandler(m,r=>{const e=this.webviewHandles.get(r.id);e&&e.emit(r.event)}),this.allowedHosts=i.tables.get(P)}webviewHandles=new h;allowedHosts;setDashboard(i){const r=async(e,t)=>{const o=t.split(".").reverse().join(".");if(e.caller.namespace===o)return{type:"ok",value:void 0};const n=e.caller.key();if(!(await this.allowedHosts.get(n)??{id:n,hosts:[]}).hosts.includes(t))if(await i.handleHostRequest({host:t},e)==="accept"){const s=await this.allowedHosts.get(n)??{id:n,hosts:[]};s.hosts.push(t),await this.allowedHosts.update(s)}else return{type:"cancelled"};return{type:"ok",value:void 0}};this.omu.server.apps.event.remove.listen(async e=>{for(const t of e.values()){const o=await this.allowedHosts.get(t.id.key());o&&this.allowedHosts.remove(o)}}),this.omu.endpoints.bind(W,async(e,t)=>{const{url:o}=e,{host:n}=new URL(o),a=await r(t,n);return a.type!=="ok"?a:await i.getCookies(e)}),this.omu.endpoints.bind(g,async(e,t)=>{const{host:o}=e;return await r(t,o)}),this.omu.endpoints.bind(k,async(e,t)=>{const o=new URL(e.url),{host:n}=o,a=await r(t,n);if(a.type!=="ok")return a;let l=null;const d=async v=>{l&&this.omu.send(m,{id:l,target:t.caller,event:v})},s=await i.createWebview(e,t,d);return l=s,{type:"ok",value:{id:s.key()}}}),this.omu.endpoints.bind(f,async(e,t)=>{const o=await i.getWebview(e,t);return o?(await i.closeWebview(e,t),{type:"ok",value:{id:o.key()}}):{type:"cancelled"}})}requestWebview(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(k,i).then(o=>{if(o.type!=="ok"){t(o);return}const{value:n}=o,a=b.fromKey(n.id),l={},d={id:a,url:i.url,close:async()=>{await this.omu.endpoints.call(f,{id:a.key()})},getCookies:()=>this.getCookies({url:i.url}),on:function(s,v){l[s]||(l[s]=[]),l[s].push(v)},join:async()=>{await new Promise(s=>{d.on("closed",()=>s())})}};this.webviewHandles.set(a,{handle:d,emit:function(s){const v=l[s.type];if(v)for(const y of v)y(s)}}),e(d)}),r}getCookies(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(W,i).then(o=>{if(o.type==="ok"){e(A.from(o.value));return}else t(o)}),r}}export{A as CookieList,m as DASHBOARD_WEBVIEW_EVENT_PACKET,w as DASHBOARD_WEBVIEW_PERMISSION_ID,G as WebviewAPI};
1
+ import{Identifier as b,IdentifierMap as h}from"../../identifier";import{PacketType as R}from"../../network/packet";import{PromiseResult as E}from"../../result";import{Serializer as _}from"../../serialize";import{EndpointType as p}from"../endpoint";import{TableType as H}from"../table";import{DASHBOARD_EXTENSION_TYPE as c,DASHBOARD_SET_PERMISSION_ID as x}from"./constants";class A extends Array{toString(){return this.map(i=>`${i.name}=${i.value}`).join("; ")}}const m=R.createJson(c,{name:"webview_event",serializer:_.noop().field("id",b).field("target",b)}),w=c.join("webview"),P=H.createJson(c,{name:"allowed_webview_hosts",key:u=>u.id,permissions:{all:x}}),g=p.createJson(c,{name:"host_request",permissionId:w}),W=p.createJson(c,{name:"cookies_get",permissionId:w}),k=p.createJson(c,{name:"webview_request",permissionId:w}),f=p.createJson(c,{name:"webview_close",permissionId:w});class G{constructor(i){this.omu=i;i.network.registerPacket(m),i.network.addPacketHandler(m,r=>{const e=this.webviewHandles.get(r.id);e&&e.emit(r.event)}),this.allowedHosts=i.tables.get(P)}webviewHandles=new h;allowedHosts;setDashboard(i){const r=async(e,t)=>{const o=t.split(".").reverse().join(".");if(e.caller.namespace===o)return{type:"ok",value:void 0};const n=e.caller.key();if(!(await this.allowedHosts.get(n)??{id:n,hosts:[]}).hosts.includes(t))if(await i.handleHostRequest({host:t},e)==="accept"){const s=await this.allowedHosts.get(n)??{id:n,hosts:[]};s.hosts.push(t),await this.allowedHosts.update(s)}else return{type:"cancelled"};return{type:"ok",value:void 0}};this.omu.server.apps.on("remove",async e=>{for(const t of e.values()){const o=await this.allowedHosts.get(t.id.key());o&&this.allowedHosts.remove(o)}}),this.omu.endpoints.bind(W,async(e,t)=>{const{url:o}=e,{host:n}=new URL(o),a=await r(t,n);return a.type!=="ok"?a:await i.getCookies(e)}),this.omu.endpoints.bind(g,async(e,t)=>{const{host:o}=e;return await r(t,o)}),this.omu.endpoints.bind(k,async(e,t)=>{const o=new URL(e.url),{host:n}=o,a=await r(t,n);if(a.type!=="ok")return a;let l=null;const d=async v=>{l&&this.omu.send(m,{id:l,target:t.caller,event:v})},s=await i.createWebview(e,t,d);return l=s,{type:"ok",value:{id:s.key()}}}),this.omu.endpoints.bind(f,async(e,t)=>{const o=await i.getWebview(e,t);return o?(await i.closeWebview(e,t),{type:"ok",value:{id:o.key()}}):{type:"cancelled"}})}requestWebview(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(k,i).then(o=>{if(o.type!=="ok"){t(o);return}const{value:n}=o,a=b.fromKey(n.id),l={},d={id:a,url:i.url,close:async()=>{await this.omu.endpoints.call(f,{id:a.key()})},getCookies:()=>this.getCookies({url:i.url}),on:function(s,v){l[s]||(l[s]=[]),l[s].push(v)},join:async()=>{await new Promise(s=>{d.on("closed",()=>s())})}};this.webviewHandles.set(a,{handle:d,emit:function(s){const v=l[s.type];if(v)for(const y of v)y(s)}}),e(d)}),r}getCookies(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(W,i).then(o=>{if(o.type==="ok"){e(A.from(o.value));return}else t(o)}),r}}export{A as CookieList,m as DASHBOARD_WEBVIEW_EVENT_PACKET,w as DASHBOARD_WEBVIEW_PERMISSION_ID,G as WebviewAPI};
2
2
  //# sourceMappingURL=webview.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/dashboard/webview.ts"],
4
- "sourcesContent": ["import { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { PromiseResult } from '../../result';\nimport { Serializer } from '../../serialize';\nimport { EndpointType, InvokedParams } from '../endpoint';\nimport { Table, TableType } from '../table';\nimport { AllowedHost, DASHBOARD_EXTENSION_TYPE, DASHBOARD_SET_PERMISSION_ID, UserError, UserResponse } from './constants';\nimport { DashboardHandler } from './handler';\n\nexport type Cookie = {\n name: string;\n value: string;\n};\n\nexport class CookieList extends Array<Cookie> {\n public toString(): string {\n return this.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n }\n}\n\nexport type WebviewEvent = {\n type: 'closed';\n} | {\n type: 'resize';\n dimensions: {\n x: number;\n y: number;\n };\n} | {\n type: 'cookie';\n cookies: Cookie[];\n} | {\n type: 'message';\n data: any;\n};\n\nexport type WebviewEventPacket = {\n id: Identifier;\n target: Identifier;\n event: WebviewEvent;\n};\n\nexport const DASHBOARD_WEBVIEW_EVENT_PACKET: PacketType<WebviewEventPacket> = PacketType.createJson<WebviewEventPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_event',\n serializer: Serializer.noop<WebviewEventPacket>()\n .field('id', Identifier)\n .field('target', Identifier),\n});\n\nexport type WebviewPacket = {\n id: string;\n};\n\nexport type WebviewResponse = UserResponse<WebviewPacket>;\n\nexport type GetCookiesRequest = {\n url: string;\n};\n\nexport type WebviewRequest = {\n url: string;\n script?: string;\n center?: boolean;\n position?: { x: number; y: number };\n inner_size?: { x: number; y: number };\n min_inner_size?: { x: number; y: number };\n max_inner_size?: { x: number; y: number };\n resizable?: boolean;\n maximizable?: boolean;\n minimizable?: boolean;\n title?: string;\n maximized?: boolean;\n always_on_bottom?: boolean;\n always_on_top?: boolean;\n shadow?: boolean;\n decorations?: boolean;\n transparent?: boolean;\n};\n\nexport type WebviewEventListeners = {\n [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, { type: K }>) => void>;\n};\n\nexport type WebviewHandle = {\n readonly id: Identifier;\n readonly url: string;\n getCookies(): PromiseResult<CookieList, UserError>;\n on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;\n close(): Promise<void>;\n join(): Promise<void>;\n};\n\nexport type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>) => void;\n\nexport const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');\n\nconst DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson<AllowedHost>(DASHBOARD_EXTENSION_TYPE, {\n name: 'allowed_webview_hosts',\n key: (entry) => entry.id,\n permissions: { all: DASHBOARD_SET_PERMISSION_ID },\n});\n\nconst DASHBOARD_HOST_REQUEST = EndpointType.createJson<{ host: string }, UserResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'host_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserResponse<Cookie[]>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'cookies_get',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_close',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport class WebviewAPI {\n private readonly webviewHandles: IdentifierMap<{ handle: WebviewHandle; emit: WebviewEventEmit }> = new IdentifierMap();\n public readonly allowedHosts: Table<AllowedHost>;\n\n constructor(\n private readonly omu: Omu,\n ) {\n omu.network.registerPacket(\n DASHBOARD_WEBVIEW_EVENT_PACKET,\n );\n omu.network.addPacketHandler(DASHBOARD_WEBVIEW_EVENT_PACKET, (packet) => {\n const handle = this.webviewHandles.get(packet.id);\n if (!handle) return;\n handle.emit(packet.event);\n });\n this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);\n }\n\n public setDashboard(dashboard: DashboardHandler): void {\n const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {\n const hostNamespace = host.split('.').reverse().join('.');\n if (params.caller.namespace === hostNamespace) {\n return { type: 'ok', value: undefined };\n }\n\n const id = params.caller.key();\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n const allowed = hostEntry.hosts.includes(host);\n\n if (!allowed) {\n const result = await dashboard.handleHostRequest({ host }, params);\n\n if (result === 'accept') {\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n hostEntry.hosts.push(host);\n await this.allowedHosts.update(hostEntry);\n } else {\n return { type: 'cancelled' };\n }\n }\n\n return { type: 'ok', value: undefined };\n };\n\n this.omu.server.apps.event.remove.listen(async (apps) => {\n for (const app of apps.values()) {\n const hosts = await this.allowedHosts.get(app.id.key());\n if (!hosts) continue;\n this.allowedHosts.remove(hosts);\n }\n });\n this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {\n const { url } = request;\n const { host } = new URL(url);\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n return await dashboard.getCookies(request);\n });\n this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {\n const { host } = request;\n const result = await requireHost(params, host);\n return result;\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {\n const url = new URL(request.url);\n const { host } = url;\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n\n let webviewId: Identifier | null = null;\n const emit = async (event: WebviewEvent) => {\n if (!webviewId) return;\n this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, { id: webviewId, target: params.caller, event });\n };\n\n const id = await dashboard.createWebview(request, params, emit);\n webviewId = id;\n\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {\n const id = await dashboard.getWebview(request, params);\n if (!id) {\n return {\n type: 'cancelled',\n };\n }\n await dashboard.closeWebview(request, params);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n }\n\n public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_REQUEST,\n options,\n ).then((result) => {\n if (result.type !== 'ok') {\n reject(result);\n return;\n }\n const { value } = result;\n const id = Identifier.fromKey(value.id);\n const eventListeners: WebviewEventListeners = {};\n const handle: WebviewHandle = {\n id,\n url: options.url,\n close: async () => {\n await this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_CLOSE,\n { id: id.key() },\n );\n },\n getCookies: () => this.getCookies({\n url: options.url,\n }),\n on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {\n if (!eventListeners[key]) {\n eventListeners[key] = [];\n }\n const listeners = eventListeners[key]!;\n listeners.push(callback);\n },\n join: async () => {\n await new Promise<void>((resolve) => {\n handle.on('closed', () => resolve());\n });\n },\n };\n this.webviewHandles.set(id, {\n handle,\n emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {\n const listeners = eventListeners[event.type];\n if (!listeners) return;\n for (const listener of listeners) {\n listener(event);\n }\n },\n });\n\n resolve(handle);\n });\n return promise;\n }\n\n public getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<CookieList, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_COOKIES_GET,\n options,\n ).then((response) => {\n if (response.type === 'ok') {\n resolve(CookieList.from(response.value));\n return;\n } else {\n reject(response);\n }\n });\n return promise;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { PromiseResult } from '../../result';\nimport { Serializer } from '../../serialize';\nimport { EndpointType, InvokedParams } from '../endpoint';\nimport { Table, TableType } from '../table';\nimport { AllowedHost, DASHBOARD_EXTENSION_TYPE, DASHBOARD_SET_PERMISSION_ID, UserError, UserResponse } from './constants';\nimport { DashboardHandler } from './handler';\n\nexport type Cookie = {\n name: string;\n value: string;\n};\n\nexport class CookieList extends Array<Cookie> {\n public toString(): string {\n return this.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n }\n}\n\nexport type WebviewEvent = {\n type: 'closed';\n} | {\n type: 'resize';\n dimensions: {\n x: number;\n y: number;\n };\n} | {\n type: 'cookie';\n cookies: Cookie[];\n} | {\n type: 'message';\n data: any;\n};\n\nexport type WebviewEventPacket = {\n id: Identifier;\n target: Identifier;\n event: WebviewEvent;\n};\n\nexport const DASHBOARD_WEBVIEW_EVENT_PACKET: PacketType<WebviewEventPacket> = PacketType.createJson<WebviewEventPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_event',\n serializer: Serializer.noop<WebviewEventPacket>()\n .field('id', Identifier)\n .field('target', Identifier),\n});\n\nexport type WebviewPacket = {\n id: string;\n};\n\nexport type WebviewResponse = UserResponse<WebviewPacket>;\n\nexport type GetCookiesRequest = {\n url: string;\n};\n\nexport type WebviewRequest = {\n url: string;\n script?: string;\n center?: boolean;\n position?: { x: number; y: number };\n inner_size?: { x: number; y: number };\n min_inner_size?: { x: number; y: number };\n max_inner_size?: { x: number; y: number };\n resizable?: boolean;\n maximizable?: boolean;\n minimizable?: boolean;\n title?: string;\n maximized?: boolean;\n always_on_bottom?: boolean;\n always_on_top?: boolean;\n shadow?: boolean;\n decorations?: boolean;\n transparent?: boolean;\n};\n\nexport type WebviewEventListeners = {\n [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, { type: K }>) => void>;\n};\n\nexport type WebviewHandle = {\n readonly id: Identifier;\n readonly url: string;\n getCookies(): PromiseResult<CookieList, UserError>;\n on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;\n close(): Promise<void>;\n join(): Promise<void>;\n};\n\nexport type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>) => void;\n\nexport const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');\n\nconst DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson<AllowedHost>(DASHBOARD_EXTENSION_TYPE, {\n name: 'allowed_webview_hosts',\n key: (entry) => entry.id,\n permissions: { all: DASHBOARD_SET_PERMISSION_ID },\n});\n\nconst DASHBOARD_HOST_REQUEST = EndpointType.createJson<{ host: string }, UserResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'host_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserResponse<Cookie[]>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'cookies_get',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_close',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport class WebviewAPI {\n private readonly webviewHandles: IdentifierMap<{ handle: WebviewHandle; emit: WebviewEventEmit }> = new IdentifierMap();\n public readonly allowedHosts: Table<AllowedHost>;\n\n constructor(\n private readonly omu: Omu,\n ) {\n omu.network.registerPacket(\n DASHBOARD_WEBVIEW_EVENT_PACKET,\n );\n omu.network.addPacketHandler(DASHBOARD_WEBVIEW_EVENT_PACKET, (packet) => {\n const handle = this.webviewHandles.get(packet.id);\n if (!handle) return;\n handle.emit(packet.event);\n });\n this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);\n }\n\n public setDashboard(dashboard: DashboardHandler): void {\n const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {\n const hostNamespace = host.split('.').reverse().join('.');\n if (params.caller.namespace === hostNamespace) {\n return { type: 'ok', value: undefined };\n }\n\n const id = params.caller.key();\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n const allowed = hostEntry.hosts.includes(host);\n\n if (!allowed) {\n const result = await dashboard.handleHostRequest({ host }, params);\n\n if (result === 'accept') {\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n hostEntry.hosts.push(host);\n await this.allowedHosts.update(hostEntry);\n } else {\n return { type: 'cancelled' };\n }\n }\n\n return { type: 'ok', value: undefined };\n };\n\n this.omu.server.apps.on('remove', async (apps) => {\n for (const app of apps.values()) {\n const hosts = await this.allowedHosts.get(app.id.key());\n if (!hosts) continue;\n this.allowedHosts.remove(hosts);\n }\n });\n this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {\n const { url } = request;\n const { host } = new URL(url);\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n return await dashboard.getCookies(request);\n });\n this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {\n const { host } = request;\n const result = await requireHost(params, host);\n return result;\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {\n const url = new URL(request.url);\n const { host } = url;\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n\n let webviewId: Identifier | null = null;\n const emit = async (event: WebviewEvent) => {\n if (!webviewId) return;\n this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, { id: webviewId, target: params.caller, event });\n };\n\n const id = await dashboard.createWebview(request, params, emit);\n webviewId = id;\n\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {\n const id = await dashboard.getWebview(request, params);\n if (!id) {\n return {\n type: 'cancelled',\n };\n }\n await dashboard.closeWebview(request, params);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n }\n\n public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_REQUEST,\n options,\n ).then((result) => {\n if (result.type !== 'ok') {\n reject(result);\n return;\n }\n const { value } = result;\n const id = Identifier.fromKey(value.id);\n const eventListeners: WebviewEventListeners = {};\n const handle: WebviewHandle = {\n id,\n url: options.url,\n close: async () => {\n await this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_CLOSE,\n { id: id.key() },\n );\n },\n getCookies: () => this.getCookies({\n url: options.url,\n }),\n on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {\n if (!eventListeners[key]) {\n eventListeners[key] = [];\n }\n const listeners = eventListeners[key]!;\n listeners.push(callback);\n },\n join: async () => {\n await new Promise<void>((resolve) => {\n handle.on('closed', () => resolve());\n });\n },\n };\n this.webviewHandles.set(id, {\n handle,\n emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {\n const listeners = eventListeners[event.type];\n if (!listeners) return;\n for (const listener of listeners) {\n listener(event);\n }\n },\n });\n\n resolve(handle);\n });\n return promise;\n }\n\n public getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<CookieList, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_COOKIES_GET,\n options,\n ).then((response) => {\n if (response.type === 'ok') {\n resolve(CookieList.from(response.value));\n return;\n } else {\n reject(response);\n }\n });\n return promise;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Identifier", "IdentifierMap", "PacketType", "PromiseResult", "Serializer", "EndpointType", "TableType", "DASHBOARD_EXTENSION_TYPE", "DASHBOARD_SET_PERMISSION_ID", "CookieList", "cookie", "DASHBOARD_WEBVIEW_EVENT_PACKET", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_ALLOWED_WEBVIEW_HOSTS", "entry", "DASHBOARD_HOST_REQUEST", "DASHBOARD_COOKIES_GET", "DASHBOARD_WEBVIEW_REQUEST", "DASHBOARD_WEBVIEW_CLOSE", "WebviewAPI", "omu", "packet", "handle", "dashboard", "requireHost", "params", "host", "hostNamespace", "id", "hostEntry", "apps", "app", "hosts", "request", "url", "hostAccessResult", "webviewId", "emit", "event", "options", "promise", "resolve", "reject", "result", "value", "eventListeners", "key", "callback", "listeners", "listener", "response"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{textEncoder as _}from"../../const";import{PacketType as d}from"../../network/packet";import{ExtensionType as C}from"../extension";import{DataChunk as p,OmuResponse as O}from"./http";import{OmuWS as W,WSMsgType as m}from"./websocket";const a=new C("http",i=>new P(i)),G=a.join("request"),S=d.createJson(a,{name:"request_create"}),v=d.createSerialized(a,{name:"request_send",serializer:p}),H=d.createJson(a,{name:"request_close"}),E=d.createJson(a,{name:"response_create"}),g=d.createSerialized(a,{name:"response_chunk",serializer:p}),k=d.createJson(a,{name:"response_close"}),T=d.createJson(a,{name:"ws_create"}),q=d.createJson(a,{name:"ws_open"}),w=d.createSerialized(a,{name:"ws_data",serializer:p}),R=d.createJson(a,{name:"ws_close"}),b=d.createJson(a,{name:"ws_error"});function y(){let i,n;const e=new Promise((t,r)=>{i=t,n=r});if(!i||!n)throw new Error("Failed to create future");return{promise:e,resolve:i,reject:n}}class P{constructor(n){this.omu=n;n.network.registerPacket(S,v,H,E,g,k,R,T,w,q,b),n.network.addPacketHandler(E,e=>{const t=this.httpHandles[e.id];if(!t){console.warn("Received response for unknown request",e.id);return}if(t.type!=="created"){console.warn("Received response for already handled request",e.id);return}t.setResponse(e)}),n.network.addPacketHandler(g,e=>{const t=this.httpHandles[e.meta.id];if(!t){console.warn("Received response for unknown request",e.meta.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving request",e.meta.id);return}t.receive(e.body)}),n.network.addPacketHandler(k,e=>{const t=this.httpHandles[e.id];if(!t){console.warn("Received response for unknown request",e.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving request",e.id);return}t.close(),delete this.httpHandles[e.id]}),n.network.addPacketHandler(q,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}if(t.type!=="created"){console.warn("Received response for already handled socket",e.id);return}t.handle.open(e),t.type="receiving"}),n.network.addPacketHandler(w,e=>{const t=this.wsHandles[e.meta.id];if(!t){console.warn("Received response for unknown socket",e.meta.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving socket",e.meta.id);return}t.handle.dispatch(e)}),n.network.addPacketHandler(R,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}t.handle.close(e),delete this.httpHandles[e.id]}),n.network.addPacketHandler(b,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}t.handle.error(e),delete this.httpHandles[e.id]}),n.event.ready.listen(()=>{this.wsSendLoop()})}type=a;requestCount=0;httpHandles={};wsHandles={};wsSendQueue=[];wsSendWaitResolve=()=>{};async wsSendLoop(){for(;this.omu.running;){const n=this.wsSendQueue.shift();if(n){const e=await A(n.data),t=typeof n.data=="string"?m.TEXT:m.BINARY;this.omu.send(w,new p({id:n.id,type:t},e))}else await new Promise(e=>{this.wsSendWaitResolve=e})}}generateHeaders(n,e){const t={},r={},c=(s,o)=>{const h=s.toLowerCase(),f=r[h];f&&delete t[f],t[s]=o,r[h]=s};if(n.headers.forEach((s,o)=>{c(o,s)}),e?.headers)if(e.headers instanceof Headers)e.headers.forEach((s,o)=>{c(o,s)});else if(Array.isArray(e.headers))for(const[s,o]of e.headers)c(s,o);else for(const s in e.headers){const o=e.headers[s];c(s,o)}return t}generateId(){return this.omu.app.id.join(`${performance.timeOrigin}-${this.requestCount++}`)}async request(n,e){const t=new Request(n,e),r=this.generateId().key();if(this.omu.send(S,{id:r,header:this.generateHeaders(t,e),method:t.method,redirect:t.redirect,url:t.url}),t.body){const u=t.body.getReader();for(;;){const l=await u.read();if(l.done)break;this.omu.send(v,{meta:{id:r},body:l.value})}}this.omu.send(H,{id:r});const c=[],s=y();let o=y();const h=u=>{s.resolve(u),this.httpHandles[r]={type:"receiving",receive(l){c.push(l),o.resolve(!0),o=y()},close(){o.resolve(!1)}}};return this.httpHandles[r]={type:"created",setResponse:h},{response:await s.promise,stream:new ReadableStream({async start(u){for(;await o.promise;){const l=c.shift();if(!l)break;u.enqueue(l)}u.close()}})}}async fetch(n,e){const{response:t,stream:r}=await this.request(n,e);return new O(new Headers(t.header),t.status>=200&&t.status<300,t.redirected,t.status,t.statusText,"basic",t.url,r,!1)}async ws(n,e){const t=new Request(n,e),r=this.generateId(),c=W.create({addQueue:s=>{this.wsSendQueue.push({id:r.key(),data:s}),this.wsSendWaitResolve()},dispose:s=>{this.omu.send(R,{id:r.key(),code:s.code,reason:s.reason}),delete this.wsHandles[r.key()]}});return this.wsHandles[r.key()]={type:"created",handle:c},this.omu.send(T,{id:r.key(),header:this.generateHeaders(t,e),method:t.method,redirect:t.redirect,url:t.url}),c.ws}}async function A(i){if(typeof i=="string")return _.encode(i);if(i instanceof Blob){const n=await i.arrayBuffer();return new Uint8Array(n)}else return new Uint8Array(i)}export{a as HTTP_EXTENSION_TYPE,G as HTTP_REQUEST_PERMISSION_ID,P as HttpExtension};
1
+ import{textEncoder as _}from"../../const";import{PacketType as d}from"../../network/packet";import{ExtensionType as C}from"../extension";import{DataChunk as p,OmuResponse as O}from"./http";import{OmuWS as W,WSMsgType as m}from"./websocket";const a=new C("http",i=>new P(i)),G=a.join("request"),S=d.createJson(a,{name:"request_create"}),H=d.createSerialized(a,{name:"request_send",serializer:p}),v=d.createJson(a,{name:"request_close"}),E=d.createJson(a,{name:"response_create"}),g=d.createSerialized(a,{name:"response_chunk",serializer:p}),k=d.createJson(a,{name:"response_close"}),T=d.createJson(a,{name:"ws_create"}),q=d.createJson(a,{name:"ws_open"}),w=d.createSerialized(a,{name:"ws_data",serializer:p}),R=d.createJson(a,{name:"ws_close"}),b=d.createJson(a,{name:"ws_error"});function y(){let i,n;const e=new Promise((t,r)=>{i=t,n=r});if(!i||!n)throw new Error("Failed to create future");return{promise:e,resolve:i,reject:n}}class P{constructor(n){this.omu=n;n.network.registerPacket(S,H,v,E,g,k,R,T,w,q,b),n.network.addPacketHandler(E,e=>{const t=this.httpHandles[e.id];if(!t){console.warn("Received response for unknown request",e.id);return}if(t.type!=="created"){console.warn("Received response for already handled request",e.id);return}t.setResponse(e)}),n.network.addPacketHandler(g,e=>{const t=this.httpHandles[e.meta.id];if(!t){console.warn("Received response for unknown request",e.meta.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving request",e.meta.id);return}t.receive(e.body)}),n.network.addPacketHandler(k,e=>{const t=this.httpHandles[e.id];if(!t){console.warn("Received response for unknown request",e.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving request",e.id);return}t.close(),delete this.httpHandles[e.id]}),n.network.addPacketHandler(q,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}if(t.type!=="created"){console.warn("Received response for already handled socket",e.id);return}t.handle.open(e),t.type="receiving"}),n.network.addPacketHandler(w,e=>{const t=this.wsHandles[e.meta.id];if(!t){console.warn("Received response for unknown socket",e.meta.id);return}if(t.type!=="receiving"){console.warn("Received chunk for non-receiving socket",e.meta.id);return}t.handle.dispatch(e)}),n.network.addPacketHandler(R,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}t.handle.close(e),delete this.httpHandles[e.id]}),n.network.addPacketHandler(b,e=>{const t=this.wsHandles[e.id];if(!t){console.warn("Received response for unknown socket",e.id);return}t.handle.error(e),delete this.httpHandles[e.id]}),n.on("ready",()=>{this.wsSendLoop()})}type=a;requestCount=0;httpHandles={};wsHandles={};wsSendQueue=[];wsSendWaitResolve=()=>{};async wsSendLoop(){for(;this.omu.running;){const n=this.wsSendQueue.shift();if(n){const e=await A(n.data),t=typeof n.data=="string"?m.TEXT:m.BINARY;this.omu.send(w,new p({id:n.id,type:t},e))}else await new Promise(e=>{this.wsSendWaitResolve=e})}}generateHeaders(n,e){const t={},r={},c=(s,o)=>{const h=s.toLowerCase(),f=r[h];f&&delete t[f],t[s]=o,r[h]=s};if(n.headers.forEach((s,o)=>{c(o,s)}),e?.headers)if(e.headers instanceof Headers)e.headers.forEach((s,o)=>{c(o,s)});else if(Array.isArray(e.headers))for(const[s,o]of e.headers)c(s,o);else for(const s in e.headers){const o=e.headers[s];c(s,o)}return t}generateId(){return this.omu.app.id.join(`${performance.timeOrigin}-${this.requestCount++}`)}async request(n,e){const t=new Request(n,e),r=this.generateId().key();if(this.omu.send(S,{id:r,header:this.generateHeaders(t,e),method:t.method,redirect:t.redirect,url:t.url}),t.body){const u=t.body.getReader();for(;;){const l=await u.read();if(l.done)break;this.omu.send(H,{meta:{id:r},body:l.value})}}this.omu.send(v,{id:r});const c=[],s=y();let o=y();const h=u=>{s.resolve(u),this.httpHandles[r]={type:"receiving",receive(l){c.push(l),o.resolve(!0),o=y()},close(){o.resolve(!1)}}};return this.httpHandles[r]={type:"created",setResponse:h},{response:await s.promise,stream:new ReadableStream({async start(u){for(;await o.promise;){const l=c.shift();if(!l)break;u.enqueue(l)}u.close()}})}}async fetch(n,e){const{response:t,stream:r}=await this.request(n,e);return new O(new Headers(t.header),t.status>=200&&t.status<300,t.redirected,t.status,t.statusText,"basic",t.url,r,!1)}async ws(n,e){const t=new Request(n,e),r=this.generateId(),c=W.create({addQueue:s=>{this.wsSendQueue.push({id:r.key(),data:s}),this.wsSendWaitResolve()},dispose:s=>{this.omu.send(R,{id:r.key(),code:s.code,reason:s.reason}),delete this.wsHandles[r.key()]}});return this.wsHandles[r.key()]={type:"created",handle:c},this.omu.send(T,{id:r.key(),header:this.generateHeaders(t,e),method:t.method,redirect:t.redirect,url:t.url}),c.ws}}async function A(i){if(typeof i=="string")return _.encode(i);if(i instanceof Blob){const n=await i.arrayBuffer();return new Uint8Array(n)}else return new Uint8Array(i)}export{a as HTTP_EXTENSION_TYPE,G as HTTP_REQUEST_PERMISSION_ID,P as HttpExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/http/extension.ts"],
4
- "sourcesContent": ["\nimport { textEncoder } from '../../const';\nimport { Identifier } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { Extension, ExtensionType } from '../extension';\nimport { DataChunk, HttpRequest, OmuResponse, RequestHandle } from './http';\nimport { OmuWS, WebSocketClose, WebSocketError, WebSocketOpen, WSData, WSDataMeta, WSHandleState, WSMsgType } from './websocket';\n\nexport const HTTP_EXTENSION_TYPE: ExtensionType<HttpExtension> = new ExtensionType(\n 'http',\n (omu: Omu) => new HttpExtension(omu),\n);\n\nexport const HTTP_REQUEST_PERMISSION_ID: Identifier = HTTP_EXTENSION_TYPE.join('request');\n\nconst REQUEST_CREATE = PacketType.createJson<HttpRequest>(HTTP_EXTENSION_TYPE, {\n name: 'request_create',\n});\n\nconst REQUEST_SEND = PacketType.createSerialized<DataChunk<RequestHandle>>(HTTP_EXTENSION_TYPE, {\n name: 'request_send',\n serializer: DataChunk,\n});\n\ntype HttpRequestClose = RequestHandle;\n\nconst REQUEST_CLOSE = PacketType.createJson<HttpRequestClose>(HTTP_EXTENSION_TYPE, {\n name: 'request_close',\n});\n\ntype HttpResponse = RequestHandle & {\n header: Record<string, string>;\n status: number;\n statusText: string;\n url: string;\n history: HttpResponse[];\n redirected: boolean;\n};\n\nconst RESPONSE_CREATE = PacketType.createJson<HttpResponse>(HTTP_EXTENSION_TYPE, {\n name: 'response_create',\n});\n\nconst RESPONSE_CHUNK = PacketType.createSerialized<DataChunk<RequestHandle>>(HTTP_EXTENSION_TYPE, {\n name: 'response_chunk',\n serializer: DataChunk,\n});\n\nconst RESPONSE_CLOSE = PacketType.createJson<RequestHandle>(HTTP_EXTENSION_TYPE, {\n name: 'response_close',\n});\n\ntype HandleStateReceiving = {\n type: 'receiving';\n receive(data: Uint8Array): void;\n close(): void;\n};\n\ntype HandleStateCreated = {\n type: 'created';\n setResponse(response: HttpResponse): void;\n};\n\ntype HandleState = HandleStateCreated | HandleStateReceiving;\n\nconst WEBSOCKET_CREATE = PacketType.createJson<HttpRequest>(HTTP_EXTENSION_TYPE, {\n name: 'ws_create',\n});\n\nconst WEBSOCKET_OPEN = PacketType.createJson<WebSocketOpen>(HTTP_EXTENSION_TYPE, {\n name: 'ws_open',\n});\n\nconst WEBSOCKET_DATA = PacketType.createSerialized<DataChunk<WSDataMeta>>(HTTP_EXTENSION_TYPE, {\n name: 'ws_data',\n serializer: DataChunk,\n});\n\nconst WEBSOCKET_CLOSE = PacketType.createJson<WebSocketClose>(HTTP_EXTENSION_TYPE, {\n name: 'ws_close',\n});\n\nconst WEBSOCKET_ERROR = PacketType.createJson<WebSocketError>(HTTP_EXTENSION_TYPE, {\n name: 'ws_error',\n});\n\nfunction createFuture<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve: ((value: T) => void) | undefined = undefined;\n let reject: ((reason?: unknown) => void) | undefined = undefined;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n if (!resolve || !reject) throw new Error('Failed to create future');\n return {\n promise,\n resolve,\n reject,\n };\n}\n\ntype WSSendTask = {\n id: string;\n data: WSData;\n};\n\nexport class HttpExtension implements Extension {\n public readonly type: ExtensionType<Extension> = HTTP_EXTENSION_TYPE;\n private requestCount: number = 0;\n\n private readonly httpHandles: Record<string, HandleState | undefined> = {};\n private readonly wsHandles: Record<string, WSHandleState> = {};\n private readonly wsSendQueue: WSSendTask[] = [];\n private wsSendWaitResolve: () => void = () => {};\n\n constructor(\n private readonly omu: Omu,\n ) {\n omu.network.registerPacket(\n REQUEST_CREATE,\n REQUEST_SEND,\n REQUEST_CLOSE,\n RESPONSE_CREATE,\n RESPONSE_CHUNK,\n RESPONSE_CLOSE,\n WEBSOCKET_CLOSE,\n WEBSOCKET_CREATE,\n WEBSOCKET_DATA,\n WEBSOCKET_OPEN,\n WEBSOCKET_ERROR,\n );\n omu.network.addPacketHandler(RESPONSE_CREATE, (packet) => {\n const handle = this.httpHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.id);\n return;\n }\n if (handle.type !== 'created') {\n console.warn('Received response for already handled request', packet.id);\n return;\n }\n handle.setResponse(packet);\n });\n omu.network.addPacketHandler(RESPONSE_CHUNK, (packet) => {\n const handle = this.httpHandles[packet.meta.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.meta.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving request', packet.meta.id);\n return;\n }\n handle.receive(packet.body);\n });\n omu.network.addPacketHandler(RESPONSE_CLOSE, (packet) => {\n const handle = this.httpHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving request', packet.id);\n return;\n }\n handle.close();\n delete this.httpHandles[packet.id];\n });\n omu.network.addPacketHandler(WEBSOCKET_OPEN, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n if (handle.type !== 'created') {\n console.warn('Received response for already handled socket', packet.id);\n return;\n }\n handle.handle.open(packet);\n handle.type = 'receiving';\n });\n omu.network.addPacketHandler(WEBSOCKET_DATA, (packet) => {\n const handle = this.wsHandles[packet.meta.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.meta.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving socket', packet.meta.id);\n return;\n }\n handle.handle.dispatch(packet);\n });\n omu.network.addPacketHandler(WEBSOCKET_CLOSE, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n handle.handle.close(packet);\n delete this.httpHandles[packet.id];\n });\n omu.network.addPacketHandler(WEBSOCKET_ERROR, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n handle.handle.error(packet);\n delete this.httpHandles[packet.id];\n });\n omu.event.ready.listen(() => {\n this.wsSendLoop();\n });\n }\n\n private async wsSendLoop() {\n while (this.omu.running) {\n const send = this.wsSendQueue.shift();\n if (send) {\n const array = await toUint8Array(send.data);\n const type = typeof send.data === 'string' ? WSMsgType.TEXT : WSMsgType.BINARY;\n this.omu.send(WEBSOCKET_DATA, new DataChunk({ id: send.id, type }, array));\n } else {\n await new Promise<void>((resolve) => {\n this.wsSendWaitResolve = resolve;\n });\n }\n }\n }\n\n private generateHeaders(request: Request, init?: RequestInit): Record<string, string> {\n const headers: Record<string, string> = {};\n const keys: Record<string, string> = {};\n const set = (key: string, value: string) => {\n const lowerKey = key.toLowerCase();\n const originalKey = keys[lowerKey];\n if (originalKey) {\n delete headers[originalKey];\n }\n headers[key] = value;\n keys[lowerKey] = key;\n };\n request.headers.forEach((value, key) => {\n set(key, value);\n });\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n set(key, value);\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n set(key, value);\n }\n } else {\n for (const key in init.headers) {\n const value = init.headers[key];\n set(key, value);\n }\n }\n }\n return headers;\n }\n\n private generateId(): Identifier {\n return this.omu.app.id.join(`${performance.timeOrigin}-${this.requestCount++}`);\n }\n\n public async request(input: string | URL | globalThis.Request, init?: RequestInit): Promise<{ response: HttpResponse; stream: ReadableStream }> {\n const request = new Request(input, init);\n const id = this.generateId().key();\n this.omu.send(REQUEST_CREATE, {\n id,\n header: this.generateHeaders(request, init),\n method: request.method,\n redirect: request.redirect,\n url: request.url,\n });\n if (request.body) {\n const reader = request.body.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n this.omu.send(REQUEST_SEND, {\n meta: { id },\n body: result.value,\n });\n }\n }\n this.omu.send(REQUEST_CLOSE, { id });\n const chunks: Uint8Array[] = [];\n const responseFuture = createFuture<HttpResponse>();\n let chunkEvent = createFuture<boolean>();\n const setResponse = (response: HttpResponse) => {\n responseFuture.resolve(response);\n this.httpHandles[id] = {\n type: 'receiving',\n receive(data: Uint8Array<ArrayBufferLike>) {\n chunks.push(data);\n chunkEvent.resolve(true);\n chunkEvent = createFuture<boolean>();\n },\n close() {\n chunkEvent.resolve(false);\n },\n };\n };\n this.httpHandles[id] = {\n type: 'created',\n setResponse,\n };\n const response = await responseFuture.promise;\n return {\n response,\n stream: new ReadableStream<Uint8Array>({\n async start(controller) {\n while (await chunkEvent.promise) {\n const chunk = chunks.shift();\n if (!chunk) break;\n controller.enqueue(chunk);\n }\n controller.close();\n },\n }),\n };\n }\n\n public async fetch(input: string | URL | globalThis.Request, init?: RequestInit): Promise<OmuResponse> {\n const { response, stream } = await this.request(input, init);\n return new OmuResponse(\n new Headers(response.header),\n response.status >= 200 && response.status < 300,\n response.redirected,\n response.status,\n response.statusText,\n 'basic',\n response.url,\n stream,\n false,\n );\n }\n\n public async ws(input: string | URL | globalThis.Request, options?: {\n method?: string;\n autoclose?: boolean;\n autoping?: boolean;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n }): Promise<OmuWS> {\n const request = new Request(input, options);\n const id = this.generateId();\n const handle = OmuWS.create({\n addQueue: (data) => {\n this.wsSendQueue.push({\n id: id.key(),\n data,\n });\n this.wsSendWaitResolve();\n },\n dispose: (options: { code?: number; reason?: string }) => {\n this.omu.send(WEBSOCKET_CLOSE, {\n id: id.key(),\n code: options.code,\n reason: options.reason,\n });\n delete this.wsHandles[id.key()];\n },\n });\n this.wsHandles[id.key()] = {\n type: 'created',\n handle,\n };\n this.omu.send(WEBSOCKET_CREATE, {\n id: id.key(),\n header: this.generateHeaders(request, options),\n method: request.method,\n redirect: request.redirect,\n url: request.url,\n });\n return handle.ws;\n }\n}\n\nasync function toUint8Array(data: string | ArrayBufferLike | Blob | ArrayBufferView): Promise<Uint8Array<ArrayBufferLike>> {\n if (typeof data === 'string') {\n return textEncoder.encode(data);\n } else if (data instanceof Blob) {\n const arrayBuffer = await data.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n } else {\n return new Uint8Array(data as ArrayBufferLike);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\nimport { textEncoder } from '../../const';\nimport { Identifier } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { Extension, ExtensionType } from '../extension';\nimport { DataChunk, HttpRequest, OmuResponse, RequestHandle } from './http';\nimport { OmuWS, WebSocketClose, WebSocketError, WebSocketOpen, WSData, WSDataMeta, WSHandleState, WSMsgType } from './websocket';\n\nexport const HTTP_EXTENSION_TYPE: ExtensionType<HttpExtension> = new ExtensionType(\n 'http',\n (omu: Omu) => new HttpExtension(omu),\n);\n\nexport const HTTP_REQUEST_PERMISSION_ID: Identifier = HTTP_EXTENSION_TYPE.join('request');\n\nconst REQUEST_CREATE = PacketType.createJson<HttpRequest>(HTTP_EXTENSION_TYPE, {\n name: 'request_create',\n});\n\nconst REQUEST_SEND = PacketType.createSerialized<DataChunk<RequestHandle>>(HTTP_EXTENSION_TYPE, {\n name: 'request_send',\n serializer: DataChunk,\n});\n\ntype HttpRequestClose = RequestHandle;\n\nconst REQUEST_CLOSE = PacketType.createJson<HttpRequestClose>(HTTP_EXTENSION_TYPE, {\n name: 'request_close',\n});\n\ntype HttpResponse = RequestHandle & {\n header: Record<string, string>;\n status: number;\n statusText: string;\n url: string;\n history: HttpResponse[];\n redirected: boolean;\n};\n\nconst RESPONSE_CREATE = PacketType.createJson<HttpResponse>(HTTP_EXTENSION_TYPE, {\n name: 'response_create',\n});\n\nconst RESPONSE_CHUNK = PacketType.createSerialized<DataChunk<RequestHandle>>(HTTP_EXTENSION_TYPE, {\n name: 'response_chunk',\n serializer: DataChunk,\n});\n\nconst RESPONSE_CLOSE = PacketType.createJson<RequestHandle>(HTTP_EXTENSION_TYPE, {\n name: 'response_close',\n});\n\ntype HandleStateReceiving = {\n type: 'receiving';\n receive(data: Uint8Array): void;\n close(): void;\n};\n\ntype HandleStateCreated = {\n type: 'created';\n setResponse(response: HttpResponse): void;\n};\n\ntype HandleState = HandleStateCreated | HandleStateReceiving;\n\nconst WEBSOCKET_CREATE = PacketType.createJson<HttpRequest>(HTTP_EXTENSION_TYPE, {\n name: 'ws_create',\n});\n\nconst WEBSOCKET_OPEN = PacketType.createJson<WebSocketOpen>(HTTP_EXTENSION_TYPE, {\n name: 'ws_open',\n});\n\nconst WEBSOCKET_DATA = PacketType.createSerialized<DataChunk<WSDataMeta>>(HTTP_EXTENSION_TYPE, {\n name: 'ws_data',\n serializer: DataChunk,\n});\n\nconst WEBSOCKET_CLOSE = PacketType.createJson<WebSocketClose>(HTTP_EXTENSION_TYPE, {\n name: 'ws_close',\n});\n\nconst WEBSOCKET_ERROR = PacketType.createJson<WebSocketError>(HTTP_EXTENSION_TYPE, {\n name: 'ws_error',\n});\n\nfunction createFuture<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve: ((value: T) => void) | undefined = undefined;\n let reject: ((reason?: unknown) => void) | undefined = undefined;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n if (!resolve || !reject) throw new Error('Failed to create future');\n return {\n promise,\n resolve,\n reject,\n };\n}\n\ntype WSSendTask = {\n id: string;\n data: WSData;\n};\n\nexport class HttpExtension implements Extension {\n public readonly type: ExtensionType<Extension> = HTTP_EXTENSION_TYPE;\n private requestCount: number = 0;\n\n private readonly httpHandles: Record<string, HandleState | undefined> = {};\n private readonly wsHandles: Record<string, WSHandleState> = {};\n private readonly wsSendQueue: WSSendTask[] = [];\n private wsSendWaitResolve: () => void = () => {};\n\n constructor(\n private readonly omu: Omu,\n ) {\n omu.network.registerPacket(\n REQUEST_CREATE,\n REQUEST_SEND,\n REQUEST_CLOSE,\n RESPONSE_CREATE,\n RESPONSE_CHUNK,\n RESPONSE_CLOSE,\n WEBSOCKET_CLOSE,\n WEBSOCKET_CREATE,\n WEBSOCKET_DATA,\n WEBSOCKET_OPEN,\n WEBSOCKET_ERROR,\n );\n omu.network.addPacketHandler(RESPONSE_CREATE, (packet) => {\n const handle = this.httpHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.id);\n return;\n }\n if (handle.type !== 'created') {\n console.warn('Received response for already handled request', packet.id);\n return;\n }\n handle.setResponse(packet);\n });\n omu.network.addPacketHandler(RESPONSE_CHUNK, (packet) => {\n const handle = this.httpHandles[packet.meta.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.meta.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving request', packet.meta.id);\n return;\n }\n handle.receive(packet.body);\n });\n omu.network.addPacketHandler(RESPONSE_CLOSE, (packet) => {\n const handle = this.httpHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown request', packet.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving request', packet.id);\n return;\n }\n handle.close();\n delete this.httpHandles[packet.id];\n });\n omu.network.addPacketHandler(WEBSOCKET_OPEN, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n if (handle.type !== 'created') {\n console.warn('Received response for already handled socket', packet.id);\n return;\n }\n handle.handle.open(packet);\n handle.type = 'receiving';\n });\n omu.network.addPacketHandler(WEBSOCKET_DATA, (packet) => {\n const handle = this.wsHandles[packet.meta.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.meta.id);\n return;\n }\n if (handle.type !== 'receiving') {\n console.warn('Received chunk for non-receiving socket', packet.meta.id);\n return;\n }\n handle.handle.dispatch(packet);\n });\n omu.network.addPacketHandler(WEBSOCKET_CLOSE, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n handle.handle.close(packet);\n delete this.httpHandles[packet.id];\n });\n omu.network.addPacketHandler(WEBSOCKET_ERROR, (packet) => {\n const handle = this.wsHandles[packet.id];\n if (!handle) {\n console.warn('Received response for unknown socket', packet.id);\n return;\n }\n handle.handle.error(packet);\n delete this.httpHandles[packet.id];\n });\n omu.on('ready', () => {\n this.wsSendLoop();\n });\n }\n\n private async wsSendLoop() {\n while (this.omu.running) {\n const send = this.wsSendQueue.shift();\n if (send) {\n const array = await toUint8Array(send.data);\n const type = typeof send.data === 'string' ? WSMsgType.TEXT : WSMsgType.BINARY;\n this.omu.send(WEBSOCKET_DATA, new DataChunk({ id: send.id, type }, array));\n } else {\n await new Promise<void>((resolve) => {\n this.wsSendWaitResolve = resolve;\n });\n }\n }\n }\n\n private generateHeaders(request: Request, init?: RequestInit): Record<string, string> {\n const headers: Record<string, string> = {};\n const keys: Record<string, string> = {};\n const set = (key: string, value: string) => {\n const lowerKey = key.toLowerCase();\n const originalKey = keys[lowerKey];\n if (originalKey) {\n delete headers[originalKey];\n }\n headers[key] = value;\n keys[lowerKey] = key;\n };\n request.headers.forEach((value, key) => {\n set(key, value);\n });\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n set(key, value);\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n set(key, value);\n }\n } else {\n for (const key in init.headers) {\n const value = init.headers[key];\n set(key, value);\n }\n }\n }\n return headers;\n }\n\n private generateId(): Identifier {\n return this.omu.app.id.join(`${performance.timeOrigin}-${this.requestCount++}`);\n }\n\n public async request(input: string | URL | globalThis.Request, init?: RequestInit): Promise<{ response: HttpResponse; stream: ReadableStream }> {\n const request = new Request(input, init);\n const id = this.generateId().key();\n this.omu.send(REQUEST_CREATE, {\n id,\n header: this.generateHeaders(request, init),\n method: request.method,\n redirect: request.redirect,\n url: request.url,\n });\n if (request.body) {\n const reader = request.body.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n this.omu.send(REQUEST_SEND, {\n meta: { id },\n body: result.value,\n });\n }\n }\n this.omu.send(REQUEST_CLOSE, { id });\n const chunks: Uint8Array[] = [];\n const responseFuture = createFuture<HttpResponse>();\n let chunkEvent = createFuture<boolean>();\n const setResponse = (response: HttpResponse) => {\n responseFuture.resolve(response);\n this.httpHandles[id] = {\n type: 'receiving',\n receive(data: Uint8Array<ArrayBufferLike>) {\n chunks.push(data);\n chunkEvent.resolve(true);\n chunkEvent = createFuture<boolean>();\n },\n close() {\n chunkEvent.resolve(false);\n },\n };\n };\n this.httpHandles[id] = {\n type: 'created',\n setResponse,\n };\n const response = await responseFuture.promise;\n return {\n response,\n stream: new ReadableStream<Uint8Array>({\n async start(controller) {\n while (await chunkEvent.promise) {\n const chunk = chunks.shift();\n if (!chunk) break;\n controller.enqueue(chunk);\n }\n controller.close();\n },\n }),\n };\n }\n\n public async fetch(input: string | URL | globalThis.Request, init?: RequestInit): Promise<OmuResponse> {\n const { response, stream } = await this.request(input, init);\n return new OmuResponse(\n new Headers(response.header),\n response.status >= 200 && response.status < 300,\n response.redirected,\n response.status,\n response.statusText,\n 'basic',\n response.url,\n stream,\n false,\n );\n }\n\n public async ws(input: string | URL | globalThis.Request, options?: {\n method?: string;\n autoclose?: boolean;\n autoping?: boolean;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n }): Promise<OmuWS> {\n const request = new Request(input, options);\n const id = this.generateId();\n const handle = OmuWS.create({\n addQueue: (data) => {\n this.wsSendQueue.push({\n id: id.key(),\n data,\n });\n this.wsSendWaitResolve();\n },\n dispose: (options: { code?: number; reason?: string }) => {\n this.omu.send(WEBSOCKET_CLOSE, {\n id: id.key(),\n code: options.code,\n reason: options.reason,\n });\n delete this.wsHandles[id.key()];\n },\n });\n this.wsHandles[id.key()] = {\n type: 'created',\n handle,\n };\n this.omu.send(WEBSOCKET_CREATE, {\n id: id.key(),\n header: this.generateHeaders(request, options),\n method: request.method,\n redirect: request.redirect,\n url: request.url,\n });\n return handle.ws;\n }\n}\n\nasync function toUint8Array(data: string | ArrayBufferLike | Blob | ArrayBufferView): Promise<Uint8Array<ArrayBufferLike>> {\n if (typeof data === 'string') {\n return textEncoder.encode(data);\n } else if (data instanceof Blob) {\n const arrayBuffer = await data.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n } else {\n return new Uint8Array(data as ArrayBufferLike);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["textEncoder", "PacketType", "ExtensionType", "DataChunk", "OmuResponse", "OmuWS", "WSMsgType", "HTTP_EXTENSION_TYPE", "omu", "HttpExtension", "HTTP_REQUEST_PERMISSION_ID", "REQUEST_CREATE", "REQUEST_SEND", "REQUEST_CLOSE", "RESPONSE_CREATE", "RESPONSE_CHUNK", "RESPONSE_CLOSE", "WEBSOCKET_CREATE", "WEBSOCKET_OPEN", "WEBSOCKET_DATA", "WEBSOCKET_CLOSE", "WEBSOCKET_ERROR", "createFuture", "resolve", "reject", "promise", "res", "rej", "packet", "handle", "send", "array", "toUint8Array", "type", "request", "init", "headers", "keys", "set", "key", "value", "lowerKey", "originalKey", "input", "id", "reader", "result", "chunks", "responseFuture", "chunkEvent", "setResponse", "response", "data", "controller", "chunk", "stream", "options", "arrayBuffer"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Identifier as c,IdentifierMap as d}from"../../identifier";import{PacketType as p}from"../../network/packet/packet.js";import{ExtensionType as m}from"../extension.js";import{LogPacket as g,LogType as o}from"./packets.js";const s=new m("logger",r=>new L(r)),O=s.join("log"),n=p.createSerialized(s,{name:"log",serializer:g}),a=p.createJson(s,{name:"listen",serializer:c});class L{constructor(e){this.omu=e;e.network.registerPacket(n,a),e.network.addPacketHandler(n,t=>{const i=this.listeners.get(t.id);i&&i.forEach(l=>l(t.message))})}type=s;listeners=new d;log(e){const t=new g(this.omu.app.id,e);this.omu.send(n,t)}error(e){this.log({type:o.ERROR,text:e})}warning(e){this.log({type:o.WARNING,text:e})}info(e){this.log({type:o.INFO,text:e})}debug(e){this.log({type:o.DEBUG,text:e})}listen(e,t){this.listeners.has(e)||this.omu.onReady(()=>{this.omu.send(a,e)});const i=this.listeners.get(e)??[];return i.push(t),this.listeners.set(e,i),()=>{i.splice(i.indexOf(t),1)}}}export{s as LOGGER_EXTENSION_TYPE,a as LOGGER_LISTEN_PACKET,n as LOGGER_LOG_PACKET,O as LOGGER_LOG_PERMISSION_ID,L as LoggerExtension};
1
+ import{Identifier as c,IdentifierMap as d}from"../../identifier";import{PacketType as g}from"../../network/packet/packet.js";import{ExtensionType as m}from"../extension.js";import{LogPacket as a,LogType as s}from"./packets.js";const n=new m("logger",p=>new L(p)),x=n.join("log"),r=g.createSerialized(n,{name:"log",serializer:a}),l=g.createJson(n,{name:"listen",serializer:c});class L{constructor(e){this.omu=e;e.network.registerPacket(r,l),e.network.addPacketHandler(r,t=>{const i=this.listeners.get(t.id);i&&i.forEach(o=>o(t.message))})}type=n;listeners=new d;log(e){const t=new a(this.omu.app.id,e);this.omu.send(r,t)}error(e){this.log({type:s.ERROR,text:e})}warning(e){this.log({type:s.WARNING,text:e})}info(e){this.log({type:s.INFO,text:e})}debug(e){this.log({type:s.DEBUG,text:e})}listen(e,t){this.listeners.has(e)||this.omu.onReady(()=>{this.omu.send(l,e)});const i=this.listeners.get(e)??[];return i.push(t),this.listeners.set(e,i),()=>{const o=i.indexOf(t);o!==-1&&i.splice(o,1)}}}export{n as LOGGER_EXTENSION_TYPE,l as LOGGER_LISTEN_PACKET,r as LOGGER_LOG_PACKET,x as LOGGER_LOG_PERMISSION_ID,L as LoggerExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -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{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": "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",
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 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,i){const t=this.omu.app.id.base.join(e),r=l.createJson(t,{name:e,serializer:i?.serializer});return this.createSignal(r)}serialized(e,i){const t=this.omu.app.id.base.join(e),r=l.createSerialized(t,{name:e,serializer:i?.serializer});return this.createSignal(r)}get(e){return this.createSignal(e)}}class h{constructor(e,i){this.omu=e;this.type=i;e.network.addPacketHandler(o,t=>this.handleBroadcast(t)),e.network.addTask(()=>this.onTask())}listeners=[];listening=!1;notify(e){const i=this.type.serializer.serialize(e);this.omu.send(o,{id:this.type.id,body:i});for(const t of this.listeners)t(e)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(d,this.type.id)}),this.listening=!0),this.listeners.push(e),()=>{const i=this.listeners.indexOf(e);i!==-1&&this.listeners.splice(i,1)}}handleBroadcast(e){if(!e.id.isEqual(this.type.id))return;const i=this.type.serializer.deserialize(e.body);for(const t of this.listeners)t(i)}onTask(){this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(p,{id:this.type.id,permissions:this.type.permissions})}}export{n as SIGNAL_EXTENSION_TYPE,m as SignalExtension};
2
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<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 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", "SignalImpl", "name", "options", "id", "type", "data", "body", "listener", "handler", "index"]
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 w}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}),A=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,M])=>{const y=a(M);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 w;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);this.omu.send(b,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);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))),this.omu.send(E,{id:this.id,items:i})}async clear(){this.omu.send(z,{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(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