@omujs/omu 0.9.50 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/api/dashboard/apps.d.ts +25 -0
  2. package/dist/api/dashboard/apps.js +2 -0
  3. package/dist/api/dashboard/apps.js.map +7 -0
  4. package/dist/api/dashboard/constants.d.ts +59 -0
  5. package/dist/api/dashboard/constants.js +2 -0
  6. package/dist/api/dashboard/constants.js.map +7 -0
  7. package/dist/api/dashboard/dragdrop.d.ts +78 -0
  8. package/dist/api/dashboard/dragdrop.js +2 -0
  9. package/dist/api/dashboard/dragdrop.js.map +7 -0
  10. package/dist/api/dashboard/extension.d.ts +9 -159
  11. package/dist/api/dashboard/extension.js +1 -1
  12. package/dist/api/dashboard/extension.js.map +3 -3
  13. package/dist/api/dashboard/handler.d.ts +6 -2
  14. package/dist/api/dashboard/index.d.ts +5 -2
  15. package/dist/api/dashboard/index.js +1 -1
  16. package/dist/api/dashboard/index.js.map +3 -3
  17. package/dist/api/dashboard/packets.d.ts +48 -59
  18. package/dist/api/dashboard/packets.js +1 -1
  19. package/dist/api/dashboard/packets.js.map +3 -3
  20. package/dist/api/dashboard/prompt.d.ts +0 -0
  21. package/dist/api/dashboard/prompt.js +1 -0
  22. package/dist/api/dashboard/prompt.js.map +7 -0
  23. package/dist/api/dashboard/webview.d.ts +101 -0
  24. package/dist/api/dashboard/webview.js +2 -0
  25. package/dist/api/dashboard/webview.js.map +7 -0
  26. package/dist/api/registry/extension.js +1 -1
  27. package/dist/api/registry/extension.js.map +2 -2
  28. package/dist/api/table/extension.js +1 -1
  29. package/dist/api/table/extension.js.map +3 -3
  30. package/dist/index.d.ts +3 -3
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +3 -3
  33. package/dist/network/network.js +1 -1
  34. package/dist/network/network.js.map +2 -2
  35. package/dist/serialize/bytebuffer.d.ts +1 -1
  36. package/dist/serialize/bytebuffer.js.map +2 -2
  37. package/dist/version.d.ts +2 -2
  38. package/dist/version.js +1 -1
  39. package/dist/version.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,3 +1,6 @@
1
- export { DASHBOARD_APP_INSTALL_PERMISSION_ID, DASHBOARD_DRAG_DROP_PERMISSION_ID as DAShBOARD_DRAG_DROP_PERMISSION_ID, DASHBOARD_OPEN_APP_PERMISSION_ID, DASHBOARD_SET_PERMISSION_ID, DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID, DASHBOARD_WEBVIEW_PERMISSION_ID, DASHOBARD_APP_EDIT_PERMISSION_ID, DASHOBARD_APP_READ_PERMISSION_ID, type Cookie, type GetCookiesRequest, type HostRequest, type PortProcess, type PromptRequest, type PromptRequestAppInstall, type PromptRequestAppPermissions, type PromptRequestAppPlugins, type PromptRequestAppUpdate, type PromptRequestHttpPort, type PromptRequestIndexInstall, type PromptResult, type SpeechRecognitionStart, type TranscriptSegment, type TranscriptStatus, type UserResponse, type WebviewEvent, type WebviewPacket, type WebviewRequest, } from './extension.js';
1
+ export { DASHBOARD_APP_INSTALL_PERMISSION_ID, DASHBOARD_OPEN_APP_PERMISSION_ID, } from './apps.js';
2
+ export { DASHBOARD_DRAG_DROP_PERMISSION_ID, DASHBOARD_SET_PERMISSION_ID, DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID, type HostRequest, type SpeechRecognitionStart, type TranscriptSegment, type TranscriptStatus, type UserResponse, } from './constants.js';
3
+ export { type PortProcess, type PromptRequest, type PromptRequestAppInstall, type PromptRequestAppPermissions, type PromptRequestAppPlugins, type PromptRequestAppUpdate, type PromptRequestHttpPort, type PromptRequestIndexInstall, type PromptResult, } from './packets.js';
4
+ export { CookieList, DASHBOARD_WEBVIEW_PERMISSION_ID, type Cookie, type GetCookiesRequest, type WebviewEvent, type WebviewHandle, type WebviewPacket, type WebviewRequest, } from './webview.js';
5
+ export { DragDropReadResponse, type DragDropFile, type DragDropReadRequest, type DragDropRequestDashboard, type FileData, } from './dragdrop.js';
2
6
  export type { DashboardHandler } from './handler';
