@omujs/omu 0.10.7 → 0.10.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +30 -0
  2. package/dist/api/asset/extension.js +1 -1
  3. package/dist/api/asset/extension.js.map +2 -2
  4. package/dist/api/dashboard/webview.js +1 -1
  5. package/dist/api/dashboard/webview.js.map +2 -2
  6. package/dist/api/endpoint/extension.d.ts +9 -1
  7. package/dist/api/endpoint/extension.js +1 -1
  8. package/dist/api/endpoint/extension.js.map +3 -3
  9. package/dist/api/endpoint/index.d.ts +1 -0
  10. package/dist/api/endpoint/index.js.map +1 -1
  11. package/dist/api/http/extension.js +1 -1
  12. package/dist/api/http/extension.js.map +2 -2
  13. package/dist/api/http/websocket.js +1 -1
  14. package/dist/api/http/websocket.js.map +2 -2
  15. package/dist/api/logger/extension.js +1 -1
  16. package/dist/api/logger/extension.js.map +3 -3
  17. package/dist/api/registry/extension.js +1 -1
  18. package/dist/api/registry/extension.js.map +3 -3
  19. package/dist/api/server/extension.js +1 -1
  20. package/dist/api/server/extension.js.map +2 -2
  21. package/dist/api/signal/extension.js +1 -1
  22. package/dist/api/signal/extension.js.map +3 -3
  23. package/dist/api/signal/signal.d.ts +2 -1
  24. package/dist/api/signal/signal.js +1 -1
  25. package/dist/api/signal/signal.js.map +1 -1
  26. package/dist/api/table/extension.js +1 -1
  27. package/dist/api/table/extension.js.map +3 -3
  28. package/dist/api/table/index.d.ts +1 -1
  29. package/dist/api/table/index.js +1 -1
  30. package/dist/api/table/index.js.map +2 -2
  31. package/dist/api/table/table.d.ts +8 -7
  32. package/dist/api/table/table.js +1 -1
  33. package/dist/api/table/table.js.map +2 -2
  34. package/dist/event/index.d.ts +7 -0
  35. package/dist/event/index.js +1 -1
  36. package/dist/event/index.js.map +3 -3
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +2 -2
  40. package/dist/network/network.d.ts +11 -9
  41. package/dist/network/network.js +1 -1
  42. package/dist/network/network.js.map +3 -3
  43. package/dist/omu.d.ts +11 -9
  44. package/dist/omu.js +1 -1
  45. package/dist/omu.js.map +3 -3
  46. package/dist/token.d.ts +4 -2
  47. package/dist/token.js +1 -1
  48. package/dist/token.js.map +2 -2
  49. package/dist/version.d.ts +1 -1
  50. package/dist/version.js +1 -1
  51. package/dist/version.js.map +1 -1
  52. package/package.json +2 -2
package/README.md CHANGED
@@ -0,0 +1,30 @@
1
+ # `@omujs/omu`
2
+
3
+ TypeScript client for connecting an application to OMUAPPS.
4
+
5
+ ## Installation
6
+
7
+ ```sh
8
+ npm install @omujs/omu
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { App, Omu } from '@omujs/omu';
15
+
16
+ const app = new App('com.example:sample', {
17
+ version: '1.0.0',
18
+ });
19
+ const omu = new Omu(app);
20
+
21
+ void omu.start();
22
+ await omu.waitForReady();
23
+ ```
24
+
25
+ Register required APIs, permissions, and plugins before calling `start()`.
26
+ The promise returned by `start()` remains pending while the connection loop is
27
+ running; use `waitForReady()` when initialization must wait for API readiness.
28
+
29
+ See the [OMUAPPS API documentation](https://omuapps.com/docs/api) for API
30
+ guides and examples.
@@ -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
  }
@@ -3,6 +3,13 @@ import { ExtensionType } from '../extension.js';
3
3
  import { EndpointType } from './endpoint.js';
4
4
  import { InvokedParams } from './packets.js';
5
5
  export declare const ENDPOINT_EXTENSION_TYPE: ExtensionType<EndpointExtension>;
