@omujs/omu 0.10.8 → 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.
- package/README.md +30 -0
- package/dist/api/endpoint/extension.d.ts +9 -1
- package/dist/api/endpoint/extension.js +1 -1
- package/dist/api/endpoint/extension.js.map +3 -3
- package/dist/api/endpoint/index.d.ts +1 -0
- package/dist/api/endpoint/index.js.map +1 -1
- package/dist/api/http/websocket.js +1 -1
- package/dist/api/http/websocket.js.map +2 -2
- package/dist/api/registry/extension.js +1 -1
- package/dist/api/registry/extension.js.map +3 -3
- package/dist/api/signal/extension.js +1 -1
- package/dist/api/signal/extension.js.map +3 -3
- package/dist/api/signal/signal.d.ts +2 -1
- package/dist/api/signal/signal.js +1 -1
- package/dist/api/signal/signal.js.map +1 -1
- package/dist/api/table/extension.js +1 -1
- package/dist/api/table/extension.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/network/network.d.ts +2 -2
- package/dist/network/network.js +1 -1
- package/dist/network/network.js.map +2 -2
- package/dist/omu.d.ts +4 -4
- package/dist/omu.js +1 -1
- package/dist/omu.js.map +3 -3
- package/dist/token.d.ts +4 -2
- package/dist/token.js +1 -1
- package/dist/token.js.map +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- 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.
|
|
@@ -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
|
|
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,
|
|
5
|
-
"mappings": "AACA,OAAS,iBAAAA,MAAqB,mBAC9B,OAAS,cAAAC,MAAkB,uBAE3B,OAAS,iBAAAC,MAAqB,kBAG9B,OAAS,yBAAAC,EAAuB,wBAAAC,EAAsB,0BAAAC,EAAwB,0BAAAC,EAAuC,gBAAAC,EAAc,kBAAAC,MAAsB,eAElJ,MAAMC,EAA4D,IAAIP,EACzE,WACCQ,GAAa,IAAIC,EAAkBD,CAAG,CAC3C,
|
|
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": "AACA,OAAS,iBAAAA,MAAqB,mBAC9B,OAAS,cAAAC,MAAkB,uBAE3B,OAAS,iBAAAC,MAAqB,kBAG9B,OAAS,yBAAAC,EAAuB,wBAAAC,EAAsB,0BAAAC,EAAwB,0BAAAC,EAAuC,gBAAAC,EAAc,kBAAAC,MAAsB,eAElJ,MAAMC,EAA4D,IAAIP,EACzE,WACCQ,GAAa,IAAIC,EAAkBD,CAAG,CAC3C,EAgBME,EAAuB,IAOtB,MAAMD,CAAkB,CAM3B,YAA6BD,EAAU,CAAV,SAAAA,EACzB,KAAK,OAAS,KAAK,OAAO,YAAY,WAAa,YAAY,IAAI,GAAK,GAAI,EAC5EA,EAAI,QAAQ,eACRG,EACAC,EACAC,EACAC,CACJ,EACAN,EAAI,QAAQ,iBAAiBK,EAA0BE,GAAW,CAC9D,KAAK,cAAcA,CAAM,CAC7B,CAAC,EACDP,EAAI,QAAQ,iBAAiBM,EAA2BC,GAAW,CAC/D,MAAMC,EAAU,KAAK,iBAAiB,IAAID,EAAO,OAAO,GAAG,EAC3D,GAAI,CAACC,EACD,MAAM,IAAI,MACN,qCAAqCD,EAAO,OAAO,GAAG,KAAKA,EAAO,OAAO,GAAG,IAAI,CAAC,GACrF,EAIJ,GAFA,KAAK,iBAAiB,OAAOA,EAAO,OAAO,GAAG,EAC9CE,EAAiBD,CAAO,EACpBD,EAAO,OAAO,MAAO,CACrBC,EAAQ,OAAO,IAAI,MAAMD,EAAO,OAAO,KAAK,CAAC,EAC7C,MACJ,CACAC,EAAQ,QAAQD,EAAO,MAAM,CACjC,CAAC,EACDP,EAAI,QAAQ,QAAQ,IAAM,KAAK,OAAO,CAAC,EACvCA,EAAI,QAAQ,GAAG,eAAiBU,GAAW,CACvC,KAAK,mBACDA,GAAU,IAAI,MAAM,wCAAwC,CAChE,CACJ,CAAC,CACL,CArCgB,KAAyCX,EACxC,eAAiB,IAAIT,EACrB,iBAA6C,IAAI,IAC1D,OAoCR,MAAc,cAAciB,EAA8C,CACtE,MAAMI,EAAW,KAAK,eAAe,IAAIJ,EAAO,OAAO,EAAE,EACzD,GAAI,CAACI,EACD,MAAM,IAAI,MAAM,4CAA4CJ,EAAO,OAAO,GAAG,IAAI,CAAC,KAAKA,EAAO,OAAO,GAAG,GAAG,EAE/G,GAAI,CACA,MAAMK,EAAS,MAAMD,EAAS,QAAQJ,CAAM,EAC5C,MAAM,KAAK,IAAI,KAAKD,EAA0B,IAAIV,EAC9C,IAAIE,EAAeS,EAAO,OAAO,GAAIA,EAAO,OAAO,IAAK,IAAI,EAC5DK,CACJ,CAAC,CACL,OAASC,EAAO,CACZ,MAAM,KAAK,IAAI,KAAKP,EAA0B,IAAIV,EAC9C,IAAIE,EAAeS,EAAO,OAAO,GAAIA,EAAO,OAAO,IAAKO,EAAYD,CAAK,CAAC,EAC1E,IAAI,UACR,CAAC,CACL,CACJ,CAEQ,QAAe,CACnB,MAAME,EAAY,IAAIzB,EACtB,SAAW,CAAC0B,EAAKL,CAAQ,IAAK,KAAK,eAC/BI,EAAU,IAAIC,EAAKL,EAAS,KAAK,YAAY,EAEjD,MAAMJ,EAAS,IAAIZ,EAAuBoB,CAAS,EACnD,KAAK,IAAI,KAAKZ,EAA0BI,CAAM,CAClD,CAEO,KACHU,EACAC,EACI,CACJ,GAAI,KAAK,IAAI,QACT,MAAM,IAAI,MAAM,wDAAwD,EAE5E,GAAI,KAAK,eAAe,IAAID,EAAK,EAAE,EAC/B,MAAM,IAAI,MAAM,oBAAoBA,EAAK,GAAG,IAAI,CAAC,wBAAwB,EAE7E,KAAK,eAAe,IAAIA,EAAK,GAAI,CAAE,KAAAA,EAAM,QAAS,MAAO,CAAE,OAAAE,EAAQ,OAAAC,CAAO,IAAM,CAC5E,MAAMC,EAAMJ,EAAK,kBAAkB,YAAYE,CAAM,EAC/CP,EAAS,MAAMM,EAAQG,EAAKD,CAAM,EACxC,OAAOH,EAAK,mBAAmB,UAAUL,CAAM,CACnD,CAAE,CAAC,CACP,CAEA,MAAa,KACTD,EACAW,EACAC,EACY,CACZ,MAAMP,EAAM,KAAK,SACXQ,EAAYD,GAAS,UAAY,OACjCrB,EACAqB,EAAQ,QACd,GACIC,IAAc,OACV,CAAC,OAAO,SAASA,CAAS,GAAKA,GAAa,GAEhD,MAAM,IAAI,WACN,2DACJ,EAEJ,MAAMhB,EAAU,IAAI,QAAoB,CAACiB,EAASC,IAAW,CACzD,MAAMC,EAAUH,IAAc,KACxB,OACA,WAAW,IAAM,CACf,KAAK,iBAAiB,OAAOR,CAAG,EAChCU,EAAO,IAAI,MACP,YAAYf,EAAS,GAAG,IAAI,CAAC,oBAAoBa,CAAS,IAC9D,CAAC,CACL,EAAGA,CAAS,EAChB,KAAK,iBAAiB,IAAIR,EAAK,CAAE,QAAAS,EAAS,OAAAC,EAAQ,QAAAC,CAAQ,CAAC,CAC/D,CAAC,EACD,GAAI,CACA,MAAM,KAAK,IAAI,KAAKvB,EAAwB,IAAIV,EAC5C,IAAIG,EAAac,EAAS,GAAIK,CAAG,EACjCL,EAAS,kBAAkB,UAAUW,CAAI,CAC7C,CAAC,EACD,MAAMM,EAAW,MAAMpB,EACvB,OAAOG,EAAS,mBAAmB,YAAYiB,CAAQ,CAC3D,OAASf,EAAO,CACZ,MAAMgB,EAAU,KAAK,iBAAiB,IAAIb,CAAG,EAC7C,MAAIa,IACApB,EAAiBoB,CAAO,EACxB,KAAK,iBAAiB,OAAOb,CAAG,GAE9BH,CACV,CACJ,CAEQ,mBAAmBA,EAAoB,CAC3C,UAAWL,KAAW,KAAK,iBAAiB,OAAO,EAC/CC,EAAiBD,CAAO,EACxBA,EAAQ,OAAOK,CAAK,EAExB,KAAK,iBAAiB,MAAM,CAChC,CACJ,CAEA,SAASJ,EAAiBD,EAA4B,CAC9CA,EAAQ,UAAY,QACpB,aAAaA,EAAQ,OAAO,CAEpC,CAEA,SAASM,EAAYD,EAAwB,CACzC,OAAIA,aAAiB,MACV,GAAGA,EAAM,IAAI,KAAKA,EAAM,OAAO,GAEnC,OAAOA,CAAK,CACvB,CAEA,MAAMV,EAA2BZ,EAAW,iBAAyCQ,EAAyB,CAC1G,KAAM,WACN,WAAYJ,CAChB,CAAC,EACKS,EAAyBb,EAAW,iBAAuCQ,EAAyB,CACtG,KAAM,SACN,WAAYL,CAChB,CAAC,EACKW,EAA0Bd,EAAW,iBAAwCQ,EAAyB,CACxG,KAAM,UACN,WAAYN,CAChB,CAAC,EACKa,EAA2Bf,EAAW,iBAAyCQ,EAAyB,CAC1G,KAAM,WACN,WAAYH,CAChB,CAAC",
|
|
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,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
|
|
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{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,
|
|
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
|
|
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,
|
|
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": "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",
|
|
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{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);
|
|
1
|
+
import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id.key()}' already exists`);const i=new I(this.omu,e);return this.registries.set(e.id,i),i}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){await this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/registry/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
|
|
5
|
-
"mappings": "AACA,OAAS,gBAAAA,MAAoB,cAC7B,OAAS,cAAAC,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,QAAAC,MAAY,gBACrB,OAAS,cAAAC,MAAkB,uBAE3B,OAAmB,cAAAC,MAAkB,kBACrC,OAAS,gBAAAC,MAAoB,0BAC7B,OAAyB,iBAAAC,MAAqB,kBAE9C,OAAS,kBAAAC,EAAgB,kBAAAC,MAAsB,eAC/C,OAAwB,gBAAAC,MAA8B,gBAE/C,MAAMC,CAAuC,CAIhD,YAA6BC,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRC,EACAC,EACAC,CACJ,CACJ,CATgB,KAAyCC,EACxC,WAAa,IAAId,EAU1B,eAAkBe,EAA4C,CAClE,GAAI,KAAK,WAAW,IAAIA,EAAa,EAAE,EACnC,MAAM,IAAI,MAAM,6BAA6BA,EAAa,
|
|
6
|
-
"names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id.key()}' already exists`);\n }\n const registry = new RegistryImpl(this.omu, registryType);\n this.registries.set(registryType.id, registry as Registry<unknown>);\n return registry;\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n await this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "registry", "RegistryImpl", "identifier", "name", "options", "tableType", "type", "packet", "#get", "result", "REGISTRY_GET_ENDPOINT", "#set", "value", "fn", "newValue", "handler", "data", "isReady", "context", "handle", "listeners", "emit", "unsubscribe", "proxied", "proxy", "listener", "PROXIED_SYMBOL", "run", "resolve", "deepEqual", "objA", "objB", "keysA", "keysB", "key", "changed", "target", "prop", "p", "REGISTRY_PERMISSION_ID"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Identifier as
|
|
1
|
+
import{Identifier as d,IdentifierMap as c}from"../../identifier";import{PacketType as r}from"../../network/packet";import{ExtensionType as g}from"../extension.js";import{SignalPacket as S,SignalRegisterPacket as T}from"./packets.js";import{SignalType as l}from"./signal.js";const n=new g("signal",s=>new m(s)),o=r.createJson(n,{name:"register",serializer:T}),p=r.createJson(n,{name:"listen",serializer:d}),a=r.createSerialized(n,{name:"notify",serializer:S});class m{constructor(i){this.omu=i;i.network.registerPacket(o,p,a)}type=n;signals=new c;createSignal(i){if(this.signals.has(i.id))throw new Error(`Signal with identifier '${i.id.key()}' already exists`);const e=new h(this.omu,i);return this.signals.set(i.id,e),e}json(i,e){const t=l.createJson(this.omu.app.id.base,{name:i,serializer:e?.serializer});return this.createSignal(t)}serialized(i,e){const t=l.createSerialized(this.omu.app.id.base,{name:i,serializer:e?.serializer});return this.createSignal(t)}get(i){const e=this.signals.get(i.id);return e||this.createSignal(i)}}class h{constructor(i,e){this.omu=i;this.type=e;i.network.addPacketHandler(a,t=>this.handleBroadcast(t)),i.network.addTask(()=>this.onTask())}listeners=[];listening=!1;async notify(i){const e=this.type.serializer.serialize(i);await this.omu.send(a,{id:this.type.id,body:e});for(const t of this.listeners)t(i)}listen(i){return this.listening||(this.omu.onReady(()=>{this.omu.send(p,this.type.id)}),this.listening=!0),this.listeners.push(i),()=>{const e=this.listeners.indexOf(i);e!==-1&&this.listeners.splice(e,1)}}handleBroadcast(i){if(!i.id.isEqual(this.type.id))return;const e=this.type.serializer.deserialize(i.body);for(const t of this.listeners)t(e)}onTask(){this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(o,{id:this.type.id,permissions:this.type.permissions})}}export{n as SIGNAL_EXTENSION_TYPE,m as SignalExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/signal/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializable } from '../../serialize';\nimport { ExtensionType, type Extension } from '../extension.js';\nimport { SignalPacket, SignalRegisterPacket } from './packets.js';\nimport { SignalType, type Signal } from './signal.js';\n\nexport const SIGNAL_EXTENSION_TYPE: ExtensionType<SignalExtension> = new ExtensionType(\n 'signal',\n (omu: Omu) => new SignalExtension(omu),\n);\n\nconst SIGNAL_REGISTER_PACKET = PacketType.createJson<SignalRegisterPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'register',\n serializer: SignalRegisterPacket,\n});\nconst SIGNAL_LISTEN_PACKET = PacketType.createJson<Identifier>(SIGNAL_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst SIGNAL_NOTIFY_PACKET = PacketType.createSerialized<SignalPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'notify',\n serializer: SignalPacket,\n});\n\nexport class SignalExtension implements Extension {\n public readonly type: ExtensionType<SignalExtension> = SIGNAL_EXTENSION_TYPE;\n private readonly signals = new IdentifierMap<
|
|
5
|
-
"mappings": "AACA,OAAS,cAAAA,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,cAAAC,MAAkB,uBAG3B,OAAS,iBAAAC,MAAqC,kBAC9C,OAAS,gBAAAC,EAAc,wBAAAC,MAA4B,eACnD,OAAS,cAAAC,MAA+B,cAEjC,MAAMC,EAAwD,IAAIJ,EACrE,SACCK,GAAa,IAAIC,EAAgBD,CAAG,CACzC,EAEME,EAAyBR,EAAW,WAAiCK,EAAuB,CAC9F,KAAM,WACN,WAAYF,CAChB,CAAC,EACKM,EAAuBT,EAAW,WAAuBK,EAAuB,CAClF,KAAM,SACN,WAAYP,CAChB,CAAC,EACKY,EAAuBV,EAAW,iBAA+BK,EAAuB,CAC1F,KAAM,SACN,WAAYH,CAChB,CAAC,EAEM,MAAMK,CAAqC,CAI9C,YAA6BD,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRE,EACAC,EACAC,CACJ,CACJ,CATgB,KAAuCL,EACtC,QAAU,IAAIN,EAUvB,aAAgBY,EAAsC,CAC1D,GAAI,KAAK,QAAQ,IAAIA,EAAW,EAAE,EAC9B,MAAM,IAAI,MAAM,
|
|
6
|
-
"names": ["Identifier", "IdentifierMap", "PacketType", "ExtensionType", "SignalPacket", "SignalRegisterPacket", "SignalType", "SIGNAL_EXTENSION_TYPE", "omu", "SignalExtension", "SIGNAL_REGISTER_PACKET", "SIGNAL_LISTEN_PACKET", "SIGNAL_NOTIFY_PACKET", "signalType", "
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializable } from '../../serialize';\nimport { ExtensionType, type Extension } from '../extension.js';\nimport { SignalPacket, SignalRegisterPacket } from './packets.js';\nimport { SignalType, type Signal } from './signal.js';\n\nexport const SIGNAL_EXTENSION_TYPE: ExtensionType<SignalExtension> = new ExtensionType(\n 'signal',\n (omu: Omu) => new SignalExtension(omu),\n);\n\nconst SIGNAL_REGISTER_PACKET = PacketType.createJson<SignalRegisterPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'register',\n serializer: SignalRegisterPacket,\n});\nconst SIGNAL_LISTEN_PACKET = PacketType.createJson<Identifier>(SIGNAL_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst SIGNAL_NOTIFY_PACKET = PacketType.createSerialized<SignalPacket>(SIGNAL_EXTENSION_TYPE, {\n name: 'notify',\n serializer: SignalPacket,\n});\n\nexport class SignalExtension implements Extension {\n public readonly type: ExtensionType<SignalExtension> = SIGNAL_EXTENSION_TYPE;\n private readonly signals = new IdentifierMap<Signal<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n SIGNAL_REGISTER_PACKET,\n SIGNAL_LISTEN_PACKET,\n SIGNAL_NOTIFY_PACKET,\n );\n }\n\n private createSignal<T>(signalType: SignalType<T>): Signal<T> {\n if (this.signals.has(signalType.id)) {\n throw new Error(`Signal with identifier '${signalType.id.key()}' already exists`);\n }\n const signal = new SignalImpl(this.omu, signalType);\n this.signals.set(signalType.id, signal as Signal<unknown>);\n return signal;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options?: { serializer?: Serializable<T, D> }): Signal<T> {\n const type = SignalType.createJson<T>(this.omu.app.id.base, {\n name,\n serializer: options?.serializer,\n });\n return this.createSignal(type);\n }\n\n public serialized<T>(name: string, options: { serializer: Serializable<T, Uint8Array> }): Signal<T> {\n const type = SignalType.createSerialized<T>(this.omu.app.id.base, {\n name,\n serializer: options?.serializer,\n });\n return this.createSignal(type);\n }\n\n public get<T>(signalType: SignalType<T>): Signal<T> {\n const signal = this.signals.get(signalType.id);\n if (signal) {\n return signal as Signal<T>;\n }\n return this.createSignal(signalType);\n }\n}\n\nclass SignalImpl<T> implements Signal<T> {\n private readonly listeners: ((value: T) => void)[] = [];\n private listening = false;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: SignalType<T>,\n ) {\n omu.network.addPacketHandler(SIGNAL_NOTIFY_PACKET, (data) => this.handleBroadcast(data));\n omu.network.addTask(() => this.onTask());\n }\n\n public async notify(body: T): Promise<void> {\n const data = this.type.serializer.serialize(body);\n await this.omu.send(SIGNAL_NOTIFY_PACKET, {\n id: this.type.id,\n body: data,\n });\n for (const listener of this.listeners) {\n listener(body);\n }\n }\n\n public listen(handler: (value: T) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(SIGNAL_LISTEN_PACKET, this.type.id);\n });\n this.listening = true;\n }\n this.listeners.push(handler);\n return () => {\n const index = this.listeners.indexOf(handler);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n private handleBroadcast(data: SignalPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n const body = this.type.serializer.deserialize(data.body);\n for (const listener of this.listeners) {\n listener(body);\n }\n }\n\n private onTask(): void {\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(SIGNAL_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Identifier", "IdentifierMap", "PacketType", "ExtensionType", "SignalPacket", "SignalRegisterPacket", "SignalType", "SIGNAL_EXTENSION_TYPE", "omu", "SignalExtension", "SIGNAL_REGISTER_PACKET", "SIGNAL_LISTEN_PACKET", "SIGNAL_NOTIFY_PACKET", "signalType", "signal", "SignalImpl", "name", "options", "type", "data", "body", "listener", "handler", "index"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Identifier as
|
|
1
|
+
import{Identifier as o}from"../../identifier";import{Serializer as t}from"../../serialize";class s{constructor(i,e,n){this.id=i;this.serializer=e;this.permissions=n}static createJson(i,{name:e,serializer:n,permissions:r}){return new s(o.from(i).join(e),t.of(n??t.noop()).toJson(),r??{})}static createSerialized(i,{name:e,serializer:n,permissions:r}){return new s(o.from(i).join(e),n,r??{})}}export{s as SignalType};
|
|
2
2
|
//# sourceMappingURL=signal.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/signal/signal.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport interface SignalPermissionsJSON {\n all?: string;\n listen?: string;\n send?: string;\n}\n\nexport interface SignalPermissions {\n all?: IntoId | undefined;\n listen?: IntoId | undefined;\n send?: IntoId | undefined;\n}\n\nexport class SignalType<T> {\n constructor(\n public readonly id: Identifier,\n public readonly serializer: Serializable<T, Uint8Array>,\n public readonly permissions: SignalPermissions,\n ) {}\n\n static createJson<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer?: Serializable<T, any>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n Serializer.of<T, any>(serializer ?? Serializer.noop()).toJson(),\n permissions ?? {},\n );\n }\n\n static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer: Serializable<T, Uint8Array>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n serializer,\n permissions ?? {},\n );\n }\n}\n\nexport interface Signal<T> {\n listen(handler: (value: T) => void): Unlisten;\n notify(body: T): void
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport interface SignalPermissionsJSON {\n all?: string;\n listen?: string;\n send?: string;\n}\n\nexport interface SignalPermissions {\n all?: IntoId | undefined;\n listen?: IntoId | undefined;\n send?: IntoId | undefined;\n}\n\nexport class SignalType<T> {\n constructor(\n public readonly id: Identifier,\n public readonly serializer: Serializable<T, Uint8Array>,\n public readonly permissions: SignalPermissions,\n ) {}\n\n static createJson<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer?: Serializable<T, any>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n Serializer.of<T, any>(serializer ?? Serializer.noop()).toJson(),\n permissions ?? {},\n );\n }\n\n static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n serializer,\n permissions,\n }: {\n name: string;\n serializer: Serializable<T, Uint8Array>;\n permissions?: SignalPermissions;\n },\n ): SignalType<T> {\n return new SignalType(\n Identifier.from(identifier).join(name),\n serializer,\n permissions ?? {},\n );\n }\n}\n\nexport interface Signal<T> {\n readonly type: SignalType<T>;\n listen(handler: (value: T) => void): Unlisten;\n notify(body: T): Promise<void>;\n}\n"],
|
|
5
5
|
"mappings": "AACA,OAAS,cAAAA,MAA0B,mBAEnC,OAAS,cAAAC,MAAkB,kBAcpB,MAAMC,CAAc,CACvB,YACoBC,EACAC,EACAC,EAClB,CAHkB,QAAAF,EACA,gBAAAC,EACA,iBAAAC,CACjB,CAEH,OAAO,WACHC,EACA,CACI,KAAAC,EACA,WAAAH,EACA,YAAAC,CACJ,EAKa,CACb,OAAO,IAAIH,EACPF,EAAW,KAAKM,CAAU,EAAE,KAAKC,CAAI,EACrCN,EAAW,GAAWG,GAAcH,EAAW,KAAK,CAAC,EAAE,OAAO,EAC9DI,GAAe,CAAC,CACpB,CACJ,CAEA,OAAO,iBACHC,EACA,CACI,KAAAC,EACA,WAAAH,EACA,YAAAC,CACJ,EAKa,CACb,OAAO,IAAIH,EACPF,EAAW,KAAKM,CAAU,EAAE,KAAKC,CAAI,EACrCH,EACAC,GAAe,CAAC,CACpB,CACJ,CACJ",
|
|
6
6
|
"names": ["Identifier", "Serializer", "SignalType", "id", "serializer", "permissions", "identifier", "name"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventHub as
|
|
1
|
+
import{EventHub as M}from"../../event";import{Identifier as P,IdentifierMap as x}from"../../identifier";import{PacketType as o}from"../../network/packet/packet.js";import{Serializer as h}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as C}from"../extension.js";import{SetConfigPacket as L,SetPermissionPacket as N,TableFetchPacket as I,TableFetchRangePacket as O,TableItemsPacket as d,TableKeysPacket as m,TablePacket as T,TableProxyPacket as K}from"./packets.js";import{TableType as _}from"./table.js";const r=new C("table",p=>new U(p)),c=r.join("permission"),B=o.createSerialized(r,{name:"set_permission",serializer:N}),g=o.createSerialized(r,{name:"set_config",serializer:L}),S=o.createJson(r,{name:"listen",serializer:P}),k=o.createJson(r,{name:"proxy_listen",serializer:P}),u=o.createSerialized(r,{name:"proxy",serializer:K}),b=o.createSerialized(r,{name:"item_add",serializer:d}),f=o.createSerialized(r,{name:"item_update",serializer:d}),E=o.createSerialized(r,{name:"item_remove",serializer:d}),v=l.createSerialized(r,{name:"item_get",requestSerializer:m,responseSerializer:d,permissionId:c}),w=l.createSerialized(r,{name:"item_has",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),R=l.createSerialized(r,{name:"item_has_all",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_any",requestSerializer:m,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:I,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"fetch_all",requestSerializer:T,responseSerializer:d,permissionId:c}),H=l.createSerialized(r,{name:"size",requestSerializer:T,responseSerializer:h.json(),permissionId:c}),z=o.createSerialized(r,{name:"clear",serializer:T});class U{constructor(e){this.omu=e;e.network.registerPacket(B,g,S,k,u,b,f,E,z)}type=r;tableMap=new x;createTable(e){this.omu.permissions.require(c);const i=this.tableMap.get(e.id);if(i)return i;const t=new J(this.omu,e);return this.tableMap.set(e.id,t),t}json(e,i){const t=new _(this.omu.app.id.base.join(e),h.pipe(i.serializer??h.noop(),h.json()),i.key);return this.createTable(t)}serialized(e,i){const t=new _(this.omu.app.id.base.join(e),i.serializer,i.key);return this.createTable(t)}get(e){return this.has(e.id)?this.tableMap.get(e.id):this.createTable(e)}has(e){return this.tableMap.has(e)}}class J{constructor(e,i){this.omu=e;this.type=i;this.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(u,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,A])=>{const y=a(A);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(u,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.events.emit("add",s)}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.events.emit("update",s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.events.emit("remove",s),this.events.emit("cache",this.cache)}),e.network.addPacketHandler(z,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.events.emit("clear"),this.events.emit("cache",this.cache))}),e.on("ready",()=>this.onReady())}cache;events=new M;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;on(e,i){return this.events.on(e,i)}off(e,i){this.events.off(e,i)}updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.events.emit("cache",this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(S,this.id)}),this.listening=!0),e?this.events.on("cache",e):()=>{}}proxy(e){return this.proxies.length===0&&this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.proxies.push(e),()=>{const i=this.proxies.indexOf(e);i!==-1&&this.proxies.splice(i,1)}}onReady(){this.config&&this.omu.send(g,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(v,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(v,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);await this.omu.send(b,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);await this.omu.send(f,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),await this.omu.send(E,{id:this.id,items:i})}async clear(){await this.omu.send(z,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(w,{id:this.id,keys:[e]}))[e]??!1}async hasMany(...e){return await this.omu.endpoints.call(w,{id:this.id,keys:e})}async hasAll(...e){return await this.omu.endpoints.call(R,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(j,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){await this.omu.waitForReady();const s=await this.omu.endpoints.call(q,new I(this.id,e,i,t)),a=this.deserializeItems(s.items);return this.updateCache(a),a}async fetchRange({start:e,end:i}){const t=await this.omu.endpoints.call(D,{id:this.id,start:e,end:i}),s=this.deserializeItems(t.items);return this.updateCache(s),s}async fetchAll(){const e=await this.omu.endpoints.call(F,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values();const s=[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(H,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,U as TableExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/table/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventHub } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n const existing = this.tableMap.get(tableType.id);\n if (existing) {\n return existing as Table<T>;\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n private readonly events = new EventHub<TableEvents<T>>();\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: TableType<T>,\n ) {\n this.id = type.id;\n this.serializer = type.serializer;\n this.keyFunction = type.keyFunction;\n this.cache = new Map();\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('add', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('update', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.events.emit('remove', items);\n this.events.emit('cache', this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.events.emit('clear');\n this.events.emit('cache', this.cache);\n });\n omu.on('ready', () => this.onReady());\n }\n\n public on<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): Unlisten {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): void {\n this.events.off(event, listener);\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.events.emit('cache', this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.events.on('cache', listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n const index = this.proxies.indexOf(callback);\n if (index !== -1) {\n this.proxies.splice(index, 1);\n }\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n await this.omu.waitForReady();\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n const cursorItem = [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventHub } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n const existing = this.tableMap.get(tableType.id);\n if (existing) {\n return existing as Table<T>;\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n private readonly events = new EventHub<TableEvents<T>>();\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: TableType<T>,\n ) {\n this.id = type.id;\n this.serializer = type.serializer;\n this.keyFunction = type.keyFunction;\n this.cache = new Map();\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('add', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.events.emit('update', items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.events.emit('remove', items);\n this.events.emit('cache', this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.events.emit('clear');\n this.events.emit('cache', this.cache);\n });\n omu.on('ready', () => this.onReady());\n }\n\n public on<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): Unlisten {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): void {\n this.events.off(event, listener);\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.events.emit('cache', this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.events.on('cache', listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n const index = this.proxies.indexOf(callback);\n if (index !== -1) {\n this.proxies.splice(index, 1);\n }\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n await this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n await this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n await this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n await this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n await this.omu.waitForReady();\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n const cursorItem = [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["EventHub", "Identifier", "IdentifierMap", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SetConfigPacket", "SetPermissionPacket", "TableFetchPacket", "TableFetchRangePacket", "TableItemsPacket", "TableKeysPacket", "TablePacket", "TableProxyPacket", "TableType", "TABLE_EXTENSION_TYPE", "client", "TableExtension", "TABLE_PERMISSION_ID", "TABLE_SET_PERMISSION_PACKET", "TABLE_SET_CONFIG_PACKET", "TABLE_LISTEN_PACKET", "TABLE_PROXY_LISTEN_PACKET", "TABLE_PROXY_PACKET", "TABLE_ITEM_ADD_PACKET", "TABLE_ITEM_UPDATE_PACKET", "TABLE_ITEM_REMOVE_PACKET", "TABLE_ITEM_GET_ENDPOINT", "TABLE_ITEM_HAS_ENDPOINT", "TABLE_ITEM_HAS_ALL_ENDPOINT", "TABLE_ITEM_HAS_ANY_ENDPOINT", "TABLE_FETCH_ENDPOINT", "TABLE_FETCH_RANGE_ENDPOINT", "TABLE_FETCH_ALL_ENDPOINT", "TABLE_SIZE_ENDPOINT", "TABLE_ITEM_CLEAR_PACKET", "omu", "tableType", "existing", "table", "TableImpl", "name", "options", "type", "identifier", "packet", "items", "proxy", "key", "item", "proxyItem", "_", "event", "listener", "cache", "callback", "index", "promise", "res", "keys", "filteredKeys", "data", "limit", "backward", "cursor", "start", "end", "cursorItem", "size", "config", "permissions"]
|
|
7
7
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export * as network from './network';
|
|
|
6
6
|
export { Omu } from './omu.js';
|
|
7
7
|
export { Serializer } from './serialize';
|
|
8
8
|
export type { Serializable } from './serialize';
|
|
9
|
-
export { BrowserSession, type SessionParam, type SessioTokenProvider } from './token';
|
|
9
|
+
export { BrowserSession, type SessionParam, type SessionTokenProvider, type SessioTokenProvider, } from './token';
|
|
10
10
|
import { Identifier } from './identifier';
|
|
11
11
|
export declare const OmuPermissions: {
|
|
12
12
|
readonly ASSET_PERMISSION_ID: Identifier;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{AppIndexRegistry as
|
|
1
|
+
import{AppIndexRegistry as g}from"./api/server";import{App as v}from"./app.js";import{DisconnectReason as Y}from"./errors.js";import{Identifier as J,IdentifierMap as h,IdentifierSet as j}from"./identifier";import*as q from"./network";import{Omu as X}from"./omu.js";import{Serializer as $}from"./serialize";import{BrowserSession as SI}from"./token";import{ASSET_PERMISSION_ID as I}from"./api/asset";import{DASHBOARD_APP_INSTALL_PERMISSION_ID as S,DASHBOARD_DRAG_DROP_PERMISSION_ID as _,DASHBOARD_OPEN_APP_PERMISSION_ID as E,DASHBOARD_SET_PERMISSION_ID as e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as R,DASHBOARD_WEBVIEW_PERMISSION_ID as r}from"./api/dashboard";import{DASHBOARD_APP_CLOSE_PERMISSION_ID as D,DASHBOARD_APP_STARTUP_PERMISSION_ID as O}from"./api/dashboard/apps";import{HTTP_REQUEST_PERMISSION_ID as P}from"./api/http";import{I18N_GET_LOCALES_PERMISSION_ID as i,I18N_SET_LOCALES_PERMISSION_ID as o}from"./api/i18n";import{LOGGER_LOG_PERMISSION_ID as A}from"./api/logger";import{PLUGIN_MANAGE_PACKAGE_PERMISSION_ID as N,PLUGIN_READ_PACKAGE_PERMISSION_ID as n}from"./api/plugin";import{REGISTRY_PERMISSION_ID as t}from"./api/registry";import{SERVER_APPS_READ_PERMISSION_ID as d,SERVER_SHUTDOWN_PERMISSION_ID as M,TRUSTED_ORIGINS_GET_PERMISSION_ID as T,TRUSTED_ORIGINS_SET_PERMISSION_ID as f}from"./api/server";import{GENERATE_TOKEN_PERMISSION_ID as p,REMOTE_APP_REQUEST_PERMISSION_ID as a,SESSIONS_READ_PERMISSION_ID as m}from"./api/session";import{TABLE_PERMISSION_ID as y}from"./api/table";const Q={ASSET_PERMISSION_ID:I,DASHBOARD_APP_INSTALL_PERMISSION_ID:S,DASHBOARD_DRAG_DROP_PERMISSION_ID:_,DASHBOARD_OPEN_APP_PERMISSION_ID:E,DASHBOARD_SET_PERMISSION_ID:e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID:R,DASHBOARD_WEBVIEW_PERMISSION_ID:r,DASHBOARD_APP_STARTUP_PERMISSION_ID:O,DASHBOARD_APP_CLOSE_PERMISSION_ID:D,HTTP_REQUEST_PERMISSION_ID:P,I18N_GET_LOCALES_PERMISSION_ID:i,I18N_SET_LOCALES_PERMISSION_ID:o,LOGGER_LOG_PERMISSION_ID:A,PLUGIN_MANAGE_PACKAGE_PERMISSION_ID:N,PLUGIN_READ_PACKAGE_PERMISSION_ID:n,REGISTRY_PERMISSION_ID:t,SERVER_APPS_READ_PERMISSION_ID:d,SERVER_SHUTDOWN_PERMISSION_ID:M,TRUSTED_ORIGINS_GET_PERMISSION_ID:T,TRUSTED_ORIGINS_SET_PERMISSION_ID:f,GENERATE_TOKEN_PERMISSION_ID:p,REMOTE_APP_REQUEST_PERMISSION_ID:a,SESSIONS_READ_PERMISSION_ID:m,TABLE_PERMISSION_ID:y};export{v as App,g as AppIndexRegistry,SI as BrowserSession,Y as DisconnectReason,J as Identifier,h as IdentifierMap,j as IdentifierSet,X as Omu,Q as OmuPermissions,$ as Serializer,q as network};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { AppIndexRegistry, type AppIndexRegistryJSON } from './api/server';\nexport { App, type AppMetadata } from './app.js';\nexport { DisconnectReason } from './errors.js';\nexport { Identifier, IdentifierMap, IdentifierSet, type IntoId } from './identifier';\nexport * as network from './network';\nexport { Omu } from './omu.js';\nexport { Serializer } from './serialize';\nexport type { Serializable } from './serialize';\nexport {
|
|
5
|
-
"mappings": "AAAA,OAAS,oBAAAA,MAAmD,eAC5D,OAAS,OAAAC,MAA6B,WACtC,OAAS,oBAAAC,MAAwB,cACjC,OAAS,cAAAC,EAAY,iBAAAC,EAAe,iBAAAC,MAAkC,eACtE,UAAYC,MAAa,YACzB,OAAS,OAAAC,MAAW,WACpB,OAAS,cAAAC,MAAkB,cAE3B,
|
|
4
|
+
"sourcesContent": ["export { AppIndexRegistry, type AppIndexRegistryJSON } from './api/server';\nexport { App, type AppMetadata } from './app.js';\nexport { DisconnectReason } from './errors.js';\nexport { Identifier, IdentifierMap, IdentifierSet, type IntoId } from './identifier';\nexport * as network from './network';\nexport { Omu } from './omu.js';\nexport { Serializer } from './serialize';\nexport type { Serializable } from './serialize';\nexport {\n BrowserSession,\n type SessionParam,\n type SessionTokenProvider,\n type SessioTokenProvider,\n} from './token';\n\nimport { ASSET_PERMISSION_ID } from './api/asset';\nimport {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n} from './api/dashboard';\nimport { DASHBOARD_APP_CLOSE_PERMISSION_ID, DASHBOARD_APP_STARTUP_PERMISSION_ID } from './api/dashboard/apps';\nimport { HTTP_REQUEST_PERMISSION_ID } from './api/http';\nimport { I18N_GET_LOCALES_PERMISSION_ID, I18N_SET_LOCALES_PERMISSION_ID } from './api/i18n';\nimport { LOGGER_LOG_PERMISSION_ID } from './api/logger';\nimport { PLUGIN_MANAGE_PACKAGE_PERMISSION_ID, PLUGIN_READ_PACKAGE_PERMISSION_ID } from './api/plugin';\nimport { REGISTRY_PERMISSION_ID } from './api/registry';\nimport { SERVER_APPS_READ_PERMISSION_ID, SERVER_SHUTDOWN_PERMISSION_ID, TRUSTED_ORIGINS_GET_PERMISSION_ID, TRUSTED_ORIGINS_SET_PERMISSION_ID } from './api/server';\nimport { GENERATE_TOKEN_PERMISSION_ID, REMOTE_APP_REQUEST_PERMISSION_ID, SESSIONS_READ_PERMISSION_ID } from './api/session';\nimport { TABLE_PERMISSION_ID } from './api/table';\nimport { Identifier } from './identifier';\n\nexport const OmuPermissions: {\n // Asset API\n readonly ASSET_PERMISSION_ID: Identifier;\n // Dashboard API\n readonly DASHBOARD_APP_INSTALL_PERMISSION_ID: Identifier; readonly DASHBOARD_DRAG_DROP_PERMISSION_ID: Identifier; readonly DASHBOARD_OPEN_APP_PERMISSION_ID: Identifier; readonly DASHBOARD_SET_PERMISSION_ID: Identifier; readonly DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID: Identifier; readonly DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_STARTUP_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_CLOSE_PERMISSION_ID: Identifier;\n // HTTP API\n readonly HTTP_REQUEST_PERMISSION_ID: Identifier;\n // I18n API\n readonly I18N_GET_LOCALES_PERMISSION_ID: Identifier; readonly I18N_SET_LOCALES_PERMISSION_ID: Identifier;\n // Logger API\n readonly LOGGER_LOG_PERMISSION_ID: Identifier;\n // Plugin API\n readonly PLUGIN_MANAGE_PACKAGE_PERMISSION_ID: Identifier; readonly PLUGIN_READ_PACKAGE_PERMISSION_ID: Identifier;\n // Registry API\n readonly REGISTRY_PERMISSION_ID: Identifier;\n // Server API\n readonly SERVER_APPS_READ_PERMISSION_ID: Identifier; readonly SERVER_SHUTDOWN_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_GET_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_SET_PERMISSION_ID: Identifier;\n // Session API\n readonly GENERATE_TOKEN_PERMISSION_ID: Identifier; readonly REMOTE_APP_REQUEST_PERMISSION_ID: Identifier; readonly SESSIONS_READ_PERMISSION_ID: Identifier;\n // Table API\n readonly TABLE_PERMISSION_ID: Identifier;\n} = {\n // Asset API\n ASSET_PERMISSION_ID,\n // Dashboard API\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n DASHBOARD_APP_STARTUP_PERMISSION_ID,\n DASHBOARD_APP_CLOSE_PERMISSION_ID,\n // HTTP API\n HTTP_REQUEST_PERMISSION_ID,\n // I18n API\n I18N_GET_LOCALES_PERMISSION_ID,\n I18N_SET_LOCALES_PERMISSION_ID,\n // Logger API\n LOGGER_LOG_PERMISSION_ID,\n // Plugin API\n PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,\n PLUGIN_READ_PACKAGE_PERMISSION_ID,\n // Registry API\n REGISTRY_PERMISSION_ID,\n // Server API\n SERVER_APPS_READ_PERMISSION_ID,\n SERVER_SHUTDOWN_PERMISSION_ID,\n TRUSTED_ORIGINS_GET_PERMISSION_ID,\n TRUSTED_ORIGINS_SET_PERMISSION_ID,\n // Session API\n GENERATE_TOKEN_PERMISSION_ID,\n REMOTE_APP_REQUEST_PERMISSION_ID,\n SESSIONS_READ_PERMISSION_ID,\n // Table API\n TABLE_PERMISSION_ID,\n} as const;\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,oBAAAA,MAAmD,eAC5D,OAAS,OAAAC,MAA6B,WACtC,OAAS,oBAAAC,MAAwB,cACjC,OAAS,cAAAC,EAAY,iBAAAC,EAAe,iBAAAC,MAAkC,eACtE,UAAYC,MAAa,YACzB,OAAS,OAAAC,MAAW,WACpB,OAAS,cAAAC,MAAkB,cAE3B,OACI,kBAAAC,OAIG,UAEP,OAAS,uBAAAC,MAA2B,cACpC,OACI,uCAAAC,EACA,qCAAAC,EACA,oCAAAC,EACA,+BAAAC,EACA,8CAAAC,EACA,mCAAAC,MACG,kBACP,OAAS,qCAAAC,EAAmC,uCAAAC,MAA2C,uBACvF,OAAS,8BAAAC,MAAkC,aAC3C,OAAS,kCAAAC,EAAgC,kCAAAC,MAAsC,aAC/E,OAAS,4BAAAC,MAAgC,eACzC,OAAS,uCAAAC,EAAqC,qCAAAC,MAAyC,eACvF,OAAS,0BAAAC,MAA8B,iBACvC,OAAS,kCAAAC,EAAgC,iCAAAC,EAA+B,qCAAAC,EAAmC,qCAAAC,MAAyC,eACpJ,OAAS,gCAAAC,EAA8B,oCAAAC,EAAkC,+BAAAC,MAAmC,gBAC5G,OAAS,uBAAAC,MAA2B,cAG7B,MAAMC,EAuBT,CAEA,oBAAAxB,EAEA,oCAAAC,EACA,kCAAAC,EACA,iCAAAC,EACA,4BAAAC,EACA,2CAAAC,EACA,gCAAAC,EACA,oCAAAE,EACA,kCAAAD,EAEA,2BAAAE,EAEA,+BAAAC,EACA,+BAAAC,EAEA,yBAAAC,EAEA,oCAAAC,EACA,kCAAAC,EAEA,uBAAAC,EAEA,+BAAAC,EACA,8BAAAC,EACA,kCAAAC,EACA,kCAAAC,EAEA,6BAAAC,EACA,iCAAAC,EACA,4BAAAC,EAEA,oBAAAC,CACJ",
|
|
6
6
|
"names": ["AppIndexRegistry", "App", "DisconnectReason", "Identifier", "IdentifierMap", "IdentifierSet", "network", "Omu", "Serializer", "BrowserSession", "ASSET_PERMISSION_ID", "DASHBOARD_APP_INSTALL_PERMISSION_ID", "DASHBOARD_DRAG_DROP_PERMISSION_ID", "DASHBOARD_OPEN_APP_PERMISSION_ID", "DASHBOARD_SET_PERMISSION_ID", "DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_APP_CLOSE_PERMISSION_ID", "DASHBOARD_APP_STARTUP_PERMISSION_ID", "HTTP_REQUEST_PERMISSION_ID", "I18N_GET_LOCALES_PERMISSION_ID", "I18N_SET_LOCALES_PERMISSION_ID", "LOGGER_LOG_PERMISSION_ID", "PLUGIN_MANAGE_PACKAGE_PERMISSION_ID", "PLUGIN_READ_PACKAGE_PERMISSION_ID", "REGISTRY_PERMISSION_ID", "SERVER_APPS_READ_PERMISSION_ID", "SERVER_SHUTDOWN_PERMISSION_ID", "TRUSTED_ORIGINS_GET_PERMISSION_ID", "TRUSTED_ORIGINS_SET_PERMISSION_ID", "GENERATE_TOKEN_PERMISSION_ID", "REMOTE_APP_REQUEST_PERMISSION_ID", "SESSIONS_READ_PERMISSION_ID", "TABLE_PERMISSION_ID", "OmuPermissions"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Address } from '../address.js';
|
|
2
2
|
import { DisconnectReason } from '../errors.js';
|
|
3
3
|
import { Omu } from '../omu.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { SessionTokenProvider } from '../token.js';
|
|
5
5
|
import type { Connection, Transport } from './connection.js';
|
|
6
6
|
import { AES } from './encryption.js';
|
|
7
7
|
import type { Packet, PacketType } from './packet/packet.js';
|
|
@@ -40,7 +40,7 @@ export declare class Network {
|
|
|
40
40
|
private listenTask;
|
|
41
41
|
reason: DisconnectReason | undefined;
|
|
42
42
|
private attempt;
|
|
43
|
-
constructor(omu: Omu, address: Address, tokenProvider:
|
|
43
|
+
constructor(omu: Omu, address: Address, tokenProvider: SessionTokenProvider, transport: Transport, connection?: Connection | undefined, aes?: AES | undefined);
|
|
44
44
|
on<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): () => void;
|
|
45
45
|
off<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): void;
|
|
46
46
|
setConnection(connection: Connection): void;
|
package/dist/network/network.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{AnotherConnection as y,AppRemoved as l,DisconnectReason as v,InternalError as w,InvalidOrigin as k,InvalidPacket as p,InvalidToken as u,InvalidVersion as m,PermissionDenied as E,ServerRestart as f}from"../errors.js";import{EventEmitter as T,EventHub as P}from"../event";import{IdentifierMap as R}from"../identifier";import{VERSION as N}from"../version.js";import{PacketMapper as S}from"./connection.js";import{AES as A,Decryptor as C,ENCRYPTION_AVAILABLE as D,Encryptor as I}from"./encryption.js";import{ConnectPacket as b,DisconnectType as n,PACKET_TYPES as s}from"./packet/packet-types.js";class j{constructor(e,t,i,r,
|
|
1
|
+
import{AnotherConnection as y,AppRemoved as l,DisconnectReason as v,InternalError as w,InvalidOrigin as k,InvalidPacket as p,InvalidToken as u,InvalidVersion as m,PermissionDenied as E,ServerRestart as f}from"../errors.js";import{EventEmitter as T,EventHub as P}from"../event";import{IdentifierMap as R}from"../identifier";import{VERSION as N}from"../version.js";import{PacketMapper as S}from"./connection.js";import{AES as A,Decryptor as C,ENCRYPTION_AVAILABLE as D,Encryptor as I}from"./encryption.js";import{ConnectPacket as b,DisconnectType as n,PACKET_TYPES as s}from"./packet/packet-types.js";class j{constructor(e,t,i,r,o,c){this.omu=e;this.address=t;this.tokenProvider=i;this.transport=r;this.connection=o;this.aes=c;this.registerPacket(s.SERVER_META,s.CONNECT,s.DISCONNECT,s.TOKEN,s.READY,s.ENCRYPTED_PACKET),this.addPacketHandler(s.DISCONNECT,async a=>{if(a.type===n.SHUTDOWN||a.type===n.CLOSE){this.setStatus({type:"disconnected"});return}const h={[n.ANOTHER_CONNECTION]:y,[n.PERMISSION_DENIED]:E,[n.APP_REMOVED]:l,[n.INVALID_TOKEN]:u,[n.INVALID_ORIGIN]:k,[n.INVALID_VERSION]:m,[n.INTERNAL_ERROR]:w,[n.INVALID_PACKET]:p,[n.INVALID_PACKET_TYPE]:p,[n.INVALID_PACKET_DATA]:p,[n.SERVER_RESTART]:f,[n.CLOSE]:void 0,[n.SHUTDOWN]:void 0}[a.type];h&&(this.reason=new h(a.message??""))}),this.addPacketHandler(s.READY,()=>{if(this.status.type==="ready")throw new Error("Received READY packet when already ready");this.setStatus({type:"ready"}),this.attempt=0})}status={type:"disconnected"};events=new P;tasks=[];packetMapper=new S;packetHandlers=new R;listenTask=void 0;reason=void 0;attempt=0;on(e,t){return this.events.on(e,t)}off(e,t){this.events.off(e,t)}setConnection(e){if(this.status.type!=="disconnected")throw new Error("Cannot change connection while connected");this.connection=e}registerPacket(...e){this.packetMapper.register(...e);for(const t of e)this.packetHandlers.set(t.id,{type:t,event:new T})}addPacketHandler(e,t){const i=this.packetHandlers.get(e.id);if(!i)throw new Error(`Packet type ${e.id.key()} not registered`);i.event.listen(t)}async scheduleReconnect(e){const t=Math.min(3e4,2e3*(Math.pow(1.5,e)-1)+2e3),i=new Date;let r=!1;const o={type:"reconnecting",attempt:e,timeout:t,date:i,cancel:()=>{r=!0}};if(await this.setStatus(o),r)return!1;const c=o.timeout-(new Date().getTime()-i.getTime());return await new Promise(a=>setTimeout(a,c)),!0}async connect(e=!0){if(!this.isState("disconnected"))throw new Error(`Cannot connect while ${this.status.type}`);if(this.listenTask)throw new Error("Cannot connect while already connecting");for(this.attempt=0;this.omu.running;){this.attempt++;try{this.aes=void 0,this.connection=await this.transport.connect(),await this.setStatus({type:"connecting"});const i=await this.connection.receive(this.packetMapper);if(!i)throw new Error("Connection closed before receiving server meta");if(!s.SERVER_META.match(i))throw new Error("First packet received was not server meta");const{data:r}=i;this.address.hash=r.hash;let o=await this.tokenProvider.get(this.address,this.omu.app);if(!o)throw new u(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);let c;if(this.omu.app.type==="remote"&&D&&r.encryption){const a=await C.new(),d=await I.new(r.encryption.rsa);o&&(o=await d.encryptString(o)),this.aes=await A.new(),c={kind:"v1",rsa:await a.toRequest(),aes:await this.aes.serialize(d)}}this.connection.send({type:s.CONNECT,data:new b({app:this.omu.app,protocol:{version:N},encryption:c,token:o})},this.packetMapper),this.listenTask=this.listen(),await this.setStatus({type:"connected"}),await this.events.emit("connected"),this.dispatchTasks().then(()=>{this.send({type:s.READY,data:null})}),await this.listenTask}catch(i){if(i instanceof v&&(this.reason=i),!e)throw i}finally{this.events.emit("disconnected",this.reason),this.status.type!=="disconnected"&&this.status.type!=="reconnecting"&&this.setStatus({type:"disconnected",attempt:this.attempt,reason:this.reason}),this.connection?.close(),this.connection=void 0,this.listenTask=void 0}if(this.reason&&![n.SHUTDOWN,n.SERVER_RESTART].includes(this.reason.type)||(this.reason=void 0,!e)||!await this.scheduleReconnect(this.attempt))break}await this.setStatus({type:"disconnected",reason:this.reason}),this.connection?.close(),this.connection=void 0}isState(e){return this.status.type===e}async send(e){if(!this.connection)throw new Error("No connection established");if(this.aes){const t=this.packetMapper.serialize(e);e=await this.aes.encrypt(t)}this.connection.send(e,this.packetMapper)}async listen(){for(;this.connection;){const e=await this.connection.receive(this.packetMapper);if(!e)break;await this.dispatchPacket(e)}}async dispatchPacket(e){if(s.ENCRYPTED_PACKET.match(e)){if(!this.aes)throw new Error("Received encrypted packet before encryption was established");const i=await this.aes.decrypt(e);e=this.packetMapper.deserialize(i)}await this.events.emit("packet",e);const t=this.packetHandlers.get(e.type.id);t&&await t.event.emit(e.data)}addTask(e){this.tasks.push(e)}removeTask(e){const t=this.tasks.indexOf(e);t!==-1&&this.tasks.splice(t,1)}async dispatchTasks(){for(const e of this.tasks)await e()}async setStatus(e){if(this.status===e)throw new Error(`Cannot set status to ${e} when already ${e}`);this.status=e,await this.events.emit("status",e)}close(){this.setStatus({type:"disconnected"}),this.attempt=0,this.connection?.close(),this.connection=void 0}}export{j as Network};
|
|
2
2
|
//# sourceMappingURL=network.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/network/network.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Address } from '../address.js';\nimport {\n AnotherConnection, AppRemoved, DisconnectReason, InternalError,\n InvalidOrigin,\n InvalidPacket,\n InvalidToken,\n InvalidVersion,\n PermissionDenied,\n ServerRestart,\n} from '../errors.js';\nimport { EventEmitter, EventHub } from '../event';\nimport { IdentifierMap } from '../identifier';\nimport { Omu } from '../omu.js';\nimport type { SessioTokenProvider } from '../token.js';\nimport { VERSION } from '../version.js';\n\nimport type { Connection, Transport } from './connection.js';\nimport { PacketMapper } from './connection.js';\nimport { AES, Decryptor, ENCRYPTION_AVAILABLE, EncryptionResponse, Encryptor } from './encryption.js';\nimport { ConnectPacket, DisconnectType, PACKET_TYPES } from './packet/packet-types.js';\nimport type { Packet, PacketType } from './packet/packet.js';\n\ntype PacketHandler<T> = {\n readonly type: PacketType<T>;\n event: EventEmitter<[T]>;\n};\n\ntype StatusType<T> = {\n type: T;\n};\n\nexport type NetworkStatus = StatusType<'connecting'> | StatusType<'connected'> | StatusType<'ready'> | {\n type: 'disconnected';\n attempt?: number;\n reason?: DisconnectReason;\n} | {\n type: 'reconnecting';\n attempt: number;\n timeout: number;\n date: Date;\n cancel: () => void;\n};\n\ntype NetworkEvents = {\n connected: [];\n disconnected: [DisconnectReason | undefined];\n packet: [Packet<unknown>];\n status: [NetworkStatus];\n};\n\nexport class Network {\n public status: NetworkStatus = { type: 'disconnected' };\n private readonly events = new EventHub<NetworkEvents>();\n private readonly tasks: Array<() => Promise<void> | void> = [];\n private readonly packetMapper = new PacketMapper();\n private readonly packetHandlers = new IdentifierMap<PacketHandler<unknown>>();\n private listenTask: Promise<void> | undefined = undefined;\n public reason: DisconnectReason | undefined = undefined;\n private attempt = 0;\n\n constructor(\n private readonly omu: Omu,\n public address: Address,\n private readonly tokenProvider: SessioTokenProvider,\n private transport: Transport,\n private connection?: Connection | undefined,\n private aes?: AES | undefined,\n ) {\n this.registerPacket(\n PACKET_TYPES.SERVER_META,\n PACKET_TYPES.CONNECT,\n PACKET_TYPES.DISCONNECT,\n PACKET_TYPES.TOKEN,\n PACKET_TYPES.READY,\n PACKET_TYPES.ENCRYPTED_PACKET,\n );\n this.addPacketHandler(PACKET_TYPES.DISCONNECT, async (reason) => {\n if (reason.type === DisconnectType.SHUTDOWN\n || reason.type === DisconnectType.CLOSE) {\n this.setStatus({ type: 'disconnected' });\n return;\n }\n const ERROR_MAP = {\n [DisconnectType.ANOTHER_CONNECTION]: AnotherConnection,\n [DisconnectType.PERMISSION_DENIED]: PermissionDenied,\n [DisconnectType.APP_REMOVED]: AppRemoved,\n [DisconnectType.INVALID_TOKEN]: InvalidToken,\n [DisconnectType.INVALID_ORIGIN]: InvalidOrigin,\n [DisconnectType.INVALID_VERSION]: InvalidVersion,\n [DisconnectType.INTERNAL_ERROR]: InternalError,\n [DisconnectType.INVALID_PACKET]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_TYPE]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_DATA]: InvalidPacket,\n [DisconnectType.SERVER_RESTART]: ServerRestart,\n [DisconnectType.CLOSE]: undefined,\n [DisconnectType.SHUTDOWN]: undefined,\n };\n const error = ERROR_MAP[reason.type];\n if (error) {\n this.reason = new error(reason.message ?? '');\n }\n });\n this.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.status.type === 'ready') {\n throw new Error('Received READY packet when already ready');\n }\n this.setStatus({ type: 'ready' });\n this.attempt = 0;\n });\n }\n\n public on<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): () => void {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): void {\n this.events.off(event, listener);\n }\n\n public setConnection(connection: Connection): void {\n if (this.status.type !== 'disconnected') {\n throw new Error('Cannot change connection while connected');\n }\n this.connection = connection;\n }\n\n public registerPacket(...packetTypes: PacketType<unknown>[]): void {\n this.packetMapper.register(...packetTypes);\n for (const type of packetTypes) {\n this.packetHandlers.set(type.id, {\n type,\n event: new EventEmitter(),\n });\n }\n }\n\n public addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void {\n const listeners = this.packetHandlers.get(type.id) as PacketHandler<unknown> | undefined;\n if (!listeners) {\n throw new Error(`Packet type ${type.id.key()} not registered`);\n }\n listeners.event.listen(handler as (packet: unknown) => void);\n }\n\n private async scheduleReconnect(attempt: number): Promise<boolean> {\n const timeout = Math.min(30000, 2000 * (Math.pow(1.5, attempt) - 1) + 2000);\n const date = new Date();\n let cancelled = false;\n const status: Extract<NetworkStatus, { type: 'reconnecting' }> = {\n type: 'reconnecting',\n attempt,\n timeout,\n date,\n cancel: () => {cancelled = true;},\n };\n await this.setStatus(status);\n if (cancelled) {\n return false;\n }\n const remaining = status.timeout - (new Date().getTime() - date.getTime());\n await new Promise((resolve) => setTimeout(resolve, remaining));\n return true;\n }\n\n public async connect(reconnect = true): Promise<void> {\n if (!this.isState('disconnected')) {\n throw new Error(`Cannot connect while ${this.status.type}`);\n }\n if (this.listenTask) {\n throw new Error('Cannot connect while already connecting');\n }\n\n this.attempt = 0;\n while (this.omu.running) {\n this.attempt++;\n try {\n this.aes = undefined;\n this.connection = await this.transport.connect();\n await this.setStatus({ type: 'connecting' });\n const metaReceived = await this.connection.receive(this.packetMapper);\n if (!metaReceived) {\n throw new Error('Connection closed before receiving server meta');\n }\n if (!PACKET_TYPES.SERVER_META.match(metaReceived)) {\n throw new Error('First packet received was not server meta');\n }\n const { data: meta } = metaReceived;\n this.address.hash = meta.hash;\n let token = await this.tokenProvider.get(this.address, this.omu.app);\n if (!token) {\n throw new InvalidToken(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);\n }\n let encryptionResp: EncryptionResponse | undefined = undefined;\n if (this.omu.app.type === 'remote' && ENCRYPTION_AVAILABLE && meta.encryption) {\n const decryptor = await Decryptor.new();\n const encryptor = await Encryptor.new(meta.encryption.rsa);\n if (token) {\n token = await encryptor.encryptString(token);\n }\n this.aes = await AES.new();\n encryptionResp = {\n kind: 'v1',\n rsa: await decryptor.toRequest(),\n aes: await this.aes.serialize(encryptor),\n };\n }\n this.connection.send({\n type: PACKET_TYPES.CONNECT,\n data: new ConnectPacket({\n app: this.omu.app,\n protocol: { version: VERSION },\n encryption: encryptionResp,\n token,\n }),\n }, this.packetMapper);\n this.listenTask = this.listen();\n await this.setStatus({ type: 'connected' });\n await this.events.emit('connected');\n this.dispatchTasks().then(() => {\n this.send({\n type: PACKET_TYPES.READY,\n data: null,\n });\n });\n await this.listenTask;\n } catch (error) {\n if (error instanceof DisconnectReason) {\n this.reason = error;\n }\n if (!reconnect) {\n throw error;\n }\n } finally {\n this.events.emit('disconnected', this.reason);\n if (this.status.type !== 'disconnected' && this.status.type !== 'reconnecting') {\n this.setStatus({ type: 'disconnected', attempt: this.attempt, reason: this.reason });\n }\n this.connection?.close();\n this.connection = undefined;\n this.listenTask = undefined;\n }\n if (this.reason && ![\n DisconnectType.SHUTDOWN,\n DisconnectType.SERVER_RESTART,\n ].includes(this.reason.type)) {\n break;\n }\n this.reason = undefined;\n if (!reconnect) {\n break;\n }\n const shouldReconnect = await this.scheduleReconnect(this.attempt);\n if (!shouldReconnect) {\n break;\n }\n }\n await this.setStatus({ type: 'disconnected', reason: this.reason });\n this.connection?.close();\n this.connection = undefined;\n }\n\n private isState(state: NetworkStatus['type']): boolean {\n return this.status.type === state;\n }\n\n public async send(packet: Packet): Promise<void> {\n if (!this.connection) {\n throw new Error('No connection established');\n }\n if (this.aes) {\n const serialized = this.packetMapper.serialize(packet);\n packet = await this.aes.encrypt(serialized);\n }\n this.connection.send(packet, this.packetMapper);\n }\n\n private async listen(): Promise<void> {\n while (this.connection) {\n const packet = await this.connection.receive(this.packetMapper);\n if (!packet) {\n break;\n }\n await this.dispatchPacket(packet);\n }\n }\n\n private async dispatchPacket(packet: Packet): Promise<void> {\n if (PACKET_TYPES.ENCRYPTED_PACKET.match(packet)) {\n if (!this.aes) {\n throw new Error('Received encrypted packet before encryption was established');\n }\n const decrypted = await this.aes.decrypt(packet);\n packet = this.packetMapper.deserialize(decrypted);\n }\n await this.events.emit('packet', packet);\n const packetHandler = this.packetHandlers.get(packet.type.id);\n if (!packetHandler) {\n return;\n }\n await packetHandler.event.emit(packet.data);\n }\n\n public addTask(task: () => Promise<void> | void): void {\n this.tasks.push(task);\n }\n\n public removeTask(task: () => Promise<void> | void): void {\n const index = this.tasks.indexOf(task);\n if (index !== -1) {\n this.tasks.splice(index, 1);\n }\n }\n\n private async dispatchTasks(): Promise<void> {\n for (const task of this.tasks) {\n await task();\n }\n }\n\n private async setStatus(status: NetworkStatus): Promise<void> {\n if (this.status === status) {\n throw new Error(`Cannot set status to ${status} when already ${status}`);\n }\n this.status = status;\n await this.events.emit('status', status);\n }\n\n public close(): void {\n this.setStatus({ type: 'disconnected' });\n this.attempt = 0;\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { Address } from '../address.js';\nimport {\n AnotherConnection, AppRemoved, DisconnectReason, InternalError,\n InvalidOrigin,\n InvalidPacket,\n InvalidToken,\n InvalidVersion,\n PermissionDenied,\n ServerRestart,\n} from '../errors.js';\nimport { EventEmitter, EventHub } from '../event';\nimport { IdentifierMap } from '../identifier';\nimport { Omu } from '../omu.js';\nimport type { SessionTokenProvider } from '../token.js';\nimport { VERSION } from '../version.js';\n\nimport type { Connection, Transport } from './connection.js';\nimport { PacketMapper } from './connection.js';\nimport { AES, Decryptor, ENCRYPTION_AVAILABLE, EncryptionResponse, Encryptor } from './encryption.js';\nimport { ConnectPacket, DisconnectType, PACKET_TYPES } from './packet/packet-types.js';\nimport type { Packet, PacketType } from './packet/packet.js';\n\ntype PacketHandler<T> = {\n readonly type: PacketType<T>;\n event: EventEmitter<[T]>;\n};\n\ntype StatusType<T> = {\n type: T;\n};\n\nexport type NetworkStatus = StatusType<'connecting'> | StatusType<'connected'> | StatusType<'ready'> | {\n type: 'disconnected';\n attempt?: number;\n reason?: DisconnectReason;\n} | {\n type: 'reconnecting';\n attempt: number;\n timeout: number;\n date: Date;\n cancel: () => void;\n};\n\ntype NetworkEvents = {\n connected: [];\n disconnected: [DisconnectReason | undefined];\n packet: [Packet<unknown>];\n status: [NetworkStatus];\n};\n\nexport class Network {\n public status: NetworkStatus = { type: 'disconnected' };\n private readonly events = new EventHub<NetworkEvents>();\n private readonly tasks: Array<() => Promise<void> | void> = [];\n private readonly packetMapper = new PacketMapper();\n private readonly packetHandlers = new IdentifierMap<PacketHandler<unknown>>();\n private listenTask: Promise<void> | undefined = undefined;\n public reason: DisconnectReason | undefined = undefined;\n private attempt = 0;\n\n constructor(\n private readonly omu: Omu,\n public address: Address,\n private readonly tokenProvider: SessionTokenProvider,\n private transport: Transport,\n private connection?: Connection | undefined,\n private aes?: AES | undefined,\n ) {\n this.registerPacket(\n PACKET_TYPES.SERVER_META,\n PACKET_TYPES.CONNECT,\n PACKET_TYPES.DISCONNECT,\n PACKET_TYPES.TOKEN,\n PACKET_TYPES.READY,\n PACKET_TYPES.ENCRYPTED_PACKET,\n );\n this.addPacketHandler(PACKET_TYPES.DISCONNECT, async (reason) => {\n if (reason.type === DisconnectType.SHUTDOWN\n || reason.type === DisconnectType.CLOSE) {\n this.setStatus({ type: 'disconnected' });\n return;\n }\n const ERROR_MAP = {\n [DisconnectType.ANOTHER_CONNECTION]: AnotherConnection,\n [DisconnectType.PERMISSION_DENIED]: PermissionDenied,\n [DisconnectType.APP_REMOVED]: AppRemoved,\n [DisconnectType.INVALID_TOKEN]: InvalidToken,\n [DisconnectType.INVALID_ORIGIN]: InvalidOrigin,\n [DisconnectType.INVALID_VERSION]: InvalidVersion,\n [DisconnectType.INTERNAL_ERROR]: InternalError,\n [DisconnectType.INVALID_PACKET]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_TYPE]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_DATA]: InvalidPacket,\n [DisconnectType.SERVER_RESTART]: ServerRestart,\n [DisconnectType.CLOSE]: undefined,\n [DisconnectType.SHUTDOWN]: undefined,\n };\n const error = ERROR_MAP[reason.type];\n if (error) {\n this.reason = new error(reason.message ?? '');\n }\n });\n this.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.status.type === 'ready') {\n throw new Error('Received READY packet when already ready');\n }\n this.setStatus({ type: 'ready' });\n this.attempt = 0;\n });\n }\n\n public on<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): () => void {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): void {\n this.events.off(event, listener);\n }\n\n public setConnection(connection: Connection): void {\n if (this.status.type !== 'disconnected') {\n throw new Error('Cannot change connection while connected');\n }\n this.connection = connection;\n }\n\n public registerPacket(...packetTypes: PacketType<unknown>[]): void {\n this.packetMapper.register(...packetTypes);\n for (const type of packetTypes) {\n this.packetHandlers.set(type.id, {\n type,\n event: new EventEmitter(),\n });\n }\n }\n\n public addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void {\n const listeners = this.packetHandlers.get(type.id) as PacketHandler<unknown> | undefined;\n if (!listeners) {\n throw new Error(`Packet type ${type.id.key()} not registered`);\n }\n listeners.event.listen(handler as (packet: unknown) => void);\n }\n\n private async scheduleReconnect(attempt: number): Promise<boolean> {\n const timeout = Math.min(30000, 2000 * (Math.pow(1.5, attempt) - 1) + 2000);\n const date = new Date();\n let cancelled = false;\n const status: Extract<NetworkStatus, { type: 'reconnecting' }> = {\n type: 'reconnecting',\n attempt,\n timeout,\n date,\n cancel: () => {cancelled = true;},\n };\n await this.setStatus(status);\n if (cancelled) {\n return false;\n }\n const remaining = status.timeout - (new Date().getTime() - date.getTime());\n await new Promise((resolve) => setTimeout(resolve, remaining));\n return true;\n }\n\n public async connect(reconnect = true): Promise<void> {\n if (!this.isState('disconnected')) {\n throw new Error(`Cannot connect while ${this.status.type}`);\n }\n if (this.listenTask) {\n throw new Error('Cannot connect while already connecting');\n }\n\n this.attempt = 0;\n while (this.omu.running) {\n this.attempt++;\n try {\n this.aes = undefined;\n this.connection = await this.transport.connect();\n await this.setStatus({ type: 'connecting' });\n const metaReceived = await this.connection.receive(this.packetMapper);\n if (!metaReceived) {\n throw new Error('Connection closed before receiving server meta');\n }\n if (!PACKET_TYPES.SERVER_META.match(metaReceived)) {\n throw new Error('First packet received was not server meta');\n }\n const { data: meta } = metaReceived;\n this.address.hash = meta.hash;\n let token = await this.tokenProvider.get(this.address, this.omu.app);\n if (!token) {\n throw new InvalidToken(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);\n }\n let encryptionResp: EncryptionResponse | undefined = undefined;\n if (this.omu.app.type === 'remote' && ENCRYPTION_AVAILABLE && meta.encryption) {\n const decryptor = await Decryptor.new();\n const encryptor = await Encryptor.new(meta.encryption.rsa);\n if (token) {\n token = await encryptor.encryptString(token);\n }\n this.aes = await AES.new();\n encryptionResp = {\n kind: 'v1',\n rsa: await decryptor.toRequest(),\n aes: await this.aes.serialize(encryptor),\n };\n }\n this.connection.send({\n type: PACKET_TYPES.CONNECT,\n data: new ConnectPacket({\n app: this.omu.app,\n protocol: { version: VERSION },\n encryption: encryptionResp,\n token,\n }),\n }, this.packetMapper);\n this.listenTask = this.listen();\n await this.setStatus({ type: 'connected' });\n await this.events.emit('connected');\n this.dispatchTasks().then(() => {\n this.send({\n type: PACKET_TYPES.READY,\n data: null,\n });\n });\n await this.listenTask;\n } catch (error) {\n if (error instanceof DisconnectReason) {\n this.reason = error;\n }\n if (!reconnect) {\n throw error;\n }\n } finally {\n this.events.emit('disconnected', this.reason);\n if (this.status.type !== 'disconnected' && this.status.type !== 'reconnecting') {\n this.setStatus({ type: 'disconnected', attempt: this.attempt, reason: this.reason });\n }\n this.connection?.close();\n this.connection = undefined;\n this.listenTask = undefined;\n }\n if (this.reason && ![\n DisconnectType.SHUTDOWN,\n DisconnectType.SERVER_RESTART,\n ].includes(this.reason.type)) {\n break;\n }\n this.reason = undefined;\n if (!reconnect) {\n break;\n }\n const shouldReconnect = await this.scheduleReconnect(this.attempt);\n if (!shouldReconnect) {\n break;\n }\n }\n await this.setStatus({ type: 'disconnected', reason: this.reason });\n this.connection?.close();\n this.connection = undefined;\n }\n\n private isState(state: NetworkStatus['type']): boolean {\n return this.status.type === state;\n }\n\n public async send(packet: Packet): Promise<void> {\n if (!this.connection) {\n throw new Error('No connection established');\n }\n if (this.aes) {\n const serialized = this.packetMapper.serialize(packet);\n packet = await this.aes.encrypt(serialized);\n }\n this.connection.send(packet, this.packetMapper);\n }\n\n private async listen(): Promise<void> {\n while (this.connection) {\n const packet = await this.connection.receive(this.packetMapper);\n if (!packet) {\n break;\n }\n await this.dispatchPacket(packet);\n }\n }\n\n private async dispatchPacket(packet: Packet): Promise<void> {\n if (PACKET_TYPES.ENCRYPTED_PACKET.match(packet)) {\n if (!this.aes) {\n throw new Error('Received encrypted packet before encryption was established');\n }\n const decrypted = await this.aes.decrypt(packet);\n packet = this.packetMapper.deserialize(decrypted);\n }\n await this.events.emit('packet', packet);\n const packetHandler = this.packetHandlers.get(packet.type.id);\n if (!packetHandler) {\n return;\n }\n await packetHandler.event.emit(packet.data);\n }\n\n public addTask(task: () => Promise<void> | void): void {\n this.tasks.push(task);\n }\n\n public removeTask(task: () => Promise<void> | void): void {\n const index = this.tasks.indexOf(task);\n if (index !== -1) {\n this.tasks.splice(index, 1);\n }\n }\n\n private async dispatchTasks(): Promise<void> {\n for (const task of this.tasks) {\n await task();\n }\n }\n\n private async setStatus(status: NetworkStatus): Promise<void> {\n if (this.status === status) {\n throw new Error(`Cannot set status to ${status} when already ${status}`);\n }\n this.status = status;\n await this.events.emit('status', status);\n }\n\n public close(): void {\n void this.setStatus({ type: 'disconnected' });\n this.attempt = 0;\n this.connection?.close();\n this.connection = undefined;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["AnotherConnection", "AppRemoved", "DisconnectReason", "InternalError", "InvalidOrigin", "InvalidPacket", "InvalidToken", "InvalidVersion", "PermissionDenied", "ServerRestart", "EventEmitter", "EventHub", "IdentifierMap", "VERSION", "PacketMapper", "AES", "Decryptor", "ENCRYPTION_AVAILABLE", "Encryptor", "ConnectPacket", "DisconnectType", "PACKET_TYPES", "Network", "omu", "address", "tokenProvider", "transport", "connection", "aes", "reason", "error", "event", "listener", "packetTypes", "type", "handler", "listeners", "attempt", "timeout", "date", "cancelled", "status", "remaining", "resolve", "reconnect", "metaReceived", "meta", "token", "encryptionResp", "decryptor", "encryptor", "state", "packet", "serialized", "decrypted", "packetHandler", "task", "index"]
|
|
7
7
|
}
|
package/dist/omu.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type { Address, Connection } from './network';
|
|
|
18
18
|
import { Network } from './network';
|
|
19
19
|
import { Transport } from './network/connection.js';
|
|
20
20
|
import type { PacketType } from './network/packet/packet.js';
|
|
21
|
-
import { type
|
|
21
|
+
import { type SessionTokenProvider } from './token.js';
|
|
22
22
|
export type ClientEvents = {
|
|
23
23
|
started: [];
|
|
24
24
|
stopped: [];
|
|
@@ -29,7 +29,7 @@ export declare class Omu {
|
|
|
29
29
|
ready: boolean;
|
|
30
30
|
running: boolean;
|
|
31
31
|
private readonly events;
|
|
32
|
-
readonly token:
|
|
32
|
+
readonly token: SessionTokenProvider;
|
|
33
33
|
readonly address: Address;
|
|
34
34
|
readonly sessions: SessionExtension;
|
|
35
35
|
readonly network: Network;
|
|
@@ -48,11 +48,11 @@ export declare class Omu {
|
|
|
48
48
|
readonly http: HttpExtension;
|
|
49
49
|
constructor(app: App, options?: {
|
|
50
50
|
address?: Address;
|
|
51
|
-
token?:
|
|
51
|
+
token?: SessionTokenProvider | string;
|
|
52
52
|
transport?: Transport;
|
|
53
53
|
connection?: Connection;
|
|
54
54
|
});
|
|
55
|
-
send<T>(packetType: PacketType<T>, data: T): void
|
|
55
|
+
send<T>(packetType: PacketType<T>, data: T): Promise<void>;
|
|
56
56
|
start(): Promise<void>;
|
|
57
57
|
stop(): void;
|
|
58
58
|
on<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): Unlisten;
|
package/dist/omu.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ExtensionRegistry as
|
|
1
|
+
import{ExtensionRegistry as r}from"./api";import{ASSET_EXTENSION_TYPE as o}from"./api/asset/extension";import{DASHBOARD_EXTENSION_TYPE as a}from"./api/dashboard/extension";import{ENDPOINT_EXTENSION_TYPE as d}from"./api/endpoint/extension";import{HTTP_EXTENSION_TYPE as p}from"./api/http/extension";import{I18N_EXTENSION_TYPE as E}from"./api/i18n/extension";import{LOGGER_EXTENSION_TYPE as l}from"./api/logger/extension.js";import{PERMISSION_EXTENSION_TYPE as h}from"./api/permission/extension";import{PLUGIN_EXTENSION_TYPE as y}from"./api/plugin/extension";import{REGISTRY_EXTENSION_TYPE as m}from"./api/registry/extension";import{SERVER_EXTENSION_TYPE as f}from"./api/server/extension";import{SESSION_EXTENSION_TYPE as g}from"./api/session";import{SIGNAL_EXTENSION_TYPE as x}from"./api/signal/extension";import{TABLE_EXTENSION_TYPE as T}from"./api/table/extension";import{EventHub as c}from"./event";import{Network as v}from"./network";import{PACKET_TYPES as u}from"./network/packet/packet-types.js";import{WebsocketTransport as S}from"./network/websocket-transport";import{BrowserSession as N}from"./token.js";class q{constructor(t,e){this.app=t;if(this.ready=!1,this.running=!1,typeof e?.token=="string"){const s=e?.token;this.token={get:()=>Promise.resolve(s)}}else this.token=e?.token??new N;this.address=e?.address??{host:"127.0.0.1",port:26423,secure:!1},this.network=new v(this,this.address,this.token,e?.transport??new S(this.address),e?.connection),this.network.on("disconnected",()=>{this.ready=!1}),this.network.addPacketHandler(u.READY,()=>{if(this.ready)throw new Error("Received READY packet when already ready");this.ready=!0,this.events.emit("ready")}),this.extensions=new r(this),this.endpoints=this.extensions.register(d),this.plugins=this.extensions.register(y),this.permissions=this.extensions.register(h),this.tables=this.extensions.register(T),this.sessions=this.extensions.register(g),this.registries=this.extensions.register(m),this.dashboard=this.extensions.register(a),this.signals=this.extensions.register(x),this.assets=this.extensions.register(o),this.i18n=this.extensions.register(E),this.server=this.extensions.register(f),this.logger=this.extensions.register(l),this.http=this.extensions.register(p)}ready;running;events=new c;token;address;sessions;network;endpoints;permissions;plugins;dashboard;extensions;tables;registries;signals;assets;i18n;server;logger;http;send(t,e){return this.network.send({type:t,data:e})}async start(){if(this.running)throw new Error("Client already running");this.running=!0;const t=this.network.connect();this.events.emit("started");try{await t}finally{this.running=!1,this.ready=!1}}stop(){this.running=!1,this.ready=!1,this.network.close(),this.events.emit("stopped")}on(t,e){return this.events.on(t,e)}off(t,e){this.events.off(t,e)}emit(t,...e){this.events.emit(t,...e)}onReady(t){return this.ready&&t(),this.events.on("ready",t)}async waitForReady(){if(!this.ready){if(!this.running)throw new Error("Cannot wait for ready before the client has started");return new Promise((t,e)=>{const s=()=>{n(),i()},n=this.events.on("ready",()=>{s(),t()}),i=this.events.on("stopped",()=>{s(),e(new Error("Client stopped before becoming ready"))})})}}}export{q as Omu};
|
|
2
2
|
//# sourceMappingURL=omu.js.map
|
package/dist/omu.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/omu.ts"],
|
|
4
|
-
"sourcesContent": ["import { ExtensionRegistry } from './api';\nimport { ASSET_EXTENSION_TYPE, type AssetExtension } from './api/asset/extension';\nimport { DASHBOARD_EXTENSION_TYPE, type DashboardExtension } from './api/dashboard/extension';\nimport { ENDPOINT_EXTENSION_TYPE, type EndpointExtension } from './api/endpoint/extension';\nimport { HTTP_EXTENSION_TYPE, HttpExtension } from './api/http/extension';\nimport { I18N_EXTENSION_TYPE, type I18nExtension } from './api/i18n/extension';\nimport { LOGGER_EXTENSION_TYPE, type LoggerExtension } from './api/logger/extension.js';\nimport { PERMISSION_EXTENSION_TYPE, type PermissionExtension } from './api/permission/extension';\nimport { PLUGIN_EXTENSION_TYPE, type PluginExtension } from './api/plugin/extension';\nimport { REGISTRY_EXTENSION_TYPE, type RegistryExtension } from './api/registry/extension';\nimport { SERVER_EXTENSION_TYPE, type ServerExtension } from './api/server/extension';\nimport { SESSION_EXTENSION_TYPE, SessionExtension } from './api/session';\nimport { SIGNAL_EXTENSION_TYPE, type SignalExtension } from './api/signal/extension';\nimport { TABLE_EXTENSION_TYPE, type TableExtension } from './api/table/extension';\nimport type { App } from './app.js';\nimport type { Unlisten } from './event';\nimport { EventHub } from './event';\nimport type { Address, Connection } from './network';\nimport { Network } from './network';\nimport { Transport } from './network/connection.js';\nimport { PACKET_TYPES } from './network/packet/packet-types.js';\nimport type { PacketType } from './network/packet/packet.js';\nimport { WebsocketTransport } from './network/websocket-transport';\nimport { BrowserSession, type
|
|
5
|
-
"mappings": "AAAA,OAAS,qBAAAA,MAAyB,QAClC,OAAS,wBAAAC,MAAiD,wBAC1D,OAAS,4BAAAC,MAAyD,4BAClE,OAAS,2BAAAC,MAAuD,2BAChE,OAAS,uBAAAC,MAA0C,uBACnD,OAAS,uBAAAC,MAA+C,uBACxD,OAAS,yBAAAC,MAAmD,4BAC5D,OAAS,6BAAAC,MAA2D,6BACpE,OAAS,yBAAAC,MAAmD,yBAC5D,OAAS,2BAAAC,MAAuD,2BAChE,OAAS,yBAAAC,MAAmD,yBAC5D,OAAS,0BAAAC,MAAgD,gBACzD,OAAS,yBAAAC,MAAmD,yBAC5D,OAAS,wBAAAC,MAAiD,wBAG1D,OAAS,YAAAC,MAAgB,UAEzB,OAAS,WAAAC,MAAe,YAExB,OAAS,gBAAAC,MAAoB,mCAE7B,OAAS,sBAAAC,MAA0B,gCACnC,OAAS,kBAAAC,
|
|
6
|
-
"names": ["ExtensionRegistry", "ASSET_EXTENSION_TYPE", "DASHBOARD_EXTENSION_TYPE", "ENDPOINT_EXTENSION_TYPE", "HTTP_EXTENSION_TYPE", "I18N_EXTENSION_TYPE", "LOGGER_EXTENSION_TYPE", "PERMISSION_EXTENSION_TYPE", "PLUGIN_EXTENSION_TYPE", "REGISTRY_EXTENSION_TYPE", "SERVER_EXTENSION_TYPE", "SESSION_EXTENSION_TYPE", "SIGNAL_EXTENSION_TYPE", "TABLE_EXTENSION_TYPE", "EventHub", "Network", "PACKET_TYPES", "WebsocketTransport", "BrowserSession", "Omu", "app", "options", "token", "packetType", "data", "connect", "event", "handler", "args", "callback", "resolve", "
|
|
4
|
+
"sourcesContent": ["import { ExtensionRegistry } from './api';\nimport { ASSET_EXTENSION_TYPE, type AssetExtension } from './api/asset/extension';\nimport { DASHBOARD_EXTENSION_TYPE, type DashboardExtension } from './api/dashboard/extension';\nimport { ENDPOINT_EXTENSION_TYPE, type EndpointExtension } from './api/endpoint/extension';\nimport { HTTP_EXTENSION_TYPE, HttpExtension } from './api/http/extension';\nimport { I18N_EXTENSION_TYPE, type I18nExtension } from './api/i18n/extension';\nimport { LOGGER_EXTENSION_TYPE, type LoggerExtension } from './api/logger/extension.js';\nimport { PERMISSION_EXTENSION_TYPE, type PermissionExtension } from './api/permission/extension';\nimport { PLUGIN_EXTENSION_TYPE, type PluginExtension } from './api/plugin/extension';\nimport { REGISTRY_EXTENSION_TYPE, type RegistryExtension } from './api/registry/extension';\nimport { SERVER_EXTENSION_TYPE, type ServerExtension } from './api/server/extension';\nimport { SESSION_EXTENSION_TYPE, SessionExtension } from './api/session';\nimport { SIGNAL_EXTENSION_TYPE, type SignalExtension } from './api/signal/extension';\nimport { TABLE_EXTENSION_TYPE, type TableExtension } from './api/table/extension';\nimport type { App } from './app.js';\nimport type { Unlisten } from './event';\nimport { EventHub } from './event';\nimport type { Address, Connection } from './network';\nimport { Network } from './network';\nimport { Transport } from './network/connection.js';\nimport { PACKET_TYPES } from './network/packet/packet-types.js';\nimport type { PacketType } from './network/packet/packet.js';\nimport { WebsocketTransport } from './network/websocket-transport';\nimport { BrowserSession, type SessionTokenProvider } from './token.js';\n\nexport type ClientEvents = {\n started: [];\n stopped: [];\n ready: [];\n};\n\nexport class Omu {\n public ready: boolean;\n public running: boolean;\n private readonly events = new EventHub<ClientEvents>();\n readonly token: SessionTokenProvider;\n readonly address: Address;\n readonly sessions: SessionExtension;\n readonly network: Network;\n readonly endpoints: EndpointExtension;\n readonly permissions: PermissionExtension;\n readonly plugins: PluginExtension;\n readonly dashboard: DashboardExtension;\n readonly extensions: ExtensionRegistry;\n readonly tables: TableExtension;\n readonly registries: RegistryExtension;\n readonly signals: SignalExtension;\n readonly assets: AssetExtension;\n readonly i18n: I18nExtension;\n readonly server: ServerExtension;\n readonly logger: LoggerExtension;\n readonly http: HttpExtension;\n\n constructor(\n public readonly app: App,\n options?: {\n address?: Address;\n token?: SessionTokenProvider | string;\n transport?: Transport;\n connection?: Connection;\n },\n ) {\n this.ready = false;\n this.running = false;\n if (typeof options?.token === 'string') {\n const token = options?.token;\n this.token = {\n get: () => Promise.resolve(token),\n };\n } else {\n this.token = options?.token ?? new BrowserSession();\n }\n this.address = options?.address ?? {\n host: '127.0.0.1',\n port: 26423,\n secure: false,\n };\n this.network = new Network(\n this,\n this.address,\n this.token,\n options?.transport ?? new WebsocketTransport(this.address),\n options?.connection,\n );\n this.network.on('disconnected', () => {\n this.ready = false;\n });\n this.network.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.ready) {\n throw new Error('Received READY packet when already ready');\n }\n this.ready = true;\n this.events.emit('ready');\n });\n this.extensions = new ExtensionRegistry(this);\n this.endpoints = this.extensions.register(ENDPOINT_EXTENSION_TYPE);\n this.plugins = this.extensions.register(PLUGIN_EXTENSION_TYPE);\n this.permissions = this.extensions.register(PERMISSION_EXTENSION_TYPE);\n this.tables = this.extensions.register(TABLE_EXTENSION_TYPE);\n this.sessions = this.extensions.register(SESSION_EXTENSION_TYPE);\n this.registries = this.extensions.register(REGISTRY_EXTENSION_TYPE);\n this.dashboard = this.extensions.register(DASHBOARD_EXTENSION_TYPE);\n this.signals = this.extensions.register(SIGNAL_EXTENSION_TYPE);\n this.assets = this.extensions.register(ASSET_EXTENSION_TYPE);\n this.i18n = this.extensions.register(I18N_EXTENSION_TYPE);\n this.server = this.extensions.register(SERVER_EXTENSION_TYPE);\n this.logger = this.extensions.register(LOGGER_EXTENSION_TYPE);\n this.http = this.extensions.register(HTTP_EXTENSION_TYPE);\n }\n\n public send<T>(packetType: PacketType<T>, data: T): Promise<void> {\n return this.network.send({\n type: packetType,\n data,\n });\n }\n\n public async start(): Promise<void> {\n if (this.running) {\n throw new Error('Client already running');\n }\n this.running = true;\n const connect = this.network.connect();\n this.events.emit('started');\n try {\n await connect;\n } finally {\n this.running = false;\n this.ready = false;\n }\n }\n\n public stop(): void {\n this.running = false;\n this.ready = false;\n this.network.close();\n this.events.emit('stopped');\n }\n\n public on<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): Unlisten {\n return this.events.on(event, handler);\n }\n\n public off<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): void {\n this.events.off(event, handler);\n }\n\n public emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): void {\n this.events.emit(event, ...args);\n }\n\n public onReady(callback: () => void): Unlisten {\n if (this.ready) {\n callback();\n }\n return this.events.on('ready', callback);\n }\n\n public async waitForReady(): Promise<void> {\n if (this.ready) return;\n if (!this.running) {\n throw new Error('Cannot wait for ready before the client has started');\n }\n return new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n unlistenReady();\n unlistenStopped();\n };\n const unlistenReady = this.events.on('ready', () => {\n cleanup();\n resolve();\n });\n const unlistenStopped = this.events.on('stopped', () => {\n cleanup();\n reject(new Error('Client stopped before becoming ready'));\n });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ExtensionRegistry", "ASSET_EXTENSION_TYPE", "DASHBOARD_EXTENSION_TYPE", "ENDPOINT_EXTENSION_TYPE", "HTTP_EXTENSION_TYPE", "I18N_EXTENSION_TYPE", "LOGGER_EXTENSION_TYPE", "PERMISSION_EXTENSION_TYPE", "PLUGIN_EXTENSION_TYPE", "REGISTRY_EXTENSION_TYPE", "SERVER_EXTENSION_TYPE", "SESSION_EXTENSION_TYPE", "SIGNAL_EXTENSION_TYPE", "TABLE_EXTENSION_TYPE", "EventHub", "Network", "PACKET_TYPES", "WebsocketTransport", "BrowserSession", "Omu", "app", "options", "token", "packetType", "data", "connect", "event", "handler", "args", "callback", "resolve", "reject", "cleanup", "unlistenReady", "unlistenStopped"]
|
|
7
7
|
}
|
package/dist/token.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { Address } from './address.js';
|
|
2
2
|
import type { App } from './app.js';
|
|
3
|
-
export interface
|
|
3
|
+
export interface SessionTokenProvider {
|
|
4
4
|
get(serverAddress: Address, app: App): Promise<string | undefined>;
|
|
5
5
|
}
|
|
6
|
+
/** @deprecated Use SessionTokenProvider instead. */
|
|
7
|
+
export type SessioTokenProvider = SessionTokenProvider;
|
|
6
8
|
export type SessionParam = {
|
|
7
9
|
address: Address;
|
|
8
10
|
token: string;
|
|
9
11
|
};
|
|
10
|
-
export declare class BrowserSession implements
|
|
12
|
+
export declare class BrowserSession implements SessionTokenProvider {
|
|
11
13
|
static readonly PARAM_NAME = "_omu_session";
|
|
12
14
|
get(address: Address): Promise<string | undefined>;
|
|
13
15
|
private parseParamSession;
|
package/dist/token.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{tryCatch as t}from"./helper.js";class
|
|
1
|
+
import{tryCatch as t}from"./helper.js";class o{static PARAM_NAME="_omu_session";async get(e){const r=this.parseParamSession(e);if(r)return r}parseParamSession(e){const n=new URLSearchParams(location.search).get(o.PARAM_NAME);if(!n)return;const{ok:a,data:s}=t(()=>JSON.parse(n));if(!a){console.warn(`Failed to parse session from URL parameter: ${s}`);return}if(s.address.hash!==e.hash){console.warn(`Session address hash does not match: expected ${e.hash}, got ${s.address.hash}`);return}return s.token}}export{o as BrowserSession};
|
|
2
2
|
//# sourceMappingURL=token.js.map
|
package/dist/token.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/token.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Address } from './address.js';\n\nimport type { App } from './app.js';\nimport { tryCatch } from './helper.js';\n\nexport interface
|
|
5
|
-
"mappings": "AAGA,OAAS,YAAAA,MAAgB,
|
|
4
|
+
"sourcesContent": ["import type { Address } from './address.js';\n\nimport type { App } from './app.js';\nimport { tryCatch } from './helper.js';\n\nexport interface SessionTokenProvider {\n get(serverAddress: Address, app: App): Promise<string | undefined>;\n}\n\n/** @deprecated Use SessionTokenProvider instead. */\nexport type SessioTokenProvider = SessionTokenProvider;\n\nexport type SessionParam = {\n address: Address;\n token: string;\n};\n\nexport class BrowserSession implements SessionTokenProvider {\n public static readonly PARAM_NAME = '_omu_session';\n\n public async get(address: Address): Promise<string | undefined> {\n const foundToken = this.parseParamSession(address);\n if (foundToken) return foundToken;\n return;\n }\n\n private parseParamSession(address: Address): string | undefined {\n const searchParams = new URLSearchParams(location.search);\n const param = searchParams.get(BrowserSession.PARAM_NAME);\n if (!param) return;\n const { ok, data: session } = tryCatch<SessionParam>(() => JSON.parse(param));\n if (!ok) {\n console.warn(`Failed to parse session from URL parameter: ${session}`);\n return undefined;\n }\n if (session.address.hash !== address.hash) {\n console.warn(`Session address hash does not match: expected ${address.hash}, got ${session.address.hash}`);\n return undefined;\n }\n return session.token;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAGA,OAAS,YAAAA,MAAgB,cAclB,MAAMC,CAA+C,CACxD,OAAuB,WAAa,eAEpC,MAAa,IAAIC,EAA+C,CAC5D,MAAMC,EAAa,KAAK,kBAAkBD,CAAO,EACjD,GAAIC,EAAY,OAAOA,CAE3B,CAEQ,kBAAkBD,EAAsC,CAE5D,MAAME,EADe,IAAI,gBAAgB,SAAS,MAAM,EAC7B,IAAIH,EAAe,UAAU,EACxD,GAAI,CAACG,EAAO,OACZ,KAAM,CAAE,GAAAC,EAAI,KAAMC,CAAQ,EAAIN,EAAuB,IAAM,KAAK,MAAMI,CAAK,CAAC,EAC5E,GAAI,CAACC,EAAI,CACL,QAAQ,KAAK,+CAA+CC,CAAO,EAAE,EACrE,MACJ,CACA,GAAIA,EAAQ,QAAQ,OAASJ,EAAQ,KAAM,CACvC,QAAQ,KAAK,iDAAiDA,EAAQ,IAAI,SAASI,EAAQ,QAAQ,IAAI,EAAE,EACzG,MACJ,CACA,OAAOA,EAAQ,KACnB,CACJ",
|
|
6
6
|
"names": ["tryCatch", "BrowserSession", "address", "foundToken", "param", "ok", "session"]
|
|
7
7
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.10.
|
|
1
|
+
export declare const VERSION = "0.10.9";
|
|
2
2
|
export declare const VERSION_MINOR = "0.10.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const o="0.10.
|
|
1
|
+
const o="0.10.9",t="0.10.0";export{o as VERSION,t as VERSION_MINOR};
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["export const VERSION = '0.10.
|
|
4
|
+
"sourcesContent": ["export const VERSION = '0.10.9';\nexport const VERSION_MINOR = '0.10.0';\n"],
|
|
5
5
|
"mappings": "AAAO,MAAMA,EAAU,SACVC,EAAgB",
|
|
6
6
|
"names": ["VERSION", "VERSION_MINOR"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@omujs/omu",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.9",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"./*": {
|
|
13
13
|
"import": "./dist/*/index.js",
|
|
14
|
-
"types": "./dist/*/index.d.
|
|
14
|
+
"types": "./dist/*/index.d.ts"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"files": [
|