3
- export { DragDropReadResponse, type DragDropFile, type DragDropReadRequest, type DragDropRequestDashboard, type FileData, } from './packets.js';
@@ -1,2 +1,2 @@
1
- import{DASHBOARD_APP_INSTALL_PERMISSION_ID as p,DASHBOARD_DRAG_DROP_PERMISSION_ID as D,DASHBOARD_OPEN_APP_PERMISSION_ID as R,DASHBOARD_SET_PERMISSION_ID as r,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as I,DASHBOARD_WEBVIEW_PERMISSION_ID as P,DASHOBARD_APP_EDIT_PERMISSION_ID as s,DASHOBARD_APP_READ_PERMISSION_ID as S}from"./extension.js";import{DragDropReadResponse as o}from"./packets.js";export{p as DASHBOARD_APP_INSTALL_PERMISSION_ID,R as DASHBOARD_OPEN_APP_PERMISSION_ID,r as DASHBOARD_SET_PERMISSION_ID,I as DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,P as DASHBOARD_WEBVIEW_PERMISSION_ID,s as DASHOBARD_APP_EDIT_PERMISSION_ID,S as DASHOBARD_APP_READ_PERMISSION_ID,D as DAShBOARD_DRAG_DROP_PERMISSION_ID,o as DragDropReadResponse};
1
+ import{DASHBOARD_APP_INSTALL_PERMISSION_ID as p,DASHBOARD_OPEN_APP_PERMISSION_ID as r}from"./apps.js";import{DASHBOARD_DRAG_DROP_PERMISSION_ID as s,DASHBOARD_SET_PERMISSION_ID as R,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as D}from"./constants.js";import{CookieList as I,DASHBOARD_WEBVIEW_PERMISSION_ID as S}from"./webview.js";import{DragDropReadResponse as _}from"./dragdrop.js";export{I as CookieList,p as DASHBOARD_APP_INSTALL_PERMISSION_ID,s as DASHBOARD_DRAG_DROP_PERMISSION_ID,r as DASHBOARD_OPEN_APP_PERMISSION_ID,R as DASHBOARD_SET_PERMISSION_ID,D as DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,S as DASHBOARD_WEBVIEW_PERMISSION_ID,_ as DragDropReadResponse};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/dashboard/index.ts"],
4
- "sourcesContent": ["export {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID as 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 DASHOBARD_APP_EDIT_PERMISSION_ID,\n DASHOBARD_APP_READ_PERMISSION_ID,\n type Cookie,\n type GetCookiesRequest,\n type HostRequest,\n type PortProcess,\n type PromptRequest,\n type PromptRequestAppInstall,\n type PromptRequestAppPermissions,\n type PromptRequestAppPlugins,\n type PromptRequestAppUpdate,\n type PromptRequestHttpPort,\n type PromptRequestIndexInstall,\n type PromptResult,\n type SpeechRecognitionStart,\n type TranscriptSegment,\n type TranscriptStatus,\n type UserResponse,\n type WebviewEvent,\n type WebviewPacket,\n type WebviewRequest,\n} from './extension.js';\nexport type { DashboardHandler } from './handler';\nexport {\n DragDropReadResponse,\n type DragDropFile,\n type DragDropReadRequest,\n type DragDropRequestDashboard,\n type FileData,\n} from './packets.js';\n\n"],
5
- "mappings": "AAAA,OACI,uCAAAA,EACqC,qCAArCC,EACA,oCAAAC,EACA,+BAAAC,EACA,8CAAAC,EACA,mCAAAC,EACA,oCAAAC,EACA,oCAAAC,MAoBG,iBAEP,OACI,wBAAAC,MAKG",
6
- "names": ["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", "DASHOBARD_APP_EDIT_PERMISSION_ID", "DASHOBARD_APP_READ_PERMISSION_ID", "DragDropReadResponse"]
4
+ "sourcesContent": ["export {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n} from './apps.js';\nexport {\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n type HostRequest,\n type SpeechRecognitionStart,\n type TranscriptSegment,\n type TranscriptStatus,\n type UserResponse,\n} from './constants.js';\nexport {\n type PortProcess,\n type PromptRequest,\n type PromptRequestAppInstall,\n type PromptRequestAppPermissions,\n type PromptRequestAppPlugins,\n type PromptRequestAppUpdate,\n type PromptRequestHttpPort,\n type PromptRequestIndexInstall,\n type PromptResult,\n} from './packets.js';\nexport {\n CookieList,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n type Cookie,\n type GetCookiesRequest,\n type WebviewEvent,\n type WebviewHandle,\n type WebviewPacket,\n type WebviewRequest,\n} from './webview.js';\n\nexport {\n DragDropReadResponse,\n type DragDropFile,\n type DragDropReadRequest,\n type DragDropRequestDashboard,\n type FileData,\n} from './dragdrop.js';\n\nexport type { DashboardHandler } from './handler';\n"],
5
+ "mappings": "AAAA,OACI,uCAAAA,EACA,oCAAAC,MACG,YACP,OACI,qCAAAC,EACA,+BAAAC,EACA,8CAAAC,MAMG,iBAYP,OACI,cAAAC,EACA,mCAAAC,MAOG,eAEP,OACI,wBAAAC,MAKG",
6
+ "names": ["DASHBOARD_APP_INSTALL_PERMISSION_ID", "DASHBOARD_OPEN_APP_PERMISSION_ID", "DASHBOARD_DRAG_DROP_PERMISSION_ID", "DASHBOARD_SET_PERMISSION_ID", "DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID", "CookieList", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DragDropReadResponse"]
7
7
  }
@@ -1,63 +1,52 @@
1
- import { App } from '../../app.js';
1
+ import { App, AppJson } from '../../app.js';
2
+ import { PacketType } from '../../network/packet/packet.js';
3
+ import { PermissionTypeJson } from '../permission/permission.js';
4
+ import { PackageInfo } from '../plugin/package-info.js';
5
+ import { AppIndexRegistryMeta } from '../server/extension.js';
2
6
  export type AppInstallResponse = {
3
7
  accepted: boolean;
4
8
  };