6
+ export type EndpointCallOptions = {
7
+ /**
8
+ * Timeout in milliseconds. Set to null to disable the timeout.
9
+ * @default 30000
10
+ */
11
+ timeout?: number | null;
12
+ };
6
13
  export declare class EndpointExtension {
7
14
  private readonly omu;
8
15
  readonly type: ExtensionType<EndpointExtension>;
@@ -13,5 +20,6 @@ export declare class EndpointExtension {
13
20
  private handleInvoked;
14
21
  private onTask;
15
22
  bind<Req, Res>(type: EndpointType<Req, Res>, handler: (data: Req, params: InvokedParams) => Promise<Res>): void;
16
- call<Req, Res>(endpoint: EndpointType<Req, Res>, data: Req): Promise<Res>;
23
+ call<Req, Res>(endpoint: EndpointType<Req, Res>, data: Req, options?: EndpointCallOptions): Promise<Res>;
24
+ private rejectPendingCalls;
17
25
  }
@@ -1,2 +1,2 @@
1
- import{IdentifierMap as l}from"../../identifier";import{PacketType as s}from"../../network/packet";import{ExtensionType as u}from"../extension.js";import{EndpointInvokedPacket as f,EndpointInvokePacket as E,EndpointRegisterPacket as c,EndpointResponsePacket as p,InvokeParams as v,ResponseParams as P}from"./packets.js";const o=new u("endpoint",m=>new I(m));class I{constructor(e){this.omu=e;this.callId=Math.floor((performance.timeOrigin+performance.now())*1e3),e.network.registerPacket(k,y,w,t),e.network.addPacketHandler(w,n=>{this.handleInvoked(n)}),e.network.addPacketHandler(t,n=>{const r=this.responsePromises.get(n.params.key);if(!r)throw new Error(`Received response for unknown key ${n.params.key} (${n.params.id.key()})`);if(this.responsePromises.delete(n.params.key),n.params.error){r.reject(new Error(n.params.error));return}r.resolve(n.buffer)}),e.network.addTask(()=>this.onTask())}type=o;boundEndpoints=new l;responsePromises=new Map;callId;async handleInvoked(e){const n=this.boundEndpoints.get(e.params.id);if(!n)throw new Error(`Received invocation for unknown endpoint ${e.params.id.key()} (${e.params.key})`);try{const r=await n.handler(e);this.omu.send(t,new p(new P(e.params.id,e.params.key,null),r))}catch(r){this.omu.send(t,new p(new P(e.params.id,e.params.key,JSON.stringify(r)),new Uint8Array))}}onTask(){const e=new l;for(const[r,i]of this.boundEndpoints)e.set(r,i.type.permissionId);const n=new c(e);this.omu.send(k,n)}bind(e,n){if(this.omu.running)throw new Error("Cannot register endpoints after the client has started");if(this.boundEndpoints.has(e.id))throw new Error(`Endpoint with id ${e.id.key()} is already registered`);this.boundEndpoints.set(e.id,{type:e,handler:async({buffer:r,params:i})=>{const a=e.requestSerializer.deserialize(r),d=await n(a,i);return e.responseSerializer.serialize(d)}})}async call(e,n){const r=this.callId++,i=new Promise((d,h)=>{this.responsePromises.set(r,{resolve:d,reject:h})});this.omu.send(y,new E(new v(e.id,r),e.requestSerializer.serialize(n)));const a=await i;return e.responseSerializer.deserialize(a)}}const k=s.createSerialized(o,{name:"register",serializer:c}),y=s.createSerialized(o,{name:"invoke",serializer:E}),w=s.createSerialized(o,{name:"invoked",serializer:f}),t=s.createSerialized(o,{name:"response",serializer:p});export{o as ENDPOINT_EXTENSION_TYPE,I as EndpointExtension};
1
+ import{IdentifierMap as u}from"../../identifier";import{PacketType as p}from"../../network/packet";import{ExtensionType as T}from"../extension.js";import{EndpointInvokedPacket as I,EndpointInvokePacket as P,EndpointRegisterPacket as f,EndpointResponsePacket as E,InvokeParams as R,ResponseParams as w}from"./packets.js";const d=new T("endpoint",i=>new b(i)),g=3e4;class b{constructor(e){this.omu=e;this.callId=Math.floor((performance.timeOrigin+performance.now())*1e3),e.network.registerPacket(h,k,y,m),e.network.addPacketHandler(y,n=>{this.handleInvoked(n)}),e.network.addPacketHandler(m,n=>{const r=this.responsePromises.get(n.params.key);if(!r)throw new Error(`Received response for unknown key ${n.params.key} (${n.params.id.key()})`);if(this.responsePromises.delete(n.params.key),c(r),n.params.error){r.reject(new Error(n.params.error));return}r.resolve(n.buffer)}),e.network.addTask(()=>this.onTask()),e.network.on("disconnected",n=>{this.rejectPendingCalls(n??new Error("Disconnected before endpoint responded"))})}type=d;boundEndpoints=new u;responsePromises=new Map;callId;async handleInvoked(e){const n=this.boundEndpoints.get(e.params.id);if(!n)throw new Error(`Received invocation for unknown endpoint ${e.params.id.key()} (${e.params.key})`);try{const r=await n.handler(e);await this.omu.send(m,new E(new w(e.params.id,e.params.key,null),r))}catch(r){await this.omu.send(m,new E(new w(e.params.id,e.params.key,z(r)),new Uint8Array))}}onTask(){const e=new u;for(const[r,t]of this.boundEndpoints)e.set(r,t.type.permissionId);const n=new f(e);this.omu.send(h,n)}bind(e,n){if(this.omu.running)throw new Error("Cannot register endpoints after the client has started");if(this.boundEndpoints.has(e.id))throw new Error(`Endpoint with id ${e.id.key()} is already registered`);this.boundEndpoints.set(e.id,{type:e,handler:async({buffer:r,params:t})=>{const o=e.requestSerializer.deserialize(r),l=await n(o,t);return e.responseSerializer.serialize(l)}})}async call(e,n,r){const t=this.callId++,o=r?.timeout===void 0?g:r.timeout;if(o!==null&&(!Number.isFinite(o)||o<=0))throw new RangeError("Endpoint timeout must be a positive finite number or null");const l=new Promise((s,a)=>{const v=o===null?void 0:setTimeout(()=>{this.responsePromises.delete(t),a(new Error(`Endpoint ${e.id.key()} timed out after ${o}ms`))},o);this.responsePromises.set(t,{resolve:s,reject:a,timeout:v})});try{await this.omu.send(k,new P(new R(e.id,t),e.requestSerializer.serialize(n)));const s=await l;return e.responseSerializer.deserialize(s)}catch(s){const a=this.responsePromises.get(t);throw a&&(c(a),this.responsePromises.delete(t)),s}}rejectPendingCalls(e){for(const n of this.responsePromises.values())c(n),n.reject(e);this.responsePromises.clear()}}function c(i){i.timeout!==void 0&&clearTimeout(i.timeout)}function z(i){return i instanceof Error?`${i.name}: ${i.message}`:String(i)}const h=p.createSerialized(d,{name:"register",serializer:f}),k=p.createSerialized(d,{name:"invoke",serializer:P}),y=p.createSerialized(d,{name:"invoked",serializer:I}),m=p.createSerialized(d,{name:"response",serializer:E});export{d as ENDPOINT_EXTENSION_TYPE,b as EndpointExtension};
2
2
  //# sourceMappingURL=extension.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/endpoint/extension.ts"],
4
- "sourcesContent": ["import type { Identifier } from '../../identifier';\nimport { IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { ExtensionType } from '../extension.js';\n\nimport { EndpointType } from './endpoint.js';\nimport { EndpointInvokedPacket, EndpointInvokePacket, EndpointRegisterPacket, EndpointResponsePacket, InvokedParams, InvokeParams, ResponseParams } from './packets.js';\n\nexport const ENDPOINT_EXTENSION_TYPE: ExtensionType<EndpointExtension> = new ExtensionType(\n 'endpoint',\n (omu: Omu) => new EndpointExtension(omu),\n);\n\ntype CallPromise = {\n resolve: (data: Uint8Array) => void;\n reject: (error: Error) => void;\n};\n\ntype EndpointHandler = {\n type: EndpointType;\n handler: (packet: EndpointInvokedPacket) => Promise<Uint8Array>;\n};\n\nexport class EndpointExtension {\n public readonly type: ExtensionType<EndpointExtension> = ENDPOINT_EXTENSION_TYPE;\n private readonly boundEndpoints = new IdentifierMap<EndpointHandler>();\n private readonly responsePromises: Map<number, CallPromise> = new Map();\n private callId: number;\n\n constructor(private readonly omu: Omu) {\n this.callId = Math.floor((performance.timeOrigin + performance.now()) * 1000);\n omu.network.registerPacket(\n ENDPOINT_REGISTER_PACKET,\n ENDPOINT_INVOKE_PACKET,\n ENDPOINT_INVOKED_PACKET,\n ENDPOINT_RESPONSE_PACKET,\n );\n omu.network.addPacketHandler(ENDPOINT_INVOKED_PACKET, (packet) => {\n this.handleInvoked(packet);\n });\n omu.network.addPacketHandler(ENDPOINT_RESPONSE_PACKET, (packet) => {\n const promise = this.responsePromises.get(packet.params.key);\n if (!promise) {\n throw new Error(\n `Received response for unknown key ${packet.params.key} (${packet.params.id.key()})`,\n );\n }\n this.responsePromises.delete(packet.params.key);\n if (packet.params.error) {\n promise.reject(new Error(packet.params.error));\n return;\n }\n promise.resolve(packet.buffer);\n });\n omu.network.addTask(() => this.onTask());\n }\n\n private async handleInvoked(packet: EndpointInvokedPacket) {\n const endpoint = this.boundEndpoints.get(packet.params.id);\n if (!endpoint) {\n throw new Error(`Received invocation for unknown endpoint ${packet.params.id.key()} (${packet.params.key})`);\n }\n try {\n const result = await endpoint.handler(packet);\n this.omu.send(ENDPOINT_RESPONSE_PACKET, new EndpointResponsePacket(\n new ResponseParams(packet.params.id, packet.params.key, null),\n result,\n ));\n } catch (error) {\n this.omu.send(ENDPOINT_RESPONSE_PACKET, new EndpointResponsePacket(\n new ResponseParams(packet.params.id, packet.params.key, JSON.stringify(error)),\n new Uint8Array(),\n ));\n }\n }\n\n private onTask(): void {\n const endpoints = new IdentifierMap<Identifier | undefined>();\n for (const [key, endpoint] of this.boundEndpoints) {\n endpoints.set(key, endpoint.type.permissionId);\n }\n const packet = new EndpointRegisterPacket(endpoints);\n this.omu.send(ENDPOINT_REGISTER_PACKET, packet);\n }\n\n public bind<Req, Res>(\n type: EndpointType<Req, Res>,\n handler: (data: Req, params: InvokedParams) => Promise<Res>,\n ): void {\n if (this.omu.running) {\n throw new Error('Cannot register endpoints after the client has started');\n }\n if (this.boundEndpoints.has(type.id)) {\n throw new Error(`Endpoint with id ${type.id.key()} is already registered`);\n }\n this.boundEndpoints.set(type.id, { type, handler: async ({ buffer, params }) => {\n const req = type.requestSerializer.deserialize(buffer);\n const result = await handler(req, params);\n return type.responseSerializer.serialize(result);\n } });\n }\n\n public async call<Req, Res>(endpoint: EndpointType<Req, Res>, data: Req): Promise<Res> {\n const key = this.callId++;\n const promise = new Promise<Uint8Array>((resolve, reject) => {\n this.responsePromises.set(key, { resolve, reject });\n });\n this.omu.send(ENDPOINT_INVOKE_PACKET, new EndpointInvokePacket(\n new InvokeParams(endpoint.id, key),\n endpoint.requestSerializer.serialize(data),\n ));\n const response = await promise;\n return endpoint.responseSerializer.deserialize(response);\n }\n}\n\nconst ENDPOINT_REGISTER_PACKET = PacketType.createSerialized<EndpointRegisterPacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'register',\n serializer: EndpointRegisterPacket,\n});\nconst ENDPOINT_INVOKE_PACKET = PacketType.createSerialized<EndpointInvokePacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'invoke',\n serializer: EndpointInvokePacket,\n});\nconst ENDPOINT_INVOKED_PACKET = PacketType.createSerialized<EndpointInvokedPacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'invoked',\n serializer: EndpointInvokedPacket,\n});\nconst ENDPOINT_RESPONSE_PACKET = PacketType.createSerialized<EndpointResponsePacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'response',\n serializer: EndpointResponsePacket,\n});\n"],
5
- "mappings": "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",
6
- "names": ["IdentifierMap", "PacketType", "ExtensionType", "EndpointInvokedPacket", "EndpointInvokePacket", "EndpointRegisterPacket", "EndpointResponsePacket", "InvokeParams", "ResponseParams", "ENDPOINT_EXTENSION_TYPE", "omu", "EndpointExtension", "ENDPOINT_REGISTER_PACKET", "ENDPOINT_INVOKE_PACKET", "ENDPOINT_INVOKED_PACKET", "ENDPOINT_RESPONSE_PACKET", "packet", "promise", "endpoint", "result", "error", "endpoints", "key", "type", "handler", "buffer", "params", "req", "data", "resolve", "reject", "response"]
4
+ "sourcesContent": ["import type { Identifier } from '../../identifier';\nimport { IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { ExtensionType } from '../extension.js';\n\nimport { EndpointType } from './endpoint.js';\nimport { EndpointInvokedPacket, EndpointInvokePacket, EndpointRegisterPacket, EndpointResponsePacket, InvokedParams, InvokeParams, ResponseParams } from './packets.js';\n\nexport const ENDPOINT_EXTENSION_TYPE: ExtensionType<EndpointExtension> = new ExtensionType(\n 'endpoint',\n (omu: Omu) => new EndpointExtension(omu),\n);\n\ntype CallPromise = {\n resolve: (data: Uint8Array) => void;\n reject: (error: Error) => void;\n timeout?: ReturnType<typeof setTimeout>;\n};\n\nexport type EndpointCallOptions = {\n /**\n * Timeout in milliseconds. Set to null to disable the timeout.\n * @default 30000\n */\n timeout?: number | null;\n};\n\nconst DEFAULT_CALL_TIMEOUT = 30_000;\n\ntype EndpointHandler = {\n type: EndpointType;\n handler: (packet: EndpointInvokedPacket) => Promise<Uint8Array>;\n};\n\nexport class EndpointExtension {\n public readonly type: ExtensionType<EndpointExtension> = ENDPOINT_EXTENSION_TYPE;\n private readonly boundEndpoints = new IdentifierMap<EndpointHandler>();\n private readonly responsePromises: Map<number, CallPromise> = new Map();\n private callId: number;\n\n constructor(private readonly omu: Omu) {\n this.callId = Math.floor((performance.timeOrigin + performance.now()) * 1000);\n omu.network.registerPacket(\n ENDPOINT_REGISTER_PACKET,\n ENDPOINT_INVOKE_PACKET,\n ENDPOINT_INVOKED_PACKET,\n ENDPOINT_RESPONSE_PACKET,\n );\n omu.network.addPacketHandler(ENDPOINT_INVOKED_PACKET, (packet) => {\n this.handleInvoked(packet);\n });\n omu.network.addPacketHandler(ENDPOINT_RESPONSE_PACKET, (packet) => {\n const promise = this.responsePromises.get(packet.params.key);\n if (!promise) {\n throw new Error(\n `Received response for unknown key ${packet.params.key} (${packet.params.id.key()})`,\n );\n }\n this.responsePromises.delete(packet.params.key);\n clearCallTimeout(promise);\n if (packet.params.error) {\n promise.reject(new Error(packet.params.error));\n return;\n }\n promise.resolve(packet.buffer);\n });\n omu.network.addTask(() => this.onTask());\n omu.network.on('disconnected', (reason) => {\n this.rejectPendingCalls(\n reason ?? new Error('Disconnected before endpoint responded'),\n );\n });\n }\n\n private async handleInvoked(packet: EndpointInvokedPacket): Promise<void> {\n const endpoint = this.boundEndpoints.get(packet.params.id);\n if (!endpoint) {\n throw new Error(`Received invocation for unknown endpoint ${packet.params.id.key()} (${packet.params.key})`);\n }\n try {\n const result = await endpoint.handler(packet);\n await this.omu.send(ENDPOINT_RESPONSE_PACKET, new EndpointResponsePacket(\n new ResponseParams(packet.params.id, packet.params.key, null),\n result,\n ));\n } catch (error) {\n await this.omu.send(ENDPOINT_RESPONSE_PACKET, new EndpointResponsePacket(\n new ResponseParams(packet.params.id, packet.params.key, formatError(error)),\n new Uint8Array(),\n ));\n }\n }\n\n private onTask(): void {\n const endpoints = new IdentifierMap<Identifier | undefined>();\n for (const [key, endpoint] of this.boundEndpoints) {\n endpoints.set(key, endpoint.type.permissionId);\n }\n const packet = new EndpointRegisterPacket(endpoints);\n this.omu.send(ENDPOINT_REGISTER_PACKET, packet);\n }\n\n public bind<Req, Res>(\n type: EndpointType<Req, Res>,\n handler: (data: Req, params: InvokedParams) => Promise<Res>,\n ): void {\n if (this.omu.running) {\n throw new Error('Cannot register endpoints after the client has started');\n }\n if (this.boundEndpoints.has(type.id)) {\n throw new Error(`Endpoint with id ${type.id.key()} is already registered`);\n }\n this.boundEndpoints.set(type.id, { type, handler: async ({ buffer, params }) => {\n const req = type.requestSerializer.deserialize(buffer);\n const result = await handler(req, params);\n return type.responseSerializer.serialize(result);\n } });\n }\n\n public async call<Req, Res>(\n endpoint: EndpointType<Req, Res>,\n data: Req,\n options?: EndpointCallOptions,\n ): Promise<Res> {\n const key = this.callId++;\n const timeoutMs = options?.timeout === undefined\n ? DEFAULT_CALL_TIMEOUT\n : options.timeout;\n if (\n timeoutMs !== null\n && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)\n ) {\n throw new RangeError(\n 'Endpoint timeout must be a positive finite number or null',\n );\n }\n const promise = new Promise<Uint8Array>((resolve, reject) => {\n const timeout = timeoutMs === null\n ? undefined\n : setTimeout(() => {\n this.responsePromises.delete(key);\n reject(new Error(\n `Endpoint ${endpoint.id.key()} timed out after ${timeoutMs}ms`,\n ));\n }, timeoutMs);\n this.responsePromises.set(key, { resolve, reject, timeout });\n });\n try {\n await this.omu.send(ENDPOINT_INVOKE_PACKET, new EndpointInvokePacket(\n new InvokeParams(endpoint.id, key),\n endpoint.requestSerializer.serialize(data),\n ));\n const response = await promise;\n return endpoint.responseSerializer.deserialize(response);\n } catch (error) {\n const pending = this.responsePromises.get(key);\n if (pending) {\n clearCallTimeout(pending);\n this.responsePromises.delete(key);\n }\n throw error;\n }\n }\n\n private rejectPendingCalls(error: Error): void {\n for (const promise of this.responsePromises.values()) {\n clearCallTimeout(promise);\n promise.reject(error);\n }\n this.responsePromises.clear();\n }\n}\n\nfunction clearCallTimeout(promise: CallPromise): void {\n if (promise.timeout !== undefined) {\n clearTimeout(promise.timeout);\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n return String(error);\n}\n\nconst ENDPOINT_REGISTER_PACKET = PacketType.createSerialized<EndpointRegisterPacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'register',\n serializer: EndpointRegisterPacket,\n});\nconst ENDPOINT_INVOKE_PACKET = PacketType.createSerialized<EndpointInvokePacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'invoke',\n serializer: EndpointInvokePacket,\n});\nconst ENDPOINT_INVOKED_PACKET = PacketType.createSerialized<EndpointInvokedPacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'invoked',\n serializer: EndpointInvokedPacket,\n});\nconst ENDPOINT_RESPONSE_PACKET = PacketType.createSerialized<EndpointResponsePacket>(ENDPOINT_EXTENSION_TYPE, {\n name: 'response',\n serializer: EndpointResponsePacket,\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["IdentifierMap", "PacketType", "ExtensionType", "EndpointInvokedPacket", "EndpointInvokePacket", "EndpointRegisterPacket", "EndpointResponsePacket", "InvokeParams", "ResponseParams", "ENDPOINT_EXTENSION_TYPE", "omu", "EndpointExtension", "DEFAULT_CALL_TIMEOUT", "ENDPOINT_REGISTER_PACKET", "ENDPOINT_INVOKE_PACKET", "ENDPOINT_INVOKED_PACKET", "ENDPOINT_RESPONSE_PACKET", "packet", "promise", "clearCallTimeout", "reason", "endpoint", "result", "error", "formatError", "endpoints", "key", "type", "handler", "buffer", "params", "req", "data", "options", "timeoutMs", "resolve", "reject", "timeout", "response", "pending"]
7
7
  }
@@ -1,2 +1,3 @@
1
1
  export { EndpointType } from './endpoint.js';
2
+ export type { EndpointCallOptions } from './extension.js';
2
3
  export type { InvokedParams, InvokeParams } from './packets.js';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/endpoint/index.ts"],
4
- "sourcesContent": ["export { EndpointType } from './endpoint.js';\nexport type { InvokedParams, InvokeParams } from './packets.js';\n\n"],
4
+ "sourcesContent": ["export { EndpointType } from './endpoint.js';\nexport type { EndpointCallOptions } from './extension.js';\nexport type { InvokedParams, InvokeParams } from './packets.js';\n"],
5
5
  "mappings": "AAAA,OAAS,gBAAAA,MAAoB",
6
6
  "names": ["EndpointType"]
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{textDecoder as r}from"../../const";const i={CONTINUATION:0,TEXT:1,BINARY:2,PING:9,PONG:10,CLOSE:8},y={OK:1e3,GOING_AWAY:1001,PROTOCOL_ERROR:1002,UNSUPPORTED_DATA:1003,ABNORMAL_CLOSURE:1006,INVALID_TEXT:1007,POLICY_VIOLATION:1008,MESSAGE_TOO_BIG:1009,MANDATORY_EXTENSION:1010,INTERNAL_ERROR:1011,SERVICE_RESTART:1012,TRY_AGAIN_LATER:1013,BAD_GATEWAY:1014};class n{constructor(e,t,o=[],s=void 0,p="connecting"){this.addQueue=e;this.dispose=t;this.receiveQueue=o;this.receiveResolve=s;this.status=p}toWebSocket(){return new a(this)}static create(e){const t=new n(e.addQueue,e.dispose);return{ws:t,open:o=>{t.receiveQueue.push({type:"open",data:o}),t.receiveResolve?.()},dispatch:o=>{o.meta.type===i.BINARY?t.receiveQueue.push({type:"binary",data:o.body}):t.receiveQueue.push({type:"text",data:r.decode(o.body)}),t.receiveResolve?.()},close:o=>{t.receiveQueue.push({type:"close",data:o}),t.receiveResolve?.()},error:o=>{t.receiveQueue.push({type:"error",data:o}),t.receiveResolve?.()}}}send(e){this.addQueue(e)}close(e,t){this.dispose({code:e,reason:t})}async receive(){if(this.receiveResolve)throw new Error("Already receiving from another async call");for(;this.status!=="closed";){const e=this.receiveQueue.shift();if(!e){await new Promise(t=>this.receiveResolve=t);continue}return e.type==="close"&&(this.status="closed"),e.type==="open"&&(this.status="open"),this.receiveResolve=void 0,e}throw new Error("Receiving on already closed socket")}protocol="";url=""}class a{constructor(e,t={close:[],error:[],message:[],open:[]}){this.ws=e;this.eventListeners=t;this.receiveLoop()}CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;binaryType="blob";bufferedAmount=0;extensions="";onclose=null;onerror=null;onmessage=null;onopen=null;protocol="";readyState=0;url="";async receiveLoop(){for(;this.readyState===WebSocket.CLOSED;){const{data:e,type:t}=await this.ws.receive();switch(t){case"close":this.dispatchEvent(new CloseEvent("close",{code:e.code,reason:e.reason??void 0}));break;case"open":this.url=e.url,this.protocol=e.protocol??"",this.dispatchEvent(new Event("open",{}));break;case"error":this.dispatchEvent(new ErrorEvent("error",{error:e.type,message:e.reason??void 0}));break;case"text":case"binary":this.dispatchEvent(new MessageEvent("message",{data:e}));break}}}dispatchEvent(e){const t=this.eventListeners[e.type];for(const o of t)o(e);return e.type==="open"&&this.onopen?.(e),e.type==="error"&&this.onerror?.(e),e.type==="message"&&this.onmessage?.(e),e.type==="close"&&this.onclose?.(e),!0}send(e){this.ws.send(e)}close(e,t){this.ws.close(e,t)}addEventListener(e,t){this.eventListeners[e].push(t)}removeEventListener(e,t){const o=this.eventListeners[e],s=o.indexOf(t);s!==-1&&o.splice(s,1)}}export{n as OmuWS,a as OmuWebSocket,y as WSCloseCode,i as WSMsgType};
1
+ import{textDecoder as r}from"../../const";const i={CONTINUATION:0,TEXT:1,BINARY:2,PING:9,PONG:10,CLOSE:8},y={OK:1e3,GOING_AWAY:1001,PROTOCOL_ERROR:1002,UNSUPPORTED_DATA:1003,ABNORMAL_CLOSURE:1006,INVALID_TEXT:1007,POLICY_VIOLATION:1008,MESSAGE_TOO_BIG:1009,MANDATORY_EXTENSION:1010,INTERNAL_ERROR:1011,SERVICE_RESTART:1012,TRY_AGAIN_LATER:1013,BAD_GATEWAY:1014};class n{constructor(e,t,s=[],o=void 0,p="connecting"){this.addQueue=e;this.dispose=t;this.receiveQueue=s;this.receiveResolve=o;this.status=p}toWebSocket(){return new a(this)}static create(e){const t=new n(e.addQueue,e.dispose);return{ws:t,open:s=>{t.receiveQueue.push({type:"open",data:s}),t.receiveResolve?.()},dispatch:s=>{s.meta.type===i.BINARY?t.receiveQueue.push({type:"binary",data:s.body}):t.receiveQueue.push({type:"text",data:r.decode(s.body)}),t.receiveResolve?.()},close:s=>{t.receiveQueue.push({type:"close",data:s}),t.receiveResolve?.()},error:s=>{t.receiveQueue.push({type:"error",data:s}),t.receiveResolve?.()}}}send(e){this.addQueue(e)}close(e,t){this.dispose({code:e,reason:t})}async receive(){if(this.receiveResolve)throw new Error("Already receiving from another async call");for(;this.status!=="closed";){const e=this.receiveQueue.shift();if(!e){await new Promise(t=>this.receiveResolve=t);continue}return e.type==="close"&&(this.status="closed"),e.type==="open"&&(this.status="open"),this.receiveResolve=void 0,e}throw new Error("Receiving on already closed socket")}protocol="";url=""}class a{constructor(e,t={close:[],error:[],message:[],open:[]}){this.ws=e;this.eventListeners=t;this.receiveLoop()}CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;binaryType="blob";bufferedAmount=0;extensions="";onclose=null;onerror=null;onmessage=null;onopen=null;protocol="";readyState=0;url="";async receiveLoop(){for(;this.readyState!==this.CLOSED;){const{data:e,type:t}=await this.ws.receive();switch(t){case"close":this.readyState=this.CLOSED,this.dispatchEvent(new CloseEvent("close",{code:e.code,reason:e.reason??void 0}));break;case"open":this.url=e.url,this.protocol=e.protocol??"",this.readyState=this.OPEN,this.dispatchEvent(new Event("open",{}));break;case"error":this.dispatchEvent(new ErrorEvent("error",{error:e.type,message:e.reason??void 0}));break;case"text":case"binary":this.dispatchEvent(new MessageEvent("message",{data:e}));break}}}dispatchEvent(e){const t=this.eventListeners[e.type];for(const s of t)s(e);return e.type==="open"&&this.onopen?.(e),e.type==="error"&&this.onerror?.(e),e.type==="message"&&this.onmessage?.(e),e.type==="close"&&this.onclose?.(e),!0}send(e){this.ws.send(e)}close(e,t){this.readyState===this.CLOSED||this.readyState===this.CLOSING||(this.readyState=this.CLOSING,this.ws.close(e,t))}addEventListener(e,t){this.eventListeners[e].push(t)}removeEventListener(e,t){const s=this.eventListeners[e],o=s.indexOf(t);o!==-1&&s.splice(o,1)}}export{n as OmuWS,a as OmuWebSocket,y as WSCloseCode,i as WSMsgType};
2
2
  //# sourceMappingURL=websocket.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/http/websocket.ts"],
4
- "sourcesContent": ["import { textDecoder } from '../../const';\nimport { DataChunk, RequestHandle } from './http';\n\nexport type WSData = string | ArrayBufferLike | Blob | ArrayBufferView;\n\nexport const WSMsgType = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n PING: 0x9,\n PONG: 0xA,\n CLOSE: 0x8,\n} as const;\n\nexport const WSCloseCode = {\n OK: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n ABNORMAL_CLOSURE: 1006,\n INVALID_TEXT: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n MANDATORY_EXTENSION: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n BAD_GATEWAY: 1014,\n} as const;\n\nexport type WebSocketOpen = RequestHandle & {\n url: string;\n protocol?: string | null;\n};\nexport type WebSocketClose = RequestHandle & {\n code?: number;\n reason?: string | null;\n};\nexport type WebSocketError = RequestHandle & {\n type: 'ConnectionRefused';\n reason?: string | null;\n};\n\nexport type EventListenerMap<T> = {\n [K in keyof T]: ((event: T[K]) => unknown)[]\n};\n\nexport type WSMsg = {\n type: 'open';\n data: WebSocketOpen;\n} | {\n type: 'error';\n data: WebSocketError;\n} | {\n type: 'text';\n data: string;\n} | {\n type: 'binary';\n data: Uint8Array;\n} | {\n type: 'close';\n data: WebSocketClose;\n};\n\nexport type WebSocketHandle = {\n ws: OmuWS;\n open: (response: WebSocketOpen) => void;\n dispatch: (data: DataChunk<WSDataMeta>) => void;\n close: (response: WebSocketClose) => void;\n error: (response: WebSocketError) => void;\n};\n\nexport type WSDataMeta = {\n id: string;\n type:\n | typeof WSMsgType.TEXT\n | typeof WSMsgType.BINARY\n | typeof WSMsgType.PING\n | typeof WSMsgType.PONG;\n};\n\nexport type WSHandleState = {\n type: 'created' | 'receiving';\n handle: WebSocketHandle;\n};\n\ntype WSOptions = {\n addQueue: (data: WSData) => void;\n dispose(options: {\n code?: number;\n reason?: string;\n }): void;\n};\n\nexport class OmuWS {\n constructor(\n protected readonly addQueue: (data: WSData) => void,\n protected readonly dispose: (options: { code?: number; reason?: string }) => void,\n protected readonly receiveQueue: WSMsg[] = [],\n private receiveResolve: (() => void) | undefined = undefined,\n private status: 'connecting' | 'open' | 'closed' = 'connecting',\n ) { }\n\n public toWebSocket(): OmuWebSocket {\n return new OmuWebSocket(this);\n }\n\n public static create(options: WSOptions): WebSocketHandle {\n const ws = new OmuWS(options.addQueue, options.dispose);\n return {\n ws,\n open: (response) => {\n ws.receiveQueue.push({\n type: 'open',\n data: response,\n });\n ws.receiveResolve?.();\n },\n dispatch: (data: DataChunk<WSDataMeta>): void => {\n if (data.meta.type === WSMsgType.BINARY) {\n ws.receiveQueue.push({\n type: 'binary',\n data: data.body,\n });\n } else {\n ws.receiveQueue.push({\n type: 'text',\n data: textDecoder.decode(data.body),\n });\n }\n ws.receiveResolve?.();\n },\n close: (response) => {\n ws.receiveQueue.push({\n type: 'close',\n data: response,\n });\n ws.receiveResolve?.();\n },\n error: (response) => {\n ws.receiveQueue.push({\n type: 'error',\n data: response,\n });\n ws.receiveResolve?.();\n },\n };\n }\n\n public send(data: WSData): void {\n this.addQueue(data);\n }\n\n public close(code?: number, reason?: string): void {\n this.dispose({ code, reason });\n }\n\n public async receive(): Promise<WSMsg> {\n if (this.receiveResolve) {\n throw new Error('Already receiving from another async call');\n }\n while (this.status !== 'closed') {\n const data = this.receiveQueue.shift();\n if (!data) {\n await new Promise<void>((resolve) => this.receiveResolve = resolve);\n continue;\n }\n if (data.type === 'close') {\n this.status = 'closed';\n }\n if (data.type === 'open') {\n this.status = 'open';\n }\n this.receiveResolve = undefined;\n return data;\n }\n throw new Error('Receiving on already closed socket');\n }\n\n protocol: string = '';\n url: string = '';\n}\n\nexport class OmuWebSocket implements WebSocket {\n public CONNECTING = 0 as const;\n public OPEN = 1 as const;\n public CLOSING = 2 as const;\n public CLOSED = 3 as const;\n\n binaryType: BinaryType = 'blob';\n bufferedAmount: number = 0;\n extensions: string = '';\n onclose: ((this: WebSocket, ev: CloseEvent) => unknown) | null = null;\n onerror: ((this: WebSocket, ev: Event) => unknown) | null = null;\n onmessage: ((this: WebSocket, ev: MessageEvent) => unknown) | null = null;\n onopen: ((this: WebSocket, ev: Event) => unknown) | null = null;\n protocol: string = '';\n readyState: 0 | 2 | 1 | 3 = 0;\n url: string = '';\n\n constructor(\n protected readonly ws: OmuWS,\n private readonly eventListeners: EventListenerMap<WebSocketEventMap> = {\n close: [],\n error: [],\n message: [],\n open: [],\n },\n ) {\n this.receiveLoop();\n }\n\n private async receiveLoop() {\n while (this.readyState === WebSocket.CLOSED) {\n const { data, type } = await this.ws.receive();\n switch (type) {\n case 'close':\n this.dispatchEvent(new CloseEvent('close', {\n code: data.code,\n reason: data.reason ?? undefined,\n }));\n break;\n case 'open':\n this.url = data.url;\n this.protocol = data.protocol ?? '';\n this.dispatchEvent(new Event('open', {}));\n break;\n case 'error':\n this.dispatchEvent(new ErrorEvent('error', {\n error: data.type,\n message: data.reason ?? undefined,\n }));\n break;\n case 'text':\n case 'binary':\n this.dispatchEvent(new MessageEvent('message', {\n data,\n }));\n break;\n }\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const listeners = this.eventListeners[event.type];\n for (const listener of listeners) {\n listener(event);\n }\n if (event.type === 'open') {\n this.onopen?.(event as MessageEvent);\n }\n if (event.type === 'error') {\n this.onerror?.(event);\n }\n if (event.type === 'message') {\n this.onmessage?.(event as MessageEvent);\n }\n if (event.type === 'close') {\n this.onclose?.(event as CloseEvent);\n }\n return true;\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this.ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this.ws.close(code, reason);\n }\n\n addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n this.eventListeners[type].push(listener);\n }\n\n removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n const listeners = this.eventListeners[type];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { textDecoder } from '../../const';\nimport { DataChunk, RequestHandle } from './http';\n\nexport type WSData = string | ArrayBufferLike | Blob | ArrayBufferView;\n\nexport const WSMsgType = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n PING: 0x9,\n PONG: 0xA,\n CLOSE: 0x8,\n} as const;\n\nexport const WSCloseCode = {\n OK: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n ABNORMAL_CLOSURE: 1006,\n INVALID_TEXT: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n MANDATORY_EXTENSION: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n BAD_GATEWAY: 1014,\n} as const;\n\nexport type WebSocketOpen = RequestHandle & {\n url: string;\n protocol?: string | null;\n};\nexport type WebSocketClose = RequestHandle & {\n code?: number;\n reason?: string | null;\n};\nexport type WebSocketError = RequestHandle & {\n type: 'ConnectionRefused';\n reason?: string | null;\n};\n\nexport type EventListenerMap<T> = {\n [K in keyof T]: ((event: T[K]) => unknown)[]\n};\n\nexport type WSMsg = {\n type: 'open';\n data: WebSocketOpen;\n} | {\n type: 'error';\n data: WebSocketError;\n} | {\n type: 'text';\n data: string;\n} | {\n type: 'binary';\n data: Uint8Array;\n} | {\n type: 'close';\n data: WebSocketClose;\n};\n\nexport type WebSocketHandle = {\n ws: OmuWS;\n open: (response: WebSocketOpen) => void;\n dispatch: (data: DataChunk<WSDataMeta>) => void;\n close: (response: WebSocketClose) => void;\n error: (response: WebSocketError) => void;\n};\n\nexport type WSDataMeta = {\n id: string;\n type:\n | typeof WSMsgType.TEXT\n | typeof WSMsgType.BINARY\n | typeof WSMsgType.PING\n | typeof WSMsgType.PONG;\n};\n\nexport type WSHandleState = {\n type: 'created' | 'receiving';\n handle: WebSocketHandle;\n};\n\ntype WSOptions = {\n addQueue: (data: WSData) => void;\n dispose(options: {\n code?: number;\n reason?: string;\n }): void;\n};\n\nexport class OmuWS {\n constructor(\n protected readonly addQueue: (data: WSData) => void,\n protected readonly dispose: (options: { code?: number; reason?: string }) => void,\n protected readonly receiveQueue: WSMsg[] = [],\n private receiveResolve: (() => void) | undefined = undefined,\n private status: 'connecting' | 'open' | 'closed' = 'connecting',\n ) { }\n\n public toWebSocket(): OmuWebSocket {\n return new OmuWebSocket(this);\n }\n\n public static create(options: WSOptions): WebSocketHandle {\n const ws = new OmuWS(options.addQueue, options.dispose);\n return {\n ws,\n open: (response) => {\n ws.receiveQueue.push({\n type: 'open',\n data: response,\n });\n ws.receiveResolve?.();\n },\n dispatch: (data: DataChunk<WSDataMeta>): void => {\n if (data.meta.type === WSMsgType.BINARY) {\n ws.receiveQueue.push({\n type: 'binary',\n data: data.body,\n });\n } else {\n ws.receiveQueue.push({\n type: 'text',\n data: textDecoder.decode(data.body),\n });\n }\n ws.receiveResolve?.();\n },\n close: (response) => {\n ws.receiveQueue.push({\n type: 'close',\n data: response,\n });\n ws.receiveResolve?.();\n },\n error: (response) => {\n ws.receiveQueue.push({\n type: 'error',\n data: response,\n });\n ws.receiveResolve?.();\n },\n };\n }\n\n public send(data: WSData): void {\n this.addQueue(data);\n }\n\n public close(code?: number, reason?: string): void {\n this.dispose({ code, reason });\n }\n\n public async receive(): Promise<WSMsg> {\n if (this.receiveResolve) {\n throw new Error('Already receiving from another async call');\n }\n while (this.status !== 'closed') {\n const data = this.receiveQueue.shift();\n if (!data) {\n await new Promise<void>((resolve) => this.receiveResolve = resolve);\n continue;\n }\n if (data.type === 'close') {\n this.status = 'closed';\n }\n if (data.type === 'open') {\n this.status = 'open';\n }\n this.receiveResolve = undefined;\n return data;\n }\n throw new Error('Receiving on already closed socket');\n }\n\n protocol: string = '';\n url: string = '';\n}\n\nexport class OmuWebSocket implements WebSocket {\n public CONNECTING = 0 as const;\n public OPEN = 1 as const;\n public CLOSING = 2 as const;\n public CLOSED = 3 as const;\n\n binaryType: BinaryType = 'blob';\n bufferedAmount: number = 0;\n extensions: string = '';\n onclose: ((this: WebSocket, ev: CloseEvent) => unknown) | null = null;\n onerror: ((this: WebSocket, ev: Event) => unknown) | null = null;\n onmessage: ((this: WebSocket, ev: MessageEvent) => unknown) | null = null;\n onopen: ((this: WebSocket, ev: Event) => unknown) | null = null;\n protocol: string = '';\n readyState: 0 | 2 | 1 | 3 = 0;\n url: string = '';\n\n constructor(\n protected readonly ws: OmuWS,\n private readonly eventListeners: EventListenerMap<WebSocketEventMap> = {\n close: [],\n error: [],\n message: [],\n open: [],\n },\n ) {\n this.receiveLoop();\n }\n\n private async receiveLoop() {\n while (this.readyState !== this.CLOSED) {\n const { data, type } = await this.ws.receive();\n switch (type) {\n case 'close':\n this.readyState = this.CLOSED;\n this.dispatchEvent(new CloseEvent('close', {\n code: data.code,\n reason: data.reason ?? undefined,\n }));\n break;\n case 'open':\n this.url = data.url;\n this.protocol = data.protocol ?? '';\n this.readyState = this.OPEN;\n this.dispatchEvent(new Event('open', {}));\n break;\n case 'error':\n this.dispatchEvent(new ErrorEvent('error', {\n error: data.type,\n message: data.reason ?? undefined,\n }));\n break;\n case 'text':\n case 'binary':\n this.dispatchEvent(new MessageEvent('message', {\n data,\n }));\n break;\n }\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const listeners = this.eventListeners[event.type];\n for (const listener of listeners) {\n listener(event);\n }\n if (event.type === 'open') {\n this.onopen?.(event as MessageEvent);\n }\n if (event.type === 'error') {\n this.onerror?.(event);\n }\n if (event.type === 'message') {\n this.onmessage?.(event as MessageEvent);\n }\n if (event.type === 'close') {\n this.onclose?.(event as CloseEvent);\n }\n return true;\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this.ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n if (this.readyState === this.CLOSED || this.readyState === this.CLOSING) {\n return;\n }\n this.readyState = this.CLOSING;\n this.ws.close(code, reason);\n }\n\n addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n this.eventListeners[type].push(listener);\n }\n\n removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => unknown): void {\n const listeners = this.eventListeners[type];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,MAAmB,cAKrB,MAAMC,EAAY,CACrB,aAAc,EACd,KAAM,EACN,OAAQ,EACR,KAAM,EACN,KAAM,GACN,MAAO,CACX,EAEaC,EAAc,CACvB,GAAI,IACJ,WAAY,KACZ,eAAgB,KAChB,iBAAkB,KAClB,iBAAkB,KAClB,aAAc,KACd,iBAAkB,KAClB,gBAAiB,KACjB,oBAAqB,KACrB,eAAgB,KAChB,gBAAiB,KACjB,gBAAiB,KACjB,YAAa,IACjB,EAkEO,MAAMC,CAAM,CACf,YACuBC,EACAC,EACAC,EAAwB,CAAC,EACpCC,EAA2C,OAC3CC,EAA2C,aACrD,CALqB,cAAAJ,EACA,aAAAC,EACA,kBAAAC,EACX,oBAAAC,EACA,YAAAC,CACR,CAEG,aAA4B,CAC/B,OAAO,IAAIC,EAAa,IAAI,CAChC,CAEA,OAAc,OAAOC,EAAqC,CACtD,MAAMC,EAAK,IAAIR,EAAMO,EAAQ,SAAUA,EAAQ,OAAO,EACtD,MAAO,CACH,GAAAC,EACA,KAAOC,GAAa,CAChBD,EAAG,aAAa,KAAK,CACjB,KAAM,OACN,KAAMC,CACV,CAAC,EACDD,EAAG,iBAAiB,CACxB,EACA,SAAWE,GAAsC,CACzCA,EAAK,KAAK,OAASZ,EAAU,OAC7BU,EAAG,aAAa,KAAK,CACjB,KAAM,SACN,KAAME,EAAK,IACf,CAAC,EAEDF,EAAG,aAAa,KAAK,CACjB,KAAM,OACN,KAAMX,EAAY,OAAOa,EAAK,IAAI,CACtC,CAAC,EAELF,EAAG,iBAAiB,CACxB,EACA,MAAQC,GAAa,CACjBD,EAAG,aAAa,KAAK,CACjB,KAAM,QACN,KAAMC,CACV,CAAC,EACDD,EAAG,iBAAiB,CACxB,EACA,MAAQC,GAAa,CACjBD,EAAG,aAAa,KAAK,CACjB,KAAM,QACN,KAAMC,CACV,CAAC,EACDD,EAAG,iBAAiB,CACxB,CACJ,CACJ,CAEO,KAAKE,EAAoB,CAC5B,KAAK,SAASA,CAAI,CACtB,CAEO,MAAMC,EAAeC,EAAuB,CAC/C,KAAK,QAAQ,CAAE,KAAAD,EAAM,OAAAC,CAAO,CAAC,CACjC,CAEA,MAAa,SAA0B,CACnC,GAAI,KAAK,eACL,MAAM,IAAI,MAAM,2CAA2C,EAE/D,KAAO,KAAK,SAAW,UAAU,CAC7B,MAAMF,EAAO,KAAK,aAAa,MAAM,EACrC,GAAI,CAACA,EAAM,CACP,MAAM,IAAI,QAAeG,GAAY,KAAK,eAAiBA,CAAO,EAClE,QACJ,CACA,OAAIH,EAAK,OAAS,UACd,KAAK,OAAS,UAEdA,EAAK,OAAS,SACd,KAAK,OAAS,QAElB,KAAK,eAAiB,OACfA,CACX,CACA,MAAM,IAAI,MAAM,oCAAoC,CACxD,CAEA,SAAmB,GACnB,IAAc,EAClB,CAEO,MAAMJ,CAAkC,CAiB3C,YACuBE,EACFM,EAAsD,CACnE,MAAO,CAAC,EACR,MAAO,CAAC,EACR,QAAS,CAAC,EACV,KAAM,CAAC,CACX,EACF,CAPqB,QAAAN,EACF,oBAAAM,EAOjB,KAAK,YAAY,CACrB,CA1BO,WAAa,EACb,KAAO,EACP,QAAU,EACV,OAAS,EAEhB,WAAyB,OACzB,eAAyB,EACzB,WAAqB,GACrB,QAAiE,KACjE,QAA4D,KAC5D,UAAqE,KACrE,OAA2D,KAC3D,SAAmB,GACnB,WAA4B,EAC5B,IAAc,GAcd,MAAc,aAAc,CACxB,KAAO,KAAK,aAAe,KAAK,QAAQ,CACpC,KAAM,CAAE,KAAAJ,EAAM,KAAAK,CAAK,EAAI,MAAM,KAAK,GAAG,QAAQ,EAC7C,OAAQA,EAAM,CACV,IAAK,QACD,KAAK,WAAa,KAAK,OACvB,KAAK,cAAc,IAAI,WAAW,QAAS,CACvC,KAAML,EAAK,KACX,OAAQA,EAAK,QAAU,MAC3B,CAAC,CAAC,EACF,MACJ,IAAK,OACD,KAAK,IAAMA,EAAK,IAChB,KAAK,SAAWA,EAAK,UAAY,GACjC,KAAK,WAAa,KAAK,KACvB,KAAK,cAAc,IAAI,MAAM,OAAQ,CAAC,CAAC,CAAC,EACxC,MACJ,IAAK,QACD,KAAK,cAAc,IAAI,WAAW,QAAS,CACvC,MAAOA,EAAK,KACZ,QAASA,EAAK,QAAU,MAC5B,CAAC,CAAC,EACF,MACJ,IAAK,OACL,IAAK,SACD,KAAK,cAAc,IAAI,aAAa,UAAW,CAC3C,KAAAA,CACJ,CAAC,CAAC,EACF,KACR,CACJ,CACJ,CAEA,cAAcM,EAAuB,CACjC,MAAMC,EAAY,KAAK,eAAeD,EAAM,IAAI,EAChD,UAAWE,KAAYD,EACnBC,EAASF,CAAK,EAElB,OAAIA,EAAM,OAAS,QACf,KAAK,SAASA,CAAqB,EAEnCA,EAAM,OAAS,SACf,KAAK,UAAUA,CAAK,EAEpBA,EAAM,OAAS,WACf,KAAK,YAAYA,CAAqB,EAEtCA,EAAM,OAAS,SACf,KAAK,UAAUA,CAAmB,EAE/B,EACX,CAEA,KAAKN,EAA+D,CAChE,KAAK,GAAG,KAAKA,CAAI,CACrB,CAEA,MAAMC,EAAeC,EAAuB,CACpC,KAAK,aAAe,KAAK,QAAU,KAAK,aAAe,KAAK,UAGhE,KAAK,WAAa,KAAK,QACvB,KAAK,GAAG,MAAMD,EAAMC,CAAM,EAC9B,CAEA,iBAAoDG,EAASG,EAAwE,CACjI,KAAK,eAAeH,CAAI,EAAE,KAAKG,CAAQ,CAC3C,CAEA,oBAAuDH,EAASG,EAAwE,CACpI,MAAMD,EAAY,KAAK,eAAeF,CAAI,EACpCI,EAAQF,EAAU,QAAQC,CAAQ,EACpCC,IAAU,IACVF,EAAU,OAAOE,EAAO,CAAC,CAEjC,CACJ",
6
6
  "names": ["textDecoder", "WSMsgType", "WSCloseCode", "OmuWS", "addQueue", "dispose", "receiveQueue", "receiveResolve", "status", "OmuWebSocket", "options", "ws", "response", "data", "code", "reason", "resolve", "eventListeners", "type", "event", "listeners", "listener", "index"]
7
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