5
- export type DragDropFile = {
6
- type: 'file' | 'directory';
7
- size: number;
9
+ export declare const DASHBOARD_OPEN_APP_PACKET: PacketType<App>;
10
+ export interface PromptRequestBase<T extends string> {
11
+ kind: T;
12
+ id: string;
13
+ }
14
+ export interface PromptRequestAppPermissions extends PromptRequestBase<'app/permissions'> {
15
+ app: AppJson;
16
+ permissions: PermissionTypeJson[];
17
+ }
18
+ export interface PromptRequestAppPlugins extends PromptRequestBase<'app/plugins'> {
19
+ app: AppJson;
20
+ packages: PackageInfo[];
21
+ }
22
+ export interface PromptRequestAppInstall extends PromptRequestBase<'app/install'> {
23
+ app: AppJson;
24
+ dependencies: Record<string, AppJson>;
25
+ }
26
+ export interface PromptRequestAppUpdate extends PromptRequestBase<'app/update'> {
27
+ old_app: AppJson;
28
+ new_app: AppJson;
29
+ dependencies: Record<string, AppJson>;
30
+ }
31
+ export interface PromptRequestIndexInstall extends PromptRequestBase<'index/install'> {
32
+ index_url: string;
33
+ meta?: AppIndexRegistryMeta;
34
+ }
35
+ export interface PortProcess {
36
+ port: number;
8
37
  name: string;
9
- };
10
- export type DragDropPosition = {
11
- x: number;
12
- y: number;
13
- };
14
- export type DragEnter = {
15
- type: 'enter';
16
- drag_id: string;
17
- files: DragDropFile[];
18
- position: DragDropPosition;
19
- };
20
- export type DragOver = {
21
- type: 'over';
22
- drag_id: string;
23
- position: DragDropPosition;
24
- };
25
- export type DragDrop = {
26
- type: 'drop';
27
- drag_id: string;
28
- position: DragDropPosition;
29
- files: DragDropFile[];
30
- };
31
- export type DragLeave = {
32
- type: 'leave';
33
- drag_id: string;
34
- };
35
- export type DragState = DragEnter | DragOver | DragDrop | DragLeave;
36
- export type FileDragPacket = {
37
- drag_id: string;
38
- app: App;
39
- state: DragState;
40
- };
41
- export type DragDropReadRequest = {
42
- drag_id: string;
43
- };
44
- export type DragDropReadMeta = {
45
- drag_id: string;
46
- files: readonly DragDropFile[];
47
- };
48
- export type FileData = {
49
- file: DragDropFile;
50
- buffer: Uint8Array;
51
- };
52
- export declare class DragDropReadResponse {
53
- readonly meta: DragDropReadMeta;
54
- readonly files: Record<string, FileData>;
55
- readonly version: number;
56
- constructor(meta: DragDropReadMeta, files: Record<string, FileData>, version?: number);
57
- static serialize(data: DragDropReadResponse): Uint8Array;
58
- static deserialize(data: Uint8Array): DragDropReadResponse;
59
- }
60
- export type DragDropRequestDashboard = object;
61
- export type DragDropRequestResponse = {
62
- ok: boolean;
63
- };
38
+ exe: string;
39
+ }
40
+ export interface PromptRequestHttpPort extends PromptRequestBase<'http/port'> {
41
+ app: AppJson;
42
+ processes: PortProcess[];
43
+ }
44
+ export type PromptResult = 'accept' | 'deny' | 'block';
45
+ export interface PromptResponse {
46
+ id: string;
47
+ kind: string;
48
+ result: PromptResult;
49
+ }
50
+ export type PromptRequest = (PromptRequestAppPermissions | PromptRequestAppPlugins | PromptRequestAppInstall | PromptRequestAppUpdate | PromptRequestIndexInstall | PromptRequestHttpPort);
51
+ export declare const DASHBOARD_PROMPT_REQUEST: PacketType<PromptRequest>;
52
+ export declare const DASHBOARD_PROMPT_RESPONSE: PacketType<PromptResponse>;
@@ -1,2 +1,2 @@
1
- import{ByteReader as l,ByteWriter as y}from"../../serialize";class n{constructor(e,r,t=1){this.meta=e;this.files=r;this.version=t}static serialize(e){const r=new y;r.writeULEB128(e.version),r.writeString(JSON.stringify(e.meta)),r.writeULEB128(Object.keys(e.files).length);for(const[t,{file:i,buffer:o}]of Object.entries(e.files))r.writeString(t),r.writeString(JSON.stringify(i)),r.writeUint8Array(o);return r.finish()}static deserialize(e){const r=l.fromUint8Array(e),t=r.readULEB128(),i=JSON.parse(r.readString()),o=r.readULEB128(),a={};for(let p=0;p<o;p++){const s=r.readString(),g=JSON.parse(r.readString()),D=r.readUint8Array();a[s]={file:g,buffer:D}}return new n(i,a,t)}}export{n as DragDropReadResponse};
1
+ import{App as t}from"../../app.js";import{PacketType as e}from"../../network/packet/packet.js";import{DASHBOARD_EXTENSION_TYPE as p}from"./constants.js";const A=e.createJson(p,{name:"open_app",serializer:t}),u=e.createJson(p,{name:"prompt_request"}),d=e.createJson(p,{name:"prompt_response"});export{A as DASHBOARD_OPEN_APP_PACKET,u as DASHBOARD_PROMPT_REQUEST,d as DASHBOARD_PROMPT_RESPONSE};
2
2
  //# sourceMappingURL=packets.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/dashboard/packets.ts"],
4
- "sourcesContent": ["import { App } from '../../app.js';\nimport { ByteReader, ByteWriter } from '../../serialize';\n\nexport type AppInstallResponse = {\n accepted: boolean;\n};\n\nexport type DragDropFile = {\n type: 'file' | 'directory';\n size: number;\n name: string;\n};\n\nexport type DragDropPosition = {\n x: number;\n y: number;\n};\n\nexport type DragEnter = {\n type: 'enter';\n drag_id: string;\n files: DragDropFile[];\n position: DragDropPosition;\n};\n\nexport type DragOver = {\n type: 'over';\n drag_id: string;\n position: DragDropPosition;\n};\n\nexport type DragDrop = {\n type: 'drop';\n drag_id: string;\n position: DragDropPosition;\n files: DragDropFile[];\n};\n\nexport type DragLeave = {\n type: 'leave';\n drag_id: string;\n};\n\nexport type DragState = DragEnter | DragOver | DragDrop | DragLeave;\n\nexport type FileDragPacket = {\n drag_id: string;\n app: App;\n state: DragState;\n};\n\nexport type DragDropReadRequest = {\n drag_id: string;\n};\n\nexport type DragDropReadMeta = {\n drag_id: string;\n files: readonly DragDropFile[];\n};\n\nexport type FileData = {\n file: DragDropFile;\n buffer: Uint8Array;\n};\n\nexport class DragDropReadResponse {\n constructor(\n public readonly meta: DragDropReadMeta,\n public readonly files: Record<string, FileData>,\n public readonly version: number = 1,\n ) {}\n\n public static serialize(data: DragDropReadResponse): Uint8Array {\n const writer = new ByteWriter();\n writer.writeULEB128(data.version);\n writer.writeString(JSON.stringify(data.meta));\n writer.writeULEB128(Object.keys(data.files).length);\n\n for (const [key, { file, buffer }] of Object.entries(data.files)) {\n writer.writeString(key);\n writer.writeString(JSON.stringify(file));\n writer.writeUint8Array(buffer);\n }\n\n return writer.finish();\n }\n\n public static deserialize(data: Uint8Array): DragDropReadResponse {\n const reader = ByteReader.fromUint8Array(data);\n const version = reader.readULEB128();\n const meta: DragDropReadMeta = JSON.parse(reader.readString());\n const length = reader.readULEB128();\n\n const files: Record<string, FileData> = {};\n for (let i = 0; i < length; i++) {\n const key = reader.readString();\n const file: DragDropFile = JSON.parse(reader.readString());\n const buffer = reader.readUint8Array();\n files[key] = { file, buffer };\n }\n\n return new DragDropReadResponse(\n meta,\n files,\n version,\n );\n }\n}\n\nexport type DragDropRequestDashboard = object;\n\nexport type DragDropRequestResponse = {\n ok: boolean;\n};\n"],
5
- "mappings": "AACA,OAAS,cAAAA,EAAY,cAAAC,MAAkB,kBAgEhC,MAAMC,CAAqB,CAC9B,YACoBC,EACAC,EACAC,EAAkB,EACpC,CAHkB,UAAAF,EACA,WAAAC,EACA,aAAAC,CACjB,CAEH,OAAc,UAAUC,EAAwC,CAC5D,MAAMC,EAAS,IAAIN,EACnBM,EAAO,aAAaD,EAAK,OAAO,EAChCC,EAAO,YAAY,KAAK,UAAUD,EAAK,IAAI,CAAC,EAC5CC,EAAO,aAAa,OAAO,KAAKD,EAAK,KAAK,EAAE,MAAM,EAElD,SAAW,CAACE,EAAK,CAAE,KAAAC,EAAM,OAAAC,CAAO,CAAC,IAAK,OAAO,QAAQJ,EAAK,KAAK,EAC3DC,EAAO,YAAYC,CAAG,EACtBD,EAAO,YAAY,KAAK,UAAUE,CAAI,CAAC,EACvCF,EAAO,gBAAgBG,CAAM,EAGjC,OAAOH,EAAO,OAAO,CACzB,CAEA,OAAc,YAAYD,EAAwC,CAC9D,MAAMK,EAASX,EAAW,eAAeM,CAAI,EACvCD,EAAUM,EAAO,YAAY,EAC7BR,EAAyB,KAAK,MAAMQ,EAAO,WAAW,CAAC,EACvDC,EAASD,EAAO,YAAY,EAE5BP,EAAkC,CAAC,EACzC,QAASS,EAAI,EAAGA,EAAID,EAAQC,IAAK,CAC7B,MAAML,EAAMG,EAAO,WAAW,EACxBF,EAAqB,KAAK,MAAME,EAAO,WAAW,CAAC,EACnDD,EAASC,EAAO,eAAe,EACrCP,EAAMI,CAAG,EAAI,CAAE,KAAAC,EAAM,OAAAC,CAAO,CAChC,CAEA,OAAO,IAAIR,EACPC,EACAC,EACAC,CACJ,CACJ,CACJ",
6
- "names": ["ByteReader", "ByteWriter", "DragDropReadResponse", "meta", "files", "version", "data", "writer", "key", "file", "buffer", "reader", "length", "i"]
4
+ "sourcesContent": ["import { App, AppJson } from '../../app.js';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { PermissionTypeJson } from '../permission/permission.js';\nimport { PackageInfo } from '../plugin/package-info.js';\nimport { AppIndexRegistryMeta } from '../server/extension.js';\nimport { DASHBOARD_EXTENSION_TYPE } from './constants.js';\n\nexport type AppInstallResponse = {\n accepted: boolean;\n};\n\nexport const DASHBOARD_OPEN_APP_PACKET: PacketType<App> = PacketType.createJson<App>(DASHBOARD_EXTENSION_TYPE, {\n name: 'open_app',\n serializer: App,\n});\nexport interface PromptRequestBase<T extends string> {\n kind: T;\n id: string;\n}\n\nexport interface PromptRequestAppPermissions extends PromptRequestBase<'app/permissions'> {\n app: AppJson;\n permissions: PermissionTypeJson[];\n}\n\nexport interface PromptRequestAppPlugins extends PromptRequestBase<'app/plugins'> {\n app: AppJson;\n packages: PackageInfo[];\n}\n\nexport interface PromptRequestAppInstall extends PromptRequestBase<'app/install'> {\n app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestAppUpdate extends PromptRequestBase<'app/update'> {\n old_app: AppJson;\n new_app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestIndexInstall extends PromptRequestBase<'index/install'> {\n index_url: string;\n meta?: AppIndexRegistryMeta;\n}\n\nexport interface PortProcess {\n port: number;\n name: string;\n exe: string;\n}\n\nexport interface PromptRequestHttpPort extends PromptRequestBase<'http/port'> {\n app: AppJson;\n processes: PortProcess[];\n}\n\nexport type PromptResult = 'accept' | 'deny' | 'block';\n\nexport interface PromptResponse {\n id: string;\n kind: string;\n result: PromptResult;\n}\n\nexport type PromptRequest = (\n PromptRequestAppPermissions\n | PromptRequestAppPlugins\n | PromptRequestAppInstall\n | PromptRequestAppUpdate\n | PromptRequestIndexInstall\n | PromptRequestHttpPort\n);\n\nexport const DASHBOARD_PROMPT_REQUEST: PacketType<PromptRequest> = PacketType.createJson<PromptRequest>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_request',\n});\nexport const DASHBOARD_PROMPT_RESPONSE: PacketType<PromptResponse> = PacketType.createJson<PromptResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_response',\n});\n\n"],
5
+ "mappings": "AAAA,OAAS,OAAAA,MAAoB,eAC7B,OAAS,cAAAC,MAAkB,iCAI3B,OAAS,4BAAAC,MAAgC,iBAMlC,MAAMC,EAA6CF,EAAW,WAAgBC,EAA0B,CAC3G,KAAM,WACN,WAAYF,CAChB,CAAC,EA4DYI,EAAsDH,EAAW,WAA0BC,EAA0B,CAC9H,KAAM,gBACV,CAAC,EACYG,EAAwDJ,EAAW,WAA2BC,EAA0B,CACjI,KAAM,iBACV,CAAC",
6
+ "names": ["App", "PacketType", "DASHBOARD_EXTENSION_TYPE", "DASHBOARD_OPEN_APP_PACKET", "DASHBOARD_PROMPT_REQUEST", "DASHBOARD_PROMPT_RESPONSE"]
7
7
  }
File without changes
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,101 @@
1
+ import { Identifier } from '../../identifier';
2
+ import { PacketType } from '../../network/packet';
3
+ import { Omu } from '../../omu';
4
+ import { PromiseResult } from '../../result';
5
+ import { Table } from '../table';
6
+ import { AllowedHost, UserError, UserResponse } from './constants';
7
+ import { DashboardHandler } from './handler';
8
+ export type Cookie = {
9
+ name: string;
10
+ value: string;
11
+ };
12
+ export declare class CookieList extends Array<Cookie> {
13
+ toString(): string;
14
+ }
15
+ export type WebviewEvent = {
16
+ type: 'closed';
17
+ } | {
18
+ type: 'resize';
19
+ dimensions: {
20
+ x: number;
21
+ y: number;
22
+ };
23
+ } | {
24
+ type: 'cookie';
25
+ cookies: Cookie[];
26
+ } | {
27
+ type: 'message';
28
+ data: any;
29
+ };
30
+ export type WebviewEventPacket = {
31
+ id: Identifier;
32
+ target: Identifier;
33
+ event: WebviewEvent;
34
+ };
35
+ export declare const DASHBOARD_WEBVIEW_EVENT_PACKET: PacketType<WebviewEventPacket>;
36
+ export type WebviewPacket = {
37
+ id: string;
38
+ };
39
+ export type WebviewResponse = UserResponse<WebviewPacket>;
40
+ export type GetCookiesRequest = {
41
+ url: string;
42
+ };
43
+ export type WebviewRequest = {
44
+ url: string;
45
+ script?: string;
46
+ center?: boolean;
47
+ position?: {
48
+ x: number;
49
+ y: number;
50
+ };
51
+ inner_size?: {
52
+ x: number;
53
+ y: number;
54
+ };
55
+ min_inner_size?: {
56
+ x: number;
57
+ y: number;
58
+ };
59
+ max_inner_size?: {
60
+ x: number;
61
+ y: number;
62
+ };
63
+ resizable?: boolean;
64
+ maximizable?: boolean;
65
+ minimizable?: boolean;
66
+ title?: string;
67
+ maximized?: boolean;
68
+ always_on_bottom?: boolean;
69
+ always_on_top?: boolean;
70
+ shadow?: boolean;
71
+ decorations?: boolean;
72
+ transparent?: boolean;
73
+ };
74
+ export type WebviewEventListeners = {
75
+ [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, {
76
+ type: K;
77
+ }>) => void>;
78
+ };
79
+ export type WebviewHandle = {
80
+ readonly id: Identifier;
81
+ readonly url: string;
82
+ getCookies(): PromiseResult<CookieList, UserError>;
83
+ on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, {
84
+ type: T;
85
+ }>) => void): void;
86
+ close(): Promise<void>;
87
+ join(): Promise<void>;
88
+ };
89
+ export type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, {
90
+ type: T;
91
+ }>) => void;
92
+ export declare const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier;
93
+ export declare class WebviewAPI {
94
+ private readonly omu;
95
+ private readonly webviewHandles;
96
+ readonly allowedHosts: Table<AllowedHost>;
97
+ constructor(omu: Omu);
98
+ setDashboard(dashboard: DashboardHandler): void;
99
+ requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError>;
100
+ getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError>;
101
+ }
@@ -0,0 +1,2 @@
1
+ import{Identifier as b,IdentifierMap as h}from"../../identifier";import{PacketType as R}from"../../network/packet";import{PromiseResult as E}from"../../result";import{Serializer as _}from"../../serialize";import{EndpointType as p}from"../endpoint";import{TableType as H}from"../table";import{DASHBOARD_EXTENSION_TYPE as c,DASHBOARD_SET_PERMISSION_ID as x}from"./constants";class A extends Array{toString(){return this.map(i=>`${i.name}=${i.value}`).join("; ")}}const m=R.createJson(c,{name:"webview_event",serializer:_.noop().field("id",b).field("target",b)}),w=c.join("webview"),P=H.createJson(c,{name:"allowed_webview_hosts",key:u=>u.id,permissions:{all:x}}),g=p.createJson(c,{name:"host_request",permissionId:w}),W=p.createJson(c,{name:"cookies_get",permissionId:w}),k=p.createJson(c,{name:"webview_request",permissionId:w}),f=p.createJson(c,{name:"webview_close",permissionId:w});class G{constructor(i){this.omu=i;i.network.registerPacket(m),i.network.addPacketHandler(m,r=>{const e=this.webviewHandles.get(r.id);e&&e.emit(r.event)}),this.allowedHosts=i.tables.get(P)}webviewHandles=new h;allowedHosts;setDashboard(i){const r=async(e,t)=>{const o=t.split(".").reverse().join(".");if(e.caller.namespace===o)return{type:"ok",value:void 0};const n=e.caller.key();if(!(await this.allowedHosts.get(n)??{id:n,hosts:[]}).hosts.includes(t))if(await i.handleHostRequest({host:t},e)==="accept"){const s=await this.allowedHosts.get(n)??{id:n,hosts:[]};s.hosts.push(t),await this.allowedHosts.update(s)}else return{type:"cancelled"};return{type:"ok",value:void 0}};this.omu.server.apps.event.remove.listen(async e=>{for(const t of e.values()){const o=await this.allowedHosts.get(t.id.key());o&&this.allowedHosts.remove(o)}}),this.omu.endpoints.bind(W,async(e,t)=>{const{url:o}=e,{host:n}=new URL(o),a=await r(t,n);return a.type!=="ok"?a:await i.getCookies(e)}),this.omu.endpoints.bind(g,async(e,t)=>{const{host:o}=e;return await r(t,o)}),this.omu.endpoints.bind(k,async(e,t)=>{const o=new URL(e.url),{host:n}=o,a=await r(t,n);if(a.type!=="ok")return a;let l=null;const d=async v=>{l&&this.omu.send(m,{id:l,target:t.caller,event:v})},s=await i.createWebview(e,t,d);return l=s,{type:"ok",value:{id:s.key()}}}),this.omu.endpoints.bind(f,async(e,t)=>{const o=await i.getWebview(e,t);return o?(await i.closeWebview(e,t),{type:"ok",value:{id:o.key()}}):{type:"cancelled"}})}requestWebview(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(k,i).then(o=>{if(o.type!=="ok"){t(o);return}const{value:n}=o,a=b.fromKey(n.id),l={},d={id:a,url:i.url,close:async()=>{await this.omu.endpoints.call(f,{id:a.key()})},getCookies:()=>this.getCookies({url:i.url}),on:function(s,v){l[s]||(l[s]=[]),l[s].push(v)},join:async()=>{await new Promise(s=>{d.on("closed",()=>s())})}};this.webviewHandles.set(a,{handle:d,emit:function(s){const v=l[s.type];if(v)for(const y of v)y(s)}}),e(d)}),r}getCookies(i){const{promise:r,resolve:e,reject:t}=E.create();return this.omu.endpoints.call(W,i).then(o=>{if(o.type==="ok"){e(A.from(o.value));return}else t(o)}),r}}export{A as CookieList,m as DASHBOARD_WEBVIEW_EVENT_PACKET,w as DASHBOARD_WEBVIEW_PERMISSION_ID,G as WebviewAPI};
2
+ //# sourceMappingURL=webview.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/api/dashboard/webview.ts"],
4
+ "sourcesContent": ["import { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { PromiseResult } from '../../result';\nimport { Serializer } from '../../serialize';\nimport { EndpointType, InvokedParams } from '../endpoint';\nimport { Table, TableType } from '../table';\nimport { AllowedHost, DASHBOARD_EXTENSION_TYPE, DASHBOARD_SET_PERMISSION_ID, UserError, UserResponse } from './constants';\nimport { DashboardHandler } from './handler';\n\nexport type Cookie = {\n name: string;\n value: string;\n};\n\nexport class CookieList extends Array<Cookie> {\n public toString(): string {\n return this.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n }\n}\n\nexport type WebviewEvent = {\n type: 'closed';\n} | {\n type: 'resize';\n dimensions: {\n x: number;\n y: number;\n };\n} | {\n type: 'cookie';\n cookies: Cookie[];\n} | {\n type: 'message';\n data: any;\n};\n\nexport type WebviewEventPacket = {\n id: Identifier;\n target: Identifier;\n event: WebviewEvent;\n};\n\nexport const DASHBOARD_WEBVIEW_EVENT_PACKET: PacketType<WebviewEventPacket> = PacketType.createJson<WebviewEventPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_event',\n serializer: Serializer.noop<WebviewEventPacket>()\n .field('id', Identifier)\n .field('target', Identifier),\n});\n\nexport type WebviewPacket = {\n id: string;\n};\n\nexport type WebviewResponse = UserResponse<WebviewPacket>;\n\nexport type GetCookiesRequest = {\n url: string;\n};\n\nexport type WebviewRequest = {\n url: string;\n script?: string;\n center?: boolean;\n position?: { x: number; y: number };\n inner_size?: { x: number; y: number };\n min_inner_size?: { x: number; y: number };\n max_inner_size?: { x: number; y: number };\n resizable?: boolean;\n maximizable?: boolean;\n minimizable?: boolean;\n title?: string;\n maximized?: boolean;\n always_on_bottom?: boolean;\n always_on_top?: boolean;\n shadow?: boolean;\n decorations?: boolean;\n transparent?: boolean;\n};\n\nexport type WebviewEventListeners = {\n [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, { type: K }>) => void>;\n};\n\nexport type WebviewHandle = {\n readonly id: Identifier;\n readonly url: string;\n getCookies(): PromiseResult<CookieList, UserError>;\n on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;\n close(): Promise<void>;\n join(): Promise<void>;\n};\n\nexport type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>) => void;\n\nexport const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');\n\nconst DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson<AllowedHost>(DASHBOARD_EXTENSION_TYPE, {\n name: 'allowed_webview_hosts',\n key: (entry) => entry.id,\n permissions: { all: DASHBOARD_SET_PERMISSION_ID },\n});\n\nconst DASHBOARD_HOST_REQUEST = EndpointType.createJson<{ host: string }, UserResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'host_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserResponse<Cookie[]>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'cookies_get',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_close',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport class WebviewAPI {\n private readonly webviewHandles: IdentifierMap<{ handle: WebviewHandle; emit: WebviewEventEmit }> = new IdentifierMap();\n public readonly allowedHosts: Table<AllowedHost>;\n\n constructor(\n private readonly omu: Omu,\n ) {\n omu.network.registerPacket(\n DASHBOARD_WEBVIEW_EVENT_PACKET,\n );\n omu.network.addPacketHandler(DASHBOARD_WEBVIEW_EVENT_PACKET, (packet) => {\n const handle = this.webviewHandles.get(packet.id);\n if (!handle) return;\n handle.emit(packet.event);\n });\n this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);\n }\n\n public setDashboard(dashboard: DashboardHandler): void {\n const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {\n const hostNamespace = host.split('.').reverse().join('.');\n if (params.caller.namespace === hostNamespace) {\n return { type: 'ok', value: undefined };\n }\n\n const id = params.caller.key();\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n const allowed = hostEntry.hosts.includes(host);\n\n if (!allowed) {\n const result = await dashboard.handleHostRequest({ host }, params);\n\n if (result === 'accept') {\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n hostEntry.hosts.push(host);\n await this.allowedHosts.update(hostEntry);\n } else {\n return { type: 'cancelled' };\n }\n }\n\n return { type: 'ok', value: undefined };\n };\n\n this.omu.server.apps.event.remove.listen(async (apps) => {\n for (const app of apps.values()) {\n const hosts = await this.allowedHosts.get(app.id.key());\n if (!hosts) continue;\n this.allowedHosts.remove(hosts);\n }\n });\n this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {\n const { url } = request;\n const { host } = new URL(url);\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n return await dashboard.getCookies(request);\n });\n this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {\n const { host } = request;\n const result = await requireHost(params, host);\n return result;\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {\n const url = new URL(request.url);\n const { host } = url;\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n\n let webviewId: Identifier | null = null;\n const emit = async (event: WebviewEvent) => {\n if (!webviewId) return;\n this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, { id: webviewId, target: params.caller, event });\n };\n\n const id = await dashboard.createWebview(request, params, emit);\n webviewId = id;\n\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {\n const id = await dashboard.getWebview(request, params);\n if (!id) {\n return {\n type: 'cancelled',\n };\n }\n await dashboard.closeWebview(request, params);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n }\n\n public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_REQUEST,\n options,\n ).then((result) => {\n if (result.type !== 'ok') {\n reject(result);\n return;\n }\n const { value } = result;\n const id = Identifier.fromKey(value.id);\n const eventListeners: WebviewEventListeners = {};\n const handle: WebviewHandle = {\n id,\n url: options.url,\n close: async () => {\n await this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_CLOSE,\n { id: id.key() },\n );\n },\n getCookies: () => this.getCookies({\n url: options.url,\n }),\n on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {\n if (!eventListeners[key]) {\n eventListeners[key] = [];\n }\n const listeners = eventListeners[key]!;\n listeners.push(callback);\n },\n join: async () => {\n await new Promise<void>((resolve) => {\n handle.on('closed', () => resolve());\n });\n },\n };\n this.webviewHandles.set(id, {\n handle,\n emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {\n const listeners = eventListeners[event.type];\n if (!listeners) return;\n for (const listener of listeners) {\n listener(event);\n }\n },\n });\n\n resolve(handle);\n });\n return promise;\n }\n\n public getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<CookieList, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_COOKIES_GET,\n options,\n ).then((response) => {\n if (response.type === 'ok') {\n resolve(CookieList.from(response.value));\n return;\n } else {\n reject(response);\n }\n });\n return promise;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Identifier", "IdentifierMap", "PacketType", "PromiseResult", "Serializer", "EndpointType", "TableType", "DASHBOARD_EXTENSION_TYPE", "DASHBOARD_SET_PERMISSION_ID", "CookieList", "cookie", "DASHBOARD_WEBVIEW_EVENT_PACKET", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_ALLOWED_WEBVIEW_HOSTS", "entry", "DASHBOARD_HOST_REQUEST", "DASHBOARD_COOKIES_GET", "DASHBOARD_WEBVIEW_REQUEST", "DASHBOARD_WEBVIEW_CLOSE", "WebviewAPI", "omu", "packet", "handle", "dashboard", "requireHost", "params", "host", "hostNamespace", "id", "hostEntry", "apps", "app", "hosts", "request", "url", "hostAccessResult", "webviewId", "emit", "event", "options", "promise", "resolve", "reject", "result", "value", "eventListeners", "key", "callback", "listeners", "listener", "response"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask())}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
1
+ import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
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 }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
5
+ "mappings": "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",
6
6
  "names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "RegistryImpl", "identifier", "registry", "name", "options", "tableType", "type", "packet", "#get", "result", "REGISTRY_GET_ENDPOINT", "#set", "value", "fn", "newValue", "handler", "data", "isReady", "context", "handle", "listeners", "emit", "unsubscribe", "proxied", "proxy", "listener", "PROXIED_SYMBOL", "run", "resolve", "deepEqual", "objA", "objB", "keysA", "keysB", "key", "changed", "target", "prop", "p", "REGISTRY_PERMISSION_ID"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{EventEmitter as m}from"../../event";import{Identifier as I,IdentifierMap as x}from"../../identifier";import{PacketType as o}from"../../network/packet/packet.js";import{Serializer as h}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as C}from"../extension.js";import{SetConfigPacket as L,SetPermissionPacket as N,TableFetchPacket as _,TableFetchRangePacket as O,TableItemsPacket as d,TableKeysPacket as p,TablePacket as u,TableProxyPacket as B}from"./packets.js";import{TableType as g}from"./table.js";const r=new C("table",T=>new H(T)),c=r.join("permission"),R=o.createSerialized(r,{name:"set_permission",serializer:N}),S=o.createSerialized(r,{name:"set_config",serializer:L}),k=o.createJson(r,{name:"listen",serializer:I}),v=o.createJson(r,{name:"proxy_listen",serializer:I}),b=o.createSerialized(r,{name:"proxy",serializer:B}),f=o.createSerialized(r,{name:"item_add",serializer:d}),E=o.createSerialized(r,{name:"item_update",serializer:d}),z=o.createSerialized(r,{name:"item_remove",serializer:d}),M=l.createSerialized(r,{name:"item_get",requestSerializer:p,responseSerializer:d,permissionId:c}),w=l.createSerialized(r,{name:"item_has",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_all",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),K=l.createSerialized(r,{name:"item_has_any",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:_,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),U=l.createSerialized(r,{name:"fetch_all",requestSerializer:u,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"size",requestSerializer:u,responseSerializer:h.json(),permissionId:c}),P=o.createSerialized(r,{name:"clear",serializer:u});class H{constructor(e){this.omu=e;e.network.registerPacket(R,S,k,v,b,f,E,z,P)}type=r;tableMap=new x;createTable(e){if(this.omu.permissions.require(c),this.has(e.id))throw new Error("Table already exists");const i=new J(this.omu,e);return this.tableMap.set(e.id,i),i}json(e,i){const t=new g(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 g(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.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.event={add:new m,update:new m,remove:new m,clear:new m,cacheUpdate:new m},this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,A])=>{const y=a(A);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(b,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.add.emit(s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.update.emit(s)}),e.network.addPacketHandler(z,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.event.remove.emit(s),this.event.cacheUpdate.emit(this.cache)}),e.network.addPacketHandler(P,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.event.clear.emit(),this.event.cacheUpdate.emit(this.cache))}),e.event.ready.listen(()=>this.onReady())}cache;event;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.event.cacheUpdate.emit(this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.listening=!0),e?this.event.cacheUpdate.listen(e):()=>{}}proxy(e){if(this.proxies.length===0){let i=()=>{};i=this.omu.onReady(()=>{if(this.proxies.length===0){i();return}this.omu.send(v,this.id)})}return this.proxies.push(e),()=>{this.proxies.splice(this.proxies.indexOf(e),1)}}onReady(){this.config&&this.omu.send(S,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(M,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(M,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);this.omu.send(f,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);this.omu.send(E,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),this.omu.send(z,{id:this.id,items:i})}async clear(){this.omu.send(P,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(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(j,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(K,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){const s=await this.omu.endpoints.call(q,new _(this.id,e,i,t)),a=this.deserializeItems(s.items);return this.updateCache(a),a}async fetchRange({start:e,end:i}){const t=await this.omu.endpoints.call(D,{id:this.id,start:e,end:i}),s=this.deserializeItems(t.items);return this.updateCache(s),s}async fetchAll(){const e=await this.omu.endpoints.call(U,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values(),i!==void 0&&t.delete(i);const s=e?t.values().next().value:[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(F,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,H as TableExtension};
1
+ import{EventEmitter as m}from"../../event";import{Identifier as g,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 p,TablePacket as u,TableProxyPacket as B}from"./packets.js";import{TableType as _}from"./table.js";const r=new C("table",T=>new H(T)),c=r.join("permission"),R=o.createSerialized(r,{name:"set_permission",serializer:N}),S=o.createSerialized(r,{name:"set_config",serializer:L}),k=o.createJson(r,{name:"listen",serializer:g}),v=o.createJson(r,{name:"proxy_listen",serializer:g}),b=o.createSerialized(r,{name:"proxy",serializer:B}),f=o.createSerialized(r,{name:"item_add",serializer:d}),E=o.createSerialized(r,{name:"item_update",serializer:d}),z=o.createSerialized(r,{name:"item_remove",serializer:d}),M=l.createSerialized(r,{name:"item_get",requestSerializer:p,responseSerializer:d,permissionId:c}),A=l.createSerialized(r,{name:"item_has",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_all",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),K=l.createSerialized(r,{name:"item_has_any",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:I,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),U=l.createSerialized(r,{name:"fetch_all",requestSerializer:u,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"size",requestSerializer:u,responseSerializer:h.json(),permissionId:c}),P=o.createSerialized(r,{name:"clear",serializer:u});class H{constructor(e){this.omu=e;e.network.registerPacket(R,S,k,v,b,f,E,z,P)}type=r;tableMap=new x;createTable(e){this.omu.permissions.require(c);const i=this.tableMap.get(e.id);if(i)return i;const t=new J(this.omu,e);return this.tableMap.set(e.id,t),t}json(e,i){const t=new _(this.omu.app.id.base.join(e),h.pipe(i.serializer??h.noop(),h.json()),i.key);return this.createTable(t)}serialized(e,i){const t=new _(this.omu.app.id.base.join(e),i.serializer,i.key);return this.createTable(t)}get(e){return this.has(e.id)?this.tableMap.get(e.id):this.createTable(e)}has(e){return this.tableMap.has(e)}}class J{constructor(e,i){this.omu=e;this.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.event={add:new m,update:new m,remove:new m,clear:new m,cacheUpdate:new m},this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,w])=>{const y=a(w);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(b,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.add.emit(s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.update.emit(s)}),e.network.addPacketHandler(z,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.event.remove.emit(s),this.event.cacheUpdate.emit(this.cache)}),e.network.addPacketHandler(P,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.event.clear.emit(),this.event.cacheUpdate.emit(this.cache))}),e.event.ready.listen(()=>this.onReady())}cache;event;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.event.cacheUpdate.emit(this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.listening=!0),e?this.event.cacheUpdate.listen(e):()=>{}}proxy(e){if(this.proxies.length===0){let i=()=>{};i=this.omu.onReady(()=>{if(this.proxies.length===0){i();return}this.omu.send(v,this.id)})}return this.proxies.push(e),()=>{this.proxies.splice(this.proxies.indexOf(e),1)}}onReady(){this.config&&this.omu.send(S,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(M,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(M,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);this.omu.send(f,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);this.omu.send(E,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),this.omu.send(z,{id:this.id,items:i})}async clear(){this.omu.send(P,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(A,{id:this.id,keys:[e]}))[e]??!1}async hasMany(...e){return await this.omu.endpoints.call(A,{id:this.id,keys:e})}async hasAll(...e){return await this.omu.endpoints.call(j,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(K,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){const s=await this.omu.endpoints.call(q,new 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(U,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values(),i!==void 0&&t.delete(i);const s=e?t.values().next().value:[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(F,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,H as TableExtension};
2
2
  //# sourceMappingURL=extension.js.map